Hushscript 語音轉文字 API 透過 /v1/ 接受錄音,讓您的腳本查詢工作並讀取逐字稿。這是線上轉錄工作流程,並非即時串流或直接呼叫語音辨識模型的端點。如果您的用戶端偏好工具而非 HTTP 呼叫,MCP 伺服器使用相同的帳戶、餘額與持有者權杖。
透過 API 把音訊與影片轉成逐字稿
音訊轉錄 API 接受準備好的音訊檔案,包括錄製的語音。進行 STT(語音轉文字)整合時,請提交錄音檔案;不支援麥克風即時串流。若要轉錄影片,請直接上傳帶有音軌的 MP4 或 MOV 檔案:伺服器會讀取音軌並略過影像。其他影片格式請先擷取音訊;API 不接受影片網址。瀏覽器工作流程請見影片轉文字。
快速入門
這個 API 需要一個個人存取權杖,取得方式有兩種。一種是由個人使用者在帳戶中的 MCP 頁面的 建立新的權杖 區段建立權杖,選擇其權限範圍,並決定它是否可以購買分鐘數。另一種是由代理程式自行開設帳戶,無需人類帳戶持有人:POST /v1/agent/accounts 會啟動一次付費註冊,POST /v1/agent/accounts/{signup_id}/claim 則以一次性的認領密鑰換取一個真正的帳戶與第一個權杖。無論哪一種方式,權杖都只會顯示一次,格式為 hsr1:<region>:pat.<id>.<secret>。透過 MCP 伺服器的 OAuth 登入所產生的權杖,在這裡同樣適用;詳見連接。權杖永遠無法建立、列出或撤銷其他權杖,一個帳戶最多可持有 25 個有效權杖;完整的代理程式帳戶流程,包括憑證輪替,請見自動化使用的操作說明。
取得權杖後,直接呼叫 API 即可。此範例代表尚未進行信用卡驗證或購買的新個人帳戶;由代理程式建立的帳戶,則從其已付費的分鐘套餐起算:
curl https://api.hushscript.com/v1/account \
-H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"
{
"balance_seconds": 0,
"held_seconds": 0,
"credits_expire_at": null,
"card_on_file": false,
"data_region": "eu",
"limits": {
"max_active_jobs": 50,
"max_daily_seconds": 144000,
"active_jobs": 0,
"used_today_seconds": 0
}
}
這會回傳以秒為單位的餘額、正在執行工作所暫扣的秒數、credits_expire_at(分鐘數不會過期,因此一律為 null)、是否已儲存卡片、資料所在地區,以及受理上限(max_active_jobs、max_daily_seconds,及其目前用量)。每日上限是帳戶目前的有效上限,請勿寫死在程式碼中。POST /v1/uploads 檢查的是可用分鐘數,而不是卡片:分鐘數不足時會回傳 3001 insufficient_balance。
語音轉文字 API 是否免費?
沒有通用的免費 API 方案,但您可以在撰寫程式碼前先試用工作流程:公開預覽可在登入前,從一段錄音轉錄最長五分鐘。符合資格的個人帳戶在卡片驗證後,可獲得 30 分鐘免費額度(運作方式請見定價);由代理程式建立的帳戶沒有歡迎分鐘,而是以註冊時購買的套餐開始使用。無論哪種帳戶,完整 API 工作都需要帳戶與分鐘數。
端到端自動化
相同的 /v1/ 呼叫,無論是使用由人在應用程式中建立的權杖,或是由代理程式在付費註冊後領取的權杖,都能運作(見自動化使用)。儲存卡片需要在瀏覽器中完成託管的 Checkout,代理程式可以自行操作;之後在非工作階段中發起的購買,若發卡機構要求驗證,仍可能被拒絕。
-
讀取帳戶。
GET /v1/account。若您需要購買分鐘數,且card_on_file為 false,請先儲存一張卡片。 -
儲存一張卡片,僅需一次。
POST /v1/billing/setup-session會回傳checkout_url、session_id與expires_at:curl -X POST https://api.hushscript.com/v1/billing/setup-session \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"{ "checkout_url": "https://checkout.stripe.com/c/pay/cs_live_a1B2c3D4e5F6g7H8", "session_id": "seti_1PxYzQ2eZvKYlo2C", "expires_at": "2026-09-11T15:45:00Z" }在您自己控制的瀏覽器中開啟這個網址,完成託管的 Stripe 頁面;不會產生任何收費,Hushscript 也永遠不會看到卡片明細。接著
GET /v1/billing/cards會列出該卡片及其 id。若帳戶持有多張卡片,POST /v1/billing/cards/default可以切換預設卡片。 -
購買分鐘數。
GET /v1/billing/packs會列出五個套餐,附上id、seconds、amount與currency:curl https://api.hushscript.com/v1/billing/packs \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"POST /v1/billing/purchase搭配pack、quick_payment_method_id( 已儲存卡片的 id)與idempotency_key,會在非工作階段中向卡片扣款,並回傳新的balance_seconds:curl -X POST https://api.hushscript.com/v1/billing/purchase \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293" \ -H "Content-Type: application/json" \ -d '{ "pack": "300min", "quick_payment_method_id": "pm_2QeT4bY7uX9mK3nP", "idempotency_key": "purchase-2026-09-11-02" }'{ "balance_seconds": 18000 }這需要權杖具有
billing權限範圍,且權杖與帳戶都已啟用購買功能。請求主體未指定卡片 id,或扣款遭拒,會以4021 pat_purchase_requires_app拒絕;發卡機構要求驗證 挑戰的卡片,則會以4023 pat_purchase_requires_authentication拒絕。兩者都 不會留下一個無人能完成的頁面。 -
上傳。
POST /v1/uploads搭配size_bytes、duration_seconds(15 秒至 10 小時)、選填的title、transcription_options、matter_code, 以及idempotency_key:curl -X POST https://api.hushscript.com/v1/uploads \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293" \ -H "Content-Type: application/json" \ -d '{ "size_bytes": 41943040, "duration_seconds": 1200, "title": "Q3 board call", "transcription_options": { "speaker_detection": true }, "idempotency_key": "upload-2026-09-11-02" }'matter_code是最多 64 字元的自由文字,只有在權杖屬於某個工作區時才有 意義:它會隨該工作的紀錄,顯示於該工作區的時數池活動記錄與用量報表中。若工作區的 案件代碼政策設為必填,未附上代碼的上傳請求會被org_matter_code_required拒絕。client_code會被接受但忽略,因為客戶是案件的屬性,由工作區管理員設定。它會暫扣分鐘額度,並回傳一個
job_id以及第一頁已預先簽署的分段網址:{ "job_id": "job_5e2a91cf4d7b6081a9f3c2e4b5d6a7c8", "part_urls": [ { "n": 1, "url": "https://r2.hushscript.com/uploads/job_5e2a91cf.../part-1?X-Amz-Signature=..." } ] }以
PUT將每個分段上傳至各自的網址(預設每個分段 32 MiB,最後一個分段較小):curl -X PUT "https://r2.hushscript.com/uploads/job_5e2a91cf.../part-1?X-Amz-Signature=..." \ --data-binary @part-01.bin後續頁面可從
GET /v1/uploads/{job}/part-urls?start=<n>取得,長時間傳輸時, 請在 20 分鐘閒置逾時之內盡早呼叫POST /v1/uploads/{job}/heartbeat。當預先 簽署的網址無法使用,或某個分段失敗時,可改用PUT /v1/uploads/{job}/parts/{n}透過 API 直接送出該分段的位元組;重複PUT會取代該分段,因此重試是安全的。 支援:mp3、m4a、mp4 或 mov(使用音軌,略過影像軌)、wav、flac、ogg 或 opus, 並由伺服器探測格式;其他影片格式請在上傳前先擷取音訊。 -
開始並等待。
POST /v1/uploads/{job}/complete搭配每個透過預先簽署網址 送出的分段的n與etag(若所有分段都透過 API 送出,則省略parts):curl -X POST https://api.hushscript.com/v1/uploads/job_5e2a91cf4d7b6081a9f3c2e4b5d6a7c8/complete \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293" \ -H "Content-Type: application/json" \ -d '{ "parts": [ { "n": 1, "etag": "\"9f86d081884c7d65\"" } ] }'接著輪詢
GET /v1/jobs/{id}:state會依序經過uploading、queued、processing,最終變為done或failed,完成的工作會帶有transcript_id:curl https://api.hushscript.com/v1/jobs/job_5e2a91cf4d7b6081a9f3c2e4b5d6a7c8 \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"{ "id": "job_5e2a91cf4d7b6081a9f3c2e4b5d6a7c8", "state": "done", "transcript_id": "trs_2b6e1d4a9f7c3088a1b2c3d4e5f6a7b9" } -
讀取結果。
GET /v1/transcripts/{id}會回傳中繼資料與完整內容,包含 說話者姓名、偵測到的語言、標籤,以及自動刪除日期:curl https://api.hushscript.com/v1/transcripts/trs_2b6e1d4a9f7c3088a1b2c3d4e5f6a7b9 \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"GET /v1/transcripts則分頁列出清單。
轉錄選項與應用程式中的完全一致:language_code 或自動偵測、speaker_detection、
medical_mode(需要 language_code 為 en、es、fr 或 de 之一,額外收費
+100%)、translation_targets(每種語言 +25%)、multichannel、
keyterms_prompt、自由文字的 prompt,以及已儲存的 dictionary_ids 與 prompt_preset_id,可透過 GET /v1/transcription-context
列出。
帳戶的部分功能目前仍僅限於 MCP:以連結匯入、編輯或刪除逐字稿、Insights、匯出、
儲存詞典與提示詞預設,以及帳戶設定,目前都還沒有對應的 /v1/ 路由;MCP 伺服器則以同一個權杖涵蓋所有這些功能。
身分驗證
每一次 /v1/ 呼叫都會在 Authorization 標頭中帶有持有者權杖,並依照與 MCP
伺服器相同的權限範圍進行檢查:
| 權限範圍 | 允許的操作 |
|---|---|
transcripts:read |
讀取並匯出逐字稿、其中繼資料,以及已刪除清單 |
transcripts:write |
編輯、標記、翻譯、還原並刪除逐字稿 |
transcribe |
上傳錄音、以連結匯入,並執行轉錄 |
insights |
讀取、產生並刪除 Insights |
context |
管理已儲存的詞典與提示詞預設 |
account:read |
讀取餘額、使用量、交易紀錄與暫扣額度 |
settings:write |
變更帳戶設定 |
org:read |
讀取工作區成員、時數池活動記錄、發票與稽核紀錄 |
org:write |
變更成員權限、排定轉為工作區保管(永久),並設定或解除法律保存 |
export |
要求完整帳戶匯出、查看其狀態並下載 |
billing |
儲存卡片並購買分鐘套餐 |
超出權杖權限範圍的呼叫,會以 403 回應 pat_scope_missing。billing 權限範圍在權杖與帳戶都啟用帳務功能之前也不會生效;任一開關關閉時呼叫帳務端點,同樣會失敗並回傳 pat_scope_missing,重新產生權杖也無法開啟帳戶端的開關。權杖無法建立、列出或撤銷權杖,一個帳戶最多可持有 25 個有效權杖。
這 11 個權限範圍可由呼叫端自行選擇。pat:rotate 是另一個獨立的權限範圍,會授予代理程式帳戶的第一個權杖及其輪替後的後繼權杖;它允許該權杖替換自己,但不能管理其他權杖。在應用程式中建立權杖時無法選擇它。
端點
正式版 OpenAPI 文件列出 38 個方法/路徑操作,涵蓋 37 個路徑。以下每個操作都受所示權限範圍限制:
| 方法 | 路徑 | 權限範圍 |
|---|---|---|
POST |
/v1/agent/accounts |
none |
POST |
/v1/agent/accounts/{signup_id}/claim |
none |
POST |
/v1/agent/credentials/rotate |
pat:rotate |
GET |
/v1/account |
account:read |
POST |
/v1/billing/setup-session |
billing |
GET |
/v1/billing/cards |
billing |
POST |
/v1/billing/cards/default |
billing |
GET |
/v1/billing/packs |
billing |
POST |
/v1/billing/purchase |
billing |
GET |
/v1/billing/transactions |
account:read |
GET |
/v1/billing/ledger |
account:read |
GET |
/v1/billing/holds |
account:read |
POST |
/v1/uploads |
transcribe |
GET |
/v1/uploads/{job}/part-urls |
transcribe |
PUT |
/v1/uploads/{job}/parts/{n} |
transcribe |
POST |
/v1/uploads/{job}/heartbeat |
transcribe |
POST |
/v1/uploads/{job}/complete |
transcribe |
GET |
/v1/jobs |
transcribe |
GET |
/v1/jobs/{id} |
transcribe |
GET |
/v1/transcripts |
transcripts:read |
GET |
/v1/transcripts/deleted |
transcripts:read |
GET |
/v1/transcripts/{id} |
transcripts:read |
GET |
/v1/transcription-context |
context |
GET |
/v1/org |
org:read |
GET |
/v1/org/members |
org:read |
PATCH |
/v1/org/members/{user_id} |
org:write |
GET |
/v1/org/matters |
org:read |
GET |
/v1/org/transcripts |
org:read |
POST |
/v1/org/transcripts/{id}/hold |
org:write |
DELETE |
/v1/org/transcripts/{id}/hold |
org:write |
POST |
/v1/org/custody |
org:write |
GET |
/v1/org/invoices |
org:read |
GET |
/v1/org/ledger |
org:read |
GET |
/v1/org/ledger.csv |
org:read |
GET |
/v1/org/usage |
org:read |
GET |
/v1/org/usage.csv |
org:read |
GET |
/v1/org/audit |
org:read |
GET |
/v1/org/audit.csv |
org:read |
/v1/agent/accounts 會開啟一次尚無權杖的無人值守註冊,
/v1/agent/accounts/{signup_id}/claim 會將已付款的註冊轉為真正的帳戶與第一
個權杖,而 /v1/agent/credentials/rotate 會為發出呼叫的權杖產生一個後繼權杖
並在後繼權杖首次使用後將其退役,不會影響帳戶上的其他任何憑證。自動化使用的操作
說明完整涵蓋這三者。
每個列表端點都接受 limit 與一個不透明的 cursor,並回傳 next_cursor,
在最後一頁時為 null。請原封不動地將 cursor 傳回;它已編碼了位置資訊,因此即
使在呼叫之間有新的資料列產生,分頁也不會被跳過或重複。
涵蓋所有操作參數與回應結構的完整、最新定義是 OpenAPI 文件:請以它為準,優先於 本表。它會提供給任何持有者權杖,不論權限範圍為何,因此用戶端可以直接用手上既有 的憑證取得它。
MCP 介面
比起原始 HTTP,更偏好工具介面嗎?對於已經使用 MCP 而非 REST 的用戶端, MCP 伺服器會以 56 個工具取代這些端點,操作的是同一個帳戶。它只會提供已連接權杖的權限範圍所允許的工具。
限制
以人類帳戶的權杖發出的請求,每個權杖限制為每分鐘 1,200 次。代理程式帳戶輪替後的權杖在整個帳戶內共用此額度。呼叫 Stripe 的帳務路由對 PAT 呼叫端共用一個更嚴格的額度,每個帳戶每分鐘 60 次:設定工作階段、購買、切換預設卡片、移除卡片,以及卡片清單的快取未命中。一般節流會以 429 rate_limited 回應,並附上以秒為單位的 Retry-After 標頭;請等待該時間後再重試。代理程式帳戶的購買,或人類帳戶以 PAT 發起的購買,共用每個帳戶在滾動 24 小時內最多 3 次嘗試的上限。代理程式的註冊購買也計入;保留額度後遭拒或出錯的嘗試同樣計入。由人在瀏覽器工作階段中發起的購買不受此限。因上限而被拒絕時,會以 HTTP 429 回應 4038 agent_purchase_capped 與 Retry-After。錄音長度可為 15 秒至 10 小時。GET /v1/account 會回報帳戶目前的受理上限(max_active_jobs、max_daily_seconds)。
沙盒
沒有通用的轉錄沙盒:一般的 /v1/ 呼叫都會作用於真實帳戶,購買會花費真實金錢。例外是註冊驗證:POST /v1/agent/accounts 接受 dry_run: true,會回傳無法領取的 dry_ 註冊 id,且不會開啟 Stripe 工作階段或帳戶。
錯誤
錯誤是一個帶有固定數字 code 與 error 代稱的 JSON 主體,搭配下表所示的
HTTP 狀態碼。/v1/ 的錯誤主體是一個凍結的投影:error、code,以及一組
固定的詳細資訊欄位。/api 的錯誤結構則未凍結,可能帶有更多欄位。自動化呼
叫端必須處理的代碼如下:
| 狀態碼 | 代碼 | 代稱 | 意義 |
|---|---|---|---|
| 401 | 2000 | unauthorized |
缺少或無效的持有者權杖 |
| 403 | 2022 | pat_forbidden |
此路由完全不接受任何權杖 |
| 403 | 2023 | pat_scope_missing |
權杖缺少此呼叫所需的權限範圍,或帳戶已關閉購買功能 |
| 403 | 4021 | pat_purchase_requires_app |
未指定已儲存的卡片,或扣款遭拒;未產生任何收費 |
| 403 | 4023 | pat_purchase_requires_authentication |
發卡機構要求呼叫端無法完成的驗證挑戰;卡片本身沒有問題 |
| 402 | 3001 | insufficient_balance |
餘額不足以受理此工作 |
| 402 | 3002 | card_declined |
已儲存的卡片遭拒 |
| 402 | 3003 | org_insufficient_balance |
為此次上傳提供資金的工作區額度不足 |
| 404 | 4000 | not_found |
找不到此工作、上傳或資源 |
| 409 | 4001 | wrong_state |
資源目前的狀態不允許此操作 |
| 422 | 1021 | duration_out_of_range |
宣告的時長少於 15 秒或超過 10 小時 |
| 429 | 4038 | agent_purchase_capped |
帳戶已用完權杖購買嘗試額度;請依 Retry-After 等待 |
| 429 | 5000 | rate_limited |
請求過多;請依 Retry-After 等待 |
| 502 | 6001 | provider_error |
上游服務發生錯誤 |
| 500 | 9000 | internal_error |
未預期的伺服器錯誤 |
OpenAPI 文件列出了每個操作可能回傳的確切代碼,MCP 伺服器則以
hushscript://error-codes 資源發布完整目錄。