ThunderPhone 2.0 正式上線。全程自助,每分鐘 2 美分起查看公告

Webhooks

事件目錄

ThunderPhone 發出的所有 Webhook 事件類型。

每個 webhook 主體都有一個 type 欄位,其值為本頁中的其中一種事件 類型。當你訂閱某個 端點時,events 陣列必須包含你想要的 事件類型(或留空以訂閱所有事件——但每輪事件 telephony.turn / web.turn 除外,這些事件只會傳送至明確指定它們的端點)。

這些事件有兩種傳送方式:

  • 端點傳送一律為具備重試機制非阻塞 通知:回應任何 2xx 狀態碼即可;封套中包含可用於去除重複事件的 event_id
  • 阻塞式交換僅適用於 舊版單一 URL webhook:包括 telephony.incoming / web.incoming 設定請求(webhook 模式的號碼與小工具金鑰,逾時時間為 10 秒),以及 webhook 模式的 工具派送。你的回應會影響即時通話。

以下範例酬載會依照端點封套的傳輸順序顯示 (索引鍵依字母排序:dataevent_idtype);舊版傳送包含相同的 data,但不含 event_id

通話事件

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"
}

telephony.complete

當撥入或撥出電話通話結束時傳送。非阻塞式。 包含逐字稿、可用時的錄音 URL,以及計費摘要。酬載結構描述請參閱 telephony.complete / web.complete

telephony.tool

電話通話叫用 函式工具後傳送。非阻塞式稽核通知—— 傳遞此事件時,工具已經執行完成;僅涵蓋你自己的函式工具(不包括內建工具、 知識庫工具、應用程式連線工具或 MCP 工具)。

{
  "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>"}

telephony.turn

電話通話進行中時傳送,每個包含語音的回合發生時各傳送一次——包括 智慧體說出的完成內容,以及來電者轉寫的回合。你可透過一般 webhook 追蹤即時對話,而無需輪詢 GET /v1/calls/{call_id}/transcript。 非阻塞式。

{
  "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"
}
欄位類型說明
position整數此回合在通話紀錄中的索引——用於排序的穩定識別碼
role字串assistant(智慧體語音)或 user(來電者語音)
text字串事件傳送時所知的回合逐字稿文字
entry_type字串基礎紀錄項目類型:completion(智慧體),或 user_turn / span(來電者)
start_ms, end_ms整數自通話開始起算的音訊位移(毫秒);僅在事件傳送時已知播放時間時提供

web.incoming

telephony.incoming 的網頁通道對應事件,在 網頁小工具工作階段或建置器麥克風測試通話開始時傳送。 端點傳遞是針對每個網頁工作階段的即發即忘通知。mode="webhook" 的 可發布金鑰還會在舊版 webhook 上收到阻塞式設定請求——該阻塞式請求 具有不同結構(origin_domainpublishable_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_domainpublishable_key_prefix 為空值。

web.complete

telephony.complete 的網頁通道對應事件,涵蓋網頁小工具通話 (direction: "web")與建置器麥克風測試通話 (direction: "test")。非阻塞式。其酬載結構與 telephony.complete 相同,另外包含 origin_domain,且 from_number 設為 "web"

web.tool

telephony.tool 的網頁通道對應事件。data 使用 origin_domain 取代 from_number / to_number

web.turn

telephony.turn 的網頁通道對應事件,涵蓋網頁 小工具通話與建置器麥克風測試通話。酬載結構相同,但使用 origin_domain 取代 from_number / to_number。與 telephony.turn 相同,此事件需要明確訂閱——絕不會透過空的 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.idstring自訂語音公開 ID
voice.namestring格式為 custom:<public_id> 的智慧體語音值
voice.display_namestring面向組織顯示的語音名稱
voice.languagestring複製語音的單一語言代碼
voice.genderstringmalefemale 或空字串
voice.statusstringvoice.readyreadyvoice.failedfailed
voice.failure_reasonstring成功時為空白;失敗時為處理失敗詳細資訊
voice.created_at, voice.updated_attimestampISO 8601 時間戳記
reasonstring失敗詳細資訊;僅存在於 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…"
    }
  },
  "event_id": "7c1d2e3f-4a5b-4c6d-8e9f-0a1b2c3d4e5f",
  "type": "call.graded"
}
欄位類型說明
grade.idinteger評分 ID
grade.scoreinteger | null0–100
grade.call_outcomestringsuccessfailureunknownno_conversation
grade.summarystring單段摘要
grade.detected_issuesarray評分器偵測到的問題字串
grade.statusstring一律為 completed——僅已完成的執行會傳送
grade.grader_modelstring產生結果的評分器(例如 heuristic-v1
grade.graded_at, grade.created_attimestamp

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"
}
欄位類型說明
issue_report.severitystringcriticalwarninginfo
issue_report.statusstringopenresolved
issue_report.sourcestringuser(從控制台提交)或 system(由評分建立)

測試通話事件

test-call.completed

test-call 執行 達到最終狀態時傳送——completedfailed,包括啟動時 失敗且從未產生通話的執行。非阻塞。適合將批次 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"
}
欄位類型說明
test_call_run.target_typestringagentphone_number
test_call_run.target_idinteger執行目標的智慧體 ID 或電話號碼 ID,與 target_type 相符
test_call_run.statusstringcompletedfailed
test_call_run.call_idinteger | null執行在撥出通話前失敗時為 null
test_call_run.error_messagestring成功時為空白

警示事件

alert.triggered

當已啟用 傳送至開發人員 Webhook 管道的警示規則達到其閾值時傳送。 非阻塞式。規則會觸發一次,之後遵守其冷卻時間,因此持續違規時,每個冷卻時間區間只會產生一個事件。

{
  "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(位於 dataUUID警示的觸發 ID——不同於封裝層傳送用的 event_id
rule_idrule_nameUUID、字串已觸發的規則
metric字串success_ratefailure_rateavg_scorecall_volumesuite_regression
comparator字串ltltegtgte
metric_value數字規則觸發時,指標在該時間區間內的值
threshold數字已設定的閾值
window_hours整數回溯評估時間區間
fired_at時間戳記

請參閱警示指南,了解如何建立規則、指標、冷卻時間,以及電子郵件/Slack 管道。


相關內容