ドキュメント
API リファレンス
基本
- URL
https://api.webhookadmin.com/v1- 認証
Authorization: Bearer sk_live_…またはsk_test_…。読み 書きできるのは、 その キーの 環境内の データのみです - 形式
- JSON。
時刻は Unix ミリ秒、 ID は 接頭辞付きの 文字列 - ボディの
上限 - 1.1MB
(超えると 413 too_large) - 一覧
?cursor=&limit=( limitは1〜100、 既定 50) 。 レスポンスは { items, next_cursor }
一覧のcursor と、cursor には
エラー
{ "error": "<code>", "message": "<説明>" }| HTTP | error | 説明 |
|---|---|---|
| 401 | unauthorized | キーが |
| 402 | plan_limit | プランの |
| 403 | forbidden | キーの |
| 404 | not_found | 対象が |
| 409 | conflict | 既存の |
| 409 | endpoint_disabled | エンドポイントが |
| 413 | too_large | ボディが |
| 422 | invalid | 入力内容の |
| 429 | rate_limited | レート制限を |
レート制限
1 分
| プラン | 1 分 |
|---|---|
| Free | 600 |
| Starter | 3,000 |
| Pro | 12,000 |
| Business | 20,000 |
| レスポンスヘッダー | 説明 |
|---|---|
x-ratelimit-limit | 1 分 |
x-ratelimit-remaining | 現在の |
x-ratelimit-reset | 現在の |
retry-after | 429 の |
API 一覧
メッセージの送信
POST /v1/messagesスコープ: messages:send
| パラメーター | 型 | 説明 |
|---|---|---|
consumer | string | 顧客 IDexternal_id。 |
event_type | string | イベントタイプ。_ . : - で |
payload | JSON | 配信する |
transformations_params | object | 任意。webhook.transformationsParams とtransformationsParams の |
Idempotency-Key | string | 任意。 |
レスポンス: 202 { id, deliveries }。deliveries は
- 同じ
Idempotency-Keyには、24 時間は 同じ idを返します (ペイロードが 異なっても 最初の メッセージの idです)。 consumerに該当する 顧客アカウントが 無い 場合は、 自動で 作成します (エンドポイントが 無いため deliveriesは0 です) 。 deliveriesが0 の メッセージ (エンドポイントが 無い) は、 ステータス no_endpointで記録のみ 残します。 配信は 行わず、 月間配信数にも 数えません。 後から エンドポイントを 追加しても、 この メッセージは 配信されません。 - レスポンスヘッダー
x-usage-monthには、組織の 今月 (UTC) の 本番環境の 配信数 (エンドポイントが あった メッセージの 数) が 入ります。 - テスト環境での
送信と テスト送信は 料金の 対象外です。 上限は 1 環境に つき 1 日 (UTC) 1,000 通で、 超えると 402 plan_limitを返します。
メッセージの一覧
GET /v1/messagesスコープ: logs:read
クエリ: statuspending / retrying / success / failed / cancelled / no_endpoint)event_type・q・sincecursor・limit。
no_endpoint は、pending とno_endpoint と
q は、external_id)Idempotency-Key を
q・status・event_type をsince を
レスポンス: { items: MessageRow[], next_cursor }。
メッセージの詳細
GET /v1/messages/{id}スコープ: logs:read
レスポンス: MessageDetail
配信の再送信
POST /v1/deliveries/{id}/retryスコープ: messages:retry
id はDelivery の
- 配信中
( pending・retrying)の 場合は 409 conflictを返します。 - エンドポイントが
自動で 無効化されている ( disabled)場合は、 409 endpoint_disabledを返して 受け付けません。 エンドポイントの 設定を 修正し、 エンドポイントの 更新 でstatus: activeに戻してから 呼び出してください。 状態は MessageDetailのdeliveries[].endpoint_statusで事前に 確認できます。 - 一時停止中
( paused)の エンドポイントへの 再送信は 受け付けて 保留し、 再開時に 配信します。 エンドポイントが 削除された 配信は 404 not_foundを返します。
顧客アカウントの一覧
GET /v1/consumersスコープ: logs:read
クエリ: cursor・limit。{ items: Consumer[], next_cursor }。
顧客アカウントの作成
POST /v1/consumersスコープ: consumers:write
| パラメーター | 型 | 説明 |
|---|---|---|
external_id | string | 自社サービスでの |
name | string | 任意。 |
レスポンス: 201 Consumer。external_id のconflict を
顧客アカウントの削除
DELETE /v1/consumers/{id}スコープ: consumers:write
顧客アカウントと、
- 顧客ポータルの
リンクは、 有効期限内でも 直ちに 使用できなくなります。 - 未配信の
配信 (再送信待ちを 含む) は 配信しません。 ログ上は 失敗と なり、 ポーリングエンドポイントで 待機中の 配信は キャンセル ( cancelled)に なります。 - 配信ログは、
プランの ログ保存期間を 過ぎた 時点で、 その 日の 他の ログと 一緒に 削除されます。 月間配信数の 集計は 残ります。 - 同じ
external_idでメッセージを 送信すると、 エンドポイントの 無い 新しい 顧客アカウントと して 作成されます。
顧客ポータルのリンクの作成
POST /v1/consumers/{id}/portalスコープ: endpoints:write
| パラメーター | 型 | 説明 |
|---|---|---|
frame_origin | string | 任意。https:/。 |
locale | ja・en | 任意。 |
レスポンス: 201 { url, expires_at }。url のplan_limit、
自社アプリへのsrc にはurl を
<iframe
src="https://app.webhookadmin.com/portal/eyJlIjoi…?lang=ja"
title="Webhook"
allow="clipboard-write"
style="display: block; width: 100%; height: 900px; border: 0"
></iframe>- 埋め込めるのは
frame_originで指定した オリジンのみです。 frame_originを指定しないリンクは、 iframe 内には 表示されません ( Content-Security-Policy: frame-ancestors)。 - ポータルは
Cookie を 使わず、 リンクに 含まれる トークンで 認証します。 別ドメインの iframe 内 (Safari を 含む) でも 利用できます。 - 顧客が
行える 操作: エンドポイントの 登録・編集・ 一時停止・削除、 対象イベントの 選択、 署名シークレットの 表示と ローテーション、 テスト送信、 配信ログの 確認と 再送信。 urlにクエリ theme=darkを付けると、 ダークテーマで 表示します。
エンドポイントの一覧
GET /v1/endpointsスコープ: logs:read
クエリ: consumer_id{ items: Endpoint[] }。
エンドポイントの作成
POST /v1/endpointsスコープ: endpoints:write
| パラメーター | 型 | 説明 |
|---|---|---|
consumer_id | string | 顧客アカウントのidcon_…) |
url | string | エンドポイント URLtype がhttp |
type | string | 任意。httppollingurl とdestination はwebhook・pollingEndpoint も |
destination | object | Webhook 以外のurl の |
event_types | string[] | 任意。 |
fixed_ip | boolean | 任意。 |
description | string | 任意。 |
retry | object | 任意。 |
compat_signature | object | 任意。 |
ordering | string | 任意。nonefifo |
body_format | string | 任意。standard{ type, timestamp, data })rawdata |
secret | string | 任意。whsec_…) |
レスポンス: 201 Endpoint とsecretpoller_urlhttp のnull)
- URL は
https (ポート 443 または 8443) を 指定します。 - IP アドレスを
直接指定した URL、 社内向けの ホスト名、 社内アドレスに 解決される ホスト名、 名前解決できない ホスト名には 422 を 返します。 - 1 つの
顧客アカウントに 登録できる エンドポイントは 20 個までです。 超えると 422 を 返します。
エンドポイントの詳細
GET /v1/endpoints/{id}スコープ: logs:read
レスポンス: Endpoint とrecent: AttemptRow[]・retrying_count・waiting_countordering: fifo の0)recoverynull)poller_urlhttp のnull)
エンドポイントの更新
PATCH /v1/endpoints/{id}スコープ: endpoints:write
パラメーターurl・event_types・statusactive / paused)description・retry・compat_signature・ordering・body_format。Endpoint。
pausedにした エンドポイントへの 配信は 保留されます。 activeに戻すと、 今月と 先月の 保留分を まとめて 配信します。 - 自動で
無効化された エンドポイント ( disabled)は、 statusをactiveにすると 再開します。 retryにnullを指定すると 既定値に 戻り、 compat_signatureにnullを指定すると 解除されます。 orderingをfifoからnoneに戻すと、 順番待ちの 配信を 直ちに 配信します。 typeは作成後に 変更できません (422) 。 - 署名シークレット
( secret)は 更新では 指定できません (422) 。 署名シークレットの ローテーション で変更してください。
エンドポイントの削除
DELETE /v1/endpoints/{id}スコープ: endpoints:write
レスポンス: 204。
署名シークレットのローテーション
POST /v1/endpoints/{id}/rotate-secretスコープ: endpoints:write
レスポンス: { secret }。
エンドポイントへのテスト送信
POST /v1/endpoints/{id}/testスコープ: messages:send
この
| パラメーター | 型 | 説明 |
|---|---|---|
event_type | string | 任意。webhook.test |
payload | object | 任意。data |
payloadを省略した 場合、 Webhook の エンドポイントには { "test": true, "endpoint_id": … }を送信します。 チャット (Slack・Teams・Chatwork・Google Chat) の エンドポイントには、 題 「テストメッセージ」 ・本文 「Webhook Admin からの テスト送信です。 この 送信先に 通知が 届く ことを 確認できました。 」 の メッセージを 送信します (組織の 通知の 言語が 英語の 場合は 英語) 。 - トランスフォーメーションは、
通常の メッセージと 同じく 配信時に 適用されます。 - テスト送信は
月間上限の 対象外で、 テスト環境での 送信と 同じく 1 環境 1 日 1,000 通までです。 - エンドポイントが
自動で 無効化されている ( disabled)場合は、 409 endpoint_disabledを返します。
レスポンス: 202 { message_id }。
エンドポイントの接続テスト
POST /v1/destinations/testスコープ: endpoints:write
| パラメーター | 型 | 説明 |
|---|---|---|
endpoint_id | string | 任意。 |
type | string | endpoint_id を |
destination | object | endpoint_id を |
fixed_ip | boolean | 任意。 |
レスポンス: { ok, via, response_status, duration_ms, error, response_head, ref }。webhook.test)
トランスフォーメーションの取得
GET /v1/endpoints/{id}/transformationスコープ: logs:read
レスポンス: { endpoint_id, code, updated_at, enabled, variables }。not_found を
トランスフォーメーションの保存
PUT /v1/endpoints/{id}/transformationスコープ: endpoints:write
| パラメーター | 型 | 説明 |
|---|---|---|
code | string | function handler(webhook) を |
enabled | boolean | 任意。false でtrue で |
variables | object | 任意。webhook.env にnull で |
レスポンス: { endpoint_id, code, updated_at, enabled, variables }。enabled: false のみのhandler がfields.code)
トランスフォーメーションの解除
DELETE /v1/endpoints/{id}/transformationスコープ: endpoints:write
レスポンス: 204。
トランスフォーメーションのテスト
POST /v1/endpoints/{id}/transformation/testスコープ: endpoints:write
| パラメーター | 型 | 説明 |
|---|---|---|
code | string | 任意。 |
payload | any | 任意。data。{ "test": true, "endpoint_id": … } |
event_type | string | 任意。webhook.test |
variables | object | 任意。webhook.env に |
transformations_params | object | 任意。webhook.transformationsParams に |
レスポンス: { result: "send", method, url, headers, payload, changed, logs }・{ result: "cancel", logs }・{ result: "error", error: { kind, message }, logs } のlogs にはconsole.log の
メッセージの取得(ポーリング)
GET /v1/poller/{endpoint_id}スコープ: ポーリングトークンsk_poll_…。
| クエリ | 型 | 説明 |
|---|---|---|
iterator | string | 任意。iterator。 |
limit | number | 任意。 |
event_type | string | 任意。event_types の |
after | string | 任意。iterator が |
channel | string | 任意。 |
レスポンス: { data: PolledMessage[], iterator, done }。done: true は、Authorization: Bearer sk_poll_… を
互換パスの
ポーリングトークンの一覧
GET /v1/endpoints/{id}/poller-tokensスコープ: logs:read
レスポンス: { items: PollerToken[] }
ポーリングトークンの作成
POST /v1/endpoints/{id}/poller-tokensスコープ: endpoints:write
パラメーター: name
レスポンス: 201 PollerToken とtokensk_poll_…。http の
ポーリングトークンの削除
DELETE /v1/endpoints/{id}/poller-tokens/{token_id}スコープ: endpoints:write
レスポンス: 204。
一括再送信
POST /v1/endpoints/{id}/recoverスコープ: messages:retry
| パラメーター | 型 | 説明 |
|---|---|---|
since | number | Unix ミリ秒。 |
レスポンス: 202 Recovery。
- この
エンドポイントへの 配信が 失敗で 終わった ものを、 同じ メッセージ (同じ webhook-id)の まま 再送信します (一括再送信) 。 - エンドポイントが
自動で 無効化されている ( disabled)場合は 409 endpoint_disabled、一時停止中 ( paused)の 場合は 409 conflictを返します。 再開してから 呼び出してください。 - 1 つの
エンドポイントで 同時に 実行できる 一括再送信は 1 つだけです。 実行中は 409 conflictを返します。
一括再送信の状態
GET /v1/endpoints/{id}/recoveries/{recovery_id}スコープ: logs:read
レスポンス: Recovery。status はrunningdonestopped
イベントタイプの一覧
GET /v1/event-typesスコープ: 不要
レスポンス: { items: EventType[] }
イベントタイプの登録
POST /v1/event-typesスコープ: endpoints:write
| パラメーター | 型 | 説明 |
|---|---|---|
name | string | イベントタイプ。_ . : - で |
description | string | 任意。 |
レスポンス: 201 EventType。name のconflict を
登録した
ソースの一覧
GET /v1/sourcesスコープ: logs:read
レスポンス: { items: Source[], next_cursor }
ソースの作成
POST /v1/sourcesスコープ: endpoints:write
| パラメーター | 型 | 説明 |
|---|---|---|
name | string | 1〜100 文字 |
provider | string | stripe・github・shopify・slack・meta・zoom・standard・hmac・basic・api_key・none |
consumer_id | string | 配信先の |
secret | string | 任意。standard のwhsec_…。 |
config | object | 任意。SourceConfig |
status | string | 任意。activepaused |
レスポンス: 201 Source。url がplan_limit、
ソースの詳細
GET /v1/sources/{id}スコープ: logs:read
レスポンス: Source。secret_hint)
ソースの更新
PATCH /v1/sources/{id}スコープ: endpoints:write
パラメーター: name・provider・consumer_id・status・configSource。
providerを変更すると、 署名シークレットは 解除されます。 新しい サービスの 署名シークレットを 署名シークレットの 登録 で登録してください。 providerを変更して configを省略すると、 その providerの既定の 設定が 適用されます。 configを指定すると、 設定を 置き換えます。 - 署名シークレットは
署名シークレットの 登録 で再登録します ( secretを指定すると 422) 。 status: pausedにすると 受信した リクエストを 保留します。 activeに戻すと 再開し、 保留した リクエストを 配信します (一時停止) 。
ソースの削除
DELETE /v1/sources/{id}スコープ: endpoints:write
レスポンス: 204。
署名シークレットの登録
PUT /v1/sources/{id}/secretスコープ: endpoints:write
| パラメーター | 型 | 説明 |
|---|---|---|
secret | string | null | 各サービスのstandard はwhsec_…、null で |
レスポンス: Source。null を
ソースの受信ログ
GET /v1/sources/{id}/requestsスコープ: logs:read
クエリcursor・limit・statusaccepted・duplicate・rejected・held の{ items: SourceRequest[], next_cursor }
status | 説明 |
|---|---|
accepted | 受付済み。message_id は |
duplicate | 重複。message_id は |
rejected | 拒否。reason に |
held | 保留。 |
methodは受信した メソッド ( POST・PUT・PATCH・DELETE・GET)です。 processed_atは、保留または 拒否した リクエストを 後から 処理した 時刻です (未処理の 場合は null)。 reprocessable: trueのリクエストは 拒否した リクエストの を再処理 実行できます。 headersには受信した ヘッダーが 入ります (認証情報・Cookie などは 除きます) 。
拒否したリクエストの再処理
POST /v1/sources/{id}/requests/{request_id}/reprocessスコープ: messages:send
拒否したSourceRequest。
- 受け付けると
accepted(または duplicate)に なり、 月間配信数に 数えます。 一時停止中の ソースでは heldになります。 - 検証に
失敗した 場合は rejectedのままで、 reasonとprocessed_atを更新します。 - 拒否以外の
リクエストと、 ボディが 保存されていない リクエスト ( reprocessable: false)には 409、 ログ保存期間を 過ぎたリクエストには 404 を 返します。
受信 URL
POST /in/{token}スコープ: 受信 URL
送信元サービスが
| HTTP | 説明 |
|---|---|
| 200 | 受付済み。{ "id": "msg_…" }{ "status": "held", "request_id": "sreq_…" } を |
| 401 | 署名のWWW-Authenticate: Basic 付き) |
| 402 | プランの |
| 403 | 組織がhub.verify_token が |
| 404 | 受信 URL が |
| 405 | POST・PUT・PATCH・DELETE 以外のmeta の |
| 413 | ボディが |
| 429 | 1 つのnone のretry-after 付き) |
拒否した{ "error": "<英語の理由>" } ですinvalid signature・invalid credentials・invalid API key・timestamp outside the tolerance・signing secret is not set)
再送信ポリシー
再送信回数とretry)
| 項目 | 設定値 |
|---|---|
count | 0・1・2・3・5・7・120 は |
interval | progressive1m・5m・30m・1h・6h |
{ "retry": { "count": 3, "interval": "5m" } }- 既定値は
count: 7・interval: progressiveです(初回配信を 含めて 最大 8 回、 約 28 時間) 。 retry: nullで既定値に 戻ります。 - 初回配信から
最後の 再送信までが 3 日を 超える 組み合わせは 設定できません (422) 。 該当するのは progressiveと12の組み合わせです。 - 失敗が
5 日間続いた エンドポイントの 自動無効化は、 再送信ポリシーとは 別に 判定します。 - 失敗が
続いている エンドポイントへの 配信は、 一定 時間停止します。 その間の 配信は 行わずに 再送信回数に 数え、 再送信ポリシーに 従って 次の 時刻に 再送信します。 再送信回数を 使い切ると 失敗と なります。
順序保証
エンドポイントごとに、ordering: fifo、none)
{ "ordering": "fifo" }- 同時に
配信するのは 1 通のみです。 前の 1 通が 配信成功または 失敗で 完了するまで、 次の 1 通は 配信しません。 - 配信順序は
API が 202 を 返した 順です。 前の メッセージの 202 を 受け取ってから 送信した メッセージは、 必ず後に 配信されます。 - 前の
1 通が 失敗し続けている間は、 後続の 配信も 待機します。 前の 1 通は 再送信ポリシーに 従って 再送信し、 回数を 使い切ると 失敗と して 次へ 進みます。 - 後続が
待機している間は、 アラートに 待機件数を 記載します。 エンドポイントの 詳細 ( waiting_count)でも 確認できます。 - 失敗した
配信を 再送信すると (個別・一括とも) 、 現在待機中の 配信の 後に 配信します。 - 一時停止中に
受け付けた 配信も 順序を 保持し、 再開すると 先頭から 順に 配信します。 noneに戻すと、 待機中の 配信を 直ちに 並行して 配信します。 fifoに設定する 前に 受け付けた 配信は、 順序保証の 対象外です。 - 順序保証は
エンドポイント単位です。 同じ メッセージの 他の エンドポイントには 影響しません。 - 1 通ずつ配信する
ため、 配信速度は 受信側の 応答時間に 依存します。
Webhook 以外のエンドポイント
エンドポイントのtype をhttp 以外にbody_format: raw のdata
{
"consumer_id": "con_…",
"type": "sqs",
"destination": {
"region": "ap-northeast-1",
"account_id": "123456789012",
"queue_name": "orders",
"credentials": { "access_key_id": "AKIA…", "secret_access_key": "…" }
}
}type | destination | credentials | 署名と |
|---|---|---|---|
sqs | region・account_id・queue_name | access_key_id・secret_access_key | メッセージの |
eventbridge | region・event_busdefault)sourcewebhookadmin)detail_type | SQS と | なし |
pubsub | project_id・topic | service_account | メッセージの |
s3 | region・bucket・prefix | SQS と | オブジェクトの |
r2 | account_id・bucket・prefix | R2 の | オブジェクトの |
gcs | bucket・prefix | HMAC キーまたはservice_account | オブジェクトの |
azure_blob | account・container・prefix | account_key | BLOB のwebhook_id など) |
servicebus | namespace・entity | key_name・key | メッセージの |
kafka | url/ をcluster_id・topic | api_key・api_secret | レコードの |
rabbitmq | urlvhost/)exchange・routing_key | username・password | メッセージの |
slack | なし | webhook_url | 署名なし |
teams | なし | webhook_url | 署名なし |
chatwork | room_id | api_token | 署名なし |
google_chat | なし | webhook_url | 署名なし |
- 署名と
ID は、 webhook-id・webhook-timestamp・webhook-signature・event-typeとして、 配信先の サービスが 保持できる 場所に 格納します。 受信側は Webhook と 同じ SDK で ペイロードを 検証できます (チャットには 付与しません) 。 - 配信先の
ホストは、 regionなどの値から 各事業者の 公式エンドポイントを 組み立てます。 Kafka と RabbitMQ の urlは、エンドポイント URL と 同じ 制約 (https・ポート 443 または 8443・社内アドレスは 不可) です。 - オブジェクトストレージには、
1 通を 1 つの オブジェクト <prefix><年>/<月>/<日>/<メッセージの ID>.jsonとして 保存します。 再送信時は 同じ 名前で 上 書きします。 - 認証情報は
暗号化して 保存し、 API では 返しません。 返すのは マスクした ヒント ( destination.credentials_hint)のみです。 更新時に credentialsを省略すると、 現在の 認証情報を 使用します。 Kafka と RabbitMQ で urlのホストを 変更する 場合は、 認証情報を 再入力してください。 - 再送信・再送信ポリシー・順序保証・トランスフォーメーション
(ペイロードの 変更と キャンセルのみ) ・アラート・固定送信元 IP は、 Webhook と 同様に 機能します。 2xx が 返っても 配信先が 受け付けなかった もの (EventBridge の 失敗エントリなど) は 失敗と して 扱います。 - 配信試行の
viaはエンドポイントの 種類 ( sqsなど)、 refは配信先が 返した ID (SQS の MessageId・オブジェクト名・Kafka の パーティションと オフセットなど) です。 - エンドポイントの
接続テスト で、保存前に 1 通送信して 接続を 確認できます。 typeには、互換の 種類名 ( eventBridge・googleCloudPubSub・amazonS3・googleCloudStorage・azureBlobStorage・rabbitMq)も 指定できます。
チャット(Slack・Teams・Chatwork・Google Chat)
チャットには、databody_format: raw のdata がtext がtitletext・lineslinktext がdata の
{
"consumer_id": "con_…",
"type": "chatwork",
"destination": {
"room_id": "123456789",
"credentials": { "api_token": "…" }
}
}
// ペイロードの data(またはトランスフォーメーション後のペイロード)
{
"title": "請求書が支払われました",
"text": "INV-1024 が支払われました(12,000 円)",
"lines": ["顧客: 株式会社サンプル", "支払い方法: カード"],
"link": "https://example.com/invoices/INV-1024"
}- Slack: Incoming Webhook の
URL ( https://hooks.slack.com/services/T…/B…/…)を webhook_urlに指定します。 - Teams: チャネルの
[ワークフロー]で 「Webhook 要求を 受信したら チャネルに 投稿する」 テンプレートから 作成した URL ( *.powerplatform.com・*.logic.azure.com)を webhook_urlに指定します。 フローの 実行権限は 「すべての ユーザー」 に 設定してください。 Adaptive Card 形式で 投稿します。 旧 Office 365 コネクタの URL ( webhook.office.com)は 使用できません。 - Chatwork: 右上の
利用者名 →[サービス連携] →[API トークン]で 発行した トークンを api_tokenに、投稿先の チャット ID を room_idに指定します。 個人向け以外の プランでは、 組織管理者の 承認が 必要です。 - Google Chat: スペース名の
横の メニュー → [アプリと 統合] →[Webhook を 追加]で 作成した URL ( https://chat.googleapis.com/v1/spaces/…/messages?key=…&token=…)を webhook_urlに指定します。 件名は 太字、 リンクは <URL|ホスト名>の形式で 投稿します。 Google Workspace の 管理者が Webhook を 制限している 場合は 利用できません。 - トランスフォーメーションで
webhook.payload.data = { text: … }( body_format: rawの場合は webhook.payload = { text: … })のように 指定すると、 投稿する メッセージを 指定できます。 - 署名は
付与しません。 URL と API トークンが シークレットの 役割を 果たします。 - URL や
トークンが 無効に なった 場合 (Slack の 403・404・410、 Teams の 401・403・404・410、 Chatwork の 401・403・404、 Google Chat の 401・403・404) は 再送信せず、 直ちに エンドポイントを disabledにして、 理由 ( disabled_reason)を 添えて 無効化の アラートを 送ります。 認証情報を 修正してから statusをactiveに戻してください。 - 400・413 の
場合は、 その 1 通のみ 再送信せずに 失敗とします (エンドポイントは 無効化しません) 。 429 の 場合は Retry-After(Chatwork は x-ratelimit-reset)の 時刻以降に、 最長 1 時間後までに 再送信します (固定送信元 IP から 配信する 場合は 通常の 再送信間隔です) 。 5xx・タイムアウトは 通常どおり再送信します。 - 配信試行の
refはChatwork の メッセージ ID です (Slack・Teams・Google Chat は null)。
他サービスからの移行(Webhook 以外のエンドポイント)
POST /api/v1/app/{app_id}/destination は、type・config・eventTypes・description)app_id にはid またはexternal_id をendpoints:write){ code, detail } のdetail は
互換のtype | Webhook Admin のtype | config の |
|---|---|---|
sqs | sqs | queueUrl からaccessKeyId・secretAccessKey |
eventBridge | eventbridge | region・eventBusName・detailType・アクセスキー |
googleCloudPubSub | pubsub | projectId・topicId・credentials |
amazonS3 | s3 | bucket・region・アクセスキー |
googleCloudStorage | gcs | bucket・credentials |
azureBlobStorage | azure_blob | account・container・accessKey |
rabbitMq | rabbitmq | uri はhttps:/)routingKey |
- メッセージは
1 件ずつ 配信します。 batchSize・maxWaitSecsは指定できますが、 配信には 反映しません。 - ペイロードは
既定で Standard Webhooks の JSON ( body_format: rawの場合は dataの値) です。 署名と ID は 属性や メタデータに 付与し、 Webhook と 同じ SDK で 検証できます。 - RabbitMQ の
amqp://・amqps://には対応していません。 管理プラグインの HTTP API の URL を 指定してください。 roleArn・externalId(IAM ロールの 引き受け) と endpointUrlには対応していません。 アクセスキーを 指定してください。 - SNS・BigQuery・ClickHouse・Snowflake・Redshift・Postgres・OpenTelemetry への
配信には 対応していません。 uidは使用しません。 作成した エンドポイントの ID は ep_…で、取得・更新は エンドポイントの API で 行います。
トランスフォーメーション
エンドポイントごとにfunction handler(webhook) を
function handler(webhook) {
const d = webhook.payload.data;
webhook.payload = { text: `Invoice ${d.id} paid (${d.amount})` };
webhook.headers['x-tenant'] = 'acme';
webhook.url = webhook.url + '?source=webhookadmin';
if (d.amount === 0) webhook.cancel = true;
return webhook;
}| 項目 | 説明 |
|---|---|
payload | 配信する{ type, timestamp, data }body_format: raw のdata |
headers | 追加するwebhook-*・content-type など |
method | POST・PUT・PATCH |
url | スキーム・ホスト・ポートは |
cancel | true でcancelled と |
eventType | イベントタイプ |
env | トランスフォーメーションとvariables{}) |
transformationsParams | メッセージのtransformations_params |
- 配信試行ごとに、
保存されている 元の ペイロードから 実行します。 署名は トランスフォーメーション後の ペイロードで 生成します。 - 例外、
上限超過、 戻り値の 誤りが 発生した 場合は 配信せずに 失敗とし、 再送信しません。 配信試行の errorにtransformation: <種類>: <説明>が記録されます。 コードを 修正してから 再送信してください。 - 1 回の
実行あたりの 処理量と メモリに 上限が あります。 コードは 51,200 文字までです。 外部との 通信は できません。 - トランスフォーメーションに
渡せる ペイロードは 1MB までです。 ソースで 受信した 1MB を 超える ボディには トランスフォーメーションを 適用できず、 配信は 失敗と なります (受信ボディの 転送 )。 variablesは文字列値で 50 個・JSON で 4KB まで、 transformations_paramsはJSON で 4KB までです。 enabled: falseで保存すると、 コードと variablesを保持したまま、 トランスフォーメーションを 適用せずに 配信します。 無効化は 全プランで 可能です。 - トランスフォーメーションで
ペイロードなどを 変更した 配信試行は transform: "changed"になります。 - トランスフォーメーションの
テスト で、配信せずに 結果と console.logの出力を 確認できます。 - 顧客ポータルには
表示されません。
ポーリングエンドポイント
type: polling のsk_poll_…)
curl -H "Authorization: Bearer sk_poll_..." \
"https://api.webhookadmin.com/v1/poller/ep_...?iterator=<前の iterator>&limit=100"{
"data": [
{
"id": "msg_2026092912ab34cd56ef7800",
"event_type": "invoice.paid",
"timestamp": "2026-09-29T03:04:05.000Z",
"payload": { "type": "invoice.paid", "timestamp": "2026-09-29T03:04:05.000Z", "data": { "id": "inv_1" } },
"headers": { "webhook-id": "msg_…", "webhook-timestamp": "1790651045", "webhook-signature": "v1,…" }
}
],
"iterator": "MjAyNi0wOS0yOS4wLjE",
"done": true
}payload・id・headers( webhook-id・webhook-timestamp・webhook-signature)は、 Webhook で 配信する 場合と 同じです。 通信は トークンと TLS で 保護されている ため署名の 検証は 不要ですが、 エンドポイントの 署名シークレットで JSON.stringify(payload)を検証する こともできます。 - 次の
呼び出しに 前回の レスポンスの iteratorを付けると、 前の ページを 受信済みと みなし、 その 配信を successにします(取得時刻は 配信試行 via: "poll"に記録) 。 処理が 完了してから iteratorを保存し、 次回は そこから 取得してください。 - 少なくとも
1 回の 配信 (at-least-once) を 保証します。 前回の iteratorで呼び出すと、 同じ メッセージを 再度返します。 iteratorを付けない 場合は ログ保存期間の 始めから 取得する ため、 必要に 応じて idで重複を 除外してください。 - トークンで
取得できるのは、 発行元の エンドポイントの メッセージのみです。 他の エンドポイントには 403 を 返します。 トークンは 1 つの エンドポイントに つき 5 個まで 作成でき、 削除すると 直ちに 無効に なります。 呼び出しは 1 つの エンドポイントに つき 1 分 あたり 600 回までです。 - ログ保存期間内に
取得されなかった メッセージは、 ログと 一緒に 削除されます。 組織で 設定した 時間 (既定 24 時間) ポーリングされない 場合は、 アラート で 通知します。 - 再送信・
一括再送信・トランスフォーメーション・固定 IP・互換署名・ ordering: fifoには対応していません (受け付けた 順に 取得する ため、 順序は 保証されます) 。 - 一時停止中、
およびプランの ダウングレード後に 受け付けた メッセージは、 この エンドポイントでは 取得できません。 エンドポイントを 削除すると、 未取得の メッセージは cancelledになります。 event_typeで絞り込んだ 場合、 対象外の メッセージも 次の 呼び出しで 受信済みと して 扱います。 - SDK
(Node.js・Python・Go・PHP) の Pollerは、ページを 順に 取得して iteratorを返します。
他サービスからの移行(ポーリングエンドポイント)
互換形式のhttps://api.webhookadmin.com に、sk_poll_… に
| メソッド | パス | 説明 |
|---|---|---|
| GET | / | { data: [{ id, eventType, payload, timestamp }], iterator, done }。payload はdata のbody_format にapp_id にはid またはexternal_id を |
| GET | / | 読み取り位置を |
| POST | …/ | { after }{ iterator }。 |
| GET | / | 送信側のendpoints:write){ token, id, name, createdAt, expiresAt, scopes } を |
| POST | …/ | { expiry?, oldTokenExpiry? }0 を |
- エラーは
{ code, detail }の形式で、 detailは英語です。 形式が 正しくない iteratorには400 invalid_iteratorを返します。 event_type・channel・afterのクエリにも 対応しています (メッセージの 取得 )。 - エンドポイントの
種類には http・pollingのほか、 pollingEndpointも指定できます。 - v2 の
API (offset と commit) には 対応していません。 - Webhook の
エンドポイントの 移行は 他サービスからの 移行 を(Webhook) 参照してください。
他サービスからの移行(Webhook)
署名シークレットwhsec_…)function handler(webhook) 形式の
| 移行元の | Webhook Admin での |
|---|---|
署名シークレットwhsec_…) | エンドポイントのsecret で |
ペイロードdata のみを | エンドポイントにbody_format: "raw" を |
メッセージのPOST /) | POST / でconsumer にexternal_id) |
トランスフォーメーションhandler(webhook)) | 同じwebhook.env・webhook.transformationsParams も |
{
"consumer_id": "con_…",
"url": "https://example.com/webhooks",
"secret": "whsec_…",
"body_format": "raw"
}secretには、whsec_に続けて 標準の base64 で 表した シークレット (デコード後 24〜75 バイト) を 指定します。 whsec_は省略できます。 非対称鍵 ( whsk_・whpk_)には 対応していません (422) 。 - 指定した
署名シークレットは、 自動生成した ものと 同様に 暗号化して 保存します。 表示と ローテーション (ローテーション後 24 時間は 旧シークレットの 署名も 併せて 配信) も 同じ 扱いです。 secretを指定できるのは、 API・MCP・SDK から 作成する 場合です。 管理画面と 顧客ポータルから 作成した 場合は、 新しい 署名シークレットを 生成します。 body_formatは管理画面・API・MCP・SDK・顧客ポータルで 設定できます。 rawの場合も 署名は webhook-id・webhook-timestamp・webhook-signatureヘッダーに付与し、 計算方法は Standard Webhooks の 仕様どおりです。
トランスフォーメーションは、
| メソッド | パス | 説明 |
|---|---|---|
| GET | / | { code, enabled, variables, updatedAt }。code・variables・updatedAt はnull、enabled はfalselogs:read) |
| PATCH | 同じ | { code?, enabled?, variables? } → 204。code はnull でendpoints:write) |
| POST | …/ | { code, eventType, payload, variables? } → { url, payload, method, cancel }。payload はendpoints:write) |
app_idには顧客アカウントの idまたはexternal_idを指定し、 API キーで 認証します。 enabled: falseにすると、 コードと variablesを保持したまま、 トランスフォーメーションを 適用せずに 配信します。 body_format: "raw"のエンドポイントでは、 webhook.payloadはdataの値です。 - これらの
API の エラーは { code, detail }の形式で、 detailは英語です。 422 の 場合は fields(項目名は camelCase) も 返します。 - 互換パスの
うち、 メッセージの 送信や 配信ログの 取得など Webhook Admin で 提供していない ものは、 404 not_foundを返します。 送信と ログの 取得には /v1のAPI を ご利用ください。
移行元との
- トランスフォーメーションで
変更できるのは URL の パスと クエリのみで、 ホストは 変更できません。 - トランスフォーメーションでは、
webhook-*・content-typeなど配信に 使う ヘッダーは 設定できません。 - Webhook 以外の
エンドポイントには、 メッセージを 1 件ずつ署名付きで 配信します。 - 顧客ポータルでは
トランスフォーメーションを 設定できません。 送信側で 設定してください。 - トランスフォーメーションで
配信を キャンセルした 場合、 配信ログには 失敗ではなく cancelledとして 記録されます。
一括再送信
エンドポイントのwebhook-id)
- 管理画面
- エンドポイントの
詳細 - API
POST /v1/endpoints/{id}/recover(パラメーターと レスポンス )- MCP
recover_endpoint・get_recovery- 顧客ポータル
- 顧客が
自身の エンドポイントに ついて 実行できます
- キューで
段階的に 配信します (10 秒ごとに 50 通) 。 エンドポイントの 同時接続数が 上限に 達している間は 待機します。 - 対象は、
開始時点で 失敗と なっていた 配信です。 開始後に 失敗した ものや、 個別に 再送信した ものは 含みません。 - 自動で
無効化されていた ( disabled)間の メッセージは、 その エンドポイント宛ての 配信が 作成されていないため対象外です。 一時停止中 ( paused)の 配信は 保留されており、 再開時に 配信します。 - 実行中に
エンドポイントを 一時停止・無効化・ 削除すると、 その 時点で 終了します ( stopped)。 - 使用量には
数えません。
アラートの条件
アラートupdate_alert_conditions で
| 条件 | 設定値 | 既定 |
|---|---|---|
| 配信の | 初回の | 60 分 |
| 自動無効化 | 失敗が | — |
| 再送信待ちの | 環境の | 1,000 通 |
| 使用量 | 今月の | 80% |
| ポーリングされていない | ポーリングエンドポイントが | 24 時間 |
- 配信の
失敗は、 どの 設定でも 再送信回数を 使い 切った 時点で 通知します。 同じ エンドポイントの アラートは 1 時間に 1 回までです。 - 同じ
組織への 配信失敗の アラートは、 1 時間に 1 通まで 即時に 送ります。 その 1 時間内に 失敗し始めた 他の エンドポイントは、 1 時間ごとに 1 通に まとめて 送ります。 - 再送信待ちの
件数は、 エンドポイント単位ではなく 環境全体の 合計で 判定します。 - 組織の
owner には、 この 条件とは 別に、 使用量が 月間上限の 80%・100% に 達した ときに メールで 通知します。
ソース(他サービスからの Webhook の受信)
Stripe・GitHub・Shopify・Slack・Meta・Zoom・LINE などのPOST /v1/messages で
POST /v1/sources
{ "name": "Stripe", "provider": "stripe", "consumer_id": "con_…" }
HTTP/1.1 201 Created
{ "id": "src_…", "provider": "stripe", "status": "active",
"url": "https://api.webhookadmin.com/in/…", "secret_hint": null, … }- 受信 URL
https://api.webhookadmin.com/in/{token}。ソースごとに 発行し、 送信元サービスの Webhook 設定に 登録します (レスポンス) - 配信先
- ソースごとに
指定する 顧客アカウント ( consumer_id)。 自社用の 顧客アカウントを 作成し、 社内システムを エンドポイントと して 登録する 使い方が 一般的です - 受け付ける
リクエスト - POST・PUT・PATCH・DELETE
(GET は Meta の サブスクリプション確認のみ) 。 ボディは 10MB までで、 JSON・フォーム・テキスト・バイナリの いずれも 受け付けます - 署名シークレット
- 送信元サービスの
管理画面から コピーして 登録します。 管理画面と API には、 マスクした ヒント ( secret_hint)のみを 表示します。 再登録後も 24 時間は、 以前の 署名シークレットを 受け付けます - レート制限
- ソースごとの
受信回数に 上限は 設けていません。 乱用防止の ため、 1 つの ソースに 10 秒間で 1,000 回を 超えて 届いたリクエストには、 429 と retry-afterを返します。 署名を 検証しない ソース ( none)は、 API の 1 分 あたりの レート制限の 対象にも 含めます - ソース数
- Free 1・Starter 5・Pro 20・Business 無制限
(組織内の すべての 環境の 合計)
Stripe
- ソースを
作成します ( provider: stripe)。 署名シークレットは 後から 登録できます。 - ソースの
受信 URL を コピーします。 - Stripe ダッシュボードの
ワークベンチの 「Webhook」 タブで 「イベント送信先を 作成」 を 選択します。 受信する イベントを 選び、 送信先の タイプに 「Webhook エンドポイント」 を 選択して、 エンドポイント URL に 受信 URL を 入力します。 - 作成した
エンドポイントの ページで 「シークレットを 表示」 を 押し、 署名シークレット ( whsec_…)を コピーして、 ソースの 署名シークレットに 登録します (管理画面または 署名シークレットの 登録 )。
GitHub
- ソースを
作成し ( provider: github)、 推測されにくい文字列を 決めて 署名シークレットに 登録します。 - リポジトリまたは
組織の 「Settings」 › 「Webhooks」 › 「Add webhook」 で、 Payload URL に 受信 URL、 Content type に application/json、Secret に 同じ 文字列を 入力します。 - 受信する
イベントを 選択して 保存します。 追加直後に 届く pingも、イベントタイプ pingのメッセージと して 受け付けます。
Shopify
- ソースを
作成します ( provider: shopify)。 - アプリの
Webhook サブスクリプション ( shopify.app.tomlまたはAdmin API) で、 Webhook の URL に 受信 URL を 指定します。 ストアの 管理画面の 「設定」 › 「通知」 › 「Webhook」 で 作成する 場合も 同様で、 形式は JSON を 選択します。 - 署名シークレットには、
アプリで 購読した Webhook の 場合は アプリの クライアントシークレットを 登録します。 ストアの 管理画面で 作成した Webhook の 場合は、 同じ 画面の Webhook 一覧の 下に 表示される 署名キーを 登録します。
Slack
- ソースを
作成し ( provider: slack)、 Slack アプリの 「Basic Information」 › 「App Credentials」 に ある 「Signing Secret」 を 署名シークレットに 登録します。 「Event Subscriptions」 を 有効にし、 Request URL に 受信 URL を 入力します。 Slack が 送信する 確認リクエスト ( url_verification)には 自動で 応答する ため、 そのまま 確認済みに なります。 - 受信する
イベントを 選択して 保存します。
Meta(Facebook・WhatsApp・Instagram)
- ソースを
作成し ( provider: meta)、 アプリの 「App settings」 › 「Basic」 に ある 「App secret」 を 署名シークレットに 登録します。 サブスクリプションの 確認に 使う 文字列を 決め、 config.verify_tokenに登録します。 - アプリの
Webhooks の 設定 (WhatsApp は 「WhatsApp」 › 「Configuration」 、 WhatsApp の ユースケースで 作成した アプリは 「Use cases」 › 「Customize」 › 「Configuration」 ) で、 コールバック URL に 受信 URL、 認証トークン (Verify token) に 同じ 文字列を 入力します。 - Meta が
送信する サブスクリプションの 確認 (GET の hub.mode=subscribe)には、 hub.verify_tokenがconfig.verify_tokenと一致すれば hub.challengeをtext/plain で 返します。 一致しない 場合と 未設定の 場合は 403 を 返します。 - 受信する
フィールドを 購読します。 イベントタイプは、 ペイロードの objectとentry[0].changes[0].fieldを連結した ものです (例 whatsapp_business_account.messages)。
{
"provider": "meta",
"config": { "verify_token": "…" }
}Zoom
- ソースを
作成し ( provider: zoom)、 Zoom App Marketplace の アプリの 「Features」 › 「Access」 に 表示される 「Secret Token」 を 署名シークレットに 登録します。 - 同じ
画面で 「Event Subscription」 を 有効にし、 「Add New Event Subscription」 の 「Event notification endpoint URL」 に 受信 URL を 入力して 「Validate」 を 押します。 Zoom が 送信する 確認リクエスト ( endpoint.url_validation)には、 plainTokenとencryptedTokenで自動で 応答します。 - 受信する
イベントを 選択して 保存します。 イベントタイプは ペイロードの eventです(例 meeting.started)。
LINE
- ソースを
作成し ( provider: hmac)、 下記の configを指定します。 LINE Developers コンソールの チャネルの 「チャネル基本設定」 タブに ある 「チャネルシークレット」 を 署名シークレットに 登録します。 - チャネルの
「Messaging API設定」 タブで、 Webhook URL に 受信 URL を 入力し、 「Webhookの 利用」 を オンに します。 「検証」 を 押すと 届く リクエスト ( eventsが空) は、 イベントタイプ inboundのメッセージと して 受け付けます。
{
"provider": "hmac",
"config": {
"header": "x-line-signature",
"encoding": "base64",
"event_type_field": "events.0.type"
}
}Standard Webhooks
Standard Webhooks 形式webhook-id・webhook-timestamp・webhook-signature)provider: standard でsvix-id・svix-timestamp・svix-signature もwebhook-、svix- のwhsec_…)
独自の HMAC 署名
ボディのprovider: hmac でconfig で
{
"provider": "hmac",
"config": {
"header": "x-signature",
"encoding": "hex",
"prefix": "sha256=",
"event_type_field": "event",
"id_header": "x-delivery-id"
}
}Basic 認証
Basic 認証のprovider: basic でconfig.username に、WWW-Authenticate: Basic を
{
"provider": "basic",
"config": { "username": "webhook" }
}API キー
API キーをprovider: api_key でconfig.headerconfig.prefix。"Bearer ")config.query に
{
"provider": "api_key",
"config": { "header": "authorization", "prefix": "Bearer " }
}署名をprovider: none で
ソースの設定
| 項目 | 対象 | 説明 |
|---|---|---|
header | hmac・api_key | 署名ヘッダー名hmac ではapi_key では |
query | api_key | キーのheader またはquery の |
encoding | hmac | hexbase64 |
prefix | hmac・api_key | 値のsha256=・"Bearer ") |
username | basic | ユーザー名 |
verify_token | meta | サブスクリプション確認でhub.verify_token と |
event_type_field | hmac・basic・api_key・none | イベントタイプを. でdata.type・events.0.type) |
id_header | hmac・basic・api_key・none | 重複判定に |
event_type | すべて | イベントタイプをinbound) |
forward_headers | すべて | エンドポイントへ |
response | すべて | 受付時の |
署名の検証
provider | 検証する | 時刻 |
|---|---|---|
stripe | Stripe-Signature | 5 分以内 |
github | X-Hub-Signature-256 | — |
shopify | X-Shopify-Hmac-Sha256 | — |
slack | X-Slack-Signature・X-Slack-Request-Timestamp | 5 分以内 |
meta | X-Hub-Signature-256 | — |
zoom | x-zm-signature・x-zm-request-timestamp | 5 分以内 |
standard | webhook-id・webhook-timestamp・webhook-signaturesvix-id・svix-timestamp・svix-signature) | 5 分以内 |
hmac | config.header で | — |
basic | AuthorizationBasic …) | — |
api_key | config.header のconfig.query の | — |
受信した
次の
- Slack の
url_verification:{ "challenge": "…" } - Zoom の
endpoint.url_validation:{ "plainToken": "…", "encryptedToken": "…" } - Meta の
サブスクリプション確認 (GET) : hub.challengeの値 (text/plain)
イベントタイプと重複判定
provider | イベントタイプ | 重複判定 |
|---|---|---|
stripe | ペイロードのtypeinvoice.paid) | ペイロードのidevt_…) |
github | X-GitHub-Event とaction をpull_request.opened) | X-GitHub-Delivery |
shopify | X-Shopify-Topicorders/ はorders.create) | X-Shopify-Webhook-Id |
slack | ペイロードのevent.typetype) | ペイロードのevent_id |
meta | ペイロードのobject とentry[0].changes[0].field をfield がobject) | ペイロードの |
zoom | ペイロードのevent | ペイロードの |
standard | ペイロードのtype | webhook-idsvix-id) |
hmac・basic・api_key・none | config.event_type_field の | config.id_header の |
- イベントタイプを
取得できない 場合は config.event_type(既定 inbound)を 使います。 /は.に、使用できない 文字は _に置き換え、 100 文字までに 切り 詰めます。 - 同じ
配信 ID の リクエストには、 24 時間は 最初の メッセージの ID を 返します。 送信元サービスに よる 再送信は 1 通の メッセージに まとめ、 受信ログでは duplicateになります。 - JSON の
ボディは、 その 値を メッセージの dataにします。フォームや テキストの ボディは { "content_type": "…", "body": "<ボディの文字列>" }にします。 - 受信した
ヘッダーは 受信ログで 確認できます。 エンドポイントへの 配信には、 その エンドポイントの 署名シークレットで 生成した 署名を 付けます。
受付時のレスポンス
受付時{ "id": "msg_…" }{ "status": "held", "request_id": "sreq_…" })config.response で
"config": {
"response": {
"status": 200,
"content_type": "application/xml",
"body": "<Response></Response>"
}
}| 項目 | 説明 |
|---|---|
status | 200〜299 |
content_type | 既定値はtext/ |
body | 4KB まで |
URL 確認リクエストへの
受信ボディの転送
エンドポイントのbody_format)raw のapplication/octet-stream)webhook-id・webhook-timestamp・webhook-signature)standard の{ type, timestamp, data } を
config.forward_headers にraw のstripe-signature など)
"config": {
"forward_headers": ["stripe-signature"]
}- Webhook Admin が
付与する ヘッダー (署名・Content-Type・User-Agent) と、 トランスフォーメーションで 追加した ヘッダーが 優先されます。 - 認証・Cookie・ボディと
接続に 関わる ヘッダーや、 webhook-で始まる ヘッダーなど、 配信に 使う ヘッダーは 指定できません (422) 。 - トランスフォーメーションには、
従来どおり解析済みの ペイロード ( webhook.payload)を 渡します。 トランスフォーメーションで ペイロードを 変更した 場合は 変更後の JSON を、 URL や ヘッダーのみを 変更した 場合は 受信した ボディを そのまま 配信します。 - トランスフォーメーションに
渡せる ペイロードは 1MB までです。 1MB を 超える ペイロードの 配信は、 トランスフォーメーションを 適用せずに 失敗と なり、 再送信しません (配信試行の errorはtransformation: input_too_large: …)。 トランスフォーメーションを 解除または 修正してから、 再送信してください。 - Webhook 以外の
エンドポイントには、 UTF-8 と して 読める ボディは その 文字列を、 読めない ボディは dataのJSON を 配信します。 ポーリングエンドポイントは、 従来どおり dataのJSON です。 - 受信した
ボディが ログ保存期間を 過ぎて 残っていない 場合は、 dataのJSON を 配信します。
一時停止
一時停止中の{ "status": "held", "request_id": "sreq_…" }。
- 再開
( status: active)すると、 保留した リクエストを 受信順に メッセージに して 配信します。 重複判定は 受付時と 同じです。 - 再開後に
届いたリクエストは 直ちに 処理する ため、 保留分の 処理が 終わるまでは、 保留した リクエストと 順序が 前後する ことがあります。 保留した リクエスト同士は 受信順です。 - 保留件数は、
ソースの heldと、管理画面の ソースの 一覧・詳細で 確認できます。 受信ログでは heldと表示されます。 - 保留した
リクエストは、 処理した 時点で 月間配信数に 数えます。 処理時に 月間上限を 超えていた リクエストは 拒否と なり、 再処理 できます。 - プランの
ログ保存期間を 過ぎた 保留分は 削除されます。
受信は
再処理
拒否したreprocess_source_request)
- 署名の
時刻は 受信時刻で 検証します。 署名の 時刻から 5 分以内に 受信していれば、 署名シークレットを 後から 登録しても 検証に 成功します。 - 再処理できるのは、
ボディが 保存されている 拒否済みの リクエスト ( reprocessable: true)です。 ボディが 10MB を 超えて 拒否した リクエストと GET の リクエストは 対象外です (409) 。 - 受け付けた
メッセージは 月間配信数に 数えます。 一時停止中の ソースでは 保留に なります。
月間配信数とログ
- 受け付けた
1 通を、 月間配信数の 1 通と して 数えます。 重複・拒否した リクエスト・URL 確認リクエストと、 エンドポイントが 無く 配信しない メッセージ ( no_endpoint)は 対象外です。 テスト環境の ソースは、 テスト環境の 1 日の 上限に 数えます。 - 受信した
リクエストは ソースごとの 受信ログに 記録され、 プランの ログ保存期間中は 確認できます (ソースの 受信ログ )。 拒否した リクエストの 記録は、 ソースごとに 1 分 あたり 60 件までです。 - ソースから
作成した メッセージは、 メッセージの 詳細の sourceに、ソースの ID・名前と 受信ログの ID ( request_id)が 入ります。 - プランの
ダウングレードで ソース数が 上限を 超えた 場合は、 作成順で 上限を 超えた 分の ソースが 402 を 返します。 ソースを 削除するか、 プランを 戻すと 受付を 再開します。
型
MessageRow = { id, event_type, consumer: { id, external_id, name }, created_at,
status: 'success' | 'retrying' | 'failed' | 'pending' | 'cancelled' | 'no_endpoint',
attempts, endpoint_url }
MessageDetail = { id, event_type, consumer, created_at, idempotency_key, payload, deliveries: Delivery[],
source: { id, name, request_id } | null }
Delivery = { id, endpoint_id, url, status: 'pending' | 'success' | 'retrying' | 'failed' | 'cancelled' | 'waiting',
attempt_count, next_attempt_at, attempts: AttemptRow[],
endpoint_status: 'active' | 'paused' | 'disabled' | null }
AttemptRow = { id, at, response_status, response_head, duration_ms, error,
via: 'direct' | 'relay' | 'poll' | DestinationType, source_ip,
transform: 'changed' | 'error' | null, ref: string | null }
/* error: null | 'timeout' | 'connect_failed' | 'dns_failed' | 'blocked_ip' | 'blocked_url: …'
| 'relay_failed' (fixed IP) | 'circuit_open' | 'wait_limit' | 'transformation: <kind>[: <detail>]'
| the destination's own reason (e.g. 'kafka: …') */
Consumer = { id, external_id, name, created_at, endpoint_count }
Endpoint = { id, consumer_id, url: string | null, description, event_types: string[] | null, fixed_ip,
status: 'active' | 'paused' | 'disabled', disabled_reason, failing_since, created_at,
retry: RetryPolicy, compat_signature: CompatSignature | null,
ordering: 'none' | 'fifo', transformation_updated_at: number | null,
type: 'http' | 'polling' | DestinationType, destination: object | null,
last_polled_at: number | null, body_format: 'standard' | 'raw' }
DestinationType = 'sqs' | 'eventbridge' | 'pubsub' | 's3' | 'r2' | 'gcs' | 'azure_blob'
| 'servicebus' | 'kafka' | 'rabbitmq' | 'slack' | 'teams' | 'chatwork' | 'google_chat'
RetryPolicy = { count: 0 | 1 | 2 | 3 | 5 | 7 | 12,
interval: 'progressive' | '1m' | '5m' | '30m' | '1h' | '6h' }
CompatSignature = { header, content: 'body' | 'timestamp_body', encoding: 'hex' | 'base64', prefix }
Recovery = { id, endpoint_id, since, status: 'running' | 'done' | 'stopped',
total, queued, created_at, finished_at }
EventType = { name, description, archived_at }
PollerToken = { id, endpoint_id, name, prefix, created_at, last_used_at }
Transformation = { endpoint_id, code, updated_at, enabled: boolean,
variables: Record<string, string> | null }
PolledMessage = { id, event_type, timestamp, payload /* body_format: raw なら data */,
headers: { 'webhook-id', 'webhook-timestamp', 'webhook-signature' } }
Source = { id, name, provider: SourceProvider, consumer_id, consumer: { id, external_id, name },
status: 'active' | 'paused', url, secret_hint: string | null, config: SourceConfig,
held, created_at, updated_at }
SourceProvider = 'stripe' | 'github' | 'shopify' | 'slack' | 'meta' | 'zoom' | 'standard'
| 'hmac' | 'basic' | 'api_key' | 'none'
SourceConfig = { event_type?, event_type_field?, id_header?, header?, query?, algorithm?: 'sha256',
encoding?: 'hex' | 'base64', prefix?, verify_token?, username?,
forward_headers?: string[], response?: { status, content_type, body } }
SourceRequest = { id, at, method: 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'GET',
status: 'accepted' | 'duplicate' | 'rejected' | 'held', response_status, reason,
message_id, event_type, content_type, size, headers: Record<string, string>,
processed_at: number | null, reprocessable: boolean }