Skip to main content

開始之前

請使用具備 recordings:read 的伺服器端 API 金鑰。這個權限範圍與 calls:read 彼此獨立,且只有在組織管理員為您的組織開通錄音功能後, 建立金鑰的表單上才會出現這個選項;如何為新金鑰加上這個權限,請參閱 身分驗證與權限範圍

列出錄音

呼叫 GET /recordings。回應涵蓋組織在兩張通話資料表中的所有錄音, 依錄音時間由新到舊排序。
加上 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 筆錄音約一次請求),以及不論規模大小、全量走訪都只拉 中繼資料這個事實。依錄音缺漏對您造成的成本,選擇每天或每週跑一次; 不要只靠增量同步就宣稱資料已經完整。

只在真正要使用時才索取網址

GET /recordings/{recording_id} 一律會附上 download_url,不需要 include 參數。若您是在自家產品中內嵌播放器,請在使用者按下播放 鍵的那一刻才索取這個網址,而不是在錄音列表頁面載入時就先取得。網址 預設存活 900 秒(可用 expires_in 覆寫為 60 至 3600 秒之間的數值); 頁面若開啟得比這更久,原本拿到的網址就會在使用者還沒按下播放前悄悄 失效。

撤銷存取權不會讓已核發的網址失效

這是簽名網址這套機制本身的性質,不是疏漏:網址本身就是憑證,一旦 核發出去,就不會再回頭檢查原本核發它的金鑰是否仍然有效。殘留的有效 期正好等於核發當下的 expires_in——最長一小時,預設 15 分鐘。若客戶 誤以為撤銷會讓已核發的連結立刻失效,就會做出錯誤的安全性判斷;請以 到期時間規劃,而不是以撤銷動作規劃。