Formato bruto dos webhooks da WhatsApp Business API — como configurar, validar e processar payloads de mensagens e status
A WhatsApp Business API (WABA) da Meta envia eventos diretamente para um endpoint que você registra no Facebook App. Quando você conecta um número WhatsApp na Timely.ai, nossa plataforma recebe esses eventos, os processa e os transforma nos webhooks internos do workspace. Esta página documenta o formato bruto que a Meta envia — útil para depuração, integrações diretas ou quando você precisa entender o que chega antes de qualquer transformação.
Cole a URL do endpoint que vai receber os eventos. Em produção, use sempre HTTPS com certificado válido.Se você estiver testando localmente, use ngrok ou Hookdeck para expor seu servidor:
Escolha uma string aleatória e segura (ex.: meu_token_secreto_123). A Meta faz um GET no seu endpoint na hora da configuração com os parâmetros hub.mode, hub.verify_token e hub.challenge. Seu servidor deve responder com o valor de hub.challenge se o token bater.
Diferença entre webhook da Meta e webhook da Timely
Aspecto
Webhook Meta (bruto)
Webhook Timely (plataforma)
Fonte
Meta → seu servidor
Timely → seu servidor
Autenticação
X-Hub-Signature-256 com App Secret
X-Timely-Signature com seu secret
Formato
Envelope Meta com entry[].changes[]
Payload normalizado por tipo de evento
Contato resolvido
Não — só o wa_id
Sim — inclui contact_id da Timely
Transformação
Nenhuma — dado bruto da Meta
Enriquecido com contexto do workspace
Se você usa a Timely como intermediário (o caso padrão), não precisa registrar um webhook na Meta — a Timely faz isso por você. Esta documentação serve para casos em que você conecta a WABA diretamente ou precisa depurar o fluxo completo.
A Meta assina cada requisição com o App Secret do seu Facebook App usando HMAC-SHA256. O header enviado é X-Hub-Signature-256.
Node.js
import crypto from "crypto";const APP_SECRET = process.env.META_APP_SECRET!;function verifyMetaSignature(rawBody: Buffer, signature: string): boolean { const expected = "sha256=" + crypto .createHmac("sha256", APP_SECRET) .update(rawBody) .digest("hex"); return crypto.timingSafeEqual( Buffer.from(signature), Buffer.from(expected) );}app.post("/webhook/whatsapp", (req, res) => { const sig = req.headers["x-hub-signature-256"] as string; if (!verifyMetaSignature(req.rawBody, sig)) { return res.sendStatus(401); } // processa o evento... res.sendStatus(200);});
Nunca processe um webhook da Meta sem validar X-Hub-Signature-256. O App Secret fica no painel do seu Facebook App — nunca o exponha em código-fonte ou logs.
Para baixar a mídia, faça GET https://graph.facebook.com/v19.0/{MEDIA_ID} com seu token de acesso. A Timely.ai faz esse download automaticamente e armazena a URL pública no campo media_url da mensagem normalizada.