Skip to main content
Agent 連携

Webhooks

Cloud Agents のライフサイクルイベントを HTTP Webhook で購読します。エンドポイント管理、配信動作、対応イベント一覧を説明します。

概要

Webhook は Qoder Cloud Agents が提供するイベント駆動型のプッシュ機構です。Agent や Session などのリソースにライフサイクルの変化が生じると、システムは構造化されたイベントを HTTP POST で開発者が登録した URL に配信します。ポーリングは不要です。 主な特徴:
  • イベント駆動型プッシュ — リソースの状態変化時に能動的に通知し、クライアント側のポーリングは不要
  • envelope 構造 — 統一された BetaWebhookEvent { id, created_at, data, type:"event" } フォーマット
  • 配信セマンティクス — 少なくとも 1 回(at-least-once)の保証、指数バックオフによるリトライ
ユースケース:
シナリオ説明
非同期タスク完了通知Session の完了時に下流のワークフローをトリガーする
Agent 設定の監査Agent の作成/更新/削除操作を追跡する
マルチ Agent オーケストレーションThread の状態変化に応じてサブタスクのスケジューリングを駆動する
運用監視とアラート連続失敗回数がしきい値を超えたときにアラートを発する

ドメインタイプ

このセクションでは Webhook イベントのデータ構造を定義します。各イベントタイプの data フィールドは、リソース ID、イベントタイプ、およびイベント固有の追加フィールドを含む統一されたオブジェクト形式に従います。

Session ライフサイクルイベント

Webhook Session Updated Event Data

  • WebhookSessionUpdatedEventData object { id, type }
    • id: string イベントをトリガーした Session ID。
    • type: "session.updated"
      • "session.updated"
      Session のメタデータ(タイトルや metadata など)が変更されたときにトリガーされます。

Webhook Session Deleted Event Data

  • WebhookSessionDeletedEventData object { id, type }
    • id: string イベントをトリガーした Session ID。
    • type: "session.deleted"
      • "session.deleted"
      Session が永久に削除されたときにトリガーされます。削除後、Session のすべてのデータは復元できなくなります。

Session ステータスイベント

Webhook Session Status Run Started Event Data

  • WebhookSessionStatusRunStartedEventData object { id, type }
    • id: string イベントをトリガーした Session ID。
    • type: "session.status_run_started"
      • "session.status_run_started"
      Agent が実行を開始したときにトリガーされます。Session が実行状態に入り、ユーザーの指示を実行していることを示します。

Webhook Session Status Idled Event Data

  • WebhookSessionStatusIdledEventData object { id, type }
    • id: string イベントをトリガーした Session ID。
    • type: "session.status_idled"
      • "session.status_idled"
      ターンが完了し、Session がアイドル状態に戻ったときにトリガーされます。この時点で Session の最新の出力を安全に読み取ることができます。

Session Thread イベント

マルチ Agent 協調シナリオに適用されます。Thread イベントは基本フィールドに加えて session_thread_id フィールドを持ち、特定の実行スレッドを識別します。

Webhook Session Thread Created Event Data

  • WebhookSessionThreadCreatedEventData object { id, type, session_thread_id }
    • id: string イベントをトリガーした Session ID。
    • type: "session.thread_created"
      • "session.thread_created"
      新しい Session Thread が作成されたときにトリガーされます。メイン Agent がタスクを実行するために子スレッドを生成する、サブ Agent 協調シナリオでよく見られます。
    • session_thread_id: string 関連付けられた Session Thread ID。

Webhook Session Thread Idled Event Data

  • WebhookSessionThreadIdledEventData object { id, type, session_thread_id }
    • id: string イベントをトリガーした Session ID。
    • type: "session.thread_idled"
      • "session.thread_idled"
      Session Thread が実行を終了してアイドル状態に入ったときにトリガーされます。スレッドが現在のタスクを完了し、結果を読み取れることを示します。
    • session_thread_id: string 関連付けられた Session Thread ID。

Webhook Session Thread Terminated Event Data

  • WebhookSessionThreadTerminatedEventData object { id, type, session_thread_id }
    • id: string イベントをトリガーした Session ID。
    • type: "session.thread_terminated"
      • "session.thread_terminated"
      Session Thread が終了(terminate)されたときにトリガーされます。終了された Thread は復元できません。作業を続けるには新しい Thread を作成する必要があります。
    • session_thread_id: string 関連付けられた Session Thread ID。

Agent ライフサイクルイベント

Webhook Agent Created Event Data

  • WebhookAgentCreatedEventData object { id, type }
    • id: string イベントをトリガーした Agent ID。
    • type: "agent.created"
      • "agent.created"
      Agent が正常に作成されたときにトリガーされます。システムは POST /agents により Agent が作成された後にこのイベントを送信します。

Webhook Agent Updated Event Data

  • WebhookAgentUpdatedEventData object { id, type }
    • id: string イベントをトリガーした Agent ID。
    • type: "agent.updated"
      • "agent.updated"
      Agent の設定が更新されたときにトリガーされます。

Webhook Agent Archived Event Data

  • WebhookAgentArchivedEventData object { id, type }
    • id: string イベントをトリガーした Agent ID。
    • type: "agent.archived"
      • "agent.archived"
      Agent がアーカイブされたときにトリガーされます。アーカイブ後、Agent は新しい Session 作成リクエストを受け付けなくなります。

Webhook Agent Deleted Event Data

  • WebhookAgentDeletedEventData object { id, type }
    • id: string イベントをトリガーした Agent ID。
    • type: "agent.deleted"
      • "agent.deleted"
      Agent が削除されたときにトリガーされます。削除後、Agent のすべての設定データは復元できなくなります。

Deployment Run イベント

Deployment Run イベントでは、id は Deployment Run ID です。
  • WebhookDeploymentRunStartedEventData object { id, type: "deployment_run.started" }
  • WebhookDeploymentRunSucceededEventData object { id, type: "deployment_run.succeeded" }
  • WebhookDeploymentRunFailedEventData object { id, type: "deployment_run.failed" }

Webhook エンドポイント API

Webhook エンドポイントを管理するための CRUD エンドポイントです。これらを使用して、Webhook エンドポイントの作成、照会、更新、削除を行うほか、テストイベントの送信やエンドポイントの有効化/無効化の制御を行います。 Base URL:
リージョンアドレス
Globalhttps://api.qoder.com/api/v1/cloud
CNhttps://api.qoder.com.cn/api/v1/cloud
認証: すべてのエンドポイントでは、リクエストヘッダーに Personal Access Token (PAT) または Service Account Token (SAT) が必要です:
Authorization: Bearer $QODER_ACCESS_TOKEN

POST /webhook_endpoints

新しい Webhook エンドポイントを作成します。 リクエストパラメータ:
フィールド必須説明
urlstringはいイベント配信用の、インターネットから到達可能な HTTPS URL。ポート 443 が必須
descriptionstringいいえ管理目的のエンドポイント説明
eventsstring[]はい明示的に指定したイベントタイプのリスト。使用できる値は「サポート対象のイベントタイプ」を参照
レスポンス: 201 Created
{
  "id": "5fc05310-4d9c-447e-a4b8-f124f17e1ff0",
  "url": "https://webhook.site/your-unique-path",
  "description": "quickstart demo",
  "events": ["session.status_idled", "session.thread_idled"],
  "active": true,
  "signing_secret": "whsec_BfJDodFEzmkdjAUf19-_XthSq6KbPKmRjfm9KFWMIuk",
  "created_at": "2026-07-02T18:17:30.069191+08:00"
}
Note: signing_secret は作成時に一度だけ返されます。安全に保管してください。
ステータスコード:
コード説明
201作成成功
400無効なリクエストパラメータ(URL がインターネットから到達可能な HTTPS ポート 443 のアドレスではない、イベントタイプが無効など)
401認証エラー、無効または期限切れのトークン
422セマンティックエラー(URL の重複登録など)
例:
curl -X POST https://api.qoder.com/api/v1/cloud/webhook_endpoints \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://webhook.site/your-unique-path",
    "description": "quickstart demo",
    "events": ["session.status_idled", "session.thread_idled"]
  }'

GET /webhook_endpoints

現在のアカウント配下のすべての Webhook エンドポイントを一覧表示します。 リクエストパラメータ: なし レスポンス: 200 OK
{
  "data": [
    {
      "id": "700e7789-edab-41cb-b60a-210d0df38ab6",
      "url": "https://myapp.example.com/hooks/qoder",
      "description": "prod app hook",
      "events": ["session.status_idled", "session.thread_idled"],
      "active": true,
      "consecutive_fail": 0,
      "last_success_at": "2026-07-02T18:08:12.666783+08:00",
      "created_at": "2026-07-02T17:47:16.073822+08:00",
      "updated_at": "2026-07-02T17:47:16.073822+08:00"
    }
  ]
}
レスポンスフィールド:
フィールド説明
idstringエンドポイントの一意識別子
urlstringイベントを受信する URL
descriptionstringエンドポイントの説明
eventsstring[]購読中のイベントタイプ
activeboolean有効かどうか
consecutive_failinteger連続配信失敗回数
last_success_atstring最後に配信が成功した時刻(RFC 3339)
last_failure_atstring最後に配信が失敗した時刻(RFC 3339)。失敗記録がない場合は null
created_atstring作成時刻(RFC 3339)
updated_atstring最終更新時刻(RFC 3339)
例:
curl https://api.qoder.com/api/v1/cloud/webhook_endpoints \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN"

GET /webhook_endpoints/{id}

特定の Webhook エンドポイントの詳細を取得します。 パスパラメータ:
パラメータ説明
idstringWebhook エンドポイント ID
レスポンス: 200 OK 一覧エンドポイントの要素と同じ構造の単一のエンドポイントオブジェクトを返します。 ステータスコード:
コード説明
200成功
404エンドポイントが見つからない
例:
curl https://api.qoder.com/api/v1/cloud/webhook_endpoints/700e7789-edab-41cb-b60a-210d0df38ab6 \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN"

PUT /webhook_endpoints/{id}

特定の Webhook エンドポイントの設定を更新します。 パスパラメータ:
パラメータ説明
idstringWebhook エンドポイント ID
リクエストパラメータ:
フィールド必須説明
urlstringいいえインターネットから到達可能な HTTPS ポート 443 の配信 URL に更新する
descriptionstringいいえエンドポイント説明を更新する
eventsstring[]いいえ明示的に指定した購読イベントタイプを更新する
レスポンス: 200 OK 更新後の完全なエンドポイントオブジェクトを返します。 ステータスコード:
コード説明
200更新成功
400無効なリクエストパラメータ
404エンドポイントが見つからない
例:
curl -X PUT https://api.qoder.com/api/v1/cloud/webhook_endpoints/700e7789-edab-41cb-b60a-210d0df38ab6 \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "events": ["session.status_idled", "session.thread_idled", "agent.updated"],
    "description": "updated prod hook"
  }'

DELETE /webhook_endpoints/{id}

Webhook エンドポイントを永久に削除します。未配信のイベントはすべて破棄されます。 パスパラメータ:
パラメータ説明
idstringWebhook エンドポイント ID
レスポンス: 204 No Content ステータスコード:
コード説明
204削除成功
404エンドポイントが見つからない
例:
curl -X DELETE https://api.qoder.com/api/v1/cloud/webhook_endpoints/700e7789-edab-41cb-b60a-210d0df38ab6 \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN"

POST /webhook_endpoints/{id}/test

指定したエンドポイントにテストイベントを送信し、接続性とペイロード処理ロジックを確認します。 パスパラメータ:
パラメータ説明
idstringWebhook エンドポイント ID
リクエストパラメータ: なし レスポンス: 202 Accepted
{"event_id": 433, "delivery_rows": 2}
レスポンスフィールド:
フィールド説明
event_idintegerテストイベントの内部 ID
delivery_rowsintegerイベントが公開されたメッセージパーティション数
ステータスコード:
コード説明
202テストイベント送信済み
404エンドポイントが見つからない
例:
curl -X POST https://api.qoder.com/api/v1/cloud/webhook_endpoints/700e7789-edab-41cb-b60a-210d0df38ab6/test \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN"

POST /webhook_endpoints/{id}/enable

無効化された Webhook エンドポイントを有効化します。有効化されると、エンドポイントはイベント配信の受信を再開します。 パスパラメータ:
パラメータ説明
idstringWebhook エンドポイント ID
リクエストパラメータ: なし レスポンス: 200 OK 有効化後のエンドポイントオブジェクト(active: true)を返します。 ステータスコード:
コード説明
200有効化成功
404エンドポイントが見つからない
例:
curl -X POST https://api.qoder.com/api/v1/cloud/webhook_endpoints/700e7789-edab-41cb-b60a-210d0df38ab6/enable \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN"

POST /webhook_endpoints/{id}/disable

Webhook エンドポイントを無効化します。無効化されると、エンドポイントはイベント配信の受信を停止しますが、削除はされません。 パスパラメータ:
パラメータ説明
idstringWebhook エンドポイント ID
リクエストパラメータ: なし レスポンス: 200 OK 無効化後のエンドポイントオブジェクト(active: false)を返します。 ステータスコード:
コード説明
200無効化成功
404エンドポイントが見つからない
例:
curl -X POST https://api.qoder.com/api/v1/cloud/webhook_endpoints/700e7789-edab-41cb-b60a-210d0df38ab6/disable \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN"

GET /webhook_events

監査やトラブルシューティングのために Webhook イベント配信レコードを一覧表示します。 リクエストパラメータ: なし レスポンス: 200 OK 配信ステータス、タイムスタンプなどの情報を含むイベント一覧を返します。 例:
curl https://api.qoder.com/api/v1/cloud/webhook_events \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN"

GET /webhook_events/{id}

単一の Webhook イベントの詳細情報を取得します。 パスパラメータ:
パラメータ説明
idstringWebhook イベント ID
レスポンス: 200 OK ステータスコード:
コード説明
200成功
404イベントが見つからない
例:
curl https://api.qoder.com/api/v1/cloud/webhook_events/433 \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN"

エラーレスポンス形式

すべてのエンドポイントは、エラー発生時に統一されたエラー構造を返します:
{
  "error": {
    "message": "Unknown event type: agent.updated",
    "type": "invalid_request_error"
  },
  "request_id": "cc865161-b25d-4d68-bad5-bf0363f6e0f9",
  "type": "error"
}
エラーフィールド:
フィールド説明
error.messagestring人間が読めるエラー説明
error.typestringエラーカテゴリ(例: invalid_request_errornot_found_error)
request_idstringサポートチームでのトラブルシューティング用のリクエストトレース ID
typestring固定値 "error"
注意: 認証層(Token が無効または欠落している場合など)が返す 401 レスポンスは、ゲートウェイから直接返されるため、上記の業務エラー構造に従わない場合があります。

Webhook 配信

配信方法

システムは、登録済み URL に HTTP POST で次の形式のイベントを配信します:
  • Method: POST
  • Content-Type: application/json
  • Body: JSON envelope 構造(「envelope 構造」を参照)

リクエストヘッダー

各配信には次の HTTP ヘッダーが含まれます:
ヘッダー説明
Content-Typeapplication/json
User-AgentQoderCloudAgents-Webhook/1.0

リトライ戦略

配信が失敗した場合、システムは指数バックオフでリトライします:
試行遅延説明
1 回目即時初回配信
2 回目1 秒1 回目のリトライ
3 回目5 秒2 回目のリトライ
4 回目30 秒最後のリトライ
合計 4 回(初回配信 1 回 + リトライ 3 回)試行します。すべて失敗すると、イベントはデッドレターキューに入ります。

レスポンスコードの処理

レスポンスコード範囲処理
2xx配信成功。イベントを配信済みとしてマーク
4xxリトライせず、イベントを破棄済みとしてマーク(クライアントエラーは開発者側で修正)
5xxリトライを実行(一時的なサーバー障害)
Timeoutリトライを実行(デフォルトのタイムアウトは 30 秒)

自動デグレード

エンドポイントの consecutive_fail20 を超えると、システムはデグレード警告を発します。失敗が継続する場合は、この指標を監視し、次を確認してください:
  • エンドポイント URL に到達できるか
  • SSL 証明書が有効か
  • サーバーが正常に応答しているか

サポート対象のイベントタイプ

現在購読可能で、実際に送信されるイベントを次に示します。events には、この表にあるイベント名を明示的に指定する必要があります。
イベントタイプ追加の data フィールドトリガー条件
session.updatedSession のメタデータが変更された
session.deletedSession が永久に削除された
session.status_run_startedAgent が実行を開始した
session.status_idledターンが完了し、Session がアイドルに戻った
session.thread_createdsession_thread_id新しい Session Thread が作成された
session.thread_idledsession_thread_idThread の実行が終了し、アイドルに移行した
session.thread_terminatedsession_thread_idThread が終了された
agent.createdAgent が作成された
agent.updatedAgent の設定が更新された
agent.archivedAgent がアーカイブされた
agent.deletedAgent が削除された
deployment_run.startedDeployment Run が実行を開始した
deployment_run.succeededDeployment Run が成功した
deployment_run.failedDeployment Run が失敗した

envelope 構造

すべての Webhook イベントは、統一された envelope 構造で配信されます。

基本 envelope 構造

{
  "id": "whe_a1b2c3d4e5f67890",
  "created_at": "2026-07-02T10:02:16Z",
  "type": "event",
  "data": {
    "id": "sess_019f224773fe71d79c5869bd089d159c",
    "type": "session.status_idled"
  }
}

Thread イベントの envelope

Thread イベントは data 内に追加の session_thread_id フィールドを含みます:
{
  "id": "whe_a1b2c3d4e5f67890",
  "created_at": "2026-07-02T10:02:17Z",
  "type": "event",
  "data": {
    "id": "sess_019f224773fe71d79c5869bd089d159c",
    "type": "session.thread_idled",
    "session_thread_id": "sthread_019f224..."
  }
}

フィールドの説明

フィールド説明
idstringwhe_ で始まるイベントの一意識別子。同じイベントの再試行でも値は変わりません
created_atstringイベント作成時刻。RFC 3339 UTC 形式
typestring固定値 "event"。イベント envelope であることを示します
dataobjectトリガーとなったリソース情報を含むイベントペイロード
data.idstringイベントをトリガーしたリソースの ID。Session、Agent、Deployment Run ID など
data.typestringイベントタイプ文字列(例: "session.status_idled""agent.updated"
data.session_thread_idstringThread イベントのみ。関連付けられた Session Thread ID

冪等性の処理

envelope 内の id は重複排除キーとして使用できます。配信セマンティクスは少なくとも 1 回(at-least-once)であるため、同じイベントが複数回配信される可能性があります。受信側では次を実施してください:
  1. id を重複排除の一意キーとして使用する
  2. 処理前に id がすでに消費済みか確認する
  3. イベント処理ロジックを冪等にする

付録 A: クイックスタートガイド

ステップ 1: Webhook エンドポイントを作成する

curl -X POST https://api.qoder.com/api/v1/cloud/webhook_endpoints \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://your-app.example.com/webhooks/qoder",
    "description": "Production webhook",
    "events": ["session.status_idled", "session.thread_idled"]
  }'

ステップ 2: 受信側を実装する

サービスに Webhook 受信エンドポイントを実装し、次を確実に行ってください:
  1. JSON ペイロードを解析し、type に応じてイベントを処理する
  2. イベントの id を使用して冪等な重複排除を行う
  3. 受信確認として 200 OK を返す
  4. ビジネスロジックを非同期に処理する(タイムアウトを回避するため)

ステップ 3: テストイベントを送信する

curl -X POST https://api.qoder.com/api/v1/cloud/webhook_endpoints/{id}/test \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN"

ステップ 4: 検証して本番稼働する

テストイベントが正しく受信されることを確認したら、本番運用を開始できます。

付録 B: ベストプラクティス

プラクティス説明
冪等処理イベントの id を使用して重複排除を行い、重複処理を防ぐ
高速応答受信側は 5 秒以内に 2xx を返し、時間のかかる処理は非同期に実行する
正確な購読必要なイベントタイプのみを購読し、不要なネットワーク負荷を減らす