Receba novidades do Hedhog no seu e-mail
Novos lançamentos, receitas e breaking changes — sem spam.
O Hedhog suporta dois caminhos para WhatsApp:
whatsapp-official— a WhatsApp Business Cloud API oficial da Meta. Recebe mensagens via webhook (assinado com HMAC) e gerencia os números do WABA. O envio ainda não está implementado.evolution-api— uma instância auto-hospedada da Evolution API, usada por uma ação de Integração de Webhook. Envia texto simples, mas é uma sessão não-oficial atrelada a um telefone.
Status: ⚠️ Parcial —
whatsapp-officialrecebe mensagens (envio pendente); a Evolution API envia texto via ação de Integração de Webhook.
Procurando abrir chamado a partir de uma mensagem de WhatsApp e responder pelo mesmo número? Isso é o módulo SAC, e os dois providers funcionam lá: veja Atendimento omnichannel.
API oficial da Meta (whatsapp-official)
Configuração
- Em Settings → Integrations, crie um perfil do tipo
whatsappcom o provider WhatsApp Official API e preencha com os dados do painel da Meta: Meta App ID, Meta App Secret, WABA ID, Business ID, access token (System User, permanente), verify token (escolhido por você) e a versão da Graph API (ex.:v21.0). Salve o perfil. - Reabra o perfil salvo: a seção Webhook da Meta mostra a Callback URL (com botão de copiar) e o passo a passo. Clique em Test para o Hedhog validar o token contra a Graph API.
- Importe os números do WABA:
POST /whatsapp/phone-numbers/sync/{integrationProfileId}— trazphone_number_id, quality rating e status de verificação direto da Meta. - Registre o webhook no painel da Meta com os dados abaixo.
O que copiar para o painel da Meta
Ambos aparecem na seção Webhook da Meta do perfil, prontos para copiar:
| Campo na Meta | Valor |
|---|---|
| Callback URL | a URL exibida no perfil (https://<base-da-api>/webhook/<uuid>) |
| Verify token | o valor definido no campo verify_token do perfil |
Depois de salvar, assine o campo messages no webhook do produto WhatsApp.
A URL usa o webhook do core: um UUID não-enumerável e rotacionável identifica o webhook, não o id do perfil. A Meta chama essa URL; o Hedhog delega ao adaptador do protocolo da Meta, que faz o handshake e valida o HMAC. O webhook também aparece em Settings → Integrations and Webhooks, com logs.
Segurança
- Todo POST é validado com HMAC SHA-256 (
X-Hub-Signature-256) sobre o corpo bruto, usando o Meta App Secret. Assinatura inválida →403, sem enfileirar. - App Secret, access token e verify token são cifrados em repouso e nunca devolvidos pela API (a UI mostra
********). - A validação da assinatura só pode ser desligada em desenvolvimento (
WHATSAPP_WEBHOOK_SKIP_SIGNATURE=true); em produção a flag é ignorada.
Múltiplos números
Um WABA pode ter vários números, e cada um tem estado próprio. O Hedhog guarda cada número separadamente, permite marcar um padrão por perfil (garantido no banco) e ativar/desativar individualmente. O número destinatário de cada webhook é identificado automaticamente pelo metadata.phone_number_id.
Evolution API (envio de texto)

Configuração Rápida
- Auto-hospede a Evolution API e crie uma instância de WhatsApp (comandos abaixo)
- Vá em Settings → Integrations and Webhooks, abra (ou crie) uma Webhook Integration e adicione uma ação WhatsApp (Evolution API)
- Preencha os campos
whatsapp_*diretamente na ação — nenhum Perfil de Integração necessário - Envie uma mensagem de teste e confirme que ela é de fato entregue ao telefone vinculado, não apenas um HTTP
200
Auto-Hospedando a Evolution API
docker run -d \
--name evolution-api \
-p 8080:8080 \
-e AUTHENTICATION_API_KEY=your-api-key \
atendai/evolution-api:latest
Substitua your-api-key por uma string aleatória segura — isso se torna o cabeçalho apikey que o Hedhog envia em cada requisição. O dashboard de gerenciamento fica disponível em http://localhost:8080.
Crie uma sessão de WhatsApp ("instância") antes de enviar qualquer coisa:
curl -X POST http://localhost:8080/instance/create \
-H "apikey: your-api-key" \
-H "Content-Type: application/json" \
-d '{"instanceName": "my-instance", "qrcode": true}'
Escaneie o QR code retornado a partir de um telefone em WhatsApp → Aparelhos conectados → Conectar um aparelho. A sessão permanece ativa enquanto aquele telefone tiver acesso à internet — perder a conexão do telefone derruba a sessão e as mensagens começarão a falhar até você reconectar.
Ação de Integração de Webhook
- Vá em Settings → Integrations and Webhooks, abra (ou crie) uma Webhook Integration
- Adicione uma ação do tipo WhatsApp (Evolution API) e preencha, diretamente na ação:
| Campo da ação | Descrição |
|---|---|
whatsapp_base_url | URL base da Evolution API |
whatsapp_token | Chave de API da Evolution API (enviada como o cabeçalho apikey) |
whatsapp_instance | O nome da instância criada acima — o Hedhog monta a URL da requisição como {base_url}/message/sendText/{instance} |
whatsapp_target_type | phone ou group |
whatsapp_target | Número de telefone ou ID do grupo — suporta placeholders de template resolvidos a partir do payload do webhook recebido |
whatsapp_template | Texto da mensagem — também suporta placeholders de template |
Esta ação só envia texto simples via sendText — ela não suporta mídia, botões ou listas.
Limitações
- A WhatsApp Business Policy restringe mensagens em massa/não solicitadas a contatos que deram opt-in — enviar para pessoas que nunca consentiram arrisca ter o número banido pelo WhatsApp, não apenas pela Evolution API
- Sessões da Evolution API atreladas a um número de telefone pessoal são inerentemente frágeis: uma bateria descarregada, um logout do app ou a perda de conectividade naquele telefone quebra toda integração que depende dele
- O
whatsapp-officialrecebe mensagens, mas ainda não envia — para enviar hoje, use a ação da Evolution API - O download de mídia recebida (imagens, áudios) ainda não é feito: o Hedhog guarda a referência (
id,mime_type) devolvida pela Meta, não o binário
Verifique se Funcionou
API oficial: no painel da Meta, o botão Verify and save do webhook deve passar (o Hedhog devolve o hub.challenge). Depois, envie uma mensagem real para o número de produção e confirme que ela aparece nas tabelas whatsapp_conversation/whatsapp_message — não basta o 200 do webhook, porque o processamento acontece na fila.
Evolution API: dispare a ação de webhook uma vez e confirme que a mensagem de fato chega ao telefone vinculado — não apenas que a chamada HTTP retornou 200. Verifique no dashboard da Evolution API se a instância ainda aparece como conectada.
Solução de Problemas
| Sintoma | Causa provável |
|---|---|
| Meta: "The callback URL or verify token couldn't be validated" | O perfil está inativo, o verify_token no Hedhog difere do digitado na Meta, ou a URL não tem o integrationProfileId correto |
Webhook devolve 403 em todo POST | O app_secret do perfil não é o do app da Meta que envia — o HMAC não bate |
200 no webhook mas nada aparece nas conversas | O phone_number_id do evento não está cadastrado: rode o sync dos números. Confira whatsapp_event.error |
| Erro da ação de webhook "WhatsApp action is missing required configuration" | Um de whatsapp_target, whatsapp_template, whatsapp_instance, whatsapp_base_url, whatsapp_token está em branco na ação |
| As mensagens param de ser enviadas silenciosamente | O telefone que roda a sessão da Evolution API perdeu a conexão — reconecte o aparelho |
401/403 da Evolution API | O whatsapp_token não corresponde ao AUTHENTICATION_API_KEY da Evolution API |