Pular para o conteúdo principal

Documentation Index

Fetch the complete documentation index at: https://zapo.to/llms.txt

Use this file to discover all available pages before exploring further.

Além de texto e mídia, o client.message.send aceita uma família de objetos de conteúdo interativo tipados. Cada um é discriminado pelo seu campo type.

Apontando para uma mensagem

Vários desses referenciam uma mensagem existente através de um WaSendMessageTarget:
interface WaSendMessageTarget {
  stanzaId: string      // o id da mensagem que você está mirando
  fromMe: boolean       // o alvo foi enviado por você?
  participant?: string  // obrigatório em grupos ao mirar a mensagem de outra pessoa
}
Você normalmente o constrói a partir de um evento recebido:
const target = {
  stanzaId: event.stanzaId!,
  fromMe: event.isSender ?? false,
  participant: event.senderJid
}

Reações

await client.message.send(jid, {
  type: 'reaction',
  emoji: '👍',
  target
})
Passe uma string vazia como emoji para remover uma reação anterior:
await client.message.send(jid, { type: 'reaction', emoji: '', target })

Enquetes

const result = await client.message.send(jid, {
  type: 'poll',
  name: 'Lunch?',
  options: ['Pizza', 'Sushi', 'Salad'],
  selectableCount: 1,        // quantas opções um votante pode escolher
  allowAddOption: false
})
As opções podem ser strings simples ou objetos { name }. A ordem importa — ela é usada no hashing dos votos.

Votando em uma enquete

Votar requer a identidade da enquete original e seu messageSecret (32 bytes do messageContextInfo.messageSecret da enquete):
await client.message.send(jid, {
  type: 'poll-vote',
  poll: {
    stanzaId: pollStanzaId,
    fromMe: false,
    authorJid: pollAuthorJid,
    messageSecret: pollMessageSecret, // Uint8Array, 32 bytes
    participant: pollAuthorJid        // obrigatório fora de conversas 1:1
  },
  selectedOptionNames: ['Pizza']      // exatamente como apareceram na enquete
})
Os votos recebidos chegam como eventos message_addon depois de descriptografados.

Editando uma mensagem

Para editar, envie o conteúdo novo e passe editKey nas opções. A original deve ser fromMe:
await client.message.send(jid, 'Corrected text', {
  editKey: {
    stanzaId: originalStanzaId,
    // participant obrigatório em grupos para originais endereçadas via lid/pn
    participant: undefined
  }
})
O novo payload é empacotado em uma mensagem de protocolo MESSAGE_EDIT que mira o editKey.stanzaId.

Revogando (apagar para todos)

await client.message.send(jid, {
  type: 'revoke',
  stanzaId: targetStanzaId,
  fromMe: true,
  // participant obrigatório quando um admin revoga a mensagem de outra pessoa em um grupo
  participant: undefined
})

Fixando

await client.message.send(jid, { type: 'pin', target })   // fixar
await client.message.send(jid, { type: 'unpin', target }) // desafixar

Manter no chat

Para chats com mensagens temporárias, mantenha (ou desfaça a manutenção de) uma mensagem específica:
await client.message.send(jid, { type: 'keep', target })
await client.message.send(jid, { type: 'unkeep', target })

Eventos

Crie uma mensagem de evento no estilo calendário:
await client.message.send(groupJid, {
  type: 'event',
  name: 'Team sync',
  description: 'Weekly catch-up',
  startTime: Math.floor(Date.now() / 1000) + 3600, // segundos unix
  location: { latitude: -23.5, longitude: -46.6, name: 'HQ' },
  joinLink: 'https://meet.example.com/abc',
  hasReminder: true,
  reminderOffsetSec: 600
})

Respondendo a um evento

await client.message.send(jid, {
  type: 'event-response',
  event: {
    stanzaId: eventStanzaId,
    fromMe: false,
    authorJid: eventAuthorJid,
    messageSecret: eventMessageSecret // 32 bytes
  },
  response: 'going' // 'going' | 'not_going' | 'maybe'
})

Localizações e contatos

Ainda não existe um builder dedicado para localizações estáticas ou cartões de contato — envie-os como um Proto.IMessage bruto:
await client.message.send(jid, {
  locationMessage: { degreesLatitude: -23.5, degreesLongitude: -46.6 }
})

await client.message.send(jid, {
  contactMessage: { displayName: 'Jane', vcard: 'BEGIN:VCARD\n...\nEND:VCARD' }
})
Last modified on May 27, 2026