Webhook 通知
Takumi API では、診断などのワークフロー完了時に Webhook で通知を受け取ることができます。これにより、ポーリングを行わなくてもワークフローの完了を検知し、結果の取得や後続処理を自動的に開始できます。
ワークフロー完了イベント
ワークフローの実行が完了すると、指定した Webhook エンドポイントに以下の形式で HTTP POST リクエストが送信されます。イベントの type は api.workflow_run.exited です。
{
"type": "api.workflow_run.exited",
"timestamp": "2000-01-01T00:00:00Z",
"data": {
"workflow_id": "whitebox-assessment",
"workflow_run_id": "TWR..."
}
}
data.workflow_run_id を使ってワークフロー実行を特定し、/o/{org_id}/workflows/{workflow_id}/describe エンドポイントで結果を取得できます。
Webhook エンドポイントの指定方法
ワークフロー実行 API (/o/{org_id}/workflows/{workflow_id}/dispatch) のリクエストボディで notification.webhook_endpoint_ids にエンドポイント ID を指定すると、そのワークフロー完了時に通知が送られます。
{
"input": { /* ... */ },
"notification": {
"webhook_endpoint_ids": ["WH..."]
}
}
Webhook の仕様
イベントが発生した場合に、指定された Webhook エンドポイントに対して HTTP POST リクエストが送信されます。
リクエストボディは以下の構造を持ちます。
{
"type": "{イベント種別}",
"timestamp": "2024-01-01T00:00:00Z",
"data": {/* イベントに応じたデータ */}
}
Webhook エンドポイントは 10 秒以内に HTTP 2xx ステータスコードを返すことで、リクエストの受信成功を示す必要があります。ステータスコードが 3xx の場合は失敗として扱われ、リダイレクト先にリクエストは送られません。
リクエスト送信に失敗した場合(非 2xx レスポンス、タイムアウト、ネットワークエラーなど)、本サービスは自動的にリトライを行います。
Webhook の配送は at-least-once であり、同一イベントが複数回配送される場合があります。各リクエストには webhook-id ヘッダーが付与されており、同一の webhook-id を持つリクエストは同一イベントの再送です。エンドポイントは webhook-id を用いて冪等に実装することをお勧めします。
署名の検証
受信したリクエストが確かに本サービスから送信されたものであることを検証するため、受信時に必ず署名を検証してください。 本サービスは Standard Webhooks 仕様に準拠したリクエストの署名方式を採用しています。
以下は TypeScript での実装例です。
import { Webhook } from "standardwebhooks";
const wh = new Webhook(signingSecret);
// リクエストヘッダーと本文を渡して署名を検証する
wh.verify(requestBody, {
"webhook-id": req.headers.get("webhook-id"),
"webhook-timestamp": req.headers.get("webhook-timestamp"),
"webhook-signature": req.headers.get("webhook-signature"),
});
const payload = JSON.parse(requestBody);