# 身分驗證與權限範圍
Source: https://docs.brightalk.ai/zh-Hant/authentication
安全地使用 bearer API 金鑰與最小必要權限範圍。
Brightalk REST API 以 bearer API 金鑰驗證伺服器對伺服器的請求。金鑰會決定請求所屬的組織,以及可執行的操作。
## 傳送 bearer 金鑰
每個請求都必須在 `Authorization` 標頭傳送金鑰。語法必須完全符合:`Bearer`、一個空格,再接金鑰。
```http theme={null}
Authorization: Bearer $BRIGHTALK_API_KEY
```
缺少 bearer 標頭或格式錯誤時會傳回 `401 authentication_required`。語法正確、但找不到或已撤銷的金鑰,則傳回 `401 invalid_api_key`。
## 建立及保存金鑰
請在 [Brightalk API 設定](https://www.brightalk.ai/settings/integrations/api)建立 `bt_live_` 金鑰。完整金鑰只會顯示一次;請直接複製到伺服器端金鑰管理工具,切勿放進版本控制、日誌、瀏覽器儲存空間、行動裝置程式碼或傳送給客戶端的環境變數。
需要時請選擇到期日。超過到期日的金鑰會傳回 `401 api_key_expired`。撤銷會對後續請求生效;若懷疑金鑰外洩或暫時測試已完成,應立即撤銷。
## 選擇最小必要權限範圍
每個操作都會檢查權限範圍,且預設拒絕未授權操作。寫入或執行權限不包含相對應的讀取權限,讀取權限也不包含寫入權限。
| 資源 | 讀取權限範圍 | 寫入或執行權限範圍 |
| -------------------------------------------------------- | --------------------------------- | ----------------- |
| 代理目錄(`GET /agents`) | `calls:read` **或** `batches:read` | — |
| 聯絡人 | `contacts:read` | `contacts:write` |
| 通話 | `calls:read` | `calls:write` |
| 通話逐字稿(`GET /calls/{call_id}/transcript`) | `transcripts:read` | — |
| 批次 | `batches:read` | `batches:write` |
| 自動化 | `automations:read` | `automations:run` |
| 通話錄音(`GET /recordings`、`GET /recordings/{recording_id}`) | `recordings:read` | — |
`GET /agents` 是目錄的例外:`calls:read` 或 `batches:read` 任一權限即可通過驗證(`anyOf`)。只有在伺服器需要建立或啟動工作,並接著查詢工作時,才選取同一資源的兩項權限。這只是方便整合的建議配對,不表示兩個權限範圍會彼此隱含。
`calls:read` 可讀取通話中繼資料與摘要,但不包含完整逐字稿內容。呼叫 `GET /calls/{call_id}/transcript` 前必須明確授予 `transcripts:read`;既有金鑰不會自動取得這項權限。`recordings:read` 也適用相同規則:它與 `calls:read` 彼此獨立,既有金鑰同樣不會自動取得這項權限。
## 安全地輪替及撤銷
先建立只具最小必要權限範圍的替代金鑰,更新伺服器端金鑰並確認替代金鑰能成功請求,再撤銷舊金鑰。兩把金鑰重疊有效期間都不可暴露。輪替不會改變資源歸屬,也不會繞過既有的冪等性宣告。
這也是既有整合唯一能新增權限範圍的方式。`PATCH` 只會更新金鑰名稱,沒有任何端點可以修改既有金鑰的權限範圍。若要開始使用 `recordings:read`(或任何金鑰上還沒有的權限),請建立一把涵蓋所有所需權限(含新權限)的新金鑰,再依上述步驟輪替過去。
## 謹慎使用互動式 GET 測試工具
在互動式 GET 測試工具輸入的金鑰會經過 Mintlify 代理伺服器。請使用暫時且僅具最小必要讀取權限的金鑰,不要加入寫入/執行權限,並在測試後立即撤銷。
寫入端點只提供可複製的範例,不提供互動式寫入控制。一般整合應由您的伺服器直接向 `https://api.brightalk.ai` 傳送所有請求。
# 可用性
Source: https://docs.brightalk.ai/zh-Hant/availability
確認公開 API 的可用功能與儀表板相依性。
若要開始使用公開 API,組織管理員必須在 [Brightalk API 設定](https://www.brightalk.ai/settings/integrations/api)建立具權限範圍的 API 金鑰,請求才能通過驗證。有效請求必須使用組織中仍有效的金鑰、文件支援的 API 版本與權限、符合資格的儀表板資源,以及受支援的目的地路由。
## 可用功能
* 在本文件所列欄位範圍內建立、查詢、列出及更新組織聯絡人。
* 列出符合資格的 AI 語音代理,以及儀表板管理的自動化摘要。
* 將立即執行的非同步 AI 通話加入佇列,並查詢、列出或取消。
* 為最多 1,000 位不重複收話人建立批次草稿;啟動或排程、查詢彙總狀態、暫停、繼續或取消。
* 從已啟用的自動化為一位聯絡人建立一次自動化執行;列出、查詢及取消該執行。
* 查詢本文件所列的純量狀態、接聽分類、結果、摘要、通話長度、時間戳記與批次彙總數量。
* 以 `calls:read` 取得具有獨立修訂版本的通話摘要,並以 `transcripts:read` 分頁讀取游標固定的逐字稿修訂版本。
* 以 `recordings:read` 分頁列出通話錄音,並取得短效下載網址。
只有 OpenAPI 契約中的操作與欄位屬於此可用性聲明的範圍。
## 儀表板相依性
* 在 Brightalk 設定中建立、設定到期、輪替及撤銷具權限範圍的 `bt_live_` 金鑰。
* 在儀表板設定及維護 AI 語音代理;API 目錄為唯讀。
* 在儀表板設定及啟用自動化;API 提供摘要與執行,不提供定義編輯。
* 執行前維持已驗證的目的地路由。
## 明確不支援的功能
以下功能目前不受支援:
* Brightalk SDK。
* 客戶 Webhook 傳送或重播。
* 沙箱或 dry-run 環境。
* API 日誌介面。
* 錄音的串流播放端點或永久網址。
* 僅播放預錄內容的通話。
* `/v1` 路徑。
此清單只說明目前邊界,不代表任何發布承諾。
## 定價與業務洽詢
API 使用方式依您的 Brightalk 組織所適用的商業條款為準。方案相關問題請參閱 [Brightalk 定價](https://www.brightalk.ai/pricing)或聯絡 Brightalk。
# 變更記錄
Source: https://docs.brightalk.ai/zh-Hant/changelog
追蹤 Brightalk REST API 契約與開發者文件的日期版本變更。
## 2026-09-01 — 通話錄音
* 新增 `GET /recordings` 與 `GET /recordings/{recording_id}`,涵蓋兩張通話資料表的錄音,不論該通話透過何種方式建立。
* 新增最小權限 `recordings:read` scope 與專用 `recording` 速率限制配額群組。
* 下載錄音採用依請求核發的短效簽名網址;撤銷金鑰、撤銷該權限範圍,或關閉組織對此資源的存取,都不會讓已核發的網址失效。
## 2026-07-28 — 版本化通話結果
* 新增 `GET /calls/{call_id}/summary` 與 `GET /calls/{call_id}/transcript`。
* 新增 `2026-07-28` 通話結果 payload schema,支援獨立修訂版本、處理狀態及游標固定的逐字稿分頁。
* 新增最小權限 `transcripts:read` scope 與專用逐字稿速率限制配額群組。
## 2026-07-22 — 新組織 API 存取
* 新組織預設可使用公開 API。
* 組織管理員在 Brightalk 設定中建立、輪替及撤銷具權限範圍的 API 金鑰;系統不會自動產生憑證。
* 此次推出未變更既有組織原本的 API 存取設定。
## 2026-07-16 — 公開 API 文件
* 發布日期版本的 OpenAPI 3.1 契約,以及結構一致的繁體中文與英文開發者文件。
* 說明伺服器對伺服器身分驗證、版本控制、冪等性、速率限制、穩定錯誤碼、聯絡人、符合資格的代理、立即 AI 通話、批次、儀表板管理的自動化,以及由 API 啟動的自動化執行。
# AI 語音代理
Source: https://docs.brightalk.ai/zh-Hant/concepts/agents
選取可供 REST API 執行 AI 通話的儀表板管理代理。
AI 語音代理定義單次通話與批次使用的對話行為。代理是在 Brightalk 儀表板中設定及管理。
## 符合資格的條件
`GET /agents` 只傳回組織擁有、且目前符合對外 AI 撥號資格的代理。符合資格表示代理已啟用、已設定供對外撥號使用、可開始處理通話,並與組織內已驗證且可用的對外撥號路由關聯。
此端點接受 `calls:read` 或 `batches:read` 任一權限,權限模式為 `anyOf`。單次通話整合通常使用 `calls:read`;僅使用批次撥號的整合則可用 `batches:read` 讀取同一份符合資格的代理目錄。
若清單中沒有某個代理,就不可使用該代理建立通話或批次。請重新列出目錄,不要無限期快取可用性。
## 唯讀目錄
REST API 僅提供精簡的選取資料:`id`、`name`、`description`、`language` 與 `availability`。傳回項目的 `availability` 為 `available`。本 API 無法建立或修改代理定義。
## 選取代理
將傳回的 `id` 作為 `POST /calls` 或 `POST /batches` 的 `agent_id`。請選擇語言與設定行為都適合收話人的代理。自動化會使用自身設定的代理,因此 `POST /automation-runs` 不接受 `agent_id`。
# 自動化
Source: https://docs.brightalk.ai/zh-Hant/concepts/automations
瞭解由儀表板管理的自動化及其 API 執行方式。
自動化由儀表板管理,定義要使用的代理、等待步驟、撥號行為、重試規則、分支流程與後續動作。REST API 只會列出摘要及建立自動化執行,不會在請求中重新定義這些行為。
## 選取已啟用的自動化
`GET /automations?status=active` 會傳回組織可見的摘要,包含 `id`、`name`、`description`、`status` 與 `input_fields`。請將傳回的 `id` 作為 `automation_id`。本 API 只提供唯讀目錄。
## 理解 `input_fields` 宣告
目前版本的宣告為空:
```json theme={null}
{
"id": "atm_demo_001",
"name": "Renewal follow-up",
"description": "Calls one contact and records the outcome.",
"status": "active",
"input_fields": []
}
```
`input_fields` 為空時,請在 `POST /automation-runs` 省略 `input`,或只傳送 `{}`。不要傳送未宣告的名稱。
## 啟動執行
`POST /automation-runs` 接受一個對應至已啟用自動化的 `automation_id`,以及一個既有聯絡人或內嵌收話人資料。它不接受代理覆寫、時間覆寫、重試規則或分支選擇。回應是一個非同步的自動化執行 API 資源。
只有後續 API 回應傳回非空的 `input_fields` 宣告時,客戶端才能傳送其中明確列出的欄位。請以 API 傳回的宣告為準。
## 追蹤及取消
請查詢自動化執行,直到 `status` 進入終止狀態。同一個自動化與聯絡人的組合已有另一個仍在進行的自動化執行時,可能傳回 `409 duplicate_active_run`,並在安全的 `details` 中提供既有執行 ID。
取消會阻止排隊中的工作啟動,或在步驟之間將非終止狀態的自動化執行標記為 `cancelled`。取消不會中斷正在執行的步驟,外部效果仍採盡力而為。所有 API 狀態請參閱[狀態生命週期](/zh-Hant/concepts/status-lifecycle)。
# 批次撥號
Source: https://docs.brightalk.ai/zh-Hant/concepts/batches
瞭解草稿、排程與批次撥號控制流程。
批次會將最多 1,000 位不重複的收話人交由一個符合資格的 AI 語音代理處理,並提供整體執行狀態。
## 先建立草稿,再啟動
`POST /batches` 會建立 `status: draft`。只建立草稿不會開始撥號。請只提供一種收話人格式:`contact_ids` 或內嵌 `recipients`。
`POST /batches/{batch_id}/start` 是唯一能啟動或排程草稿的狀態轉換,並以 `202 Accepted` 傳回更新後的批次。
## 收話人識別與限制
批次必須包含 1–1,000 筆不重複的標準聯絡人紀錄。重複的聯絡人 ID 會遭拒絕。內嵌 `recipients` 會先依聯絡人採用規則解析;若兩筆內嵌識別資料解析至同一筆聯絡人紀錄,也視為重複。
## 排程與撥號時段
選用的 `schedule.start_at` 可設定工作最早符合執行資格的 RFC 3339 時間點。選用的 `schedule.calling_window` 則以 `time_zone`、不重複的 `weekdays`、`start_time` 與必須較晚的 `end_time`,定義一段連續的每日撥號時段。
批次啟動後,只有在 `start_at` 之後且位於該時段內,工作才符合執行資格。批次契約不提供多段每日時段或分支流程;需要這類行為時,請使用儀表板管理的自動化。
## 彙總資料與控制
批次資源會回報 `total_recipients`、`pending_recipients`、`queued_recipients`、`in_progress_recipients`、`completed_recipients`、`failed_recipients`、`cancelled_recipients`、`answered_recipients`、`no_answer_recipients` 與 `busy_recipients` 等彙總數量。請使用 `GET /batches/{batch_id}` 監看這些數量。
暫停會停止後續收話人派送,但不保證停止已進行的通話。繼續會將符合資格的剩餘收話人重新加入佇列。取消會停止剩餘工作,並以盡力而為方式要求取消進行中的子通話。有效狀態請參閱[狀態生命週期](/zh-Hant/concepts/status-lifecycle)。
# 通話
Source: https://docs.brightalk.ai/zh-Hant/concepts/calls
瞭解非同步 AI 通話資源及其結果。
一筆通話代表針對單一聯絡人立即執行的非同步 AI 語音工作。`POST /calls` 在工作持久加入佇列後傳回 `202 Accepted`,不會等待開始撥號或完成。
## 立即非同步執行
請求會選取一個符合資格的 `agent_id`,以及一個既有聯絡人或內嵌收話人資料。請求無法選擇排程時間;如需排程開始時間或撥號時段,請使用批次撥號;如需更複雜的時間控制,請使用由儀表板管理的自動化。
容量限制可能讓已接受的通話保持 `queued`。請使用 API 資源的 `id` 查詢通話,直到 `status` 進入終止狀態。
## 生命週期與接聽分類
`status` 說明執行為排隊中、進行中、已結束、失敗或取消。`answer_status` 則獨立將目的端分類為 `answered`、`no_answer`、`busy`、`voicemail` 或 `unknown`。
因此,正常的 `no_answer`、`busy` 或 `voicemail` 結果仍可搭配 `status: completed`。`failed` 僅用於服務無法安全執行的情況。完整模型請參閱[狀態生命週期](/zh-Hant/concepts/status-lifecycle)。
## API 純量結果
通話 API 資源只包含文件列出的純量欄位:
| 類別 | 欄位 |
| ------- | ----------------------------------------------------------------- |
| 識別與來源關聯 | `id`、`contact_id`、`agent_id`、選用 `batch_id`、選用 `automation_run_id` |
| 狀態 | `status`、`answer_status` |
| 基本結果 | 選用 `outcome`、`outcome_reason`、`summary`、`duration_seconds` |
| 時間 | `queued_at`、`created_at`、`updated_at`,以及適用的撥號、接通、結束或取消時間戳記 |
請將 ID 視為不透明值;結果欄位在適用前可能不會出現。
如需具有修訂版本的通話後內容,請分別輪詢摘要與逐字稿。終止狀態及游標固定分頁方式請參閱[取得通話結果](/zh-Hant/guides/retrieve-call-results)。
## 取消
`POST /calls/{call_id}/cancel` 採盡力而為且具冪等性。若取消及早勝出,會阻止後續派送;若工作已啟動,則要求終止。完成競態仍可能讓最終 `status` 成為 `completed`;重複取消會傳回目前的通話資源,不會建立另一個動作。
# 聯絡人
Source: https://docs.brightalk.ai/zh-Hant/concepts/contacts
瞭解 REST API 中的聯絡人、API 資源識別碼與外部識別。
聯絡人是組織範圍內的標準聯絡人紀錄,供通話、批次與自動化執行共同使用。資源 ID 為不透明字串;請保存傳回的 `id`,不要從格式推論意義。
## 聯絡人參照
執行請求可接受既有的 `contact_id`,或以 `recipient` 提供內嵌收話人資料。內嵌收話人資料包含 `external_id`、`name` 與 `phone_number`,也可包含其他支援的聯絡人欄位。Brightalk 會將資料對應至一筆標準聯絡人紀錄,並在執行資源中傳回該 `contact_id`。
`external_id` 是呼叫端在 `source` 命名空間中管理的外部識別碼。請使用您系統內穩定的值,不要使用顯示名稱或會變更的電話標籤。
## 採用與衝突規則
建立或解析內嵌收話人資料時,Brightalk 會以原子方式套用以下規則:
1. 相符的外部識別會對應至既有的標準聯絡人紀錄。
2. 正規化後相符的電話號碼,只有在既有聯絡人沒有外部識別時,才能採用請求指定的外部識別。
3. 若該電話已屬於另一個非空的外部識別,請求會傳回 `409 contact_identity_conflict`,且不覆寫任一識別。
4. 其餘情況會以支援的欄位建立新聯絡人。
`POST /contacts` 建立新聯絡人時傳回 `201`;若傳回既有聯絡人或完成外部識別採用,則傳回 `200`。未知欄位會遭拒絕。
## 電話格式與組織隔離
`phone_number` 必須採用嚴格 E.164 格式:以 `+` 開頭、國碼不得為零,且總長度為 8–15 位數字。語法正確不保證組織已啟用該目的地;執行仍可能安全地失敗並傳回 `unsupported_destination`。
識別查詢、電話衝突與資源存取都依組織隔離。請求無法跨組織合併聯絡人,也無法透過請求欄位選擇組織。
# 通話錄音
Source: https://docs.brightalk.ai/zh-Hant/concepts/recordings
了解錄音資源、其可為 null 的欄位,以及簽名下載網址。
一筆錄音會將某通電話的音訊中繼資料,搭配一個短效的簽名下載網址一起提供。`GET /recordings` 與 `GET /recordings/{recording_id}` 涵蓋組織曾經撥打過、且留有錄音的每一通電話——包括從儀表板撥出、由非 API 觸發的自動化撥出,或屬於批次的通話——不只限於透過公開 API 建立的通話。
## 資源模型
| 類別 | 欄位 |
| -- | ------------------------------------------------ |
| 識別 | `id`、`call_id`(可為 null)、`contact_id`(可為 null) |
| 時間 | `recorded_at` |
| 音訊 | `duration_seconds`(可為 null)、`media_type` |
| 下載 | `download_url`(選用)、`download_url_expires_at`(選用) |
`id` 是由底層通話資料列推導而來,且保持穩定:同一筆錄音無論查詢幾次,`id` 永遠相同。請將此資源上的所有識別碼都視為不透明值。
## 為什麼 `call_id` 可能是 null
只有在該通電話是透過公開 API 建立時,`call_id` 才會有值;此時它就是[通話](/zh-Hant/concepts/calls)中所述的同一個通話 `id`,可用來查詢該通電話自己的摘要與逐字稿。若該通話從來不是由公開 API 建立——例如來自儀表板撥號、非 API 觸發的自動化,或早於此資源存在的批次——則 `call_id` 為 `null`。`call_id` 為 `null` 是正常狀況,不是錯誤;對於已經營運一段時間的組織,多數錄音其實都沒有 `call_id`。
`contact_id` 也是基於相同原則:只要該筆錄音沒有連結任何聯絡人(例如來自未知號碼的進線、人工撥號,或聯絡人在通話後才被刪除),就會是 `null`。少數錄音的 `duration_seconds` 也會是 `null`。請將這三個欄位都當作可為 null 來解析,不要假設它們一定存在。
## 沒有 status 欄位
錄音資源沒有 `status` 或 `reason` 欄位。`GET /recordings` 傳回的每一列,依定義本來就查詢得到中繼資料;至於音訊位元組現在是否真的抓得到,只有實際執行下載那一步才知道答案,並不是靠列表或單筆回應上的某個旗標。
## 簽名下載網址
`download_url` 會在傳回它的那次請求當下才核發,伺服器端不會儲存,也不會有兩次核發出現相同的值。預設存活 900 秒,可用 `expires_in` 覆寫為 60 至 3600 秒之間的任一數值。請將這個值視為不透明:直接用一般的 HTTP 用戶端抓取即可,不要嘗試解析、重組或快取其結構。
如何完整同步錄音、什麼時候該索取網址,以及撤銷存取權後既有核發的網址會發生什麼事,請參閱[下載通話錄音](/zh-Hant/guides/download-call-recordings)。
# 狀態生命週期
Source: https://docs.brightalk.ai/zh-Hant/concepts/status-lifecycle
區分通話、批次與自動化執行的 API 狀態。
只有 API 資源的 `status` 為非終止狀態時才需要查詢。終止狀態的資源仍可查詢,且不會再轉回進行中的工作。
## 通話 `status`
```mermaid theme={null}
flowchart LR
queued --> dialing
queued --> in_progress
queued --> completed
dialing --> in_progress
dialing --> completed
in_progress --> completed
queued --> failed
dialing --> failed
in_progress --> failed
queued --> cancelled
dialing --> cancelled
in_progress --> cancelled
```
| 狀態 | 是否終止 | 意義 |
| ------------- | ---- | --------------- |
| `queued` | 否 | 已接受,正在等待派送或可用容量 |
| `dialing` | 否 | 已開始撥號 |
| `in_progress` | 否 | 通話已接通且進行中 |
| `completed` | 是 | 執行已結束,包含一般接聽結果 |
| `failed` | 是 | 服務無法安全執行 |
| `cancelled` | 是 | 取消在完成前勝出 |
圖中列出 API 可見狀態允許的轉換,不代表每筆資源都必須走過單一路徑。較晚抵達的回呼、背景工作程序更新或狀態校正作業,可能跳過中間的可觀測狀態,使 `queued` 或 `dialing` 直接進入 `in_progress` 或 `completed`。客戶端必須接受圖中任一轉換。`queued`、`dialing` 與 `in_progress` 都支援取消。
## 批次 `status`
```mermaid theme={null}
flowchart LR
draft --> scheduled
draft --> queued
scheduled --> queued
scheduled --> in_progress
scheduled --> completed
scheduled --> failed
scheduled --> paused
queued --> in_progress
queued --> completed
queued --> paused
in_progress --> paused
paused --> scheduled
paused --> queued
in_progress --> completed
queued --> failed
in_progress --> failed
draft --> cancelled
scheduled --> cancelled
queued --> cancelled
in_progress --> cancelled
paused --> cancelled
```
| 狀態 | 是否終止 | 意義 |
| ------------- | ---- | --------------- |
| `draft` | 否 | 已設定但尚未啟動 |
| `scheduled` | 否 | 已啟動,正在等待符合排程條件 |
| `queued` | 否 | 收話人已符合資格並排隊等待派送 |
| `in_progress` | 否 | 至少有部分收話人工作正在進行 |
| `paused` | 否 | 後續派送已暫停 |
| `completed` | 是 | 所有收話人工作都已取得終止結果 |
| `failed` | 是 | 批次無法安全繼續 |
| `cancelled` | 是 | 剩餘工作已取消 |
控制操作與圖示一致:啟動會將 `draft` 轉為 `scheduled` 或 `queued`;`scheduled`、`queued` 與 `in_progress` 都可暫停;繼續會依排程資格將 `paused` 轉回 `scheduled` 或 `queued`;所有非終止批次狀態都可取消。
這些轉換不代表單一路徑。較晚抵達的回呼、背景工作程序更新或狀態校正作業,可能跳過中間的可觀測狀態,依圖中連線將 `scheduled` 或 `queued` 直接推進至 `in_progress`、`completed` 或 `failed`。客戶端必須接受圖中每一種轉換,並只在進入終止狀態後停止查詢。
## 自動化執行 `status`
```mermaid theme={null}
flowchart LR
queued --> running
running --> waiting
waiting --> running
running --> completed
waiting --> completed
queued --> failed
running --> failed
waiting --> failed
queued --> cancelled
running --> cancelled
waiting --> cancelled
```
| 狀態 | 是否終止 | 意義 |
| ----------- | ---- | -------------- |
| `queued` | 否 | 已接受並等待開始 |
| `running` | 否 | 自動化步驟正在執行或已可執行 |
| `waiting` | 否 | 自動化正依其定義等待 |
| `completed` | 是 | 自動化執行正常結束 |
| `failed` | 是 | 自動化執行無法安全繼續 |
| `cancelled` | 是 | 自動化執行在正常完成前遭取消 |
## `answer_status` 為獨立資訊
`answer_status` 屬於通話資源,並非生命週期狀態。其值可為 `answered`、`no_answer`、`busy`、`voicemail` 或 `unknown`。
| 通話結果 | 組合範例 |
| ----------- | --------------------------------------------- |
| 已接聽且正常結束 | `status: completed`、`answer_status: answered` |
| 未接聽、忙線或語音信箱 | `status: completed` 搭配相應的 `answer_status` |
| 沒有接通證據的執行失敗 | `status: failed`、`answer_status: unknown` |
| 接通後遭取消 | `status: cancelled`、`answer_status: answered` |
請一律先依 `status` 判斷是否停止查詢,再依 `answer_status` 解讀目的端行為。
# 錯誤
Source: https://docs.brightalk.ai/zh-Hant/errors
解析一致的 REST API 錯誤回應格式與請求識別碼。
每個非 2xx 回應都使用一致的 JSON 格式。請依穩定的 `error.code` 分類錯誤,不要依賴供人閱讀的 `message`。
## 錯誤回應格式
```json theme={null}
{
"error": {
"code": "validation_error",
"message": "The request could not be validated.",
"request_id": "req_demo_001",
"details": {
"fields": [
{ "path": "recipient.phone_number", "code": "invalid_e164" }
]
}
}
}
```
`details` 為非必填且可供機器讀取的內容。客戶端應忽略 `details` 中的未知欄位。
## 請求關聯
每個回應都包含 `X-Request-Id` 標頭,錯誤內容也會在 `error.request_id` 重複同一值。請將該識別碼與失敗操作一起記錄,並在聯絡 Brightalk 支援時提供。不要記錄 API 金鑰或完整聯絡人資料。
您可以傳送 `X-Request-Id`,使用 1–64 個 `A-Z`、`a-z`、`0-9`、`.`、`_`、`:` 或 `-` 字元。若省略或傳送不合格式的值,Brightalk 會改用產生的識別碼。
## 身分驗證錯誤的差異
| 情況 | HTTP 狀態與錯誤碼 |
| ----------------------------------- | ----------------------------- |
| 缺少 `Authorization`,或不符合精確 bearer 語法 | `401 authentication_required` |
| Bearer 語法正確,但金鑰不存在或已撤銷 | `401 invalid_api_key` |
| 金鑰已過期 | `401 api_key_expired` |
這些回應只描述憑證是否可用,不會洩漏其他組織的資源。
## 狀態與錯誤目錄
| HTTP 狀態 | 穩定錯誤碼 |
| ------: | ----------------------------------------------------------------------------------------------------------------------------- |
| `400` | `unsupported_version`、`validation_error`、`invalid_json`、`unsupported_destination`、`idempotency_key_required` |
| `401` | `authentication_required`、`invalid_api_key`、`api_key_expired` |
| `403` | `organization_not_enabled`、`insufficient_scope`、`recipient_blocked_by_policy` |
| `404` | `resource_not_found` |
| `405` | `method_not_allowed` |
| `409` | `resource_state_conflict`、`contact_identity_conflict`、`idempotency_conflict`、`idempotency_in_progress`、`duplicate_active_run` |
| `413` | `request_too_large` |
| `429` | `rate_limit_exceeded` |
| `500` | `internal_error` |
對已知路徑使用不支援的方法時,回應也包含 `Allow`。適合等待後重試的情況會包含 `Retry-After`。錯誤回應絕不揭露實作名稱、內部資料內容、查詢細節或堆疊追蹤。
## 下載錄音的錯誤格式較單純,且與上述格式不同
`download_url` 回傳的簽名網址並不屬於上面這套有版本號的 JSON API——它由另一個不需要 API 金鑰的主機提供服務,請求失敗時回傳 `{"error": ""}`,是一個純字串錯誤碼,沒有 `message`、`request_id`,也沒有 `details`。其中兩個錯誤碼帶有必須分開處理的意義:
| HTTP 狀態 | 錯誤碼 | 意義 | 應對方式 |
| ------: | ---------------------- | ------------------------------- | --------------- |
| `503` | `source_access_denied` | 來源儲存空間拒絕存取,通常是我們這端暫時性、可復原的狀況。 | 退避後重試,不要放棄這筆錄音。 |
| `410` | `media_unavailable` | 來源儲存空間已確認該物件不存在,只有在確認之後才會回傳這個碼。 | 停止重試,此狀態為永久性。 |
請把這兩者視為相反的訊號,而不是同一種失敗的不同程度:`503` 代表稍後再試,`410` 代表位元組已永久消失。若同步程式把兩者都當成「放棄」處理,就會悄悄丟掉稍後其實抓得到的錄音。此網址的其他錯誤碼(`403 invalid_link`、`404 not_found`、`502 upstream_unavailable`、`503 server_configuration_error`)不帶有這種明確的重試/不重試意義,但 `502` 與 `503 server_configuration_error` 同樣可以退避後重試——兩者都代表問題出在我們這端,而不是對這筆錄音下了永久性的判斷。
# 建立並啟動批次
Source: https://docs.brightalk.ai/zh-Hant/guides/create-start-batch
建立批次草稿、啟動撥號並追蹤批次狀態。
批次撥號分為兩個步驟:建立草稿,再明確啟動。批次可包含 1–1,000 位不重複的收話人,每位收話人都會對應至一筆標準聯絡人紀錄。
## 事前準備
* 一把放在伺服器端,且具備 `batches:write` 與 `batches:read` 的 `bt_live_` 金鑰。
* 符合資格的 `agent_id`,以及相同組織內不重複的 `contact_ids` 或內嵌收話人資料。
* 建立及啟動批次各自使用的非機密冪等性金鑰。
* 若要排程,請使用契約支援的 RFC 3339 `start_at` 和/或一段連續的每日 `calling_window`。
請將 JavaScript 範例儲存為 `.mjs`,或在 ESM 專案中執行。範例最外層的 `await` 必須使用 ESM,且需使用 Node 18 以上版本提供的內建 `fetch`。
## 建立草稿
標準範例使用兩位既有聯絡人。建立後會傳回 `status: draft`,且不會開始撥號。
啟動此批次可能對每位收話人撥打真實 PSTN 電話。啟動前,請確認完整收話人名單、代理、排程、撥號時段與時間。
```curl theme={null}
curl --request POST 'https://api.brightalk.ai/batches' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: createBatch-example-001" \
--data '{"name":"Renewal reminders","agent_id":"agt_demo_001","contact_ids":["con_demo_001","con_demo_002"]}'
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/batches", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
"Idempotency-Key": "createBatch-example-001",
},
body: JSON.stringify({"name":"Renewal reminders","agent_id":"agt_demo_001","contact_ids":["con_demo_001","con_demo_002"]}),
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"POST",
"https://api.brightalk.ai/batches",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
"Idempotency-Key": "createBatch-example-001",
},
json={"name":"Renewal reminders","agent_id":"agt_demo_001","contact_ids":["con_demo_001","con_demo_002"]},
)
print(response.status_code, response.json())
```
## 預期草稿
API 會以 `201 Created` 傳回彙總數量。請保存批次的 `id`。
```json theme={null}
{
"id": "bat_demo_001",
"name": "Renewal reminders",
"agent_id": "agt_demo_001",
"total_recipients": 2,
"pending_recipients": 2,
"queued_recipients": 0,
"in_progress_recipients": 0,
"completed_recipients": 0,
"failed_recipients": 0,
"cancelled_recipients": 0,
"answered_recipients": 0,
"no_answer_recipients": 0,
"busy_recipients": 0,
"created_at": "2026-07-20T01:00:00Z",
"updated_at": "2026-07-20T01:00:00Z",
"status": "draft"
}
```
繼續前,請檢查傳回的資源識別資料與數量。不要略過明確的啟動狀態轉換。
## 啟動批次
將 `bat_demo_001` 替換為傳回的 `id`。立即啟動時會傳回 `status: queued`;若已設定未來的符合資格時間,則可能傳回 `status: scheduled`。
```curl theme={null}
curl --request POST 'https://api.brightalk.ai/batches/bat_demo_001/start' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: startBatch-example-001" \
--data '{}'
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/batches/bat_demo_001/start", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
"Idempotency-Key": "startBatch-example-001",
},
body: JSON.stringify({}),
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"POST",
"https://api.brightalk.ai/batches/bat_demo_001/start",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
"Idempotency-Key": "startBatch-example-001",
},
json={},
)
print(response.status_code, response.json())
```
啟動操作會傳回 `202 Accepted`。容量限制可能讓符合資格的收話人留在佇列;請監控彙總數量,不要將排隊視為錯誤。
## 查詢及控制
請沿用同一個批次 `id`,並保留必要的權限配對。
| 動作 | 端點 | 下一個動作 |
| -- | --------------------------------- | --------------------------------------------- |
| 查詢 | `GET /batches/{batch_id}` | 採退避方式查詢,直到 `completed`、`failed` 或 `cancelled` |
| 暫停 | `POST /batches/{batch_id}/pause` | 停止後續派送;進行中的通話可能繼續 |
| 繼續 | `POST /batches/{batch_id}/resume` | 將符合資格的剩餘收話人重新加入佇列 |
| 取消 | `POST /batches/{batch_id}/cancel` | 停止剩餘工作,並以盡力而為方式要求取消進行中的工作 |
暫停、繼續與取消可選用 `Idempotency-Key`。動作可能重試時,請使用此標頭。
## 常見錯誤
| 錯誤 | 檢查項目 |
| ------------------------- | ----------------------------------------------------------------------- |
| `validation_error` | 共有 1–1,000 位不重複的收話人、只使用一種收話人格式,且排程/撥號時段有效 |
| `insufficient_scope` | 金鑰具備控制所需的 `batches:write`,以及查詢所需的 `batches:read` |
| `resource_state_conflict` | 只啟動 `draft`、只暫停 `scheduled`、`queued` 或 `in_progress` 的工作,且請求的狀態轉換符合目前狀態 |
| `unsupported_destination` | 派送前已確認每個目的地都已啟用 |
| `idempotency_conflict` | 建立與啟動分別使用自己的穩定金鑰,且語意相同的請求內容未改變 |
| `rate_limit_exceeded` | 等待數字 `Retry-After`;重試相同動作時保留相同金鑰 |
# 下載通話錄音
Source: https://docs.brightalk.ai/zh-Hant/guides/download-call-recordings
完整同步每一筆錄音、只在真正需要時才索取下載網址,並正確處理撤銷情境。
## 開始之前
請使用具備 `recordings:read` 的伺服器端 API 金鑰。這個權限範圍與
`calls:read` 彼此獨立,且只有在組織管理員為您的組織開通錄音功能後,
建立金鑰的表單上才會出現這個選項;如何為新金鑰加上這個權限,請參閱
[身分驗證與權限範圍](/zh-Hant/authentication)。
## 列出錄音
呼叫 `GET /recordings`。回應涵蓋組織在兩張通話資料表中的所有錄音,
依錄音時間由新到舊排序。
```curl theme={null}
curl --request GET 'https://api.brightalk.ai/recordings?limit=20' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16"
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/recordings?limit=20", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
},
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"GET",
"https://api.brightalk.ai/recordings?limit=20",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
},
)
print(response.status_code, response.json())
```
加上 `include=download_url`,即可在同一個回應中為每一列核發簽名網址——
當您準備大量抓取多筆錄音、想省下每一列額外一次請求時,這是正確的做法。
省略此參數則只取得較輕量的中繼資料頁面。在這個操作中,`expires_in`
只有搭配 `include=download_url` 才有意義;若只傳入 `expires_in` 卻沒有
`include`,會直接收到 `400 validation_error`,而不是被靜默忽略——因為
一個看似生效、實際上沒有作用的設定,比明確報錯還糟糕。
## 完整同步錄音
`recorded_at` 是通話發生的時間,不是該列的 `download_url` 變得可查詢的
時間。若某筆錄音的網址是在通話結束很久之後才寫入——例如錄音補件、
重跑,或人工修復——寫入時間可能已經晚於您同步游標經過的位置,增量
同步就再也看不到它了。這是實際量測出來的限制,不是假設性的風險,
因此契約分成兩層。
### 增量同步——best-effort
記錄您上次同步成功的時間。下次執行時,呼叫
`GET /recordings?created_after=<上次同步時間 − 24 小時>`,並依 `id`
去除您已經有的資料。這 24 小時的重疊窗口涵蓋了絕大多數情況——依
production 實測,通話結束超過六小時才寫入錄音網址的情形極為罕見——
但涵蓋不到很久以後才修復的錄音。這個做法很便宜,可以想跑多頻繁就
跑多頻繁。
### 全量對帳——唯一保證完整的做法
定期不帶 `created_after`、走完整個游標,並依 `id` 與既有資料去重。
這是唯一能保證拿齊所有錄音的方式,而且成本很低。這是 2026-09-01
針對我們整個平台量測的結果:約 32,261 筆錄音除以每頁 100 筆,大約是
323 次請求,在每分鐘 60 次請求的額度下遠遠少於六分鐘,而且每一次
請求都只拉中繼資料,不會下載任何音訊位元組。這個總數是我們平台橫跨
所有組織的加總,不是您組織自己的數字——真正能套用到您組織的是這個
比例(每 100 筆錄音約一次請求),以及不論規模大小、全量走訪都只拉
中繼資料這個事實。依錄音缺漏對您造成的成本,選擇每天或每週跑一次;
不要只靠增量同步就宣稱資料已經完整。
## 只在真正要使用時才索取網址
```curl theme={null}
curl --request GET 'https://api.brightalk.ai/recordings/22222222-2222-5222-9222-222222222222' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16"
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/recordings/22222222-2222-5222-9222-222222222222", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
},
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"GET",
"https://api.brightalk.ai/recordings/22222222-2222-5222-9222-222222222222",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
},
)
print(response.status_code, response.json())
```
`GET /recordings/{recording_id}` 一律會附上 `download_url`,不需要
`include` 參數。若您是在自家產品中內嵌播放器,請在使用者按下播放
鍵的那一刻才索取這個網址,而不是在錄音列表頁面載入時就先取得。網址
預設存活 900 秒(可用 `expires_in` 覆寫為 60 至 3600 秒之間的數值);
頁面若開啟得比這更久,原本拿到的網址就會在使用者還沒按下播放前悄悄
失效。
## 撤銷存取權不會讓已核發的網址失效
| 動作 | 對 `GET /recordings` 的影響 | 對已核發 `download_url` 的影響 |
| ----------------------- | ----------------------- | ----------------------- |
| 從金鑰移除 `recordings:read` | 立即回傳 `403` | 不受影響,會持續有效直到到期 |
| 刪除或停用該把 API 金鑰 | 立即回傳 `401` | 不受影響,會持續有效直到到期 |
| 關閉組織的錄音存取功能 | 立即回傳 `403` | 不受影響,會持續有效直到到期 |
這是簽名網址這套機制本身的性質,不是疏漏:網址本身就是憑證,一旦
核發出去,就不會再回頭檢查原本核發它的金鑰是否仍然有效。殘留的有效
期正好等於核發當下的 `expires_in`——最長一小時,預設 15 分鐘。若客戶
誤以為撤銷會讓已核發的連結立刻失效,就會做出錯誤的安全性判斷;請以
到期時間規劃,而不是以撤銷動作規劃。
# 撥打一通 AI 通話
Source: https://docs.brightalk.ai/zh-Hant/guides/place-one-call
建立一通非同步 AI 通話並查詢其結果。
此流程會將一通立即執行的非同步 AI 通話加入佇列。`POST /calls` 不會排程未來時間,也不會等待撥號完成。
## 事前準備
* 一把放在伺服器端,且具備 `calls:write` 與 `calls:read` 的 `bt_live_` 金鑰。
* 由 `GET /agents` 傳回的 `agent_id`,以及相同組織內既有的 `contact_id`。
* 此邏輯通話專用且不重複、非機密的 `Idempotency-Key`。
只有想透過聯絡人採用規則解析並保存標準聯絡人紀錄時,才以內嵌 `recipient` 取代 `contact_id`。
請將 JavaScript 範例儲存為 `.mjs`,或在 ESM 專案中執行。範例最外層的 `await` 必須使用 ESM,且需使用 Node 18 以上版本提供的內建 `fetch`。
## 建立通話
此寫入操作可能撥打一通真實 PSTN 電話。送出前,請確認所選聯絡人、目的地、代理與時間。
```curl theme={null}
curl --request POST 'https://api.brightalk.ai/calls' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: createCall-example-001" \
--data '{"agent_id":"agt_demo_001","contact_id":"con_demo_001"}'
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/calls", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
"Idempotency-Key": "createCall-example-001",
},
body: JSON.stringify({"agent_id":"agt_demo_001","contact_id":"con_demo_001"}),
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"POST",
"https://api.brightalk.ai/calls",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
"Idempotency-Key": "createCall-example-001",
},
json={"agent_id":"agt_demo_001","contact_id":"con_demo_001"},
)
print(response.status_code, response.json())
```
## 預期回應
API 會以 `202 Accepted` 傳回通話 API 資源。請保存其 `id` 供後續查詢。
```json theme={null}
{
"id": "11111111-1111-4111-8111-111111111111",
"contact_id": "con_demo_001",
"agent_id": "agt_demo_001",
"queued_at": "2026-07-20T01:00:00Z",
"created_at": "2026-07-20T01:00:00Z",
"updated_at": "2026-07-20T01:00:00Z",
"status": "queued",
"answer_status": "unknown"
}
```
容量不足時,已接受的通話可能保持 `queued`。接受請求不代表已撥號或目的端已接聽。
## 查詢通話
請以傳回的 `id` 取代範例 ID。`status` 為 `queued`、`dialing` 或 `in_progress` 時,採退避方式查詢。
```curl theme={null}
curl --request GET 'https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16"
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
},
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"GET",
"https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
},
)
print(response.status_code, response.json())
```
在 `completed`、`failed` 或 `cancelled` 時停止查詢。接著獨立判讀 `answer_status`,並讀取任何可用的 `outcome`、`outcome_reason`、`summary` 與 `duration_seconds`。
## 常見錯誤
| 錯誤 | 檢查項目 |
| -------------------------- | ---------------------------------------------- |
| `insufficient_scope` | 金鑰同時具備建立所需的 `calls:write`,以及查詢所需的 `calls:read` |
| `resource_not_found` | 代理與聯絡人存在且對此組織可見,且傳回的通話資源 ID 未遭修改 |
| `unsupported_destination` | 目的地採用有效 E.164,且組織已啟用該目的地 |
| `idempotency_key_required` | 建立請求包含非空的 `Idempotency-Key` |
| `idempotency_conflict` | 重複使用的金鑰具有語意相同的請求內容;若是新通話,請改用新金鑰 |
| `rate_limit_exceeded` | 等待數字 `Retry-After` 後,以相同冪等性金鑰重試 |
# 取得通話結果
Source: https://docs.brightalk.ai/zh-Hant/guides/retrieve-call-results
分別輪詢摘要與逐字稿,並在同一個不可變逐字稿修訂版本中分頁。
## 開始之前
伺服器端 API 金鑰以 `calls:read` 取得摘要,以 `transcripts:read`
取得逐字稿。只有在整合需要兩種資源時才授予兩個 scope。既有金鑰不會
自動取得逐字稿權限。
## 輪詢摘要
呼叫 `GET /calls/{call_id}/summary`。尚未完成是正常狀態:HTTP 200、
`status: "processing"`、`poll_after_seconds: 5`。狀態成為 `ready`、
`unavailable` 或 `failed` 後停止輪詢。
```curl theme={null}
curl --request GET 'https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/summary' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16"
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/summary", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
},
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"GET",
"https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/summary",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
},
)
print(response.status_code, response.json())
```
## 輪詢逐字稿
呼叫 `GET /calls/{call_id}/transcript?limit=100`。摘要與逐字稿各自判定
是否就緒,不能用其中一個推論另一個。
```curl theme={null}
curl --request GET 'https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/transcript?limit=100' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16"
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/transcript?limit=100", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
},
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"GET",
"https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111/transcript?limit=100",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
},
)
print(response.status_code, response.json())
```
## 沿用游標
`next_cursor` 非 null 時,下一個請求必須原樣送回。游標會固定逐字稿
修訂版本;較晚完成的對帳可以發布新修訂版本,不會改變正在讀取的舊頁面。
為了遵守回應大小上限,單頁輪次可能少於 `limit`;只有
`next_cursor` 為 null 才表示分頁完成。
## 偵測內容更新
儲存 `call_id`、端點名稱與 `revision`。較高的 revision 表示清理後的
端點內容已更新;相同內容的重投影不會增加 revision。
## 處理終止狀態
`unavailable` 表示這通電話無法產生該結果,可查看穩定的 reason。
`failed` 與 `processing_failed` 表示安全處理已耗盡。兩者都不是 HTTP
錯誤。
# 建立自動化執行
Source: https://docs.brightalk.ai/zh-Hant/guides/run-automation
為單一聯絡人建立並追蹤一次自動化執行。
此流程會選取由儀表板管理且已啟用的自動化,為一位聯絡人建立一次執行,並追蹤非同步自動化執行的 API 資源。
## 事前準備
* 一把放在伺服器端,且具備 `automations:run` 與 `automations:read` 的 `bt_live_` 金鑰。
* 一個組織可見且已啟用的自動化,以及一個既有聯絡人或內嵌收話人資料。
* 此次邏輯執行專用且不重複、非機密的 `Idempotency-Key`。
* 瞭解代理、等待步驟、重試規則與分支流程都由自動化定義,而不是由 API 請求決定。
## 選取已啟用的自動化
以 `automations:read` 列出摘要,再選擇 `status` 為 `active` 的項目。
請將 JavaScript 範例儲存為 `.mjs`,或在 ESM 專案中執行。範例最外層的 `await` 必須使用 ESM,且需使用 Node 18 以上版本提供的內建 `fetch`。
```curl theme={null}
curl --request GET 'https://api.brightalk.ai/automations?status=active&limit=20' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16"
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/automations?status=active&limit=20", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
},
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"GET",
"https://api.brightalk.ai/automations?status=active&limit=20",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
},
)
print(response.status_code, response.json())
```
目前版本的摘要沒有宣告可由 API 傳入的欄位:
```json theme={null}
{
"data": [
{
"id": "atm_demo_001",
"name": "Renewal follow-up",
"description": "Calls one contact and records the outcome.",
"status": "active",
"input_fields": []
}
],
"next_cursor": null
}
```
## 啟動自動化執行
因 `input_fields` 為空,請如標準範例一樣省略 `input`,或只傳送 `{}`。
啟動這次自動化執行可能會依儀表板管理的自動化定義撥打真實 PSTN 電話。送出此寫入操作前,請確認自動化、聯絡人、設定行為與時間。
```curl theme={null}
curl --request POST 'https://api.brightalk.ai/automation-runs' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: createAutomationRun-example-001" \
--data '{"automation_id":"atm_demo_001","contact_id":"con_demo_001"}'
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/automation-runs", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
"Idempotency-Key": "createAutomationRun-example-001",
},
body: JSON.stringify({"automation_id":"atm_demo_001","contact_id":"con_demo_001"}),
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"POST",
"https://api.brightalk.ai/automation-runs",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
"Idempotency-Key": "createAutomationRun-example-001",
},
json={"automation_id":"atm_demo_001","contact_id":"con_demo_001"},
)
print(response.status_code, response.json())
```
只有 API 傳回非空的 `input_fields` 宣告時才能提供 `input`,而且只能傳送其中明確列出的欄位。
## 預期回應
API 會傳回 `202 Accepted`。請保存自動化執行 API 資源的 `id`。
```json theme={null}
{
"id": "run_demo_001",
"automation_id": "atm_demo_001",
"contact_id": "con_demo_001",
"input": {},
"queued_at": "2026-07-20T01:00:00Z",
"created_at": "2026-07-20T01:00:00Z",
"updated_at": "2026-07-20T01:00:00Z",
"status": "queued"
}
```
## 查詢及取消
| 動作 | 端點 | 下一個動作 |
| -- | --------------------------------------- | --------------------------------------------------------------------------------- |
| 查詢 | `GET /automation-runs/{run_id}` | 在 `queued`、`running` 或 `waiting` 時採退避方式查詢;於 `completed`、`failed` 或 `cancelled` 停止 |
| 取消 | `POST /automation-runs/{run_id}/cancel` | 阻止排隊中的工作,或要求在執行步驟的邊界之間取消 |
查詢需要 `automations:read`;取消需要 `automations:run`。取消可選用 `Idempotency-Key`,且對正在執行的步驟仍採盡力而為。
## 常見錯誤
| 錯誤 | 檢查項目 |
| ------------------------- | ------------------------------------------------------------ |
| `insufficient_scope` | 金鑰具備啟動/取消所需的 `automations:run`,以及列出/查詢所需的 `automations:read` |
| `resource_not_found` | 自動化與聯絡人屬於此組織且對此組織可見 |
| `resource_state_conflict` | 所選自動化為 `active`,且請求的狀態轉換符合目前執行狀態 |
| `validation_error` | `input_fields` 為空時,省略 `input` 或只傳送 `{}` |
| `duplicate_active_run` | 使用安全 `details` 中的 `existing_run_id` 查詢既有且仍在進行的自動化執行 |
| `idempotency_conflict` | 重複使用的金鑰具有相同自動化、聯絡人及語意相同的請求內容 |
# 冪等性
Source: https://docs.brightalk.ai/zh-Hant/idempotency
以 Idempotency-Key 安全地重試支援的寫入操作。
即使您的伺服器逾時,請求仍可能已成功。若改用新的冪等性金鑰重試,Brightalk 可能會重複建立同一通電話、同一個批次或同一次自動化執行。沿用相同的 `Idempotency-Key`,Brightalk 就能辨識這是同一個動作,並傳回原本的結果。
## 三個使用原則
1. **一個動作,一把金鑰。** 第一次送出請求前,先產生不重複且非機密的值。
2. **同一個動作,沿用同一把金鑰。** 在 24 小時內,若請求逾時、連線失敗,或回應明確要求重試(例如包含 `Retry-After`),請使用相同的 HTTP 方法、路徑、API 版本、語意相同的請求內容與金鑰重送。
3. **動作或內容改變,就換新金鑰。** 若 API 版本或請求內容不同,或您確實要再建立一通電話、另一個批次或另一次自動化執行,請使用新的金鑰。
以下僅節錄標頭,刻意省略必要的 JSON 請求內容與 `Content-Type` 標頭。
```bash theme={null}
curl --request POST 'https://api.brightalk.ai/calls' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16" \
--header "Idempotency-Key: order-8f4c2-call-1"
```
請將 `order-8f4c2-call-1` 與這次業務動作一起保存。它不是驗證金鑰,但仍不可包含電話號碼、聯絡人資料或其他機密。
超過 24 小時後,請勿假設舊的冪等性宣告仍能防止重複執行。再次送出前,請先確認原本的動作是否已經執行。
## 哪些操作一定要使用
只有以下四個操作強制要求此標頭:
| 操作 | 路徑 |
| ------- | -------------------------------- |
| 建立通話 | `POST /calls` |
| 建立批次 | `POST /batches` |
| 啟動批次 | `POST /batches/{batch_id}/start` |
| 建立自動化執行 | `POST /automation-runs` |
省略標頭會傳回 `400 idempotency_key_required`。
## 哪些操作可選擇使用
狀態控制操作可選用此標頭;加入標頭後,即可重播已完成的結果:
| 操作 | 路徑 |
| ------- | --------------------------------------- |
| 取消通話 | `POST /calls/{call_id}/cancel` |
| 暫停批次 | `POST /batches/{batch_id}/pause` |
| 繼續批次 | `POST /batches/{batch_id}/resume` |
| 取消批次 | `POST /batches/{batch_id}/cancel` |
| 取消自動化執行 | `POST /automation-runs/{run_id}/cancel` |
## Brightalk 會傳回什麼
| 情況 | 結果 |
| --------------- | ------------------------------------------------------------------------ |
| 相同金鑰與語意相同的請求內容 | 傳回原始 HTTP 狀態與回應;已完成的結果重播包含 `Idempotency-Replayed: true` |
| 相同金鑰與不同請求內容 | `409 idempotency_conflict` |
| 原始請求仍在處理時使用相同金鑰 | `409 idempotency_in_progress`,並包含以差值秒數(delta-seconds)表示的數字 `Retry-After` |
請等待 `Retry-After` 指定的時間後,再重試處理中的請求。驗證失敗不會儲存成已完成的冪等結果。
## 進階細節
冪等性宣告會保留 24 小時,其適用範圍由組織、API 金鑰類別、API 版本、HTTP 方法與正規化路徑共同決定。從一把 `bt_live_` 金鑰輪替到另一把金鑰,不會重設相同金鑰類別的宣告;輪替後重試同一邏輯請求時,請沿用原本的冪等性金鑰。
# Brightalk API 簡介
Source: https://docs.brightalk.ai/zh-Hant/introduction
使用伺服器對伺服器的公開 API,把公司系統連接到 Brightalk AI 通話。
Brightalk 公開 API 能把公司既有的 CRM、表單、ERP 或內部工作流程連接到 AI 通話。您的伺服器可以建立聯絡人、選擇符合資格的 AI 語音代理、撥打一通電話、啟動批次撥號,或從儀表板管理的自動化建立一次自動化執行。
請前往 [Brightalk API 設定](https://www.brightalk.ai/settings/integrations/api)建立具適當權限的 API 金鑰,將金鑰安全地保存在伺服器端,再呼叫 `https://api.brightalk.ai`。每個已接受的通話或工作流程都會傳回可查詢的 API 資源,直到進入終止狀態。
AI 語音代理與自動化都在 Brightalk 儀表板中設定及管理。透過本 API 建立的通話僅限 AI 模式。
## 選擇執行方式
使用符合資格的 AI 語音代理,將一通立即執行的非同步通話加入佇列,再查詢結果。
為最多 1,000 位不重複的收話人建立草稿,再啟動、排程及控制批次。
從儀表板管理且已啟用的自動化,為一位聯絡人建立一次執行並追蹤狀態。
## API 涵蓋範圍
API 提供組織範圍內的聯絡人、符合資格的代理目錄、單次通話、批次、自動化摘要及自動化執行。已接受的執行工作皆為非同步:成功回應會建立或傳回一個 API 資源,您的伺服器需持續查詢,直到資源進入終止狀態。
契約未載明的功能目前不受支援。請參閱[可用性](/zh-Hant/availability),瞭解明確邊界與儀表板相依性。
## 下一步
依照[快速開始](/zh-Hant/quickstart)建立具適當權限範圍的金鑰、將一通電話加入佇列,並判讀結果。
# 快速開始
Source: https://docs.brightalk.ai/zh-Hant/quickstart
使用 Brightalk API 金鑰完成第一個經過身分驗證的 REST API 流程。
請從受信任的伺服器呼叫正式環境基礎 URL `https://api.brightalk.ai`。此流程會建立一通立即執行的非同步 AI 通話,再查詢產生的通話資源。
## 1. 建立具適當權限範圍的金鑰
前往 [Brightalk API 設定](https://www.brightalk.ai/settings/integrations/api),建立同時具備 `calls:read` 與 `calls:write` 的 `bt_live_` 金鑰。這兩項是建立並查詢通話所需的最小權限。若需要執行步驟 2 的選用聯絡人建立範例,請再選取 `contacts:write`;如果同一組織已有可用聯絡人,則不需要這項額外權限。金鑰只會顯示一次,請立即複製到伺服器端的金鑰管理工具。
將金鑰設為環境變數,且不要提交至版本控制:
```bash theme={null}
export BRIGHTALK_API_KEY="your_brightalk_api_key"
```
## 2. 取得代理與聯絡人參照
使用 `calls:read` 列出符合資格的代理。(`GET /agents` 也接受 `batches:read`,但這個單次通話流程不需要該權限。)將其中一筆回應的 `id` 保存為步驟 3 使用的 `agent_id`。
請將每個 JavaScript 範例儲存為 `.mjs`,或在 ESM 專案中執行。最外層的 `await` 必須使用 ESM,且需使用 Node 18 以上版本提供的內建 `fetch`。Python 範例使用 `requests`;在全新環境中,可執行 `python -m pip install requests` 安裝此依賴套件。
```curl theme={null}
curl --request GET 'https://api.brightalk.ai/agents?limit=20' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16"
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/agents?limit=20", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
},
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"GET",
"https://api.brightalk.ai/agents?limit=20",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
},
)
print(response.status_code, response.json())
```
接著,使用同一組織內既有聯絡人的不透明 `id`。若尚無聯絡人,可用以下需要 `contacts:write` 的請求建立或採用聯絡人。範例採用保留的 E.164 示意號碼 `+12025550123`;請將範例識別資料替換為組織可控的測試資料。
```curl theme={null}
curl --request POST 'https://api.brightalk.ai/contacts' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16" \
--header "Content-Type: application/json" \
--data '{"external_id":"customer-8421","name":"Example Customer","phone_number":"+12025550123"}'
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/contacts", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
},
body: JSON.stringify({"external_id":"customer-8421","name":"Example Customer","phone_number":"+12025550123"}),
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"POST",
"https://api.brightalk.ai/contacts",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
},
json={"external_id":"customer-8421","name":"Example Customer","phone_number":"+12025550123"},
)
print(response.status_code, response.json())
```
建立新聯絡人時會傳回 `201`;找到既有聯絡人或完成採用時則傳回 `200`。請將回應的 `id` 保存為 `contact_id`。在步驟 3 中,以前述回應的代理與聯絡人 ID 取代 `agt_demo_001` 與 `con_demo_001`。
## 3. 建立通話
請求需要 `calls:write`、`Brightalk-Version` 與非機密的 `Idempotency-Key`。
對可接通的聯絡人送出 `POST /calls`,可能會撥打一通真實 PSTN 電話。執行修改後的範例前,請確認收話人與撥號時間。
```curl theme={null}
curl --request POST 'https://api.brightalk.ai/calls' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: createCall-example-001" \
--data '{"agent_id":"agt_demo_001","contact_id":"con_demo_001"}'
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/calls", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
"Idempotency-Key": "createCall-example-001",
},
body: JSON.stringify({"agent_id":"agt_demo_001","contact_id":"con_demo_001"}),
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"POST",
"https://api.brightalk.ai/calls",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
"Content-Type": "application/json",
"Idempotency-Key": "createCall-example-001",
},
json={"agent_id":"agt_demo_001","contact_id":"con_demo_001"},
)
print(response.status_code, response.json())
```
成功的請求會傳回 `202 Accepted`。請儲存回應中的 `id`:
```json theme={null}
{
"id": "11111111-1111-4111-8111-111111111111",
"contact_id": "con_demo_001",
"agent_id": "agt_demo_001",
"queued_at": "2026-07-20T01:00:00Z",
"created_at": "2026-07-20T01:00:00Z",
"updated_at": "2026-07-20T01:00:00Z",
"status": "queued",
"answer_status": "unknown"
}
```
## 4. 查詢傳回的通話 ID
將 `11111111-1111-4111-8111-111111111111` 替換為步驟 3 取得的 `id`。請使用 `calls:read` 查詢;每次請求之間採取退避,並遵守速率限制標頭。
```curl theme={null}
curl --request GET 'https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111' \
--header "Authorization: Bearer $BRIGHTALK_API_KEY" \
--header "Brightalk-Version: 2026-07-16"
```
```javascript theme={null}
const response = await fetch("https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.BRIGHTALK_API_KEY}`,
"Brightalk-Version": "2026-07-16",
},
});
console.log(response.status, await response.json());
```
```python theme={null}
import os
import requests
response = requests.request(
"GET",
"https://api.brightalk.ai/calls/11111111-1111-4111-8111-111111111111",
headers={
"Authorization": f"Bearer {os.environ['BRIGHTALK_API_KEY']}",
"Brightalk-Version": "2026-07-16",
},
)
print(response.status_code, response.json())
```
`status` 為 `queued`、`dialing` 或 `in_progress` 時,請持續查詢。
## 5. 判讀 `status` 與 `answer_status`
`status` 說明執行生命週期;當狀態為 `completed`、`failed` 或 `cancelled` 時停止查詢。`answer_status` 則獨立分類目的端的接聽情況。
| 欄位 | 回答的問題 | 範例值 |
| --------------- | -------------------- | --------------------------------------------------- |
| `status` | 通話執行是正常結束、失敗,還是遭取消? | `completed`、`failed`、`cancelled` |
| `answer_status` | 目的端為已接聽、未接聽、忙線或語音信箱? | `answered`、`no_answer`、`busy`、`voicemail`、`unknown` |
正常未接聽的結果是 `status: completed` 搭配 `answer_status: no_answer`,並非系統失敗。所有轉換請參閱[通話狀態生命週期](/zh-Hant/concepts/status-lifecycle)。
# 速率限制
Source: https://docs.brightalk.ai/zh-Hant/rate-limits
瞭解讀取、寫入、執行、逐字稿與錄音請求的速率限制回應。
如果 Brightalk 傳回 `429 rate_limit_exceeded`,表示整合程式對這類操作送出的請求,已超過目前可用配額。回應會直接告訴您需要等待多久。
## 等待後再安全重試
1. 從每一次 `429` 回應讀取最新的 `Retry-After`。
2. 至少等待該段時間,再加上一小段隨機延遲。後續若再次收到 `429`,請依最新的 `Retry-After` 等待,並逐步增加隨機退避時間,但不得超過呼叫端自訂的上限,避免重試間隔過短或無限重試。
3. 只有在操作可安全重試,且未超過呼叫端自訂的最大嘗試次數、總經過時間或截止期限,才重新送出。一旦達到次數上限或時間期限,請停止重試並回報錯誤。同一個邏輯寫入動作若仍在[冪等性文件所述的適用界線](/zh-Hant/idempotency)內,必須沿用相同的 HTTP 方法、路徑、API 版本、語意相同的請求內容,以及原本的 `Idempotency-Key`。
共用同一個組織配額的工作程序應彼此協調,不要各自獨立重試。
請勿在程式中寫死一個全域請求上限。Brightalk 會依組織限制請求,也可能對個別金鑰套用較低限制;目前請求一律以回應標頭為準。
## 五個獨立計數器
每個操作會使用五個獨立配額群組的其中一個:
| 配額群組 | 操作範例 |
| ------------ | ------------------------------- |
| `read` | 列出及查詢資源 |
| `write` | 寫入聯絡人;建立批次;取消通話;暫停或取消批次;取消自動化執行 |
| `execution` | 建立通話;啟動或繼續批次;建立自動化執行 |
| `transcript` | 取得通話逐字稿;每個組織預設每分鐘 60 次請求 |
| `recording` | 列出及取得通話錄音;每個組織預設每分鐘 60 次請求 |
取消及暫停操作使用 `write`,不是 `execution`。輪詢逐字稿與輪詢錄音各自使用專用配額群組,都不會占用一般讀取配額。已接受的執行請求所啟動的電話工作,不會再使用另一筆 HTTP 請求配額。
## 下載錄音不受速率限制——受限的是核發網址那一步
`GET /recordings` 與 `GET /recordings/{recording_id}` 和其他請求一樣會計入 `recording` 配額群組,但實際去抓取回應中 `download_url` 指向的內容並不會。那個網址位於另一個主機,不需要 API 金鑰,也沒有配額群組可以計費。節流發生在核發網址的那一步,不是使用網址的那一步:同時間內存在多少張有效的下載網址,取決於您每分鐘可核發幾次 `recording` 配額群組的請求,乘上核發時設定的存活秒數,而不是另外設有下載本身的限制。
## 讀取回應標頭
| 標頭 | 意義 |
| --------------------- | ------------------------------------------------------ |
| `RateLimit-Limit` | 所選配額群組的有效配額 |
| `RateLimit-Remaining` | 該配額群組剩餘的非負請求次數 |
| `RateLimit-Reset` | 從產生回應到重設配額的非負整數差值秒數(delta-seconds);絕不是 Unix epoch 時間戳記 |
| `Retry-After` | 重試遭拒請求前應等待的非負整數差值秒數(delta-seconds) |
請使用這些值,不要假設每個組織或金鑰都採用相同配額。
## 排隊不等於受到速率限制
通話並行容量是另一種控制。容量暫時已滿時,已接受的工作會保持 `queued`;不會變成 `429`,也不會遭丟棄。請查詢 API 資源,並將排隊視為生命週期狀態,而非請求節流訊號。
# 版本控制
Source: https://docs.brightalk.ai/zh-Hant/versioning
使用 Brightalk-Version 標頭選擇日期版本的 API 契約。
Brightalk 使用日期版本的契約,讓伺服器能選擇整合所依循的 API 行為。
## 使用不含版本的 URL
所有請求都使用正式環境基礎 URL `https://api.brightalk.ai`。版本號不屬於路徑的一部分;例如,使用 `POST /calls` 建立通話。
## 傳送 Brightalk-Version
客戶端應在每個請求明確傳送支援的日期版本:
```http theme={null}
Brightalk-Version: 2026-07-16
```
每個回應都會在 `Brightalk-Version` 標頭回傳實際套用的版本。請將標頭值放在設定中,讓契約升級都能先完成審查與測試。
## 理解省略標頭與預設值
每個組織都有固定的預設 API 版本。若請求省略 `Brightalk-Version`,Brightalk 會使用該固定預設值,並仍在回應標頭傳回實際版本。省略標頭不代表任意選用最新版本。
## 處理不支援的版本
未知或已停用的值會傳回 `400 unsupported_version`。若回應包含可供機器讀取的 `details`,其中會列出支援版本:
```json theme={null}
{
"error": {
"code": "unsupported_version",
"message": "The requested API version is not supported.",
"request_id": "req_demo_001",
"details": {
"supported_versions": ["2026-07-16"]
}
}
}
```
會破壞相容性的回應或行為變更必須使用另一個日期版本。同一版本內可能新增回應欄位,因此客戶端應忽略未知的回應欄位。
# 列出符合資格的 AI 語音代理
Source: https://docs.brightalk.ai/zh-hant/api-reference/agents/列出符合資格的-ai-語音代理
/openapi/openapi.zh-Hant.yaml get /agents
傳回組織擁有且目前符合對外 AI 撥號資格的代理。結果採用由新到舊的不透明游標分頁。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 列出 API 可見的通話
Source: https://docs.brightalk.ai/zh-hant/api-reference/calls/列出-api-可見的通話
/openapi/openapi.zh-Hant.yaml get /calls
傳回直接通話,以及由公開 API 建立的批次或自動化執行所產生的子通話。生命週期狀態與接聽分類彼此獨立。結果採用由新到舊的游標分頁。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 取得通話
Source: https://docs.brightalk.ai/zh-hant/api-reference/calls/取得通話
/openapi/openapi.zh-Hant.yaml get /calls/{call_id}
傳回一個 API 可見的通話資源及其純量結果欄位。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 取得通話摘要
Source: https://docs.brightalk.ai/zh-hant/api-reference/calls/取得通話摘要
/openapi/openapi.zh-Hant.yaml get /calls/{call_id}/summary
傳回一筆 API 可見通話中具有獨立修訂版本的摘要結果。處理中、無法提供,以及處理已耗盡,都是正常的 HTTP 200 結果狀態。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 取得通話逐字稿
Source: https://docs.brightalk.ai/zh-hant/api-reference/calls/取得通話逐字稿
/openapi/openapi.zh-Hant.yaml get /calls/{call_id}/transcript
傳回一頁具有獨立修訂版本且由游標固定的清理後對話輪次。逐字稿是否就緒與摘要是否就緒彼此獨立。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 取消通話
Source: https://docs.brightalk.ai/zh-hant/api-reference/calls/取消通話
/openapi/openapi.zh-Hant.yaml post /calls/{call_id}/cancel
以冪等方式要求盡力取消。通話完成可能在終止狀態競爭中勝出。選用的 Idempotency-Key 可讓結果重播;原始 JSON 主體上限為 1 MiB。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 將一通立即執行的 AI 通話加入佇列
Source: https://docs.brightalk.ai/zh-hant/api-reference/calls/將一通立即執行的-ai-通話加入佇列
/openapi/openapi.zh-Hant.yaml post /calls
以持久方式將一通 AI 通話排入佇列,使其可立即執行。容量限制可能使已接受的通話繼續留在佇列中。必須提供 Idempotency-Key,且原始 JSON 主體上限為 1 MiB。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 列出聯絡人
Source: https://docs.brightalk.ai/zh-hant/api-reference/contacts/列出聯絡人
/openapi/openapi.zh-Hant.yaml get /contacts
使用穩定且由新到舊的不透明游標分頁傳回組織的聯絡人。外部識別與建立時間篩選條件可合併使用。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 取得聯絡人
Source: https://docs.brightalk.ai/zh-hant/api-reference/contacts/取得聯絡人
/openapi/openapi.zh-Hant.yaml get /contacts/{contact_id}
依不透明識別碼傳回組織的一位聯絡人。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 建立或採用聯絡人
Source: https://docs.brightalk.ai/zh-hant/api-reference/contacts/建立或採用聯絡人
/openapi/openapi.zh-Hant.yaml post /contacts
依據提供的外部識別與嚴格 E.164 號碼,建立、更新或採用組織內的標準聯絡人紀錄。原始 JSON 主體上限為 1 MiB。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 更新聯絡人
Source: https://docs.brightalk.ai/zh-hant/api-reference/contacts/更新聯絡人
/openapi/openapi.zh-Hant.yaml patch /contacts/{contact_id}
僅更新支援的聯絡人欄位。必須至少提供一個欄位,且原始 JSON 主體上限為 1 MiB。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 列出通話錄音
Source: https://docs.brightalk.ai/zh-hant/api-reference/recordings/列出通話錄音
/openapi/openapi.zh-Hant.yaml get /recordings
傳回組織在兩張通話資料表中的所有錄音,不論該通話透過何種方式建立。結果採用依錄音時間、再依錄音識別碼由新到舊排序的游標分頁。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 取得通話錄音
Source: https://docs.brightalk.ai/zh-hant/api-reference/recordings/取得通話錄音
/openapi/openapi.zh-Hant.yaml get /recordings/{recording_id}
傳回一筆錄音的中繼資料,以及一個新核發的簽名下載網址。下載網址為短效,請在需要時重新索取,不要快取留待稍後使用。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 列出批次
Source: https://docs.brightalk.ai/zh-hant/api-reference/批次撥號/列出批次
/openapi/openapi.zh-Hant.yaml get /batches
使用由新到舊的游標分頁,傳回由 API 建立的批次與彙總收話人數量。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 取得批次
Source: https://docs.brightalk.ai/zh-hant/api-reference/批次撥號/取得批次
/openapi/openapi.zh-Hant.yaml get /batches/{batch_id}
傳回一個由 API 建立的批次,以及彙總收話人數量與時間資訊。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 取消剩餘的批次工作
Source: https://docs.brightalk.ai/zh-hant/api-reference/批次撥號/取消剩餘的批次工作
/openapi/openapi.zh-Hant.yaml post /batches/{batch_id}/cancel
取消剩餘派送,並要求盡力取消仍在進行中的子通話。選用的 Idempotency-Key 可讓結果重播;原始 JSON 主體上限為 1 MiB。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 啟動或排程批次草稿
Source: https://docs.brightalk.ai/zh-hant/api-reference/批次撥號/啟動或排程批次草稿
/openapi/openapi.zh-Hant.yaml post /batches/{batch_id}/start
將草稿轉換為已排程或已加入佇列的批次。必須提供 Idempotency-Key,且原始 JSON 主體上限為 1 MiB。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 建立批次草稿
Source: https://docs.brightalk.ai/zh-hant/api-reference/批次撥號/建立批次草稿
/openapi/openapi.zh-Hant.yaml post /batches
建立包含 1 至 1,000 位不重複的既有聯絡人或內嵌收話人的草稿。只能提供其中一種收話人格式。必須提供 Idempotency-Key,且原始 JSON 主體上限為 1 MiB。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 暫停後續批次派送
Source: https://docs.brightalk.ai/zh-hant/api-reference/批次撥號/暫停後續批次派送
/openapi/openapi.zh-Hant.yaml post /batches/{batch_id}/pause
暫停後續收話人派送,但不保證停止已在進行中的工作。選用的 Idempotency-Key 可讓結果重播;原始 JSON 主體上限為 1 MiB。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 繼續批次派送
Source: https://docs.brightalk.ai/zh-hant/api-reference/批次撥號/繼續批次派送
/openapi/openapi.zh-Hant.yaml post /batches/{batch_id}/resume
將符合資格的剩餘收話人重新加入佇列。容量限制可能使其繼續留在佇列中。選用的 Idempotency-Key 可讓結果重播;原始 JSON 主體上限為 1 MiB。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 列出自動化
Source: https://docs.brightalk.ai/zh-hant/api-reference/自動化/列出自動化
/openapi/openapi.zh-Hant.yaml get /automations
傳回組織可見且由儀表板管理的自動化摘要。使用 status 縮小結果範圍,並使用 cursor 進行穩定且由新到舊的分頁。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 列出由 API 啟動的自動化執行
Source: https://docs.brightalk.ai/zh-hant/api-reference/自動化執行/列出由-api-啟動的自動化執行
/openapi/openapi.zh-Hant.yaml get /automation-runs
使用由新到舊的游標分頁,傳回透過此 API 啟動的自動化執行。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 取得自動化執行
Source: https://docs.brightalk.ai/zh-hant/api-reference/自動化執行/取得自動化執行
/openapi/openapi.zh-Hant.yaml get /automation-runs/{run_id}
依不透明識別碼傳回一個由 API 啟動的自動化執行。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 取消自動化執行
Source: https://docs.brightalk.ai/zh-hant/api-reference/自動化執行/取消自動化執行
/openapi/openapi.zh-Hant.yaml post /automation-runs/{run_id}/cancel
防止已加入佇列的工作開始,或在步驟之間將尚未終止的執行標記為 `cancelled`。選用的 Idempotency-Key 可讓結果重播;原始 JSON 主體上限為 1 MiB。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。
# 建立自動化執行
Source: https://docs.brightalk.ai/zh-hant/api-reference/自動化執行/建立自動化執行
/openapi/openapi.zh-Hant.yaml post /automation-runs
從儀表板管理且已啟用的自動化,為一位聯絡人建立一次自動化執行並加入佇列。自動化定義指定要使用的代理、等待步驟、重試規則與分支。必須提供 Idempotency-Key;經清理的原始 JSON 主體上限為 1 MiB。每個回應都包含 Brightalk-Version 與 X-Request-Id;受到速率限制的回應還會提供實際套用之配額群組的計數器。