Webhook エンドポイント
Webhook エンドポイント作成
絶対 HTTP(S) URL に Webhook を作成し、production では HTTPS を推奨します。status は active / inactive。subscribed_events は公開イベントまたは ["*"]、max_attempts は 0..5 です。 アカウント用エンドポイントを active で作成する際、同じアカウントに別の active エンドポイントがあると 409 account_webhook_already_exists(40008)になります。 通話イベントの権限はワークスペースの is_beta で決まります。ベータでは subscribed_events の *、空配列、省略に通話イベントも含まれ、個別リストは指定したイベントのみを対象とします。非ベータでもワイルドカードを利用できますが通話イベントは届かず、通話イベントの個別登録は 403 beta_feature_not_enabled になります。配信、再試行、デッドレター再実行のたびに資格を確認し、照会失敗時は許可しません。通常の message.* 通話記録は独立しています。
https://api.unifyport.ai/v1/webhook-endpoints対応チャネル
呼び出す前に
対象ワークスペースの X-Api-Key をサーバー側で使用します。実行前にすべてのプレースホルダーを置き換えます。
アカウント専用エンドポイントの作成・再有効化では、同じ account_id に active のエンドポイントは1つだけ許可されます。競合は 409 account_webhook_already_exists(40008)を返します。inactive の専用エンドポイントとワークスペースのエンドポイントは複数作成できます。既存の active を維持する更新は、過去に複数の active がある設定でも許可されます。
パラメーターの取得元
- account_id
- アカウント作成・取得応答の data.id を使います。識別子は X-Api-Key のワークスペースに属します。 アカウント取得
リクエストパラメータ
ヘッダー
X-Api-Keyワークスペース API キー。このヘッダーからワークスペースを特定します。
Content-TypeJSON のリクエストボディを送る場合は application/json を使用します。
リクエストボディ
account_idbody 内の任意の公開アカウント ID(例: acc_example)。作成時はアカウントに紐付け、省略するとワークスペースのエンドポイントを作成します。更新時は元の紐付けのみを検証し、省略すると既存の帰属を維持します。アカウントの変更、ワークスペースのエンドポイントからアカウントのエンドポイントへの変換、紐付けの解除は不可。query、null、空文字列、空白のみの文字列、重複フィールドは受け付けません。フィールド名は正確に account_id とし、body または query で大文字・小文字の異なる表記や帰属の不一致は 400 invalid_request になります。指定したアカウントが存在しないか現在のワークスペースに属さない場合は 404 account_not_found (20020) になります。 アカウント固有の設定がワークスペース設定より優先されます。無効化や未購読のイベントではワークスペースにフォールバックしません。最後の固有エンドポイントを削除すると、以後の初回配信はワークスペース設定を継承します。 有効化の競合チェックは同じ account_id の別の active エンドポイントのみが対象です。ワークスペース用エンドポイントは対象外です。条件は status を参照してください。
minLength: 1 · pattern: \S
urlWebhook を受け取る絶対 HTTP(S) URL。production では HTTPS を推奨します。
format: uri
statusエンドポイントの状態: active または inactive。active のアカウント用エンドポイントの作成、または inactive→active の変更時に、同じアカウントに別の active エンドポイントがあると 409 account_webhook_already_exists(40008)になります。inactive のアカウント用エンドポイントとワークスペース用エンドポイントは複数設定できます。既存の active エンドポイントを active のまま更新することは、過去の複数 active 設定でも可能です。既存エンドポイントは自動整理されません。
enum: active, inactive
subscribed_events[]公開標準イベントの購読。省略、空配列、または * を含む場合、新たに追加された contact.updated を含むすべての公開イベントを受信しますが、provider.raw_event は含みません。特定のイベントだけを受信するにはイベント名を明示的に列挙してください。
signing_secret任意の Webhook 署名シークレット。サンプルではプレースホルダを使用してください。
retry_policyobjectmax_attempts は初回配信後のリトライ回数です。既定 3、範囲 0〜5、0 は初回配信のみ。
retry_policymax_attempts は初回配信後のリトライ回数です。既定 3、範囲 0〜5、0 は初回配信のみ。
max_attempts初回配信後のリトライ回数(0〜5)。
結果の確認
返された設定を確認します。配信テストにはエンドポイントが active で、対象イベントを購読している必要があります。署名検証は signing_enabled が true の場合に行い、イベント保存後に 2xx を返します。
レスポンス 201 Created
{
"request_id": "<REQUEST_ID>",
"data": {
"id": "we_example",
"url": "https://example.com/webhook",
"status": "active",
"subscribed_events": [
"*"
],
"signing_enabled": true,
"retry_policy": {
"max_attempts": 3
}
}
}
レスポンスボディ
idWebhook エンドポイント識別子(we_...)。
account_idアカウント独自のエンドポイントの公開アカウント ID。ワークスペースのエンドポイントでは省略され、null は返しません。
minLength: 1
urlWebhook 配信を受け取る絶対 HTTP(S) URL。production では HTTPS を推奨します。
format: uri
statusエンドポイントのステータス: active または inactive。
enum: active, inactive
subscribed_events[]エンドポイントに配信される公開標準イベント種別。["*"] は公開イベントをすべて意味し、provider.raw_event は含みません。
signing_enabled署名シークレットが設定され配信が署名される場合は true。
retry_policyobjectmax_attempts は初回配信後のリトライ回数で、既定 3、範囲 0〜5。
retry_policymax_attempts は初回配信後のリトライ回数で、既定 3、範囲 0〜5。
max_attempts設定済みの初回配信後リトライ回数(0〜5)。
レスポンス
201201 Created
リクエスト成功。レスポンスボディの例を参照してください。
400Bad Request
リクエストボディ、パス、またはパラメータが不正です。
401Unauthorized
X-Api-Key ヘッダが欠落しているか無効です。
403Forbidden
リクエストは識別されましたが、この操作は許可されていません。
404Not Found
要求されたリソースが見つかりません。error.code と現在の操作を合わせて確認してください。
409Conflict
要求された操作が、既存のプロバイダアカウントまたはリソースと競合しています。
500Internal Server Error
サービスで予期しないエラーが発生しました。
失敗時の対応
HTTP 状態と error.code/numeric_code を確認し、request_id を保存します。原因に応じてパラメーター修正・認証・状態確認を行い、送信や書き込みの再試行前に前回の結果を確認します。 エラーリファレンス
HTTP ステータス、error.code、error.numeric_code を現在の操作と合わせて確認します。数値コードは文字列です。request_id は調査用で、冪等性キーやタスク ID ではありません。
- invalid_request · 10000 · 400
JSON 本文と必須項目を確認してください。
対処と再試行: 操作とチャネルの条件に従ってパラメーターを修正してから再実行します。同じ無効なリクエストを繰り返しても解決しません。
JSON の例です。message は実際の原因によって変わります · 400 · 10000
{ "request_id": "req_example", "error": { "code": "invalid_request", "numeric_code": "10000", "message": "Invalid request parameters" } }- invalid_target_workspace · 11003 · 400
上書き対象のワークスペースが空、または形式が無効です。上書き用ヘッダーを削除し、対象ワークスペースの API Key を使用してください。
発生条件: ワークスペースを上書きする X-Workspace-Id リクエストヘッダーを送った場合に適用されます。
対処と再試行: 操作とチャネルの条件に従ってパラメーターを修正してから再実行します。同じ無効なリクエストを繰り返しても解決しません。
JSON の例です。message は実際の原因によって変わります · 400 · 11003
{ "request_id": "req_example", "error": { "code": "invalid_target_workspace", "numeric_code": "11003", "message": "Invalid target workspace" } }- invalid_api_key · 11001 · 401
API Key が正しく有効か確認してください。
対処と再試行: request_id と構造化されたコードを保存し、現在の操作を調査してから次の対応を決めます。
JSON の例です。message は実際の原因によって変わります · 401 · 11001
{ "request_id": "req_example", "error": { "code": "invalid_api_key", "numeric_code": "11001", "message": "Invalid API key" } }- missing_api_key · 11000 · 401
X-Api-Key ヘッダーを追加してください。
対処と再試行: request_id と構造化されたコードを保存し、現在の操作を調査してから次の対応を決めます。
例 · 401 · 11000
{ "request_id": "req_xxx", "error": { "code": "missing_api_key", "numeric_code": "11000", "message": "Missing X-Api-Key header" } }- beta_feature_not_enabled · 41002 · 403
通話 API と通話イベントの明示的な購読には、ワークスペースのベータ利用資格が必要です。
対処と再試行: request_id と構造化されたコードを保存し、現在の操作を調査してから次の対応を決めます。
例 · 403 · 41002
{ "request_id": "req_example", "error": { "code": "beta_feature_not_enabled", "numeric_code": "41002", "message": "Beta feature not enabled" } }- workspace_override_forbidden · 11002 · 403
この API Key に許可されていないワークスペースの上書きを要求しています。上書き用ヘッダーを削除し、対象ワークスペースの API Key を使用してください。
発生条件: ワークスペースを上書きする X-Workspace-Id リクエストヘッダーを送った場合に適用されます。
対処と再試行: request_id と構造化されたコードを保存し、現在の操作を調査してから次の対応を決めます。
JSON の例です。message は実際の原因によって変わります · 403 · 11002
{ "request_id": "req_example", "error": { "code": "workspace_override_forbidden", "numeric_code": "11002", "message": "Workspace override is not allowed" } }- account_not_found · 20020 · 404
account_id を確認し、アカウントが属するワークスペースの X-Api-Key を使います。このワークスペースにないアカウントには現在のキーでアクセスできません。
対処と再試行: 対象の識別子、所有範囲、現在のワークスペースを確認します。不存在やアクセス不可が確認された対象を、一時的なサービス障害として自動再試行しないでください。
JSON の例です。message は実際の原因によって変わります · 404 · 20020
{ "request_id": "req_example", "error": { "code": "account_not_found", "numeric_code": "20020", "message": "Account not found" } }- target_workspace_not_found · 11004 · 404
上書きで指定したワークスペースが存在しないか利用できません。所有範囲を確認し、上書き用ヘッダーを削除して対象ワークスペースの API Key を使用します。再試行で権限は増えません。
発生条件: ワークスペースを上書きする X-Workspace-Id リクエストヘッダーを送った場合に適用されます。
対処と再試行: 対象の識別子、所有範囲、現在のワークスペースを確認します。不存在やアクセス不可が確認された対象を、一時的なサービス障害として自動再試行しないでください。
JSON の例です。message は実際の原因によって変わります · 404 · 11004
{ "request_id": "req_example", "error": { "code": "target_workspace_not_found", "numeric_code": "11004", "message": "Target workspace not found" } }- account_webhook_already_exists · 40008 · 409
account_id を指定してアカウント専用エンドポイントを取得し、既存の active を更新します。切り替える場合は、現在の active を無効化してから別のエンドポイントを有効化してください。作成や再有効化を自動再試行しないでください。
対処と再試行: 再送信前にエンドポイント設定とアカウントの範囲を照会します。PATCH は設定を置き換えるため、必要な購読、署名設定、再試行ポリシーを保持してください。active の競合時は既存を更新するか、先に無効化してから別のエンドポイントを有効にします。
例 · 409 · 40008
{ "request_id": "req_example_webhook_conflict", "error": { "code": "account_webhook_already_exists", "numeric_code": "40008", "message": "Account already has an active webhook endpoint" } }- create_webhook_endpoint_failed · 40001 · 500
Webhook エンドポイント作成:未分類のエラーが変更を中断しました。リソースの最終状態を確認する必要があります。
対処と再試行: 再送信前にエンドポイント設定とアカウントの範囲を照会します。PATCH は設定を置き換えるため、必要な購読、署名設定、再試行ポリシーを保持してください。active の競合時は既存を更新するか、先に無効化してから別のエンドポイントを有効にします。
JSON の例です。message は実際の原因によって変わります · 500 · 40001
{ "request_id": "req_example", "error": { "code": "create_webhook_endpoint_failed", "numeric_code": "40001", "message": "Failed to create webhook endpoint" } }