Pular para o conteúdo
WACRM.AI

Como enviar eventos do WhatsApp para seu servidor com webhooks

O WACRM pode enviar um evento assinado por POST para o seu próprio servidor quando chega uma mensagem do WhatsApp ou muda um status de entrega, sem que você precise consultar a API o tempo todo. Este guia mostra como adicionar um endpoint e verificar assinaturas no Workspace, o mesmo fluxo pela API, e os limites reais de hoje.

Por a equipe WACRM Atualizado em

O que você vai aprender

  • O que você precisa antes de começar
  • Adicione um endpoint de webhook no Workspace
  • Verifique a assinatura no seu servidor
  • Envie um teste, veja Deliveries e reenvie uma que falhou
  • Rotacione o segredo
  • Faça o mesmo pela API
  • O que funciona hoje e o que ainda não

Webhooks de saída deixam o WACRM enviar um evento do WhatsApp para uma URL que você controla, assinado para que você possa confirmar que ele realmente veio do WACRM, em vez do seu servidor ficar consultando a API para ver o que mudou. Este guia cobre os dois lugares que administram os mesmos endpoints de webhook — a tela Settings → Apps & Connectors → Webhooks do Workspace e a Core API diretamente — e diz com clareza quais eventos, tentativas e limites existem hoje.

O que você precisa antes de começar

  • Uma conta WACRM Workspace com pelo menos um projeto, no plano Advanced ou superior (com acesso de proprietário, para administrar webhooks pelo Workspace).
  • Um servidor que você controla, capaz de receber uma requisição POST por HTTPS e responder com um status 2xx.
  • Só para os passos da API: curl (ou qualquer cliente HTTP que consiga definir um cabeçalho), e uma API key com os scopes wa_webhooks:read/wa_webhooks:write em Developer / API & MCP.

Adicione um endpoint de webhook no Workspace

  1. Abra Settings → Apps & Connectors → Webhooks. Esta tela é só para o proprietário — um membro da equipe sem acesso de proprietário não vai ver nenhuma forma de adicionar ou mudar um endpoint aqui.
  2. Clique em Add endpoint.
  3. Digite a Endpoint URL do seu servidor — ela precisa começar com https://, e é recusada se resolver para um endereço privado, loopback, link-local ou outro endereço reservado (isso é checado de novo no momento da entrega, então um hostname que muda de destino depois de criado também é pego).
  4. Marque os Events to send que você quiser: message.inbound (chegou uma mensagem do WhatsApp) e/ou message.status (mudou o status de entrega de uma mensagem). São os únicos dois eventos disponíveis hoje.
  5. Clique em Create endpoint.

Um diálogo Your new webhook signing secret abre na hora, logo após a criação, mostrando o segredo exatamente uma vez — copie agora. O WACRM nunca guarda nem registra uma cópia legível dele, e não consegue mostrar esse mesmo segredo de novo; se você perdê-lo, rotacione por um novo (veja abaixo).

Verifique a assinatura no seu servidor

Cada entrega — um evento real, um reenvio ou um envio de teste — carrega um cabeçalho X-WACRM-Signature no formato t=<timestamp unix>,v1=<HMAC-SHA256 em hex de "<t>.<corpo bruto>", assinado com o segredo do seu endpoint>. Recalcule o mesmo HMAC sobre o corpo exato da requisição e compare com v1 antes de confiar no payload; nunca confie só no corpo. É o mesmo padrão de webhook assinado que a maioria dos provedores de webhook usa (veja as fontes de HMAC e webhooks abaixo) — com placeholders no lugar do seu segredo real, nunca um verdadeiro:

Code
const crypto = require('crypto');

// header: o valor bruto de X-WACRM-Signature; rawBody: os bytes exatos que o WACRM enviou,
// não um JSON.parse(body) reserializado — diferenças de espaço quebram o HMAC.
function isValidWebhookSignature(header, rawBody, endpointSecret) {
  const [tPart, v1Part] = header.split(',');
  const timestamp = tPart.split('=')[1];
  const expected = crypto
    .createHmac('sha256', endpointSecret)
    .update(`${timestamp}.${rawBody}`)
    .digest('hex');
  return v1Part === `v1=${expected}`;
}

Envie um teste, veja Deliveries e reenvie uma que falhou

  1. Na linha do endpoint, clique em Send test. Isso envia exatamente um evento webhook.test assinado pelo mesmo caminho de entrega, a mesma checagem de SSRF e a mesma assinatura de um evento real — útil para confirmar que seu servidor valida a assinatura corretamente antes de ligar o tráfego real. Tem um limite de 5 envios de teste por endpoint por minuto; um sexto dentro do mesmo minuto é rejeitado.
  2. Clique em Deliveries para abrir a lista de tudo que foi enviado para esse endpoint — evento, status, status HTTP, tentativas e a hora da última tentativa, do mais recente para o mais antigo. As entregas ficam guardadas por 30 dias e depois são removidas.
  3. Para uma entrega marcada como Failed, clique em Redeliver. Isso reenvia exatamente o mesmo payload como uma entrega totalmente nova — a linha falha original é mantida como está, então você ainda tem um registro do que aconteceu da primeira vez.

Um endpoint desligado (Active desativado) recusa de cara tanto Send test quanto Redeliver — ligue de novo primeiro.

Rotacione o segredo

Se seu segredo vazar, ou se você simplesmente quiser um novo, clique em Rotate secret na linha do endpoint. O mesmo diálogo de revelação única abre com o segredo novo — copie na hora, porque o segredo antigo para de verificar entregas imediatamente, sem nenhuma janela de sobreposição para assinaturas em trânsito. Atualize seu servidor com o segredo novo antes de rotacionar, ou sua verificação vai começar a falhar no momento em que você confirmar.

Faça o mesmo pela API

Tudo acima também pode ser acessado diretamente, com os scopes wa_webhooks:read/wa_webhooks:write — marque os dois em Restrict what this key can do (advanced) → WhatsApp CRM scopes ao criar uma key em Developer / API & MCP. Nenhum dos dois scopes é concedido por padrão a nenhuma key, porque um endpoint recebe o conteúdo de mensagens real do seu projeto.

AçãoRequisição
Criar um endpointPOST /v1/webhook-endpoints
Listar seus endpointsGET /v1/webhook-endpoints
Mudar a URL, os eventos ou o status ativoPATCH /v1/webhook-endpoints/{endpoint}
Rotacionar o segredoPOST /v1/webhook-endpoints/{endpoint}/rotate-secret
Enviar uma entrega de testePOST /v1/webhook-endpoints/{endpoint}/test
Listar entregasGET /v1/webhook-endpoints/{endpoint}/deliveries
Reenviar umaPOST /v1/webhook-endpoints/{endpoint}/deliveries/{delivery}/redeliver
Code
curl -s -X POST https://api.wacrm.ai/v1/webhook-endpoints \
  -H "Authorization: Bearer sk_live_your_scoped_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://your-server.com/webhook", "events": ["message.inbound", "message.status"]}'
Code
{
  "data": {
    "id": "7e9b9b7a-...-endpoint-uuid",
    "url": "https://your-server.com/webhook",
    "events": ["message.inbound", "message.status"],
    "active": true,
    "created_at": "2026-11-08T09:00:00+00:00",
    "secret": "whsec_your_one_time_secret"
  }
}

secret só aparece nessa resposta de criação e numa resposta de rotate-secret — qualquer outra chamada, mesmo buscar o mesmo endpoint de novo, omite isso por completo. Um projeto pode ter no máximo 20 endpoints; criar um 21º responde 409 {"error": {"code": "endpoint_limit_reached"}}. PATCH recebe o campo que você está mudando entre url/events/active (precisa de pelo menos um) e nunca devolve um secret. Um reenvio ou um envio de teste contra um endpoint com active: false responde 409 {"error": {"code": "endpoint_inactive"}} antes de qualquer outra coisa rodar; um sexto envio de teste no mesmo minuto responde 429 {"error": {"code": "rate_limited"}}.

Note

A mesma tela também funciona a partir de uma sessão comum do Workspace, sem API key — a interface de Settings chama por trás uma rota autenticada por sessão, igualmente restrita ao proprietário. Um membro da equipe que não é o proprietário recebe o mesmo 403 por qualquer um dos dois caminhos.

O que funciona hoje e o que ainda não

O que você quer fazerFunciona hoje?
Reagir a uma nova mensagem do WhatsApp recebidaSim — assine message.inbound
Reagir a uma mudança de status de entrega (enviado, entregue, lido, falhou)Sim — assine message.status
Ser avisado de um evento no nível da conversa (atribuição, etiqueta, label)Ainda não — só existem esses dois eventos de mensagem
Apontar um endpoint para um endereço interno ou privadoNão — só https; endereços privados, loopback, link-local e reservados são recusados, mesmo que o DNS de um hostname mude depois de criado
Consultar uma entrega de mais de 30 dias atrásNão — as entregas ficam guardadas 30 dias e depois são removidas
Enviar mais de 5 entregas de teste para um endpoint em um minutoNão — a sexta fica limitada por taxa
Administrar webhooks no Workspace sem ser o proprietárioNão — só o proprietário
Usar webhooks no plano PremiumNão — estão incluídos a partir do plano Advanced; veja seu plano em Settings se não tiver certeza

Pronto para testar isso no seu próprio projeto? Solicite acesso antecipado para conseguir um Workspace, ou veja os preços primeiro se ainda estiver comparando planos. Para mais guias como este, veja a lista completa de guias.

Fale com um especialista

Quem responde é uma pessoa da equipe WACRM.

Tire uma dúvida com o David sobre: webhooks do whatsapp: envie eventos ao servidor.

Resposta em até um dia útil, geralmente mais rápido pelo WhatsApp.

Perguntas frequentes

Preciso de um plano pago para usar webhooks?

Webhooks estão incluídos a partir do plano Advanced — o plano Premium não os tem. Se você não sabe em qual plano seu projeto está, veja em Settings.

Posso assinar um evento no nível da conversa, como uma nova atribuição ou etiqueta?

Ainda não. Hoje existem apenas dois eventos — message.inbound (chegou uma mensagem do WhatsApp) e message.status (mudou o status de entrega de uma mensagem). Eventos no nível da conversa ainda não estão disponíveis, nem no Workspace nem na API.

O que acontece se meu servidor estiver fora do ar quando o WACRM tentar entregar um evento?

O WACRM tenta de novo até 3 vezes com espera crescente (30 segundos, 2 minutos e depois 10 minutos) antes de marcar a entrega como falha. Você pode ver cada tentativa na lista de Deliveries daquele endpoint e clicar em Redeliver quando seu servidor voltar, o que reenvia o mesmo payload como uma nova entrega.

Quem pode administrar os webhooks no Workspace?

Só o proprietário do projeto. Um membro da equipe sem acesso de proprietário não vai ver nenhuma forma de adicionar, editar, rotacionar ou excluir um endpoint de webhook em Settings.

Quer que a gente configure para você?

O Quick Setup conecta o seu número com coexistência em 48 horas, feito por uma pessoa.