---
title: "イベントカタログ"
description: "ThunderPhone が送信するすべてのWebhookイベントタイプ。"
---

すべての webhook 本文には `type` フィールドがあり、その値はこのページにあるイベント
タイプのいずれかです。[エンドポイント](/ja/webhooks/endpoints)をサブスクライブする場合、
`events` 配列には必要なイベントタイプを含める必要があります（すべてをサブスクライブするには
空にします。ただし、ターンごとのイベント [`telephony.turn`](#telephony-turn) /
[`web.turn`](#web-turn) は例外で、明示的に指定したエンドポイントにのみ配信されます）。

これらのイベントには 2 種類の配信形式があります。

* **エンドポイント配信**は常に[再試行](/ja/webhooks/overview)を伴う**非ブロッキング**通知です。任意の 2xx で応答してください。エンベロープには重複排除に使用する `event_id` が含まれます。
* **ブロッキング**交換は、[レガシー単一 URL webhook](/ja/webhooks/overview)でのみ実行されます。[`telephony.incoming` / `web.incoming`](/ja/webhooks/call-incoming) の設定リクエスト（webhook モードの電話番号: 再試行 1 回を含めて 13 秒、webhook モードのウィジェットキー: 10 秒）と、webhook モードの[ツールディスパッチ](/ja/tools/overview)です。応答内容がライブ通話を制御します。

以下のペイロード例は、ワイヤ順序のエンドポイントエンベロープを示しています
（キーはアルファベット順です: `data`、`event_id`、`type`）。レガシー配信では、
`event_id` を除いた同じ `data` が送信されます。

## 通話イベント

### `telephony.incoming`

着信通話がいずれかの[電話番号](/api-reference/phone-numbers)に到達したときに送信されます。エンドポイント配信は、番号がエージェント設定済みか webhook 設定済みかにかかわらず、**すべての**着信通話に対して送信されるファイアアンドフォーゲット通知です。エージェントが割り当てられていない番号には、従来の webhook で **ブロッキング** 構成リクエストも送信されます。リクエスト / レスポンスの完全なスキーマは、[`telephony.incoming` / `web.incoming`](/ja/webhooks/call-incoming)を参照してください。

```json
{
  "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`](/ja/webhooks/call-complete)を参照してください。

| フィールド | 型 | 説明 |
|-------|------|-------------|
| `agent_id` | integer \| null | 割り当てられている場合に通話を処理したエージェント |
| `agent_name` | string \| null | 割り当てられている場合に通話を処理したエージェント |

### `telephony.tool`

電話通話で[関数ツール](/ja/tools/overview)が呼び出された後に送信されます。ノンブロッキングの監査通知です。このイベントが配信される時点でツールはすでに実行されており、独自の関数ツールおよび組み込みの `send_sms` ツールが対象です（他の組み込みツール、ナレッジベース、アプリ接続、MCP ツールは対象外です）。`send_sms` では、`arguments.to` と `arguments.body` の両方が `[REDACTED]` になります。完了時の文字起こしでもこれらは伏せ字になります。コンテンツと送信先は、レスポンスの `message_id` を使用して組織スコープの SMS リソースから取得してください。

```json
{
  "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`](/api-reference/calls#get-transcript)をポーリングする代わりに、通常の webhook を介してライブ会話を追跡できます。ノンブロッキングです。

<Note>
  **明示的なサブスクリプションが必要です。** 他のすべてのイベントタイプとは異なり、ターンイベントが空の `events` 配列（すべてにサブスクライブ）を通じて配信されることはありません。エンドポイントがこれらを受信するのは、その `events` リストに `telephony.turn` / `web.turn` が明示的に含まれている場合のみです。
</Note>

```json
{
  "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 | 通話開始からのミリ秒単位の音声オフセット。送信時点ですでに再生タイミングが判明している場合にのみ存在 |

<Note>
  配信は少なくとも 1 回行われ、ターンは**順不同**で到着する場合があります。エンベロープの `event_id` で重複を除去し、`position` で並べ替えてください。発信者の文字起こしは送信後も更新される場合があります。通話後の[`telephony.complete`](/ja/webhooks/call-complete)の文字起こしが正規の情報です。音声として発話されたターンのみが送信されます。ツール呼び出し、ささやき、その他の内部エントリはこのストリームに表示されません。
</Note>

### `web.incoming`

`telephony.incoming` のウェブチャネル版で、[ウェブウィジェット](/ja/widget/overview)セッションまたはビルダーのマイクテスト通話が開始されたときに送信されます。エンドポイント配信は、すべてのウェブセッションに対するファイアアンドフォーゲットです。`mode="webhook"` の公開可能キーには、従来の webhook で **ブロッキング** 構成リクエストも送信されます。このブロッキングリクエストの形式は異なり（`origin_domain`、`publishable_key_prefix`、電話番号なし）、詳細は[`telephony.incoming` / `web.incoming`](/ja/webhooks/call-incoming)を参照してください。

```json
{
  "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`](/ja/webhooks/call-complete)と同じペイロード形式に加え、`origin_domain` が含まれ、`from_number` は `"web"` に設定されます。

| フィールド | 型 | 説明 |
|-------|------|-------------|
| `agent_id` | integer \| null | 割り当てられている場合に通話を処理したエージェント |
| `agent_name` | string \| null | 割り当てられている場合に通話を処理したエージェント |

<Note>
  従来の単一 URL webhook では、ビルダーのマイクテスト通話は歴史的に `telephony.complete` として報告されます。この場合、`direction: "web"` の通話のみが `web.complete` タイプを使用します。エンドポイントシステムでは、ウェブ通話とテスト通話の両方が `web.*` にマッピングされます。過去のペイロードには、従来の `direction` 値である `widget` または `mic` が含まれる場合があります。
</Note>

### `web.tool`

`telephony.tool` のウェブチャネル版です。`data` には `from_number` / `to_number` ではなく `origin_domain` が含まれます。

| フィールド | 型 | 説明 |
|-------|------|-------------|
| `agent_id` | integer \| null | 割り当てられている場合に通話を処理したエージェント |
| `agent_name` | string \| null | 割り当てられている場合に通話を処理したエージェント |

### `web.turn`

[`telephony.turn`](#telephony-turn)のウェブチャネル版で、ウェブウィジェット通話とビルダーのマイクテスト通話が対象です。ペイロード形式は同じですが、`from_number` / `to_number` の代わりに `origin_domain` が含まれます。`telephony.turn` と同様に、**明示的なサブスクリプション**が必要です。空の `events` 配列を通じて配信されることはありません。

| フィールド | 型 | 説明 |
|-------|------|-------------|
| `agent_id` | integer \| null | 割り当てられている場合に通話を処理したエージェント |
| `agent_name` | string \| null | 割り当てられている場合に通話を処理したエージェント |

### `call.transfer_completed`

通話ごとに1回、[通話転送](/ja/guides/call-transfers)の最終結果とともに送信されます。結果はコールド転送、またはエージェントが離脱した後にウォーム転送で残る人同士のブリッジです。
ブロッキングは行われず、エンドポイントにのみ配信されます（従来の単一 URL Webhook には配信されません）。通話の `telephony.complete` の後に到着します。つまり、通信事業者が通話を引き継いだ時点、転送に失敗した時点、または ThunderPhone が通話をブリッジした場合はブリッジ終了時点です。

```json
{
  "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` とは別に請求されます。 |

同じ値は[通話オブジェクト](/api-reference/calls#call-object)にも
`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}`](/api-reference/sms#retrieve-a-message) で組織スコープのメッセージを取得します。

### `sms.sent`

顧客の通信事業者が送信 SMS リクエストを受け付けたときに送信されます。これは端末への配信確認ではありません。

```json
{
  "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 の設定と署名検証は別途提供予定です。

---

## 音声イベント

カスタム音声の作成は非同期です。これらの非ブロッキングイベントにより、
[クローン詳細エンドポイント](/api-reference/custom-voices#list-and-retrieve-clones)をポーリングする代わりに、最終結果に対応できます。

`voice.ready` と `voice.failed` は、`events: []` を持つ組織全体のエンドポイントにのみ配信されます。明示的なイベントフィルターとして選択することはできません。

### `voice.ready`

カスタム音声の処理が完了し、エージェントに割り当て可能になったときに送信されます。

```json
{
  "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`

カスタム音声の処理が恒久的な失敗に至ったときに送信されます。

```json
{
  "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評価実行](/api-reference/calls#ai-call-grading)が完了するたびに送信されます。非ブロッキングです。

```json
{
  "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 | 顧客向けの[通話レポート](/api-reference/calls#call-report): 結果ラベル、要対応フラグと理由、発信者、1行の要約、発信者体験。初期のヒューリスティック評価では、これは `null`、またはフィールドがプレースホルダーである `pending` レポートです。完全な評価のイベントには完了したレポートが含まれます |

<Note>
  通話は複数回評価されることがあります。録音が利用可能になると、高速なヒューリスティック評価の後に完全なモデル評価が実行されることが多く、手動での再評価も可能です。完了した各実行はそれぞれ独自の `call.graded` イベントを送信します。最新の `graded_at` を正としてください。
</Note>

### `call.data_extracted`

構造化データの抽出が正常に完了するたびに送信されます。これには、`telephony.complete` / `web.complete` 後の遅延リトライ、または [`POST /v1/calls/{call_id}/extract`](/api-reference/calls#run-data-extraction) による手動再実行も含まれます。非ブロッキングです。

ブロッキング抽出モードでは、通常、完了イベントは75秒の抽出予算を超えて待機しません。抽出ワーカープロセスが失われた場合、プロダクションの完了処理ドレインは5分ごとに実行され、次の抽出試行を開始する前に `blocking_deadline_at` を過ぎた完了を解放します。その後の成功は、このイベントとして別途配信されます。

<Warning>
  抽出された値は、会話に対するモデルの解釈です。null 以外の各値には、その根拠となった引用、話者ロール、ターンインデックスに加え、実行レベルの検証フラグが含まれます。金銭、本人確認、アクセスに関する判断を行う前に結果を検証してください。
</Warning>

```json
{
  "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 | エージェントで **通話の要約を生成** が有効な場合の完了済み[通話要約](/ja/webhooks/call-complete)。遅延した抽出イベントでも、完了ウィンドウに間に合わなかった要約が配信されます。それ以外の場合は `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回送信されます。スケジュールが終了した場合も、すべての連絡先が終端状態に到達した場合も対象です。ランナーのリトライでは別のイベントは送信されません。この組織レベルのライフサイクルイベントは、エージェントスコープのエンドポイントではなく、組織スコープのエンドポイントにのみ配信されます。非ブロッキングです。

```json
{
  "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`

[問題レポート](/api-reference/issue-reports)が作成されると送信されます。ダッシュボードからユーザーが報告したもの（`source: "user"`）と、通話評価により自動作成されたもの（`source: "system"`）の両方が対象です。非ブロッキングです。

```json
{
  "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`（評価により作成） |

<Note>
  通話を再評価すると、システム生成の問題レポートが再構築され、再作成されたレポートに対して `issue.reported` が再送信されます。根本的な問題ごとに通知を1件だけ受け取りたい場合は、`call_id` + `title` で重複を除外してください。
</Note>

### `issue.escalated`

問題パターンがスタッフレビューのためにThunderPhoneへ送信されると送信されます。**ThunderPhone に報告** の実行後、または AIで修正 が顧客側での修正を確認できず、自動的に問題をルーティングした場合が対象です。このイベントを受信するのは組織全体のエンドポイントのみです。

```json
{
  "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 に報告](/ja/guides/issues)を参照してください。

---

## テスト通話イベント

### `test-call.completed`

[test-call 実行](/api-reference/test-calls#test-call-run-object)
が `completed` または `failed` の最終ステータスに到達したときに送信されます。起動時に失敗して通話が生成されなかった実行も含まれます。同期応答は不要です。バッチ CI 実行をチャットや通知システムに連携する場合に役立ちます。

```json
{
  "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 に配信**」チャネルが有効な[アラートルール](/ja/guides/alerts)がしきい値を超えたときに送信されます。同期応答は不要です。ルールは一度発火するとクールダウンに従うため、継続的な違反ではクールダウンウィンドウごとに 1 つのイベントが生成されます。

```json
{
  "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 チャネルの作成については、[アラートガイド](/ja/guides/alerts)を参照してください。

---

## 移行イベント

### `migration.call.complete`

[`POST /v1/migrations/{id}/calls`](/api-reference/migration-calls) を通じて発信した通話が、
どちらのプラットフォームで行われたかにかかわらず終了したときに送信されます。ブロッキングされません。通話終了後、最大約5分で到着します。`data` には
[`telephony.complete`](/ja/webhooks/call-complete) のすべてのフィールドに加えて、`migration` ブロックが含まれます。ThunderPhone が発信した通話では、同じ `call_id` を持つ通常どおりの `telephony.complete` も送信されます。もう一方のプラットフォームの通話が2時間経過しても終了しない場合、または移行が先に完了したかキーを失った場合は、`status: "unknown"` とトランスクリプトなしで送信されます。

```json
{
  "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は含まれません。

```json
{
  "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 | |

---

## 関連項目

<CardGroup cols={2}>
  <Card title="telephony.incoming / web.incoming" icon="phone" href="/ja/webhooks/call-incoming">
    応答が必要な、ブロッキング型の着信通話ペイロード。
  </Card>
  <Card title="telephony.complete / web.complete" icon="phone-slash" href="/ja/webhooks/call-complete">
    通話後の文字起こしとメトリクス。
  </Card>
  <Card title="Webhook エンドポイント" icon="bolt" href="/ja/webhooks/endpoints">
    これらのイベントの一部を URL に登録します。
  </Card>
  <Card title="関数ツール" icon="screwdriver-wrench" href="/ja/tools/overview">
    `telephony.tool` / `web.tool` イベントの生成方法。
  </Card>
</CardGroup>
