Webhooks

Cadastre uma URL para receber eventos em tempo real. Cada entrega é assinada com HMAC-SHA256 e reentregue com backoff exponencial; após esgotar as tentativas, vai para a dead-letter.

Eventos

  • message.received — mensagem recebida
  • message.ack — status de entrega (enviado/entregue/lido)
  • connection.update — QR, conectado, desconectado
  • presence.update, group.participants

Verificando a assinatura

O header x-webhook-signature traz t=<timestamp>,v1=<hmac>. Recompute o HMAC sobre `${t}.${rawBody}` com o secret do endpoint:

import { createHmac, timingSafeEqual } from 'node:crypto';

function verify(rawBody, header, secret) {
  const { t, v1 } = Object.fromEntries(header.split(',').map(p => p.split('=')));
  const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
  return timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}

Payload

{ "id": "evt_...", "kind": "message.received", "data": { ... } }