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.

As mensagens recebidas chegam no evento message como um WaIncomingMessageEvent.
import type { WaIncomingMessageEvent } from 'zapo-js'

client.on('message', (event: WaIncomingMessageEvent) => {
  // ...
})

O payload do evento

Campos principais em WaIncomingMessageEvent:
CampoTipoDescrição
messageProto.IMessageO conteúdo descriptografado da mensagem.
chatJidstringO JID da conversa (grupo ou 1:1).
senderJidstringQuem enviou.
stanzaIdstringO id da mensagem.
timestampSecondsnumberTimestamp do servidor (segundos unix).
pushNamestringO nome de exibição do remetente.
isGroupChatbooleanVerdadeiro para mensagens de grupo.
isBroadcastChatbooleanVerdadeiro para broadcast/status.
isNewsletterChatbooleanVerdadeiro para mensagens de newsletter.
isSenderbooleanVerdadeiro quando a mensagem foi enviada por esta conta.
Você também recebe aqui suas próprias mensagens enviadas (sincronização multi-dispositivo), marcadas com isSender: true. Filtre-as se quiser apenas tráfego de entrada.

Extraindo texto

O texto de uma mensagem fica em campos diferentes dependendo do seu tipo. Um pequeno helper cobre os casos comuns:
function extractText(message?: Proto.IMessage | null): string | undefined {
  if (!message) return undefined
  return (
    message.conversation ??
    message.extendedTextMessage?.text ??
    message.imageMessage?.caption ??
    message.videoMessage?.caption ??
    undefined
  )
}

client.on('message', (event) => {
  const text = extractText(event.message)
  if (text) console.log(`${event.pushName}: ${text}`)
})

Identificando o tipo da mensagem

message é uma union protobuf — inspecione qual campo está definido:
client.on('message', (event) => {
  const m = event.message
  if (!m) return

  if (m.conversation || m.extendedTextMessage) console.log('text')
  else if (m.imageMessage) console.log('image')
  else if (m.videoMessage) console.log('video')
  else if (m.audioMessage) console.log('audio')
  else if (m.documentMessage) console.log('document')
  else if (m.stickerMessage) console.log('sticker')
  else if (m.pollCreationMessage) console.log('poll')
  else if (m.locationMessage) console.log('location')
})
Para baixar mídia de uma mensagem de imagem/vídeo/áudio/documento, veja Mídia → baixando.

Enviando recibos

O client.message.sendReceipt marca mensagens como recebidas/lidas/reproduzidas. A forma mais simples recebe o(s) evento(s) diretamente:
client.on('message', async (event) => {
  // marcar como lida
  await client.message.sendReceipt(event, { type: 'read' })
})
Você também pode passar um array de eventos, ou endereçá-lo manualmente por e ids:
await client.message.sendReceipt(chatJid, [id1, id2], { type: 'read' })

Addons

Addons são complementos criptografados anexados a uma mensagem: reações, votos em enquetes e comentários. Eles aparecem como o evento message_addon.

Descriptografia automática

Defina addons.autoDecrypt no client e os addons são descriptografados e emitidos para você:
const client = new WaClient({
  store,
  sessionId: 'default',
  addons: { autoDecrypt: true }
}, logger)

client.on('message_addon', (event) => {
  console.log('addon:', event)
})

Descriptografia manual

Se você deixar o autoDecrypt desligado, descriptografe sob demanda a partir do evento da mensagem de origem:
client.on('message', async (event) => {
  await client.message.tryDecryptAddon(event)
})

Mensagens de protocolo

Edições, revogações e outras atualizações em nível de protocolo chegam em message_protocol como WaIncomingProtocolMessageEvent (que estende o evento de mensagem com um campo protocolMessage):
client.on('message_protocol', (event) => {
  console.log(event.protocolMessage)
})

Recibos (entrada)

Quando outras pessoas leem ou reproduzem suas mensagens, você recebe eventos receipt:
client.on('receipt', (event) => {
  // event.status: 'delivered' | 'read' | 'played' | 'inactive'
  console.log(event.status, 'for', event.stanzaId)
})
Last modified on May 27, 2026