> ## Documentation Index
> Fetch the complete documentation index at: https://zapo.to/llms.txt
> Use this file to discover all available pages before exploring further.

# Grupos e comunidades

> Crie grupos, gerencie participantes e admins, trate convites, configure subgrupos de comunidades e reaja a eventos de grupo com o zapo.

As operações de grupo ficam em `client.group` ([`WaGroupCoordinator`](/pt-br/reference/client#group)). Os JIDs de grupo terminam em `@g.us`.

<h2 id="querying-groups">
  Consultando grupos
</h2>

```ts theme={null}
// Todos os grupos a que a conta pertence
const groups = await client.group.queryAllGroups()

// Os metadados de um grupo
const meta = await client.group.queryGroupMetadata('123456@g.us')
console.log(meta.subject, meta.participants.length)
```

`WaGroupMetadata` inclui o assunto, o dono, a lista de participantes (`WaGroupParticipant[]` com `isAdmin` / `isSuperAdmin`) e o conjunto completo de flags do grupo (`announce`, `restrict`, `ephemeral`, flags de comunidade, …).

<h2 id="creating-a-group">
  Criando um grupo
</h2>

`createGroup` retorna o `WaGroupMetadata` completo do novo grupo — não é preciso chamar `queryGroupMetadata` depois:

```ts theme={null}
const group = await client.group.createGroup('My group', [
  '5511999999999@s.whatsapp.net',
  '5511888888888@s.whatsapp.net'
])

console.log(group.jid, group.participants.length)
```

<h2 id="managing-participants">
  Gerenciando participantes
</h2>

Os quatro métodos de participantes (`addParticipants`, `removeParticipants`, `promoteParticipants`, `demoteParticipants`) retornam um `WaParticipantActionResult[]` tipado — uma entrada por jid que você passou. O IQ como um todo tem sucesso mesmo quando alguns participantes falham (te bloquearam, configurações de privacidade impedem o add, já é membro, …), então inspecione o `code` por jid para identificar falhas parciais.

```ts theme={null}
const jids = ['5511999999999@s.whatsapp.net']

const results = await client.group.addParticipants(groupJid, jids)

for (const r of results) {
  if (r.status === 'ok') {
    console.log('adicionado', r.jid)
  } else {
    // Código no estilo HTTP: 403 = bloqueio de privacidade, 408 = não permitido,
    // 409 = já está no grupo, 404 = não está no WhatsApp, ...
    console.warn('falhou', r.jid, r.code)
  }
}

await client.group.removeParticipants(groupJid, jids)
await client.group.promoteParticipants(groupJid, jids) // tornar admin
await client.group.demoteParticipants(groupJid, jids)  // remover admin
```

Cada resultado também traz `phoneNumber` e `username` quando o servidor os resolveu, mais o `BinaryNode` cru em `raw` para quaisquer tags extras que o servidor anexou (algumas falhas parciais `409`/`408` dão dicas de como recuperar).

<h2 id="group-settings">
  Configurações do grupo
</h2>

```ts theme={null}
await client.group.setSubject(groupJid, 'New name')
await client.group.setDescription(groupJid, 'A description')   // null para limpar
await client.group.setSetting(groupJid, 'announcement', true)  // mensagens só de admins
await client.group.setSetting(groupJid, 'restrict', true)      // editar info só por admins
await client.group.setSetting(groupJid, 'ephemeral', true)     // mensagens temporárias on/off
```

O `setSetting` também cobre os toggles booleanos `ephemeral`, `group_history`, `allow_admin_reports`, `no_frequently_forwarded` e as flags de comunidade. Use-o para ligar/desligar uma flag; para configurações que precisam de um valor (modo ou duração), use os setters dedicados abaixo.

<h3 id="member-modes">
  Quem pode adicionar, compartilhar link e ver histórico
</h3>

```ts theme={null}
// Quem pode adicionar novos membros
await client.group.setMemberAddMode(groupJid, 'admin_add')        // só admins
await client.group.setMemberAddMode(groupJid, 'all_member_add')   // qualquer um

// Quem pode compartilhar o link de convite
await client.group.setMemberLinkMode(groupJid, 'admin_link')
await client.group.setMemberLinkMode(groupJid, 'all_member_link')

// Se novos membros veem o histórico anterior
await client.group.setMemberShareGroupHistoryMode(groupJid, 'admin_share')      // esconde histórico
await client.group.setMemberShareGroupHistoryMode(groupJid, 'all_member_share') // expõe backlog
```

Todos os três são apenas para admins — não-admins recebem o erro `403 not-authorized`.

<h3 id="disappearing-messages">
  Mensagens temporárias
</h3>

`setSetting(groupJid, 'ephemeral', false)` é o caminho explícito para desligar. Para ligar com uma duração específica, use `setEphemeralDuration`:

```ts theme={null}
// 24h / 7d / 90d em segundos
await client.group.setEphemeralDuration(groupJid, 86_400)
await client.group.setEphemeralDuration(groupJid, 604_800)
await client.group.setEphemeralDuration(groupJid, 7_776_000)

// Desligar
await client.group.setSetting(groupJid, 'ephemeral', false)
```

Apenas para admins. Passar `0` desliga as mensagens temporárias — o mesmo que `setSetting('ephemeral', false)`.

<h2 id="invites">
  Convites
</h2>

```ts theme={null}
// Preview de um código de convite (o segmento de chat.whatsapp.com/<code>)
const info = await client.group.queryGroupInviteInfo('AbCdEf...')
console.log(info.subject, info.size, info.desc)
// info.participants é uma amostra reduzida — não é o roster completo.
// Chame queryGroupMetadata depois de entrar para ver todos.

// Busca o código de convite atual de um grupo que você administra — NÃO rotaciona.
const code = await client.group.queryInviteCode(groupJid)
console.log('convite atual:', `https://chat.whatsapp.com/${code}`)

// Entrar via código de convite — retorna o metadata do grupo
const joined = await client.group.joinGroupViaInvite('AbCdEf...')
console.log(joined.jid, joined.participants.length)

// Rotacionar o convite — retorna o código recém-emitido
const { code: rotated, affectedParticipants } = await client.group.revokeInvite(groupJid)
console.log('novo convite:', `https://chat.whatsapp.com/${rotated}`)
// affectedParticipants lista quem entrou via o código revogado e que o
// servidor surfou na resposta (tipicamente com code: 404).
```

<Note>
  `queryInviteCode` e `revokeInvite` são operações de admin — não-admins recebem `403 not-authorized`.
</Note>

<h2 id="leaving">
  Saindo
</h2>

```ts theme={null}
await client.group.leaveGroup([groupJid]) // em lote — aceita múltiplos
```

`leaveGroup` resolve para `void` assim que o servidor confirma a requisição.

<h2 id="membership-approval">
  Aprovação de entrada
</h2>

Para grupos que exigem aprovação do admin para entrar:

```ts theme={null}
const requests = await client.group.queryMembershipApprovalRequests(groupJid)

await client.group.approveMembershipRequests(groupJid, [requesterJid])
await client.group.rejectMembershipRequests(groupJid, [requesterJid])

// Cancelar sua própria solicitação pendente
await client.group.cancelMembershipRequests(groupJid, [myJid])
```

<h2 id="communities">
  Comunidades
</h2>

Comunidades são grupos-pai que vinculam subgrupos:

```ts theme={null}
// Criar uma comunidade
const community = await client.group.createCommunity('My community')

// Vincular / desvincular grupos existentes como subgrupos
await client.group.linkSubGroups(community.jid, [subGroupJidA, subGroupJidB])
await client.group.unlinkSubGroups(community.jid, [subGroupJidA], {
  removeOrphanedMembers: true
})

// Listar subgrupos (e o grupo de avisos)
const subs = await client.group.fetchSubGroups(community.jid)

// Entrar em um subgrupo vinculado ao qual você ainda não pertence.
// O resultado do IQ não carrega payload do grupo — chame
// queryGroupMetadata no subgrupo depois para obter o metadata completo.
await client.group.joinLinkedGroup(community.jid, subGroupJid)
const subMeta = await client.group.queryGroupMetadata(subGroupJid)

// Participantes mesclados de toda a comunidade
const everyone = await client.group.queryLinkedGroupsParticipants(community.jid)
```

Outras operações de comunidade incluem `deactivateCommunity`, `transferCommunityOwnership` e `fetchSubgroupSuggestions`.

<h2 id="group-events">
  Eventos de grupo
</h2>

Mudanças feitas por outras pessoas (assunto, participantes, configurações) chegam no evento `group`:

```ts theme={null}
client.on('group', (event) => {
  console.log(event.action, 'in', event.groupJid)
})
```

Veja [Eventos](/pt-br/concepts/events#groups-newsletters--profiles) para o payload completo.
