Meta (Instagram, Facebook, Threads) の Webhook 配信の仕組み

Meta は頻度を下げながら 36 時間リトライし、その後イベントを破棄します。hub.challenge のハンドシェイク、署名形式、Node の検証コードを掲載しています。

配信の挙動

プロバイダーの公式ドキュメントから読み取っています(最終確認 2026-08-06)。プロバイダーが数値を示していない項目には、この表も数値を載せていません。

応答期限プロバイダーは未公表
リトライ36 時間にわたり頻度を下げながらリトライし、その後は破棄。WhatsApp Cloud API は最大 7 日間リトライする
打ち切りプロバイダーは未公表
出典https://developers.facebook.com/docs/graph-api/webhooks/getting-started

署名

ドキュメントを読んだだけではなく、テストスイートで裏付けた動作する検証コードで確認しています。最終検証日は 2026-08-20 です。

アルゴリズムHMAC-SHA256
署名対象raw body
エンコードhex
ヘッダーx-hub-signature-256 = sha256=hex
許容範囲適用なし

検証する

JSON としてパースする前の生のリクエストボディを、バイト単位でそのまま使います。フレームワークがペイロードを再シリアライズした時点で、このページのどの方式も検証に失敗します。

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);

これらが動く前に、Meta にコールバック URL を承認させる必要があります。Meta は hub.mode=subscribe を付けた GET を送り、hub.challenge がそのまま返ってくることを期待します。返さなければサブスクリプションは作成されません。

落とし穴

Meta はリトライの期間(36 時間、頻度を下げながら、その後通知は破棄)を公表していますが、リクエストごとの応答期限や無効化のしきい値は公表していません。プロバイダーが数値を示していない項目には、このページも数値を載せていません。

あわせて読む

AnyHook は、Meta から受信するエンドポイントの手前に入ります。約 1 秒で応答し、サーバーがダウンしていれば独自のスケジュールでリトライします。すべてのイベントは再送できる状態で保存されます。 変えるのは URL 1 つだけで、コードはそのままです。

仕組みを見る →