Meta (Instagram, Facebook, Threads): como funciona a entrega de webhooks

A Meta tenta de novo com frequência decrescente por 36 horas e então descarta o evento. Handshake hub.challenge, formato da assinatura e verificador Node.

Comportamento de entrega

Lido na documentação do próprio provedor, verificado pela última vez em 2026-08-06. Onde o provedor não informa um número, esta tabela também não traz nenhum.

Prazo de respostanão publicado pelo provedor
Novas tentativasTenta de novo com frequência decrescente ao longo de 36 horas e depois descarta o evento. A WhatsApp Cloud API tenta de novo por até 7 dias
Desistenão publicado pelo provedor
Fontehttps://developers.facebook.com/docs/graph-api/webhooks/getting-started

Assinatura

Verificada com um verificador funcional, comprovado por uma suíte de testes, e não lida na documentação. Última verificação em 2026-08-20.

AlgoritmoHMAC-SHA256
Payload assinadoraw body
Codificaçãohex
Cabeçalhox-hub-signature-256 = sha256=hex
Tolerâncianenhuma exigida

Verifique a assinatura

O corpo bruto da requisição, byte a byte, antes de qualquer parsing de JSON. Todos os esquemas desta página quebram no momento em que um framework serializa o payload de novo.

const crypto = require("node:crypto");

// Same scheme as GitHub: "sha256=" + hex HMAC of the raw body, keyed by the
// app secret.
const expected =
  "sha256=" +
  crypto.createHmac("sha256", appSecret).update(rawBody).digest("hex");
const received = Buffer.from(req.headers["x-hub-signature-256"] ?? "");
const wanted = Buffer.from(expected);
// timingSafeEqual throws on a length mismatch, so check that first.
const valid =
  received.length === wanted.length && crypto.timingSafeEqual(received, wanted);

Antes de tudo isso, a Meta precisa aceitar a URL de callback: ela envia um GET com hub.mode=subscribe e espera receber hub.challenge de volta, sem alteração. Sem eco, sem inscrição.

Armadilhas

A Meta publica a janela de novas tentativas (36 horas, frequência decrescente, depois a notificação é descartada), mas não um prazo de resposta por requisição nem um limite de desativação. Onde o provedor não informa um número, esta página também não traz nenhum.

Leia também

O AnyHook fica entre Meta e seus endpoints: responde em cerca de um segundo, tenta de novo segundo um cronograma próprio quando seu servidor está fora do ar e guarda cada evento disponível para replay. Troque uma URL e mantenha seu código.

Como funciona →