Pular para o conteúdo

Webhooks

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.