Skip to main content
Estamos em processo de melhorias da nossa documentação, em breve estaremos incluindo mais eventos com seus devidos exemplos.
Alguns eventos dependem do tipo de conexão da instância. Instâncias com API oficial (WABA) emitem hoje apenas message.received, message.flow_reply, message.sent, message.delivered, message.read e message.failed; os demais eventos desta página são emitidos por instâncias não oficiais (conexão por QR Code). Na outra direção, message.failed e message.flow_reply existem apenas na API oficial. A API recusa a assinatura de qualquer evento indisponível para o tipo de conexão da instância, tanto na criação quanto na atualização do webhook: a resposta é um erro 400 com o código unsupported_webhook_event, que nomeia todos os eventos recusados e lista os eventos disponíveis para aquela instância. Cada evento com essa restrição traz o aviso na sua própria seção.

instance.connected

A instância foi conectada com sucesso e está pronta para envio e recebimento de mensagens.

instance.disconnected

A instância foi desconectada com sucesso.
Algumas vezes a desconexão pode acontecer devido a falhas internas do Whatsapp, internamente temos estrategias de recuperação, nestes casos o evento instance.connected pode ser emitido alguns segundos depois do evento de desconexão.

instance.forbidden

A conexão da instância foi rejeitada pelo WhatsApp. Isso pode indicar que o número foi bloqueado, mas o evento sozinho não é uma confirmação de bloqueio: é necessária verificação antes de assumir isso.
Depois do evento, a instância fica disconnected e um novo QR Code costuma ser gerado logo em seguida (o evento instance.qrcode normalmente é emitido na sequência). Ao receber esse evento, reconecte a instância lendo o novo QR Code; se ele voltar a acontecer com frequência, revise as práticas de envio do número.
Este evento se aplica apenas a instâncias não oficiais (conectadas via QR Code). Instâncias com API oficial (WABA) não emitem este evento.

message.received

Uma mensagem foi recebida na instância. Para detalhamento completo de como é o formato do objeto mensagem verifique na página Estrutura dos eventos > Mensagem
Observe a propriedade data.content.quoted, ela representa a citação ou marcação de quem está respondendo e tem o mesmo formato de uma message.received.
Observe que o status respondido ficará dentro de data.content.quoted que terá o mesmo formato de uma message.received, a grande diferença aqui é que você verá uma nova propriedade data.content.quoted.content.origin sendo o seu valor igual à status.
Agora existe um evento dedicado status.reply para respostas a status. Ele é emitido além do message.received (que continua sendo disparado, sem quebra de compatibilidade) e traz um formato enxuto, com o essencial do status em data.content.status. Prefira assiná-lo se você só precisa reagir a respostas de status.
Em alguns casos você pode encontrar uma variação do payload contendo uma propriedade para status que são postado em formato de texto, seu valor representará a cor do fundo (background), contendo no formato decimal, hexadecimal com e sem o canal alfa (transparência).
Se a propriedade waid (ela pode ser ausente) estiver presente dentro de data.content.contacts.phones isso pode siginificar que o telefone / contato recebido tem um whatsapp válido.
Mensagem recebida com botões
As mensagens com botões poderão chegar com os tipos text, image ou video e sempre acompanhada da propriedade buttons em seu conteudo (data.content).
Mensagem resposta à botões
Assim como o exemplo acima, o tipo de mensagem chegará como text, video ou image porém a propriedade button_reply (data.button_reply) mostrará qual botão o usuário pressionou.
Mensagem com lista de opções
Assim como o exemplo acima, o tipo de mensagem chegará como text porém a propriedade list_reply (data.list_reply) mostrará qual opção o usuário selecionou.
Disponível apenas em instâncias com API oficial (WABA), já que WhatsApp Flows não existem no WhatsApp não oficial. A resposta do formulário fica namespaced em data.content.flow_reply (flow_token, response e response_raw) e data.type vem como flow_reply.
Agora existe um evento dedicado message.flow_reply para respostas de Flow. Ele é emitido além do message.received (que continua sendo disparado, sem quebra de compatibilidade) e traz os mesmos campos na raiz de data.content. Prefira assiná-lo se você só precisa reagir a respostas de formulário.

message.flow_reply

Emitido quando alguém conclui um WhatsApp Flow (formulário nativo do WhatsApp) enviado pela sua instância. É um evento dedicado e assinável, pensado para quem precisa reagir só a respostas de formulário, sem inspecionar todas as message.received.
Este evento está disponível apenas em instâncias com API oficial (WABA). WhatsApp Flows não existem no WhatsApp não oficial.
Este evento não substitui o message.received: uma resposta de Flow continua sendo disparada também como message.received, com o conteúdo namespaced em data.content.flow_reply (mesmos campos flow_token, response e response_raw) e data.type igual a flow_reply. O message.flow_reply é emitido em adição, trazendo esses mesmos campos direto na raiz de data.content, para quem só precisa assinar respostas de formulário.
O conteúdo da resposta fica em data.content:
  • flow_token: o token que você definiu ao enviar o Flow, usado para correlacionar a resposta com o envio original. Pode vir null quando o Flow não devolve token. Evite colocar dados pessoais nesse token: diferente das respostas do formulário, ele não é tratado como dado sensível pela plataforma.
  • response: as respostas do formulário já parseadas em objeto. As chaves são exatamente as definidas por você no Flow JSON, sem nenhuma transformação de chave ou valor. O flow_token não aparece dentro de response, ele já vem promovido para o campo de topo.
  • response_raw: a string JSON original enviada pela Meta, sem nenhum tratamento. Está sempre presente, mesmo quando o parse deu certo, e serve para quem quer aplicar o próprio parser ou fazer auditoria byte a byte da submissão. Se o JSON vier malformado, response chega como {} e response_raw preserva a submissão original.
  • quoted (quando presente): a mensagem de Flow original que foi respondida, no mesmo formato de citação usado em message.received.

message.sent

Uma mensagem foi enviada da instância mensagem pode ter sido enviada através do Whatsapp ou através da API da Zapster. Você consegue identificar facilmente a origem do envio olhando para a propriedade data.origin que tem 2 valores possíveis (zapsterapi ou whatsapp), que identificarão a origem do envio da mensagem.
Em números oficiais (WABA) com o recurso de Coexistência da Meta ativo, as mensagens que a equipe envia pelo próprio WhatsApp Business App (ou por um dispositivo vinculado) também chegam como message.sent com data.origin igual a whatsapp. Mensagens enviadas pela API têm data.origin igual a zapsterapi.
Para detalhamento completo de como é o formato do objeto mensagem verifique na página Estrutura dos eventos > Mensagem

message.delivered

Indica que a mensagem foi entregue ao destinatário.

message.read

Indica que a mensagem foi lida pelo destinatário.
Nas configurações de privacidade da instância, se a confirmação de leitura estiver desativada, você não poderá ver nem exibir confirmações de leitura. Então o evento de webhook não irá disparar.Ative ou desative a confirmação de leitura

message.failed

O WhatsApp recusou a entrega da mensagem. O evento traz o motivo da recusa em data.errors e, quando a mensagem foi enviada pela Zapster, também o conteúdo original em data.content.
Este evento está disponível apenas em instâncias com API oficial (WABA). O WhatsApp não oficial não devolve confirmação de falha de entrega, então a assinatura de message.failed é recusada ao criar ou atualizar um webhook de instância não oficial.
Cada item de data.errors traz code e title sempre preenchidos, e message e details quando a Meta os envia. Use o code para tratar a falha de forma programática (por exemplo, 131026 indica mensagem não entregue ao destinatário, e 131047 indica que a janela de atendimento expirou e um template é necessário) e o details para registrar a explicação completa.

message.deleted

Indica que uma mensagem foi apagada (para mim ou para todos) na conversa.

message.reaction

Indica que uma reação (emoji) foi aplicada a uma mensagem.
Reações a mensagens com mais de 72 horas o objeto reacted_message não será enviado com todas informações, mas sim apenas com o ID da mensagem que foi reagida.

message.pinned

Indica que uma mensagem foi fixada na conversa/grupo.

message.unpinned

Indica que uma mensagem foi desafixada.

instance.mentioned

Indica que sua instância foi mencionada (”@…”) em uma conversa/grupo.

status.reply

Emitido quando alguém responde a um status publicado pela sua instância. É um evento dedicado e assinável, pensado para quem precisa automatizar em cima de respostas de status sem inspecionar todas as message.received.
Este evento não substitui o message.received: uma resposta a status continua sendo disparada também como message.received (com o status em data.content.quoted, no formato completo de mensagem). O status.reply é emitido em adição, com um formato enxuto e dedicado.
Diferente do message.received, o status.reply tem um formato enxuto: o status respondido vem em data.content.status (id, type, text, media, background_color) — sem o data.content.quoted redundante — e não há data.sender, porque nesse contexto ele seria sempre igual ao data.recipient (o contato que respondeu). A resposta em si fica no topo: data.content.text/media, data.recipient, data.sent_at e data.type.
Respostas de status podem conter mídia (imagem, vídeo, áudio, arquivo), assim como o próprio status respondido. A mídia da resposta vem em data.content.media; a mídia do status respondido em data.content.status.media. Status de texto trazem data.content.status.background_color com a cor de fundo nos formatos decimal e hexadecimal (com e sem canal alfa).

instance.qrcode

Notifica quando um novo QR Code é gerado/atualizado para a instância.

group.created

Indica que um novo grupo foi criado.

group.updated

Indica que os dados do grupo foram atualizados (nome, foto, descrição, etc.).

group.participants_added

Indica que um ou mais participantes foram adicionados ao grupo.

group.participants_removed

Indica que participantes foram removidos do grupo.

group.participants_promoted

Indica que participantes foram promovidos a administradores.

group.participants_demoted

Indica que participantes foram rebaixados de administradores para membros.