Overview
Communities are parent groups that contain linked subgroups. They use thew:g2 IQ namespace for mutations and MEX (GraphQL) for metadata queries.
This guide covers creating communities, linking and unlinking subgroups, querying subgroup metadata, identifying group types, sending encrypted reactions to Community Announcement Groups, and posting channel comments.
Accessing the Community API
All community operations are accessed through thecommunity() method:
Creating a community
create_general_chat is true, so a general chat subgroup is created alongside the community.
See Community API reference for details.
Community creation options
Customize the community withCreateCommunityOptions:
If a description is provided, it is set via a follow-up IQ after creation — the group create stanza does not support inline descriptions for communities.
Deactivating a community
Deactivate (delete) a community. Subgroups are unlinked but not deleted:Managing subgroups
Link existing groups
Link existing groups as subgroups of a community:Create a new subgroup
Create a brand new group that’s already linked as a subgroup of a community, in a single call:link_subgroups — both steps happen in a single round-trip instead of two.
See Community API reference for details.
Unlink subgroups
Unlink subgroups from a community:remove_orphan_members is true, members who are only in the community through the unlinked subgroups are removed from the community.
See Community API reference for details.
Remove participants from a community
Remove participants directly from a community (as opposed to from a single subgroup):Join a subgroup
Join a linked subgroup via the parent community:Querying community information
List communities you’re in
Fetch all parent/community groups the logged-in account currently participates in:List subgroups
Fetch all subgroups of a community via MEX (GraphQL):Get subgroup participant counts
Fetch participant counts per subgroup without fetching full subgroup details:Query linked group metadata
Query a specific linked subgroup’s metadata from the parent community:Get all participants across subgroups
Fetch all participants across all linked groups of a community:Identifying group types
Use thegroup_type function to classify a group within the community hierarchy:
GroupMetadata fields:
See Groups API reference for all
GroupMetadata fields.
Community Announcement Group (CAG) reactions
The default announcement subgroup of a community — the one whereis_default_sub_group is true — is a Community Announcement Group (CAG). CAGs require encrypted reactions; plaintext reactions are silently dropped by the server.
client.send_reaction() handles this transparently. The same call works for DMs, regular groups, and CAGs with no change to your code:
GroupInfo::is_community_announce (populated from metadata and cached). When true, the reaction is encrypted with the target post’s messageSecret (captured when the post was received) and shipped as an enc_reaction_message envelope. If the parent secret is not available the call fails with a descriptive error rather than emitting a plaintext reaction the channel would drop.
Incoming encrypted reactions from CAG posts are decrypted transparently by the receive path and surfaced as a normal reaction_message event. The key field is filled from the envelope’s target_message_key, so your event handler looks identical to a regular group reaction:
Channel comments
Post encrypted threaded replies under a CAG post usingclient.comments():
send_message:
messageSecret to have been captured when the post was received (via msg_secret_policy). If it was not captured the call returns an error explaining that the secret is missing.
Each comment carries a fresh messageSecret of its own so it can receive encrypted reactions. The comment’s secret is persisted under the comment’s own id and sender.
Receiving comments
Incoming encrypted comments are decrypted transparently on the receive path. The decrypted body is dispatched as part of a normalEvent::Messages batch. Because the inner Message proto has no slot for the parent post key, the threading link surfaces on MessageInfo::comment_target:
comment_target is None for all other message types.
Error handling
Community mutations returnanyhow::Error, while MEX-based queries (get_subgroups, get_subgroup_participant_counts) return MexError:
Next steps
- Community API reference — Full API details and types
- Group management — Manage individual groups
- Sending messages — Reactions API overview
- Receiving messages — Handle message events including comments
- Events — Handle group update events
- MEX API — Understand the GraphQL layer used by community queries