配信の挙動
まず応答期限の列を見てください。実際の制約になるのは、なじみのある送信元ではなく、受信している中で最も厳しい送信元です。
| プロバイダー | 応答期限 | リトライ | 打ち切り/無効化 |
|---|---|---|---|
| Slack出典 | 3 秒 | 3 回リトライ:即時、1 分後、5 分後 | 60 分間で配信試行の 95% 超が失敗すると、イベントサブスクリプションが無効になる |
| LINE出典 | 2 秒 ボットサーバーが 2 秒以内に応答しないと request_timeout として扱われる | 「Webhookの再送」:デフォルトはオフ(チャネルの「Messaging API設定」で有効にする)。回数と間隔は非公開 | ボットサーバーが受信に失敗し続けると、Webhook の送信を停止することがある。しきい値は非公開 |
| Xero出典 | 5 秒 5 秒以内に、ボディも Cookie もない 200 を返す。署名が正しくなければ 401 | 未確認 | 未確認 |
| Discord出典 | 3 秒 Interaction エンドポイントは 3 秒以内に最初の応答を返す必要がある | 未確認 | 未確認 |
| Shopify出典 | 5 秒 接続に 1 秒、リクエスト全体で 5 秒 | 4 時間にわたり 8 回リトライ | Admin API で作成したサブスクリプションは、8 回連続で失敗すると削除される。アプリの緊急時の開発者連絡先には警告メールが届く |
| Paddle出典 | 5 秒 | 本番環境:約 2 日間で最大 60 回試行(最初の 1 時間に約 10 回、初日に約 45 回)。サンドボックス:約 2 分以内に 3 回 | 未確認 |
| HubSpot出典 | 5 秒 最大 100 件の通知を含むバッチ全体に適用される | 24 時間にわたり最大 10 回試行 | 未確認 |
| GitHub出典 | 10 秒 | なし。GitHub は失敗した配信を自動ではリトライしない | 無効化なし。配信は 3 日間は手動で再配信でき、その後は記録が消える |
| Meta (Instagram, Facebook, Threads)出典 | 未公表 | 36 時間にわたり頻度を下げながらリトライし、その後は破棄。WhatsApp Cloud API は最大 7 日間リトライする | 未確認 |
| Twilio出典 | 15 秒 設定可能。rt(読み取りタイムアウト)はデフォルト 15000ms(最大 15000)、ct(接続)はデフォルト 5000ms(最大 10000)、tt(合計)はデフォルト 15000ms | 設定可能:rc は 0〜5、デフォルトは 1。rp で対象とする失敗の種類を選ぶ | 未確認 |
| Stripe出典 | 未公表 Stripe は数値を公開していない。ドキュメントにあるのは、時間のかかる処理の前に 2xx を返すようにという指示だけ。20 秒はコミュニティでの目安 | 本番環境では指数バックオフで最大 3 日間。サンドボックスでは数時間で 3 回試行 | 失敗が続くとエンドポイントが無効化される(その前にメールが届く)。イベントは Events API に 30 日間残る |
| Svix (Clerk, Resend)出典 | 未公表 | 8 回試行:即時、5 秒、5 分、30 分、2 時間、5 時間、10 時間、10 時間。その後 message.attempt.exhausted の Operational Webhook が送られる | 5 日間すべての試行が失敗するとエンドポイントが無効化される |
| WooCommerce出典 | 未公表 配信は Action Scheduler のキューに入り、WP-Cron で処理される。そのため送信はイベント発生時ではなく、次にページが読み込まれたときになる | 未確認 | 配信が 5 回を超えて連続で失敗すると Webhook が無効化される |
特に注意して読むべき行が 2 つあります。GitHub はまったくリトライしないため、失敗した配信は誰かが 3 日以内に再配信しない限り失われます。Paddle は 60 回の試行のうち、約 10 回を最初の 1 時間に、約 45 回を最初の 1 日に送ります。そのため遅いだけのハンドラーにとっては、Stripe の間隔よりはるかに厳しくなります。
署名方式
多くの人が何時間も費やす原因になるのが「署名対象」の列です。raw body 以外なら、リクエストボディだけをハッシュしても検証できません。
| プロバイダー | アルゴリズム | 署名対象 | エンコード | ヘッダー | 許容範囲 |
|---|---|---|---|---|---|
| Slack | HMAC-SHA256 | v0:{timestamp}:{body} | hex | x-slack-signature = v0=hex | 5 分 |
| LINE | HMAC-SHA256 | raw body | base64 | x-line-signature = base64 | なし |
| Xero | HMAC-SHA256 | raw body | base64 | x-xero-signature = base64 | なし |
| Discord | Ed25519 | {timestamp}{body} | hex | x-signature-ed25519 + x-signature-timestamp | なし |
| Shopify | HMAC-SHA256 | raw body | base64 | x-shopify-hmac-sha256 | なし |
| Paddle | HMAC-SHA256 | {timestamp}:{body} | hex | paddle-signature = ts=X;h1=hex | 5 秒 |
| HubSpot | HMAC-SHA256 | POST{decodedUrl}{body}{timestamp} | base64 | x-hubspot-signature-v3 | 5 分 |
| GitHub | HMAC-SHA256 | raw body | hex | x-hub-signature-256 = sha256=hex | なし |
| Meta (Instagram, Facebook, Threads) | HMAC-SHA256 | raw body | hex | x-hub-signature-256 = sha256=hex | なし |
| Twilio | HMAC-SHA1 | full URL + form params sorted by key | base64 | x-twilio-signature | なし |
| Stripe | HMAC-SHA256 | {timestamp}.{body} | hex | stripe-signature = t=X,v1=hex | 5 分 |
| Svix (Clerk, Resend) | HMAC-SHA256 | {id}.{timestamp}.{body} | base64 | svix-signature = v1,base64 | 5 分 |
| WooCommerce | HMAC-SHA256 | raw body | base64 | x-wc-webhook-signature | なし |
| Lemon Squeezy | HMAC-SHA256 | raw body | hex | x-signature + x-event-name | なし |
| PayPal | RSA-SHA256 | {txId}|{txTime}|{webhookId}|{crc32(body)} | base64 | paypal-transmission-sig + 4 more | なし |
| SendGrid | ECDSA P-256 | {timestamp}{body} | base64 | x-twilio-email-event-webhook-signature | なし |
| Linear | HMAC-SHA256 | raw body | hex | linear-signature | なし |
| Sentry | HMAC-SHA256 | raw body, no timestamp | hex | sentry-hook-signature | なし |
| Intercom | HMAC-SHA1 | raw body | hex | x-hub-signature = sha1=hex | なし |
| Vercel | HMAC-SHA1 | raw body | hex | x-vercel-signature | なし |
このデータを使う
同じ表を /providers.json で JSON として CC BY 4.0 で公開しています。コピーも埋め込みも修正も自由です。数字の誤りや各社の仕様変更に気づいたら、リポジトリで Issue を作成してください。ここで修正します。
出典表記:AnyHook、Webhook プロバイダーの挙動リファレンス、https://anyhook.net/ja/providers