For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
メインナビゲーション

Webhook

Webhook を使って OpenAI API からリアルタイムで更新通知を受け取ります。

OpenAI の Webhook を使うと、バッチの完了、バックグラウンドでのレスポンス生成、ファインチューニングジョブの終了など、API のイベントに関する通知をリアルタイムで受け取れます。Webhook は、Standard Webhooks 仕様に従って、管理下の HTTP エンドポイントに配信されます。Webhook イベントの全一覧は、API リファレンスで確認できます。

API プロジェクトのミスアラインメントの監視に関する通知を受け取るには、プロジェクトの安全性アラートの受信をご覧ください。

Agents API のセッションイベントと復旧パターンについては、セッションの Webhookをご覧ください。Webhook の受信側には、このページのエンドポイントのセットアップ、署名検証、配信に関するガイダンスを適用してください。

Webhook イベントの API リファレンス

Webhook イベントの全一覧を確認できます。

以下に、OpenAI からの Webhook のうち、response.completed イベントを受信できるサーバーの例を示します。

Ruby の例では、 gem install openai webrick で必要な依存関係をインストールしてから、OPENAI_API_KEYOPENAI_WEBHOOK_SECRET を設定します。

Webhook サーバー
import os
from openai import OpenAI, InvalidWebhookSignatureError
from flask import Flask, request, Response

app = Flask(__name__)
client = OpenAI(webhook_secret=os.environ["OPENAI_WEBHOOK_SECRET"])


@app.route("/webhook", methods=["POST"])
def webhook():
    try:
        # with webhook_secret set above, unwrap will raise an error if the signature is invalid
        event = client.webhooks.unwrap(request.data, request.headers)

        if event.type == "response.completed":
            response_id = event.data.id
            response = client.responses.retrieve(response_id)
            print("Response output:", response.output_text)

        return Response(status=200)
    except InvalidWebhookSignatureError as e:
        print("Invalid signature", e)
        return Response("Invalid signature", status=400)


if __name__ == "__main__":
    app.run(port=8000)

このような Webhook の動作を確認するには、OpenAI ダッシュボードで response.completed を購読する Webhook エンドポイントを設定し、API リクエストを送信してバックグラウンドモードでレスポンスを生成します。

Webhook 設定ページから、サンプルデータを使ったテストイベントを発生させることもできます。

バックグラウンドでのレスポンス生成
from openai import OpenAI

client = OpenAI()

resp = client.responses.create(
    model="gpt-6-astra",
    input="Write a very long novel about otters in space.",
    background=True,
)

print(resp.status)

このガイドでは、ダッシュボードで Webhook エンドポイントを作成する方法、Webhook を処理するサーバー側のコードを設定する方法、受信したリクエストが OpenAI から送信されたことを検証する方法を説明します。

Webhook エンドポイントの作成

サーバーで Webhook リクエストの受信を開始するには、ダッシュボードにログインし、Webhook 設定ページを開きます。Webhook はプロジェクトごとに設定します。

「作成」ボタンをクリックして、新しい Webhook エンドポイントを作成します。設定する項目は次の 3 つです。

  • エンドポイントの名前(自分で識別するためのもの)
  • 管理下のサーバーの公開 URL
  • 購読する 1 つ以上のイベントタイプ。これらのイベントが発生すると、OpenAI は指定された URL に HTTP POST リクエストを送信します。
Webhook エンドポイントの編集ダイアログ

新しい Webhook を作成すると、受信する Webhook リクエストをサーバー側で検証するための署名シークレットが発行されます。この値は再表示できないため、後で使えるように保存してください。

Webhook エンドポイントを作成したら、次に、受信するイベントのペイロードを処理するサーバー側のエンドポイントを設定します。

サーバーでの Webhook リクエストの処理

購読しているイベントが発生すると、Webhook の URL に次のような HTTP POST リクエストが届きます。

POST https://yourserver.com/webhook
user-agent: OpenAI/1.0 (+https://platform.openai.com/docs/webhooks)
content-type: application/json
webhook-id: wh_685342e6c53c8190a1be43f081506c52
webhook-timestamp: 1750287078
webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=
{
  "object": "event",
  "id": "evt_685343a1381c819085d44c354e1b330e",
  "type": "response.completed",
  "created_at": 1750287018,
  "data": { "id": "resp_abc123" }
}

エンドポイントは、これらの HTTP リクエストを受信したら、正常に受信したことを示す成功ステータスコード(2xx)を速やかに返す必要があります。タイムアウトを避け、エンドポイントがすぐに応答できるよう、時間のかかる処理はバックグラウンドワーカーに任せることをお勧めします。 エンドポイントが成功ステータスコード(2xx)を返さない場合や、数秒以内に応答しない場合は、Webhook リクエストが再試行されます。OpenAI は指数バックオフを使い、最大 72 時間にわたって配信を試みます。なお、3xx リダイレクトには追従せず、失敗として扱います。エンドポイントは最終的な宛先 URL を使うように更新してください。

まれに、内部システムの問題により、OpenAI が同じ Webhook イベントを重複して配信することがあります。webhook-id ヘッダーを冪等性キーとして使うと、重複を排除できます。

ローカルでの Webhook のテスト

Webhook のテストには、インターネットからアクセスできる公開 URL が必要です。通常、ローカル開発環境は公開されていないため、開発が難しくなることがあります。次のような選択肢が役立ちます。

Webhook 署名の検証

検証を行わなくても OpenAI から Webhook イベントを受信して結果を処理できますが、受信したリクエストが OpenAI から送信されたことを検証する必要があります。特に、Webhook によってバックエンドで何らかの操作を行う場合は重要です。Webhook リクエストとともに送信されるヘッダーには、Webhook のシークレットキーと組み合わせて、Webhook の送信元が OpenAI であることを検証できる情報が含まれています。

OpenAI ダッシュボードで Webhook エンドポイントを作成すると、署名シークレットが発行されます。次のように、サーバー上の環境変数として設定してください。

export OPENAI_WEBHOOK_SECRET="<your secret here>"

Webhook 署名を検証する最も簡単な方法は、公式 OpenAI SDK のヘルパーにある unwrap() メソッドを使うことです。

OpenAI SDK による署名の検証
import os

from flask import request
from openai import OpenAI

client = OpenAI()
webhook_secret = os.environ["OPENAI_WEBHOOK_SECRET"]

# will raise if the signature is invalid
event = client.webhooks.unwrap(
    request.data,
    request.headers,
    secret=webhook_secret,
)

Standard Webhooks ライブラリを使って署名を検証することもできます。

Standard Webhooks ライブラリによる署名の検証
$webhook_secret = getenv("OPENAI_WEBHOOK_SECRET");
$wh = new \StandardWebhooks\Webhook($webhook_secret);
$wh->verify($webhook_payload, $webhook_headers);

また、必要に応じて、Standard Webhooks 仕様の説明に従って署名検証を独自に実装することもできます。

署名シークレットを紛失したり、誤って公開したりした場合は、署名シークレットをローテーションすることで、新しいものを生成できます。