Skip to content

Webhooks

This content is not available in your language yet.

Webhooks permitem que seu servidor receba notificações em tempo real sempre que um evento ocorre na sessão WhatsApp. Quando configurado, a wiApi envia um HTTP POST com o payload do evento para a URL registrada. Cada request inclui uma assinatura HMAC para verificação de autenticidade.

POST https://api.wi.api.br/webhooks
ParâmetroTipoObrigatórioDescrição
sessionIdstringSimID da sessão que emitirá os eventos
urlstringSimURL do seu servidor que receberá os POSTs
secretstringNãoChave para assinatura HMAC-SHA256
eventsstring[]SimLista de eventos para escutar
retryCountnumberNãoNúmero de tentativas em caso de falha (padrão: 5)
Terminal window
curl -X POST https://api.wi.api.br/webhooks \
-H "x-api-key: wapi_k8s2m9d4f7a1b3c6e0g5h" \
-H "Content-Type: application/json" \
-d '{
"sessionId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"url": "https://meu-servidor.com/webhooks/whatsapp",
"secret": "whsec_r7k2m9x4p1n8v3q6w0j5",
"events": ["message", "connected", "disconnected", "qr"],
"retryCount": 5
}'

Resposta 200:

{
"id": "wh_9f8e7d6c5b4a3210",
"sessionId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"url": "https://meu-servidor.com/webhooks/whatsapp",
"events": ["message", "connected", "disconnected", "qr"],
"retryCount": 5,
"createdAt": "2026-06-01T14:23:00.000Z"
}
PATCH https://api.wi.api.br/webhooks/{id}
ParâmetroTipoObrigatórioDescrição
urlstringNãoNova URL de destino
secretstringNãoNova chave HMAC
eventsstring[]NãoNova lista de eventos
retryCountnumberNãoNovo número de tentativas
Terminal window
curl -X PATCH https://api.wi.api.br/webhooks/wh_9f8e7d6c5b4a3210 \
-H "x-api-key: wapi_k8s2m9d4f7a1b3c6e0g5h" \
-H "Content-Type: application/json" \
-d '{
"events": ["message", "connected", "disconnected", "qr", "message_ack"],
"retryCount": 3
}'

Resposta 200:

{
"id": "wh_9f8e7d6c5b4a3210",
"sessionId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"url": "https://meu-servidor.com/webhooks/whatsapp",
"events": ["message", "connected", "disconnected", "qr", "message_ack"],
"retryCount": 3,
"createdAt": "2026-06-01T14:23:00.000Z",
"updatedAt": "2026-06-02T09:15:00.000Z"
}
DELETE https://api.wi.api.br/webhooks/{id}
Terminal window
curl -X DELETE https://api.wi.api.br/webhooks/wh_9f8e7d6c5b4a3210 \
-H "x-api-key: wapi_k8s2m9d4f7a1b3c6e0g5h"

Resposta 200:

{
"deleted": true
}
EventoAliasDescrição
messagemessagesNova mensagem recebida (texto, mídia, localização, contato)
message_ackConfirmação de leitura ou entrega de mensagem enviada
connectedconnectionSessão conectada ao WhatsApp
disconnectedSessão desconectada (logout, ban, conflito)
qrNovo QR code gerado para pareamento
group_joinParticipante entrou em um grupo
group_leaveParticipante saiu de um grupo
callChamada recebida (voz ou vídeo)
presenceAtualização de status online/offline de contato
chat_archiveChat arquivado ou desarquivado

Aliases existem para compatibilidade com integrações que esperam o nome no plural (Chatwoot, Mega).

Cada evento é entregue como POST JSON na URL registrada:

{
"event": "message",
"session_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"data": {
"id": "3EB0A6C2F8B1D4E9F7A2",
"chat": "5511998765432@s.whatsapp.net",
"chatId": "5511998765432@s.whatsapp.net",
"remoteJid": "5511998765432@s.whatsapp.net",
"sender": "5511912345678@s.whatsapp.net",
"pushName": "João Silva",
"text": "Boa tarde, preciso do orçamento atualizado.",
"timestamp": 1748790000,
"fromMe": false,
"type": "text",
"mediaUrl": null
},
"timestamp": "2026-06-01T15:00:00.000Z"
}

Headers incluídos em cada request:

HeaderValor
Content-Typeapplication/json
x-webhook-signatureHMAC-SHA256 hex do body (se secret configurado)
x-webhook-idID único do dispatch (para deduplicação)
x-webhook-timestampTimestamp ISO 8601 do envio

Se o campo secret estiver configurado no webhook, cada request inclui o header x-webhook-signature com o HMAC-SHA256 do body. Valide para garantir que o payload veio da wiApi e não foi adulterado.

import { createHmac, timingSafeEqual } from "node:crypto";
function verifyWebhook(body, signature, secret) {
const expected = createHmac("sha256", secret)
.update(body, "utf-8")
.digest("hex");
return timingSafeEqual(
Buffer.from(signature, "hex"),
Buffer.from(expected, "hex")
);
}
// Uso no handler (Express/Fastify/etc.)
app.post("/webhooks/whatsapp", (req, res) => {
const signature = req.headers["x-webhook-signature"];
const rawBody = req.rawBody; // buffer do body original
if (!verifyWebhook(rawBody, signature, "whsec_r7k2m9x4p1n8v3q6w0j5")) {
return res.status(401).send("Invalid signature");
}
const event = JSON.parse(rawBody);
// processar evento...
res.status(200).send("OK");
});

Se o endpoint retornar status HTTP ≥ 400 ou não responder em 10 segundos, a wiApi faz retry com exponential backoff:

TentativaDelay após falhaTempo acumulado
imediata0s
1s1s
4s5s
16s21s
64s85s

Após esgotar todas as tentativas, o evento é movido para a Dead Letter Queue (DLQ). Eventos na DLQ ficam disponíveis para inspeção e reenvio manual via dashboard por 7 dias.

Retorne 200 o mais rápido possível. Processe o evento de forma assíncrona para evitar timeouts.