Webhooks (com carinho)
Toda atividade vira um webhook assinado. Use sempre o code na lógica; o
message é só para humanos (traduzido pelo idioma).
Envelope
{
"event_id": "evt_...",
"event_type": "message.received",
"timestamp": "2026-06-23T14:14:21Z",
"instance_id": "...",
"client_reference": "lead-42",
"group": { "jid": "[email protected]", "name": "Atendimento" },
"sender": { "jid": "[email protected]", "lid": "...@lid", "name": "Fulano" },
"mentions": ["[email protected]"],
"payload": { "type": "text", "body": "olá", "wa_message_id": "..." }
}
Catálogo de eventos
Estes são todos os eventos que a API entrega a um webhook de conta/projeto (os eventos de parceiro do Connect estão mais abaixo):
message.received(com subtipos nopayload.type),message.sent,message.delivered,message.read,message.failedinstance.connected/warming/disconnected/logged_out/bannedgroup.joined,group.left,group.participant_added/_removed/_promoted/_demoted,group.subject_changed,group.description_changedcontact.opted_out— só quando o contato responde uma palavra-chave de opt-out (payload.source = "keyword:inbound"). O opt-out feito por API (POST /contacts/{id}/optout) não emite webhook: o efeito já está na resposta da própria chamada.campaign.paused— pausa automática do Safety Autopilotusage.thresholdeadvisory.published— escopo de conta (não de projeto)
qr_code e pairing_code não são webhooksSão o segredo do pareamento e saem apenas pelo SSE
(GET /stream). Não adianta assinar um webhook para eles.
O fim de uma campanha também não gera evento — consulte a campanha (não existe
campaign.completed); e cobrança é avisada por e-mail, não por webhook.