Open in
イベントカタログ
ThunderPhone が送信するすべてのWebhookイベントタイプ。
すべての webhook 本文には type フィールドがあり、その値はこのページにあるイベント
タイプのいずれかです。エンドポイントをサブスクライブする場合、
events 配列には必要なイベントタイプを含める必要があります(すべてをサブスクライブするには
空にします。ただし、ターンごとのイベント telephony.turn /
web.turn は例外で、明示的に指定したエンドポイントにのみ配信されます)。
これらのイベントには 2 種類の配信形式があります。
- エンドポイント配信は常に再試行を伴う非ブロッキング通知です。任意の 2xx で応答してください。エンベロープには重複排除に使用する
event_idが含まれます。 - ブロッキング交換は、レガシー単一 URL webhookでのみ実行されます。
telephony.incoming/web.incomingの設定リクエスト(webhook モードの電話番号: 再試行 1 回を含めて 13 秒、webhook モードのウィジェットキー: 10 秒)と、webhook モードのツールディスパッチです。応答内容がライブ通話を制御します。
以下のペイロード例は、ワイヤ順序のエンドポイントエンベロープを示しています
(キーはアルファベット順です: data、event_id、type)。レガシー配信では、
event_id を除いた同じ data が送信されます。
通話イベント
telephony.incoming
着信通話がいずれかの電話番号に到達したときに送信されます。エンドポイント配信は、番号がエージェント設定済みか webhook 設定済みかにかかわらず、すべての着信通話に対して送信されるファイアアンドフォーゲット通知です。エージェントが割り当てられていない番号には、従来の webhook で ブロッキング 構成リクエストも送信されます。リクエスト / レスポンスの完全なスキーマは、telephony.incoming / web.incomingを参照してください。
{
"data": {
"call_id": 987654321,
"from_number": "+14155550199",
"to_number": "+15551234567"
},
"event_id": "3f6b2ad0-1c9e-4a57-9f2b-8f6f0f9d2f11",
"type": "telephony.incoming"
}| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合に通話を処理したエージェント |
telephony.complete
着信または発信の電話通話が終了したときに送信されます。ノンブロッキングです。文字起こし、利用可能な場合は録音 URL、請求概要が含まれます。ペイロードのスキーマは、telephony.complete / web.completeを参照してください。
| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合に通話を処理したエージェント |
telephony.tool
電話通話で関数ツールが呼び出された後に送信されます。ノンブロッキングの監査通知です。このイベントが配信される時点でツールはすでに実行されており、独自の関数ツールおよび組み込みの send_sms ツールが対象です(他の組み込みツール、ナレッジベース、アプリ接続、MCP ツールは対象外です)。send_sms では、arguments.to と arguments.body の両方が [REDACTED] になります。完了時の文字起こしでもこれらは伏せ字になります。コンテンツと送信先は、レスポンスの message_id を使用して組織スコープの SMS リソースから取得してください。
{
"data": {
"arguments": { "date": "2026-04-21" },
"call_id": 987654321,
"from_number": "+14155550199",
"response": {
"response": { "available_slots": ["9:00 AM", "2:00 PM"] },
"status": 200
},
"to_number": "+15551234567",
"tool_name": "search_appointments"
},
"event_id": "1f0a7c3e-52d4-4a0e-8f4b-b1a6a1c0d9e2",
"type": "telephony.tool"
}response は実行結果です。成功時は {"status": <http status>, "response": <your endpoint's JSON>}、失敗時は
{"status": <status>, "error": "<message>"} です。
| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合に通話を処理したエージェント |
telephony.turn
電話通話が進行中に、発話を含む各ターンごとにリアルタイムで送信されます。エージェントの音声による完了応答と、発信者の文字起こしされたターンが対象です。GET /v1/calls/{call_id}/transcriptをポーリングする代わりに、通常の webhook を介してライブ会話を追跡できます。ノンブロッキングです。
{
"data": {
"call_id": 987654321,
"entry_type": "completion",
"from_number": "+14155550199",
"position": 7,
"role": "assistant",
"start_ms": 15200,
"text": "How many employees does your company have?",
"to_number": "+15551234567"
},
"event_id": "8d3f5a2c-7b1e-4c9a-b6d0-2e4f6a8c0d1e",
"type": "telephony.turn"
}| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合に通話を処理したエージェント |
position | integer | 通話履歴におけるターンのインデックス。並び順を決める安定した識別子 |
role | string | assistant(エージェントの発話)または user(発信者の発話) |
text | string | 送信時点で認識されているターンの文字起こしテキスト |
entry_type | string | 基になる履歴エントリのタイプ。completion(エージェント)、または user_turn / span(発信者) |
start_ms, end_ms | integer | 通話開始からのミリ秒単位の音声オフセット。送信時点ですでに再生タイミングが判明している場合にのみ存在 |
web.incoming
telephony.incoming のウェブチャネル版で、ウェブウィジェットセッションまたはビルダーのマイクテスト通話が開始されたときに送信されます。エンドポイント配信は、すべてのウェブセッションに対するファイアアンドフォーゲットです。mode="webhook" の公開可能キーには、従来の webhook で ブロッキング 構成リクエストも送信されます。このブロッキングリクエストの形式は異なり(origin_domain、publishable_key_prefix、電話番号なし)、詳細はtelephony.incoming / web.incomingを参照してください。
{
"data": {
"call_id": 987654322,
"from_number": "web",
"origin_domain": "https://example.com",
"publishable_key_prefix": "pk_live_a1b2",
"to_number": "+15551234567"
},
"event_id": "9a2b4c6d-8e0f-4a1b-9c2d-3e4f5a6b7c8d",
"type": "web.incoming"
}from_number は常にリテラル値の "web" です。webhook モードのウィジェットセッションでは to_number は空です(セッションのエージェント番号は構成後に割り当てられます)。ビルダーのマイクテスト通話では、origin_domain と publishable_key_prefix は空です。
| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合に通話を処理したエージェント |
web.complete
telephony.complete のウェブチャネル版で、ウェブウィジェット通話(direction: "web")とビルダーのマイクテスト通話(direction: "test")が対象です。ノンブロッキングです。telephony.completeと同じペイロード形式に加え、origin_domain が含まれ、from_number は "web" に設定されます。
| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合に通話を処理したエージェント |
web.tool
telephony.tool のウェブチャネル版です。data には from_number / to_number ではなく origin_domain が含まれます。
| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合に通話を処理したエージェント |
web.turn
telephony.turnのウェブチャネル版で、ウェブウィジェット通話とビルダーのマイクテスト通話が対象です。ペイロード形式は同じですが、from_number / to_number の代わりに origin_domain が含まれます。telephony.turn と同様に、明示的なサブスクリプションが必要です。空の events 配列を通じて配信されることはありません。
| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合に通話を処理したエージェント |
call.transfer_completed
通話ごとに1回、通話転送の最終結果とともに送信されます。結果はコールド転送、またはエージェントが離脱した後にウォーム転送で残る人同士のブリッジです。
ブロッキングは行われず、エンドポイントにのみ配信されます(従来の単一 URL Webhook には配信されません)。通話の telephony.complete の後に到着します。つまり、通信事業者が通話を引き継いだ時点、転送に失敗した時点、または ThunderPhone が通話をブリッジした場合はブリッジ終了時点です。
{
"data": {
"agent_id": 12,
"agent_name": "Front desk",
"bridge_kind": "cold_fallback",
"bridge_seconds": 255,
"bridge_total_cents": 5,
"call_id": 987654321,
"destination": "+15555550102",
"sip_status": 403,
"transfer_outcome": "bridged"
},
"event_id": "5b0f6c1e-9d2a-5e7b-8c4d-1a2b3c4d5e6f",
"type": "call.transfer_completed"
}| フィールド | 型 | 説明 |
|---|---|---|
call_id | integer | 転送された通話 |
agent_id | integer | null | 割り当てられていた場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられていた場合に通話を処理したエージェント |
transfer_outcome | string | refer_accepted: 通信事業者が通話を引き継ぎました。bridged: 通信事業者がコールド転送を拒否した場合、またはウォーム転送のエージェントが離脱した場合に、ThunderPhone が発信者と転送先の接続を維持しました。bridge_unanswered: 通信事業者がコールド転送を拒否し、転送先が ThunderPhone 自身の通話に応答しませんでした。failed: 転送は完了せず、通話が終了しました。 |
destination | string | null | 通話の転送先番号 |
sip_status | integer | null | 通信事業者がコールド転送を拒否した際の SIP ステータス: 403(たとえば、通話転送に対応していない Twilio トランク)、405、または 501。通信事業者が拒否しなかった場合は null |
bridge_kind | string | null | bridged の場合のみ: cold_fallback(ThunderPhone が接続した、拒否されたコールド転送)または warm(エージェント離脱後のウォーム転送における2人) |
bridge_seconds | integer | null | bridged の場合のみ: ThunderPhone が請求したブリッジ時間(秒) |
bridge_total_cents | integer | null | bridged の場合のみ: 無料通話クレジット適用後のブリッジ料金(米ドルセント)。通話の billing_total_cents とは別に請求されます。 |
同じ値は通話オブジェクトにも
transfer_outcome、transfer_destination、transfer_sip_status、
transfer_bridge_kind、transfer_bridge_seconds、
transfer_bridge_total_cents として含まれます。event_id は通話のすべての配信で同一です。そのため、同じレポートが繰り返されても2つ目のイベントは生成されません。
SMS イベント
SMS イベントは、組織に接続された Twilio または Telnyx アカウントを通じて送信されたメッセージを示します。メッセージ本文は省略され、to はマスクされます。内容または宛先が必要な場合は、
GET /v1/sms/{message_id} で組織スコープのメッセージを取得します。
sms.sent
顧客の通信事業者が送信 SMS リクエストを受け付けたときに送信されます。これは端末への配信確認ではありません。
{
"data": {
"accepted_at": "2026-09-19T15:42:10.113Z",
"agent_id": 12,
"call_id": 987654321,
"created_at": "2026-09-19T15:42:09.901Z",
"direction": "outbound",
"error_code": null,
"error_message": null,
"from_number": "+15551234567",
"id": "313a3117-827b-46e9-a01a-ac1493838724",
"provider": "twilio",
"provider_id": "SM0123456789abcdef0123456789abcdef",
"segment_count": 1,
"source": "agent_tool",
"status": "accepted",
"to": "[REDACTED]"
},
"event_id": "0ae347b4-1716-45bb-9a0e-b52373586e37",
"type": "sms.sent"
}sms.failed
通信事業者による恒久的な拒否後、一時的な失敗に対する再試行がすべて尽きた後、または結果が最終的に不明な場合に送信されます。error_code は安定した ThunderPhone コードであり、対応可能な場合は error_message に顧客が取るべき操作が示されます。status: "unknown" は、通信事業者が SMS を受け付けた可能性があることを意味します。ThunderPhone は自動的に再送しないため、通信事業者ログで照合してください。
sms.received
受信 SMS サポート用に予約されています。現行リリースでは sms.received イベントは送信されません。受信通信事業者 webhook の設定と署名検証は別途提供予定です。
音声イベント
カスタム音声の作成は非同期です。これらの非ブロッキングイベントにより、 クローン詳細エンドポイントをポーリングする代わりに、最終結果に対応できます。
voice.ready と voice.failed は、events: [] を持つ組織全体のエンドポイントにのみ配信されます。明示的なイベントフィルターとして選択することはできません。
voice.ready
カスタム音声の処理が完了し、エージェントに割り当て可能になったときに送信されます。
{
"data": {
"voice": {
"created_at": "2026-07-30T14:12:08.317Z",
"display_name": "Support voice",
"failure_reason": "",
"gender": "female",
"id": "cv_2f6f90b0e9a34ee8b39be7d1",
"language": "en",
"name": "custom:cv_2f6f90b0e9a34ee8b39be7d1",
"status": "ready",
"updated_at": "2026-07-30T14:13:31.605Z"
}
},
"event_id": "2d5f0a61-e9b5-4a3c-b684-29d7d9e4b214",
"type": "voice.ready"
}voice.failed
カスタム音声の処理が恒久的な失敗に至ったときに送信されます。
{
"data": {
"reason": "audio sample could not be processed",
"voice": {
"created_at": "2026-07-30T14:12:08.317Z",
"display_name": "Support voice",
"failure_reason": "audio sample could not be processed",
"gender": "female",
"id": "cv_2f6f90b0e9a34ee8b39be7d1",
"language": "en",
"name": "custom:cv_2f6f90b0e9a34ee8b39be7d1",
"status": "failed",
"updated_at": "2026-07-30T14:13:31.605Z"
}
},
"event_id": "3493e985-1a75-4f77-a10a-e74af440cd31",
"type": "voice.failed"
}| フィールド | 型 | 説明 |
|---|---|---|
voice.id | string | カスタム音声の公開 ID |
voice.name | string | custom:<public_id> 形式のエージェント音声値 |
voice.display_name | string | 組織向けの音声名 |
voice.language | string | クローンの単一言語コード |
voice.gender | string | male、female、または空文字列 |
voice.status | string | voice.ready では ready、voice.failed では failed |
voice.failure_reason | string | 成功時は空。失敗時は処理失敗の詳細 |
voice.created_at, voice.updated_at | timestamp | ISO 8601 タイムスタンプ |
reason | string | 失敗の詳細。voice.failed にのみ含まれます |
品質イベント
call.graded
通話のAI評価実行が完了するたびに送信されます。非ブロッキングです。
{
"data": {
"call_id": 987654321,
"grade": {
"call_outcome": "success",
"created_at": "2026-04-20T18:25:11.002Z",
"detected_issues": [],
"graded_at": "2026-04-20T18:25:11.002Z",
"grader_model": "heuristic-v1",
"id": 5512,
"score": 92,
"status": "completed",
"summary": "Caller asked about their policy and got a full answer…"
},
"report": null
},
"event_id": "7c1d2e3f-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
"type": "call.graded"
}| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合に通話を処理したエージェント |
grade.id | integer | 評価 ID |
grade.score | integer | null | 0~100 |
grade.call_outcome | string | success、failure、unknown、または no_conversation |
grade.summary | string | 1段落の要約 |
grade.detected_issues | array | 評価器が検出した問題の文字列 |
grade.status | string | 常に completed。完了した実行のみが送信されます |
grade.grader_model | string | 結果を生成した評価器(例: heuristic-v1) |
grade.graded_at, grade.created_at | timestamp | |
report | object | null | 顧客向けの通話レポート: 結果ラベル、要対応フラグと理由、発信者、1行の要約、発信者体験。初期のヒューリスティック評価では、これは null、またはフィールドがプレースホルダーである pending レポートです。完全な評価のイベントには完了したレポートが含まれます |
call.data_extracted
構造化データの抽出が正常に完了するたびに送信されます。これには、telephony.complete / web.complete 後の遅延リトライ、または POST /v1/calls/{call_id}/extract による手動再実行も含まれます。非ブロッキングです。
ブロッキング抽出モードでは、通常、完了イベントは75秒の抽出予算を超えて待機しません。抽出ワーカープロセスが失われた場合、プロダクションの完了処理ドレインは5分ごとに実行され、次の抽出試行を開始する前に blocking_deadline_at を過ぎた完了を解放します。その後の成功は、このイベントとして別途配信されます。
{
"data": {
"call_id": 987654321,
"agent_id": 12,
"agent_name": "Acme intake",
"extracted_data": {
"status": "completed",
"fields": {
"customer_name": "Alex Morgan",
"appointment_date": "2026-04-23"
},
"evidence": {
"customer_name": {
"quote": "My name is Alex Morgan",
"speaker_role": "caller",
"turn_index": 4
},
"appointment_date": {
"quote": "April 23 works for me",
"speaker_role": "caller",
"turn_index": 7
}
},
"verification": "verified",
"field_reasons": {},
"schema_version": "92850758e231a3c95a..."
},
"extracted_at": "2026-04-20T18:25:11.002Z",
"model": "<model id>",
"summary": "Alex Morgan called to book a follow-up visit and confirmed Thursday, April 23."
},
"event_id": "4d79ef1d-c2b1-4ed6-85b8-8326bd2895ef",
"type": "call.data_extracted"
}| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合に通話を処理したエージェント |
summary | string | null | エージェントで 通話の要約を生成 が有効な場合の完了済み通話要約。遅延した抽出イベントでも、完了ウィンドウに間に合わなかった要約が配信されます。それ以外の場合は null です。要約はあるものの抽出フィールドがないエージェントでは、このイベントは送信されません。遅延した要約は GET /v1/calls/{call_id} から取得してください |
extracted_data.status | string | このイベントでは常に completed |
extracted_data.fields | object | 設定済みの抽出フィールドキーをキーとする値。利用できない値は null |
extracted_data.evidence | object | 抽出フィールドをキーとする根拠。null 以外の値には、構造的に正確性が確認された引用(最大1,000文字)、speaker_role(caller または agent)、および turn_index が含まれます。モデルが返した長すぎる引用は切り詰めずに拒否され、フィールドが null の場合は根拠も常に null です |
extracted_data.verification | string | 独立した根拠検証パスが、候補フィールドごとに有効な判定を厳密に1つ返した場合にのみ verified です。unavailable は、検証パスの失敗、タイムアウト、予算不足、または不正な出力や部分的な出力を意味します。完全に利用不可の検証パスでも、顧客レビュー用に構造的根拠を持つ値は保持されます。部分的な出力では有効な判定が適用され、厳密に1つの有効な判定がない各候補は null に設定されます |
extracted_data.field_reasons | object | 構造的根拠付けまたは独立検証ツールにより null に設定されたフィールドをキーとする理由 |
extracted_data.schema_version | string | この抽出で使用された正確なフィールドスキーマのハッシュ |
extracted_at | timestamp | ISO 8601 完了時刻 |
model | string | 抽出に使用したモデル |
campaign.completed
キャンペーンが running から completed に移行した際に1回送信されます。スケジュールが終了した場合も、すべての連絡先が終端状態に到達した場合も対象です。ランナーのリトライでは別のイベントは送信されません。この組織レベルのライフサイクルイベントは、エージェントスコープのエンドポイントではなく、組織スコープのエンドポイントにのみ配信されます。非ブロッキングです。
{
"data": {
"campaign_id": "3f6b2c9e-2a0d-4c63-b6d6-a708dc98f403",
"name": "May win-back",
"agent_id": 12,
"status": "completed",
"started_at": "2026-04-20T17:00:00Z",
"completed_at": "2026-04-20T18:25:11Z",
"counts": {
"contacts_total": 150,
"completed": 121,
"failed": 11,
"no_answer": 18,
"remaining": 0
}
},
"event_id": "8d8f52ce-6b46-423f-9dde-cea0b91ec135",
"type": "campaign.completed"
}4つの結果カウントは互いに重複せず、合計すると contacts_total になります。completed には成功した連絡先が含まれます。no_answer には、最終結果が応答なしであった終端状態の失敗または試行回数上限到達の連絡先が含まれます。failed には、その他すべての終端状態の失敗または試行回数上限到達の連絡先が含まれます。remaining には、保留中、スケジュール済み、または現在発信中の連絡先が含まれます。リトライ待ちの連絡先は、直近の試行が応答なしであっても remaining です。進行中の通話は、1回限りの完了スナップショットの前に照合されます。started_at は設定済みのキャンペーン開始時刻、開始時刻が設定されていない場合はキャンペーン作成時刻です。
issue.reported
問題レポートが作成されると送信されます。ダッシュボードからユーザーが報告したもの(source: "user")と、通話評価により自動作成されたもの(source: "system")の両方が対象です。非ブロッキングです。
{
"data": {
"call_id": 987654321,
"issue_report": {
"created_at": "2026-04-20T18:25:11.002Z",
"description": "Five-second silence before responding to the main question.",
"id": 4321,
"severity": "warning",
"source": "system",
"status": "open",
"title": "Agent paused too long"
}
},
"event_id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"type": "issue.reported"
}| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合に通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合に通話を処理したエージェント |
issue_report.severity | string | critical、warning、または info |
issue_report.status | string | open または resolved |
issue_report.source | string | user(ダッシュボードから報告)または system(評価により作成) |
issue.escalated
問題パターンがスタッフレビューのためにThunderPhoneへ送信されると送信されます。ThunderPhone に報告 の実行後、または AIで修正 が顧客側での修正を確認できず、自動的に問題をルーティングした場合が対象です。このイベントを受信するのは組織全体のエンドポイントのみです。
{
"data": {
"automatic": false,
"cluster_id": "7ac2844c-2df0-4fa8-a560-7378da649e19",
"escalation_id": "ec99f52b-c8c0-41dd-a4f2-dd8a07b10894",
"status": "open"
},
"event_id": "d8f8f420-7a42-45ba-bcf1-b747f9bbecda",
"type": "issue.escalated"
}| フィールド | 型 | 説明 |
|---|---|---|
automatic | boolean | 自動エスカレーションの場合は true、手動エスカレーションの場合は false |
cluster_id | UUID | エスカレーションされた問題パターン |
escalation_id | UUID | エスカレーションレコード |
status | string | イベント送信時は open |
これは通知であり、根拠バンドルではありません。cluster_id を使用して問題パターンと関連付けてください。ThunderPhone に報告を参照してください。
テスト通話イベント
test-call.completed
test-call 実行
が completed または failed の最終ステータスに到達したときに送信されます。起動時に失敗して通話が生成されなかった実行も含まれます。同期応答は不要です。バッチ CI 実行をチャットや通知システムに連携する場合に役立ちます。
{
"data": {
"test_call_run": {
"call_id": 987654321,
"completed_at": "2026-04-20T18:25:04.822Z",
"error_message": "",
"id": 7110,
"status": "completed",
"target_id": 12,
"target_type": "agent"
}
},
"event_id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"type": "test-call.completed"
}| フィールド | 型 | 説明 |
|---|---|---|
agent_id | integer | null | 割り当てられている場合、通話を処理したエージェント |
agent_name | string | null | 割り当てられている場合、通話を処理したエージェント |
test_call_run.target_type | string | agent または phone_number |
test_call_run.target_id | integer | target_type に対応する、実行の対象となったエージェント ID または電話番号 ID |
test_call_run.status | string | completed または failed |
test_call_run.call_id | integer | null | 通話が開始される前に実行が失敗した場合は null |
test_call_run.error_message | string | 成功時は空 |
アラートイベント
alert.triggered
「開発者向け Webhook に配信」チャネルが有効なアラートルールがしきい値を超えたときに送信されます。同期応答は不要です。ルールは一度発火するとクールダウンに従うため、継続的な違反ではクールダウンウィンドウごとに 1 つのイベントが生成されます。
{
"data": {
"comparator": "lt",
"event_id": "b8e6a1d4-2c3f-4a5b-9c8d-7e6f5a4b3c2d",
"fired_at": "2026-04-20T18:00:00+00:00",
"metric": "success_rate",
"metric_value": 71.4,
"rule_id": "d2c3b4a5-6f7e-4d8c-9b0a-1c2d3e4f5a6b",
"rule_name": "Success rate below 80%",
"threshold": 80.0,
"window_hours": 24
},
"event_id": "4d5e6f7a-8b9c-4d0e-9f1a-2b3c4d5e6f7a",
"type": "alert.triggered"
}| フィールド | 型 | 説明 |
|---|---|---|
event_id(data 内) | UUID | アラートの発火 ID。エンベロープの配信 event_id とは異なります |
rule_id, rule_name | UUID, string | 発火したルール |
metric | string | success_rate、failure_rate、avg_score、call_volume、または suite_regression |
comparator | string | lt、lte、gt、または gte |
metric_value | number | ルール発火時のウィンドウ内におけるメトリクス値 |
threshold | number | 設定されたしきい値 |
window_hours | integer | 直近の評価ウィンドウ |
fired_at | timestamp |
ルール、メトリクス、クールダウン、メール / Slack チャネルの作成については、アラートガイドを参照してください。
移行イベント
migration.call.complete
POST /v1/migrations/{id}/calls を通じて発信した通話が、
どちらのプラットフォームで行われたかにかかわらず終了したときに送信されます。ブロッキングされません。通話終了後、最大約5分で到着します。data には
telephony.complete のすべてのフィールドに加えて、migration ブロックが含まれます。ThunderPhone が発信した通話では、同じ call_id を持つ通常どおりの telephony.complete も送信されます。もう一方のプラットフォームの通話が2時間経過しても終了しない場合、または移行が先に完了したかキーを失った場合は、status: "unknown" とトランスクリプトなしで送信されます。
{
"data": {
"agent_id": 42,
"agent_name": "Front desk",
"billable_minutes": null,
"billing_total_cents": null,
"call_id": null,
"direction": "outbound",
"duration_seconds": 94,
"end_reason": "user_hangup",
"end_time": "2026-10-06T17:01:34+00:00",
"extracted_data": null,
"from_number": "+15551234567",
"migration": {
"arm": "vendor",
"id": "5f0c2a9e-7b1d-4c3e-8a6f-2d9e1b4c7a30",
"metadata": {
"lead_id": "8812"
},
"routing_id": "9b2f8c1e-4d3a-4f6b-8e2d-1a7c5b9e0f34",
"vendor": "retell",
"vendor_call_id": "call_6a1f0e",
"vendor_cost_usd": "0.1240"
},
"product": "",
"recording_mode": "vendor",
"recording_url": "https://…",
"start_time": "2026-10-06T17:00:00+00:00",
"status": "completed",
"summary": "The callee booked a table for two on Thursday.",
"thunderphone_retained_call_content": true,
"to_number": "+14155552671",
"transcripts": [
{
"content": "Hi Ada, this is Rosa's calling about your booking.",
"role": "agent"
},
{
"content": "Yes, Thursday works.",
"role": "user"
}
],
"transfer_number": null,
"unresolved_variables": [],
"variables": {
"first_name": "Ada"
},
"voice": ""
},
"event_id": "7c1e2f3a-4b5c-4d6e-8f7a-9b0c1d2e3f4a",
"type": "migration.call.complete"
}| フィールド | 型 | 説明 |
|---|---|---|
migration.id | UUID | 移行 |
migration.routing_id | UUID | 発信時に返される、ルーティングされた通話 |
migration.arm | string | ours(ThunderPhone が発信)または vendor(もう一方のプラットフォームが発信) |
migration.vendor | string | retell、vapi、elevenlabs、または bland |
migration.vendor_call_id | string | null | もう一方のプラットフォームの通話 ID。ours では null |
migration.metadata | object | 通話の発信時に送信した metadata |
migration.vendor_cost_usd | string | null | もう一方のプラットフォームが報告した通話コスト(報告された場合) |
call_id | integer | null | ThunderPhone の通話 ID。vendor では null |
status | string | vendor の場合:被発信者が応答したときは completed、応答しなかったときは failed、上記の場合は unknown。ours の場合:telephony.complete と同様 |
vendor 通話の場合、ThunderPhone には請求データや抽出データがありません。
billable_minutes、billing_total_cents、extracted_data は null、
product と voice は空、recording_mode は vendor です。recording_url は、もう一方のプラットフォームから提供された場合、そのリンクになります。
migration.rollback
移行の段階的な切り替えにより、すべての通話が自動的に他方の プラットフォームへ戻されたときに送信されます。条件は、15分以内にThunderPhoneへの接続が3件失敗した、 ThunderPhoneに送信された2件の通話がエージェントの応答前に終了した、または ThunderPhoneのタスク結果率が、設定された差を超えて他方のプラットフォームの結果率を下回った場合です。ロールバックごとに1回、非ブロッキングで送信されます。この後、ThunderPhoneの 通話シェアは0%となり、エージェントの移行タブで再開されるまで移行は一時停止されます。ペイロードには電話番号、トランスクリプト、通話IDは含まれません。
{
"data": {
"agent_id": 42,
"agent_name": "Front desk",
"dropped": 0,
"migration_id": "5f0c2a9e-7b1d-4c3e-8a6f-2d9e1b4c7a30",
"ours": {
"graded": 20,
"success_rate": 0.8
},
"ours_failed": 3,
"ours_percent": 0,
"previous_percent": 25,
"reason": "ours_failed_burst",
"rolled_back_at": "2026-10-10T12:05:00+00:00",
"step": 1,
"theirs": {
"graded": 20,
"success_rate": 0.8
},
"vendor": "retell"
},
"event_id": "3d1f6b2a-8c4e-5a7b-9d0e-2f1a3b4c5d6e",
"type": "migration.rollback"
}| フィールド | 型 | 説明 |
|---|---|---|
migration_id | UUID | 移行 |
vendor | string | retell、vapi、elevenlabs、またはbland |
reason | string | ours_failed_burst(15分以内に接続が3件失敗)、dropped_calls(30分以内にエージェントの応答前に2件の通話が終了)、またはrate_gap(各側で少なくともrollback_min_calls件の評価済み通話におけるタスク結果率の差) |
previous_percent | integer | ロールバック前のThunderPhoneの通話シェア |
ours_percent | integer | 常に0 |
step | integer | null | 適用されていたスケジュールステップ(0始まり) |
ours / theirs | object | null | 現在のステップの評価済み通話数と成功率。ステップの通話数が少なすぎる場合、theirsは直近30日間の値になることがあります。存在しない場合はnull |
ours_failed | integer | 直近15分間にカウントされた接続失敗数 |
dropped | integer | 直近30分間に切断としてカウントされた通話数 |
rolled_back_at | timestamp |