Hushscript cũng trả lời các lệnh gọi REST thuần túy, dành cho agent và script muốn gọi một endpoint HTTP hơn là chạy một client MCP. Xuyên suốt vẫn là cùng tài khoản, cùng số dư, và cùng bearer token: không có gì ở đây làm thay đổi cách tính giá hay lưu trữ của việc phiên âm.
Bắt đầu nhanh
API cần một personal access token, và có hai cách để có được một token. Một
con người tạo ra một token dưới mục Tokens trên trang MCP trong tài
khoản, chọn các scope của nó, và
quyết định liệu nó có được mua phút hay không. Hoặc một agent tự mở tài
khoản của riêng mình mà không cần con người nào: POST /v1/agent/accounts
bắt đầu một lượt đăng ký có trả phí, và
POST /v1/agent/accounts/{signup_id}/claim đổi bí mật xác nhận dùng một lần
của nó lấy một tài khoản thật và một token đầu tiên. Dù theo cách nào, token
chỉ hiện ra một lần duy nhất và có dạng hsr1:<region>:pat.<id>.<secret>.
Một token được tạo qua đăng nhập OAuth của máy chủ MCP cũng dùng được ở đây;
xem Kết nối. Một token không bao giờ có thể tạo, liệt kê hay
thu hồi các token khác, và một tài khoản giữ tối đa 25 token đang hoạt động;
toàn bộ luồng tài khoản agent, bao gồm việc xoay vòng thông tin xác thực,
nằm trong hướng dẫn Sử dụng tự động.
Khi đã có token, gọi thẳng 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": 3,
"max_daily_seconds": 36000,
"active_jobs": 0,
"daily_seconds_used": 0
}
}
Kết quả trả lời số dư tính bằng giây, số giây đang bị giữ bởi các job đang
chạy, ngày hết hạn của credit, liệu có thẻ đã lưu hay không, khu vực dữ liệu,
và các giới hạn nhận job (max_active_jobs, max_daily_seconds, cùng mức đã
dùng). Một tài khoản mới bắt đầu với số dư bằng 0. POST /v1/uploads kiểm
tra số dư, không phải thẻ: không có phút thì nó trả về
3001 insufficient_balance. Thẻ chính là cách số dư có được, vì lượt xác
minh thẻ một lần trong ứng dụng mở khóa 30 phút miễn phí, và các gói phút
được mua dựa trên một thẻ đã lưu.
Tự động hóa từ đầu đến cuối
Mọi thứ sau khi tài khoản đã tồn tại đều chạy mà không cần con người, bất kể
tài khoản đó được một con người mở trong ứng dụng hay một agent mở qua
/v1/agent/accounts (xem Sử dụng tự động). Chỉ còn lại đúng
một bước trình duyệt, và một agent có thể tự điều khiển trình duyệt đó.
-
Đọc tài khoản.
GET /v1/account. Nếucard_on_filelà false, hãy lưu thẻ trước. -
Lưu thẻ, một lần.
POST /v1/billing/setup-sessiontrả vềcheckout_url,session_id, và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" }Mở URL đó trong một trình duyệt bạn kiểm soát và hoàn tất trang Stripe được lưu trữ sẵn; không có gì bị tính phí và Hushscript không bao giờ thấy thông tin thẻ. Sau đó
GET /v1/billing/cardsliệt kê thẻ đó cùng id của nó.POST /v1/billing/cards/defaultđổi thẻ mặc định nếu tài khoản giữ nhiều thẻ. -
Mua phút.
GET /v1/billing/packsliệt kê năm gói vớiid,seconds,amount, vàcurrency:curl https://api.hushscript.com/v1/billing/packs \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"POST /v1/billing/purchasevớipack,quick_payment_method_id(id của thẻ đã lưu), và mộtidempotency_keysẽ tính phí vào thẻ mà không cần thao tác trong phiên đó, và trả vềbalance_secondsmới: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 }Việc này cần scope
billingtrên token và thanh toán phải được bật cho tài khoản. Một nội dung không có id thẻ, hoặc một thẻ bị từ chối, sẽ bị từ chối với4021 pat_purchase_requires_app; một thẻ mà ngân hàng phát hành muốn xác minh thêm sẽ bị từ chối với4023 pat_purchase_requires_authentication. Cả hai trường hợp đều không mở ra một trang mà không ai hoàn tất được. -
Tải lên.
POST /v1/uploadsvớisize_bytes,duration_seconds(từ 15 giây đến 10 giờ), mộttitletùy chọn,transcription_options, và mộtidempotency_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" }'Lệnh gọi này đặt một khoản giữ credit và trả về một
job_idcùng trang đầu tiên của các URL phần đã ký sẵn (presigned):{ "job_id": "job_5e2a91cf4d7b6081a9f3c2e4b5d6a7c8", "part_urls": [ { "n": 1, "url": "https://r2.hushscript.com/uploads/job_5e2a91cf.../part-1?X-Amz-Signature=..." } ] }PUTtừng phần lên URL của nó (mỗi phần 32 MiB theo mặc định, phần cuối nhỏ hơn):curl -X PUT "https://r2.hushscript.com/uploads/job_5e2a91cf.../part-1?X-Amz-Signature=..." \ --data-binary @part-01.binLấy các trang tiếp theo từ
GET /v1/uploads/{job}/part-urls?start=<n>, và gọiPOST /v1/uploads/{job}/heartbeattrong khoảng thời gian còn đủ an toàn so với giới hạn nhàn rỗi 20 phút khi truyền tải kéo dài. Khi các URL đã ký sẵn không khả dụng, hoặc một phần bị lỗi,PUT /v1/uploads/{job}/parts/{n}gửi các byte của phần đó qua chính API thay thế; mộtPUTlặp lại sẽ thay thế phần đó, nên việc thử lại luôn an toàn. Chỉ nhận audio: mp3, m4a, wav, flac, ogg, hoặc opus, tối đa 5 GB, được kiểm tra trên server; hãy tách track audio ra khỏi video trước khi tải lên. -
Bắt đầu và chờ.
POST /v1/uploads/{job}/completevớinvàetagcủa mỗi phần bạn đã gửi tới một URL đã ký sẵn (bỏ quapartskhi mọi phần đều được gửi qua API):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\"" } ] }'Sau đó liên tục hỏi
GET /v1/jobs/{id}:stateđi quauploading,queued, vàprocessingrồi tớidonehoặcfailed, và một job hoàn tất mang theo mộttranscript_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" } -
Đọc kết quả.
GET /v1/transcripts/{id}trả về metadata và toàn bộ nội dung, cùng tên người nói, ngôn ngữ đã phát hiện, thẻ gắn, và ngày tự động xóa:curl https://api.hushscript.com/v1/transcripts/trs_2b6e1d4a9f7c3088a1b2c3d4e5f6a7b9 \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"GET /v1/transcriptsphân trang danh sách.
Các tùy chọn phiên âm giống hệt như trong ứng dụng: language_code hoặc tự
động phát hiện, speaker_detection, medical_mode (cần language_code
thuộc en, es, fr, hoặc de, tính phí thêm 100%), translation_targets
(thêm 25% cho mỗi ngôn ngữ), multichannel, keyterms_prompt, một
prompt dạng văn bản tự do, và các dictionary_ids cùng prompt_preset_id
đã lưu mà GET /v1/transcription-context liệt kê.
Một phần tài khoản vẫn chỉ khả dụng qua MCP. Nhập từ liên kết, chỉnh sửa
hoặc xóa bản phiên âm, Insights, xuất file, lưu từ điển và mẫu lời nhắc, và
cài đặt tài khoản đều chưa có route /v1/ nào; máy chủ MCP bao phủ
toàn bộ những việc đó bằng cùng một token.
Xác thực
Mọi lệnh gọi /v1/ đều mang một bearer token trong header Authorization,
được kiểm tra theo cùng các scope mà máy chủ MCP sử dụng:
| Scope | Cho phép làm gì |
|---|---|
transcripts:read |
Đọc và xuất bản phiên âm, metadata của chúng, và danh sách đã xóa |
transcripts:write |
Chỉnh sửa, gắn thẻ, dịch, khôi phục và xóa bản phiên âm |
transcribe |
Tải lên bản ghi, nhập từ liên kết, và chạy phiên âm |
insights |
Đọc, tạo và xóa Insights |
context |
Quản lý từ điển đã lưu và mẫu lời nhắc đã lưu |
account:read |
Đọc số dư, mức sử dụng, giao dịch và khoản giữ |
settings:write |
Thay đổi cài đặt tài khoản |
org:read |
Đọc thành viên tổ chức, sổ cái, hóa đơn và nhật ký kiểm toán |
export |
Yêu cầu xuất toàn bộ tài khoản, kiểm tra trạng thái, và tải xuống |
billing |
Lưu thẻ và mua gói phút |
Một lệnh gọi ngoài các scope của token sẽ thất bại với pat_scope_missing,
mã 403. Scope billing cũng vô hiệu cho đến khi chủ tài khoản bật thanh
toán cho tài khoản đó trong ứng dụng; một lệnh gọi thanh toán trên một tài
khoản chưa bật công tắc đó sẽ thất bại với cùng pat_scope_missing, và việc
tạo lại token không xóa bỏ tình trạng đó. Một token không thể tạo, liệt kê
hay thu hồi các token khác, và một tài khoản giữ tối đa 25 token đang hoạt
động.
Endpoint
Đang hoạt động ngay hôm nay, mỗi endpoint được canh giữ bởi scope tương ứng:
| Method | Path | Scope |
|---|---|---|
POST |
/v1/agent/accounts |
none |
POST |
/v1/agent/accounts/{signup_id}/claim |
none |
POST |
/v1/agent/credentials/rotate |
none |
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/members |
org:read |
GET |
/v1/org/invoices |
org:read |
GET |
/v1/org/ledger |
org:read |
GET |
/v1/org/audit |
org:read |
/v1/agent/accounts mở một lượt đăng ký không cần giao diện mà chưa có
token nào, /v1/agent/accounts/{signup_id}/claim biến một lượt đăng ký đã
thanh toán thành một tài khoản thật và token đầu tiên của nó, và
/v1/agent/credentials/rotate tạo ra một token kế nhiệm cho token đang gọi
và thu hồi token đó, không chạm đến bất kỳ thông tin xác thực nào khác trên
tài khoản. Hướng dẫn Sử dụng tự động trình bày cả ba từ đầu
đến cuối.
Mọi danh sách đều nhận một limit và một cursor không rõ nghĩa, và trả về
một next_cursor có giá trị null ở trang cuối. Gửi lại cursor y nguyên; nó
mã hóa vị trí, nên một trang không bao giờ bị bỏ sót hay lặp lại khi có dòng
mới xuất hiện giữa các lệnh gọi.
Định nghĩa đầy đủ, cập nhật, với tham số và schema phản hồi cho mọi thao tác, là tài liệu OpenAPI: hãy coi đó là nguồn sự thật đáng tin hơn bảng trên. Tài liệu này được phục vụ cho bất kỳ bearer token nào bất kể scope, nên một client có thể lấy nó bằng chính thông tin xác thực mình đang có.
Giao diện MCP
Thích dùng công cụ hơn là HTTP thuần túy? Máy chủ MCP đặt cùng tài khoản đó phía sau 51 công cụ thay vì các endpoint này, dành cho một client đã nói sẵn MCP thay vì REST.
Giới hạn
Các lệnh gọi bằng token bị giới hạn ở 1.200 lệnh mỗi phút cho mỗi token.
POST /v1/billing/setup-session và POST /v1/billing/purchase dùng chung
một hạn mức chặt hơn, 60 lệnh mỗi phút cho mỗi tài khoản, trước cả lệnh gọi
Stripe mà chúng sẽ thực hiện. Một yêu cầu bị từ chối trả về
429 rate_limited kèm header Retry-After nêu rõ thời gian chờ tính bằng giây;
hãy chờ đúng khoảng đó trước khi thử lại. Tải lên bị giới hạn ở 5 GB và 10
giờ, với mức tối thiểu 15 giây, và các giới hạn nhận job riêng của tài khoản
(max_active_jobs, max_daily_seconds) được báo cáo bởi GET /v1/account.
Sandbox
Không có chế độ dry-run: mọi lệnh gọi /v1/ đều chạy trên một tài khoản
thật, và việc mua phút tiêu tiền thật.
Lỗi
Một lỗi là một nội dung JSON mang một code số ổn định và một slug
error, ở mã trạng thái HTTP như bên dưới. Nội dung lỗi của /v1/ là một
hình chiếu cố định: error, code, và một tập cố định các khóa chi tiết.
Hình dạng lỗi của /api không cố định và có thể mang thêm thông tin. Các mã
mà một bên gọi tự động phải xử lý:
| Status | Code | Slug | Meaning |
|---|---|---|---|
| 401 | 2000 | unauthorized |
Thiếu hoặc sai bearer token |
| 403 | 2022 | pat_forbidden |
Route này không chấp nhận bất kỳ token nào |
| 403 | 2023 | pat_scope_missing |
Token thiếu scope mà lệnh gọi này cần, hoặc thanh toán đang tắt trên tài khoản |
| 403 | 4021 | pat_purchase_requires_app |
Không có thẻ đã lưu nào được chỉ định, hoặc giao dịch bị từ chối; không có gì bị tính phí |
| 403 | 4023 | pat_purchase_requires_authentication |
Ngân hàng phát hành thẻ yêu cầu một bước xác thực mà bên gọi không thể hoàn tất; bản thân thẻ vẫn ổn |
| 402 | 3001 | insufficient_balance |
Không đủ số dư để nhận job |
| 402 | 3002 | card_declined |
Thẻ đã lưu bị từ chối |
| 402 | 3003 | org_insufficient_balance |
Quỹ chung của workspace tài trợ cho lượt tải lên này không đủ |
| 404 | 4000 | not_found |
Không có job, upload, hay tài nguyên như vậy |
| 409 | 4001 | wrong_state |
Tài nguyên không ở trạng thái cho phép việc này |
| 422 | 1021 | duration_out_of_range |
Thời lượng khai báo dưới 15 giây hoặc trên 10 giờ |
| 429 | 5000 | rate_limited |
Quá nhiều yêu cầu; chờ theo Retry-After |
| 502 | 6001 | provider_error |
Một dịch vụ thượng nguồn gặp lỗi |
| 500 | 9000 | internal_error |
Lỗi server không mong đợi |
Tài liệu OpenAPI nêu rõ mã lỗi chính xác mà mỗi thao tác có thể trả về, và
máy chủ MCP công bố toàn bộ danh mục dưới dạng tài nguyên
hushscript://error-codes.