Visão geral
- Webhooks chegam sempre assinados com sua própria
apiKey. Valide a assinatura antes de processar. - Use
express.rawsomente na rota de webhook para preservar o corpo bruto. - Planos free recebem apenas
SESSION-CONNECTEDeSESSION-DISCONNECTED. EventosMESSAGE-*são exclusivos de planos pagos comwebhookMessages = true. - As tipagens
WebhookEvent/WebhookPayloadMapentregam autocomplete imediato: exploreevent.payloadna IDE para descobrir os campos mais recentes.
Exemplo de implementação (Express)
Exemplos rápidos de cada evento
Todos seguem o mesmo envelope{ apiKey, sessionId, type, payload } enviado pelo backend:
SESSION-CONNECTED
SESSION-DISCONNECTED
MESSAGE-RECEIVED
Inclui respostas de botão/lista, edições/deleções e reações já normalizadas.Importante sobre key
No evento MESSAGE-SENT, o payload.key é o ID principal da mensagem (string). Guarde esse valor: ele aparece como key/referenceKey nos eventos seguintes (MESSAGE-DELIVERED/READ/DELETED/EDITED/REACTION) e permite correlacionar reações, edições e deleções com a mensagem original.
MESSAGE-SENT
MESSAGE-DELIVERED / MESSAGE-READ
MESSAGE-DELETED
Eventos normalizados.MESSAGE-EDITED
MESSAGE-DISCARDED
REACTION-MESSAGE
Normalizado comoNormalizedWebhookMessage.
Payloads por evento
| Evento | Payload |
|---|---|
SESSION-CONNECTED | { id, name, phone } |
SESSION-DISCONNECTED | { id, name } |
MESSAGE-RECEIVED | NormalizedWebhookMessage (key/fromMe/sender, message ou mediaUrl/filename, type, eventType/referenceKey, timestamp) |
MESSAGE-SENT | { messageId, key, timestamp } |
MESSAGE-DELIVERED | { key, fromMe, timestamp } |
MESSAGE-READ | { key, fromMe, timestamp } |
MESSAGE-DISCARDED | { messageId, lastError } |
MESSAGE-EDITED | NormalizedWebhookMessage (eventType=MESSAGE-EDITED, referenceKey, conteúdo editado) |
MESSAGE-DELETED | NormalizedWebhookMessage (eventType=MESSAGE-DELETED, referenceKey) |
REACTION-MESSAGE | NormalizedWebhookMessage (eventType=REACTION-MESSAGE, referenceKey, reaction text) |
NormalizedWebhookMessage resume: key, fromMe, sender (phone/name/profileImage), type, eventType, referenceKey, message ou mediaUrl/filename/latitude/longitude/interact, timestamp, isBroadcast, historic, responseButtonId, etc.
Notas adicionais
- URLs de mídia (
payload.mediaUrl) expiram em até 24h. Baixe imediatamente se precisar armazenar. - Para testes locais você pode gerar o cabeçalho com
zap.webhooks.signPayload(rawBody)e enviarx-locezap-signature/x-locezap-timestampmanualmente.

