Pular para o conteúdo principal
As mensagens recebidas chegam no evento message como um WaIncomingMessageEvent.

O payload do evento

WaIncomingMessageEvent carrega uma key rica (um superset de Proto.IMessageKey) e alguns campos no topo do objeto. Passe o evento (ou apenas sua key) literalmente para responder / editar / reagir / revogar / fixar / manter.
Você também recebe aqui suas próprias mensagens enviadas (sincronização multi-dispositivo), marcadas com key.fromMe === true. Filtre-as se quiser apenas tráfego de entrada.
O evento inteiro (ou event.key) é aceito como target para replies/reactions/revokes/pins/keeps e como editKey para edições — sem precisar remontá-lo.

Extraindo texto

O texto de uma mensagem fica em campos diferentes dependendo do seu tipo. Um pequeno helper cobre os casos comuns:

Identificando o tipo da mensagem

message é uma union protobuf — inspecione qual campo está definido:
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:
Você também pode passar um array de eventos, ou endereçá-lo manualmente por e ids:

Chamadas

Read-only A sinalização de chamadas recebidas aparece como o evento read-only call (WaIncomingCallEvent). O zapo reporta chamadas — ele não inicia, aceita nem rejeita.
Campos úteis: type (a etapa da sinalização), callId, callCreatorJid / callerPnJid (quem está ligando), isVideo, groupJid (chamadas de grupo) e callerPushName. Não há API para atender uma chamada.

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

Os addons são descriptografados e emitidos para você por padrão — basta se inscrever em message_addon:

Descriptografia manual

Passe addons: { autoDecrypt: false } para receber o payload criptografado e descriptografar sob demanda a partir do evento da mensagem de origem:

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):

Solicitando histórico antigo

O fluxo inicial de pareamento sincroniza uma janela limitada do histórico de mensagens. Para buscar mensagens mais antigas de um chat específico sob demanda, chame client.message.requestHistorySync:
O método retorna assim que a solicitação é despachada — não quando o chunk chega. O backfill é entregue depois como um evento history_sync_chunk, do mesmo jeito que o histórico inicial. Inscreva-se antes de chamar se precisar reagir a ele:
Combine oldestMsgId, oldestMsgFromMe e oldestMsgTimestampMs da mensagem mais antiga visível para paginar para trás corretamente. Omita count para deixar o servidor aplicar o padrão (~50).

Recibos (entrada)

Quando outras pessoas leem ou reproduzem suas mensagens, você recebe eventos receipt:
event.messageIds é o conjunto completo de stanza ids que este recibo confirma. O WhatsApp agrupa recibos de read/delivery em um único <receipt> carregando um bloco <list><item id=…/>messageIds espelha o externalIds do wa-web: itens da lista primeiro, depois event.stanzaId anexado por último. Recibos de mensagem única contêm apenas [event.stanzaId].
Eventos receipt ainda expõem stanzaId / chatJid diretamente (eles estendem WaIncomingBaseEvent); a renomeação se aplica somente aos payloads de message, message_addon e message_bot_chunk, que agora usam event.key. O event.stanzaId ainda é o último id do batch — itere messageIds para cobrir o resto.
Última modificação em 8 de junho de 2026