Um webhook de saída é uma URL sua que o Bot chama, com um POST em JSON, toda vez que acontece algo que você assinou. Serve para automações no Make, n8n e Zapier, ou para o seu próprio servidor.
Cadastrar
Em Configurações → Webhooks, informe a URL e marque os eventos. Só https://, sem usuário e senha na URL e sem endereço IP. Cada organização pode ter até 5 webhooks; só dono e administrador criam, editam, testam e apagam.
Na criação o Bot mostra o secret uma única vez. Guarde-o: é com ele que você confere a assinatura. Se perder, use Rotacionar secret.
Eventos
| Evento | Quando dispara |
|---|---|
lead.entrou |
alguém entrou num grupo acompanhado (Telegram ou WhatsApp) |
lead.saiu |
alguém saiu ou foi removido |
grupo.convite_invalido |
o link de convite do grupo parou de funcionar |
grupo.suspenso |
o WhatsApp suspendeu o grupo |
grupo.recuperado |
o grupo voltou a operar |
numero.caiu |
um número do WhatsApp desconectou |
numero.voltou |
o número reconectou |
campanha.sem_grupo_aberto |
a campanha não tem grupo com vaga para receber quem clicou |
envio.falhou |
um envio da fila do WhatsApp esgotou as tentativas |
Assinar * recebe todos, inclusive os que forem criados depois. O botão Testar manda um webhook.teste só para aquele webhook.
O que chega
POST https://sua-url
content-type: application/json
x-bot-event: lead.entrou
x-bot-delivery: whd_9f3c…
x-bot-timestamp: 1789900000
x-bot-signature: sha256=…
{"id":"whd_9f3c…","evento":"lead.entrou","workspace_id":"7","ocorrido_em":"2026-09-16T12:00:00.000Z","dados":{"grupo_id":"…","campanha_id":"…"}}
Responda 2xx em até 10 segundos e processe depois. Redirecionamentos não são seguidos: cadastre a URL final. A mesma entrega pode chegar mais de uma vez se a sua resposta se perder na rede; use o x-bot-delivery para não processar em dobro. Entradas e saídas trazem apenas identificadores internos, nunca telefone.
Conferir a assinatura
x-bot-signature é sha256= seguido do HMAC-SHA256, em hexadecimal, do texto timestamp + "." + corpo cru, usando o secret do webhook. O timestamp é o do cabeçalho x-bot-timestamp e muda a cada tentativa.
import crypto from 'node:crypto';
const ts = req.get('x-bot-timestamp');
const esperado = 'sha256=' + crypto.createHmac('sha256', SECRET).update(`${ts}.${corpoCru}`).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(esperado), Buffer.from(req.get('x-bot-signature') ?? ''));
No Make, n8n e Zapier o módulo “Webhook” recebe o corpo direto; a assinatura é opcional lá.
Reentregas e pausa
| Resposta | O que o Bot faz |
|---|---|
2xx |
entrega concluída |
410 Gone |
desativa o webhook na hora |
| outro status, redirecionamento, timeout ou erro de rede | tenta de novo em 1 min, 5 min, 30 min e 2 h; a quinta tentativa é a última |
| 20 falhas seguidas | pausa o webhook e avisa o dono uma vez |
Religar o webhook no painel zera a contagem. O histórico das últimas entregas, com status e payload, fica na própria tela.