API zamiany mowy na tekst Hushscript przyjmuje nagrane audio przez /v1/, a
potem pozwala skryptowi odpytywać zadanie i odczytać transkrypcję. To przebieg
transkrypcji online, a nie strumieniowanie na żywo ani surowy endpoint modelu
rozpoznawania. Serwer MCP korzysta z tego samego konta, salda i tokenu
okaziciela, gdy twój klient woli narzędzia od wywołań HTTP.
Transkrypcja audio i wideo przez API
API do transkrypcji audio przyjmuje przygotowane pliki audio, także nagrany głos. Do integracji STT (zamiana mowy na tekst) przesyłaj nagrane pliki; strumieniowanie na żywo z mikrofonu nie jest dostępne. W przypadku transkrypcji wideo prześlij plik MP4 lub MOV ze ścieżką audio bez zmian: serwer odczytuje ścieżkę audio i pomija wideo. Z każdego innego formatu wideo najpierw wyodrębnij audio; API nie przyjmuje linku do wideo. Proces w przeglądarce opisano na stronie wideo na tekst.
Szybki start
API wymaga osobistego tokenu dostępu, który można mieć na dwa sposoby. Osoba
tworzy go w sekcji Tokens na stronie MCP w koncie,
wybiera jego zakresy i decyduje, czy może on kupować minuty. Albo agent otwiera
własne konto bez człowieka będącego właścicielem konta: POST /v1/agent/accounts
rozpoczyna płatną rejestrację, a POST /v1/agent/accounts/{signup_id}/claim
wymienia jednorazowy sekret odbioru na prawdziwe konto i pierwszy token. W obu
przypadkach token jest pokazywany raz i wygląda tak: hsr1:<region>:pat.<id>.<secret>.
Token wystawiony przez logowanie OAuth serwera MCP działa tu również; zobacz
Połączenie. Token nigdy nie może tworzyć, wyświetlać ani unieważniać
innych tokenów, a konto ma najwyżej 25 aktywnych; pełny proces konta agenta, z
rotacją poświadczeń, opisuje przewodnik Automatyzacja.
Gdy masz token, wywołuj API bezpośrednio. Ten przykład przedstawia nowe konto osobiste przed weryfikacją karty lub zakupem; konto utworzone przez agenta zaczyna od pakietu minut, który opłaciło:
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
}
}
W odpowiedzi dostajesz saldo w sekundach, sekundy zarezerwowane przez trwające
zadania, credits_expire_at (zawsze null, ponieważ minuty nie wygasają), informację, czy karta jest zapisana, region
danych oraz limity przyjmowania zadań (max_active_jobs, max_daily_seconds i
ich wykorzystanie). Limit dzienny to bieżący, rzeczywisty limit konta, a nie
wartość do wpisania na stałe. POST /v1/uploads sprawdza dostępne minuty, a nie
kartę: bez wystarczającej liczby minut zwraca 3001 insufficient_balance.
Czy API zamiany mowy na tekst jest bezpłatne?
Nie ma ogólnego bezpłatnego poziomu API, ale proces możesz wypróbować, zanim napiszesz jakikolwiek kod: publiczny podgląd transkrybuje do pięciu minut z jednego nagrania przed zalogowaniem. Konto osobiste spełniające warunki dostaje potem 30 bezpłatnych minut po weryfikacji karty (zobacz Cennik, jak to działa); konto utworzone przez agenta pomija minuty powitalne i zaczyna od pakietu kupionego przy rejestracji. Pełne zadanie API wymaga w obu przypadkach konta i minut.
Automatyzacja od początku do końca
Te same wywołania /v1/ działają z tokenem utworzonym przez osobę w aplikacji
albo odebranym przez agenta po płatnej rejestracji (zobacz
Automatyzacja). Zapisanie karty wymaga hostowanego Checkout w
przeglądarce; agent może go obsłużyć. Późniejsze zakupy off-session nadal mogą
zostać odrzucone, jeśli wystawca karty wymaga uwierzytelnienia.
-
Odczytaj konto.
GET /v1/account. Jeśli musisz kupić minuty, acard_on_filema wartość false, najpierw zapisz kartę. -
Zapisz kartę, jednorazowo.
POST /v1/billing/setup-sessionzwracacheckout_url,session_idiexpires_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" }Otwórz adres URL w przeglądarce, którą kontrolujesz, i dokończ hostowaną stronę Stripe; nic nie jest obciążane, a Hushscript nigdy nie widzi karty. Potem
GET /v1/billing/cardspokazuje ją razem z identyfikatorem.POST /v1/billing/cards/defaultzmienia kartę domyślną, jeśli konto ma ich kilka. -
Kup minuty.
GET /v1/billing/packszwraca pięć pakietów z polamiid,seconds,amounticurrency:curl https://api.hushscript.com/v1/billing/packs \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"POST /v1/billing/purchasezpack,quick_payment_method_id(identyfikator zapisanej karty) iidempotency_keyobciąża kartę w trybie off-session i zwraca nowebalance_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 }Wymaga to zakresu
billing, włączonych rozliczeń na tokenie i włączonych rozliczeń na koncie. Treść bez identyfikatora karty lub z odrzuconą kartą kończy się błędem4021 pat_purchase_requires_app; karta, którą wystawca chce zweryfikować, kończy się błędem4023 pat_purchase_requires_authentication. Żaden z nich nie otwiera strony, której nikt nie może dokończyć. -
Prześlij.
POST /v1/uploadszsize_bytes,duration_seconds(od 15 sekund do 10 godzin), opcjonalnymititle,transcription_options,matter_codeoraz zidempotency_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_codeto dowolny tekst do 64 znaków i ma znaczenie tylko dla tokenu należącego do przestrzeni zespołu: jest pokazywany przy zadaniu w księdze i raportach wykorzystania tej przestrzeni. Przestrzeń zespołu, w której zasada dotycząca spraw wymaga kodu, odrzuca przesłanie bez niego z błędemorg_matter_code_required.client_codejest przyjmowany i ignorowany, ponieważ klient jest atrybutem sprawy, ustawianym przez administratora przestrzeni zespołu.Wywołanie rezerwuje kredyt i zwraca
job_idoraz pierwszą stronę wstępnie podpisanych adresów URL części:{ "job_id": "job_5e2a91cf4d7b6081a9f3c2e4b5d6a7c8", "part_urls": [ { "n": 1, "url": "https://r2.hushscript.com/uploads/job_5e2a91cf.../part-1?X-Amz-Signature=..." } ] }Wyślij
PUTkażdej części pod jej adres URL (domyślnie części po 32 MiB, ostatnia mniejsza):curl -X PUT "https://r2.hushscript.com/uploads/job_5e2a91cf.../part-1?X-Amz-Signature=..." \ --data-binary @part-01.binKolejne strony pobierzesz z
GET /v1/uploads/{job}/part-urls?start=<n>, a podczas długiego przesyłania wywołujPOST /v1/uploads/{job}/heartbeatz dużym zapasem przed upływem 20-minutowego limitu bezczynności. Gdy wstępnie podpisane adresy URL są niedostępne albo jedna część się nie powiedzie,PUT /v1/uploads/{job}/parts/{n}wysyła bajty tej części przez API; ponownyPUTzastępuje część, więc ponawianie jest bezpieczne. Obsługiwane: mp3, m4a, mp4 lub mov (używana jest ścieżka audio, ścieżki wideo są pomijane), wav, flac, ogg lub opus, sprawdzane na serwerze; z każdego innego formatu wideo wyodrębnij audio przed przesłaniem. -
Uruchom i poczekaj.
POST /v1/uploads/{job}/completeznietagkażdej części wysłanej pod wstępnie podpisany adres URL (pomińparts, gdy każda część poszła przez 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\"" } ] }'Potem odpytuj
GET /v1/jobs/{id}:stateprzechodzi przezuploading,queuediprocessingdodonelubfailed, a zakończone zadanie zawieratranscript_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" } -
Odczytaj wynik.
GET /v1/transcripts/{id}zwraca metadane i pełną treść, z nazwami osób mówiących, wykrytym językiem, tagami i datą automatycznego usunięcia:curl https://api.hushscript.com/v1/transcripts/trs_2b6e1d4a9f7c3088a1b2c3d4e5f6a7b9 \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"GET /v1/transcriptszwraca listę stronami.
Opcje transkrypcji są takie same jak w aplikacji: language_code albo
automatyczne wykrywanie, speaker_detection, medical_mode (wymaga
language_code ustawionego na en, es, fr lub de, rozliczany z dopłatą
+100%), translation_targets (+25% za każdy język), multichannel,
keyterms_prompt, dowolny tekst prompt oraz zapisane dictionary_ids i
prompt_preset_id, które wylistuje GET /v1/transcription-context.
Część konta jest nadal dostępna tylko przez MCP. Import z linku, edycja i
usuwanie transkrypcji, Insights, eksporty, zapisywanie słowników i zestawów
instrukcji oraz ustawienia konta nie mają jeszcze trasy /v1/; serwer MCP
obejmuje je wszystkie tym samym tokenem.
Uwierzytelnianie
Każde wywołanie /v1/ niesie token okaziciela w nagłówku Authorization,
sprawdzany względem tych samych zakresów, których używa serwer MCP:
| Zakres | Co umożliwia |
|---|---|
transcripts:read |
Odczyt i eksport transkrypcji, ich metadanych oraz listy usuniętych |
transcripts:write |
Edycja, tagowanie, tłumaczenie, przywracanie i usuwanie transkrypcji |
transcribe |
Przesyłanie nagrań, import z linku i uruchamianie transkrypcji |
insights |
Odczyt, generowanie i usuwanie Insights |
context |
Zarządzanie zapisanymi słownikami i zestawami instrukcji |
account:read |
Odczyt salda, wykorzystania, transakcji i rezerwacji |
settings:write |
Zmiana ustawień konta |
org:read |
Odczyt członków przestrzeni zespołu, księgi, faktur i dziennika audytu |
org:write |
Zmiana uprawnień członków, planowanie przejścia na zarządzanie przez organizację (trwałe) oraz zakładanie i zdejmowanie blokad usunięcia na potrzeby prawne |
export |
Zlecenie pełnego eksportu konta, sprawdzenie jego statusu i pobranie |
billing |
Zapisanie karty i kupowanie pakietów minut |
Wywołanie poza zakresami tokenu kończy się błędem pat_scope_missing, ze
statusem 403. Zakres billing jest też nieaktywny, dopóki rozliczenia nie są
włączone zarówno na tokenie, jak i na koncie. Wywołanie rozliczeń z jednym z
tych przełączników wyłączonym kończy się tym samym błędem pat_scope_missing;
ponowne wystawienie tokenu nie włącza przełącznika na koncie. Token nie może
tworzyć, wyświetlać ani unieważniać tokenów, a konto ma najwyżej 25 aktywnych.
Tych 11 zakresów można wybierać. pat:rotate to osobny zakres przyznawany
pierwszemu tokenowi konta agenta i jego kolejnym, rotowanym następcom; pozwala
temu tokenowi zastąpić samego siebie, a nie zarządzać innymi tokenami. Nie
można go wybrać przy tworzeniu tokenu w aplikacji.
Endpointy
Produkcyjny dokument OpenAPI wymienia 38 operacji metoda/ścieżka na 37 ścieżkach. Każda operacja poniżej jest chroniona pokazanym zakresem:
| Metoda | Ścieżka | Zakres |
|---|---|---|
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 otwiera rejestrację bez interfejsu, gdy nie ma jeszcze
tokenu, /v1/agent/accounts/{signup_id}/claim zamienia opłaconą rejestrację w
prawdziwe konto i jego pierwszy token, a /v1/agent/credentials/rotate
wystawia następcę dla wywołującego tokenu i unieważnia go, nie dotykając
żadnego innego poświadczenia konta. Przewodnik Automatyzacja
omawia wszystkie trzy od początku do końca.
Każda lista przyjmuje limit i nieprzezroczysty cursor oraz zwraca
next_cursor, który na ostatniej stronie ma wartość null. Przekaż kursor z
powrotem bez zmian; koduje on pozycję, więc strona nigdy nie jest pomijana ani
powtarzana, gdy między wywołaniami pojawiają się nowe wiersze.
Pełna, aktualna definicja, z parametrami i schematami odpowiedzi każdej operacji, to dokument OpenAPI: traktuj go jako źródło prawdy ponad tą tabelą. Jest udostępniany każdemu tokenowi okaziciela niezależnie od zakresu, więc klient może go pobrać z poświadczeniami, które już ma.
Interfejs MCP
Wolisz narzędzia od surowego HTTP? Serwer MCP udostępnia to samo konto przez 56 narzędzi zamiast tych endpointów, dla klienta, który zna już MCP, a nie REST. Pokazuje tylko te narzędzia, na które pozwalają zakresy podłączonego tokenu.
Limity
Żądania wykonywane tokenem konta osoby są ograniczone do 1200 na minutę na
token. Rotowane tokeny konta agenta dzielą ten budżet w obrębie konta. Trasy
rozliczeń wywołujące Stripe mają dla wywołujących z PAT węższy wspólny limit 60
na minutę na konto: sesja konfiguracji, zakup, zmiany karty domyślnej, usunięcie
karty i chybienia pamięci podręcznej listy kart. Zwykłe ograniczanie zwraca
429 rate_limited z Retry-After w sekundach; tyle poczekaj przed ponowieniem.
Zakupy konta agenta lub PAT konta osoby dzielą limit 3 prób na kroczące 24
godziny na konto. Liczy się zakup przy rejestracji agenta; odrzucenia i błędy po
rezerwacji też się liczą. Zakup w sesji przeglądarki osoby jest z limitu
wyłączony. Odmowa z powodu limitu zwraca HTTP 429 z 4038 agent_purchase_capped
i Retry-After. Nagrania mogą trwać od 15 sekund do 10 godzin. GET /v1/account
zwraca bieżące limity przyjmowania zadań konta (max_active_jobs,
max_daily_seconds).
Piaskownica
Nie ma ogólnej piaskownicy transkrypcji: zwykłe wywołania /v1/ działają na
prawdziwych kontach, a zakupy wydają prawdziwe pieniądze. Wyjątkiem jest
sprawdzanie rejestracji: POST /v1/agent/accounts przyjmuje dry_run: true,
zwraca signup_id z prefiksem dry_, którego nie można odebrać, i nie otwiera
ani sesji Stripe, ani konta.
Błędy
Błąd to treść JSON ze stałym numerycznym code i slugiem error, ze statusem
HTTP pokazanym poniżej. Treści błędów /v1/ to zamrożona projekcja: error,
code i stały zestaw kluczy szczegółów. Kształt błędów /api nie jest
zamrożony i może zawierać więcej. Kody, które musi obsłużyć automatyczny
wywołujący:
| Status | Kod | Slug | Znaczenie |
|---|---|---|---|
| 401 | 2000 | unauthorized |
Brak tokenu okaziciela lub jest nieprawidłowy |
| 403 | 2022 | pat_forbidden |
Trasa w ogóle nie przyjmuje tokenów |
| 403 | 2023 | pat_scope_missing |
Token nie ma zakresu potrzebnego do tego wywołania albo rozliczenia są wyłączone dla konta |
| 403 | 4021 | pat_purchase_requires_app |
Nie wskazano zapisanej karty lub obciążenie zostało odrzucone; nic nie obciążono |
| 403 | 4023 | pat_purchase_requires_authentication |
Wystawca karty wymaga weryfikacji, której wywołujący nie może wykonać; sama karta jest w porządku |
| 402 | 3001 | insufficient_balance |
Za małe saldo, by przyjąć zadanie |
| 402 | 3002 | card_declined |
Zapisana karta została odrzucona |
| 402 | 3003 | org_insufficient_balance |
Wspólna pula przestrzeni zespołu, z której finansowane jest to przesłanie, jest za mała |
| 404 | 4000 | not_found |
Nie ma takiego zadania, przesłania ani zasobu |
| 409 | 4001 | wrong_state |
Zasób nie jest w stanie, który na to pozwala |
| 422 | 1021 | duration_out_of_range |
Zadeklarowany czas trwania jest krótszy niż 15 sekund lub dłuższy niż 10 godzin |
| 429 | 4038 | agent_purchase_capped |
Konto wykorzystało przyznany limit prób zakupu tokenem; poczekaj na Retry-After |
| 429 | 5000 | rate_limited |
Zbyt wiele żądań; poczekaj na Retry-After |
| 502 | 6001 | provider_error |
Usługa zewnętrzna zwróciła błąd |
| 500 | 9000 | internal_error |
Nieoczekiwany błąd serwera |
Dokument OpenAPI podaje dokładny kod, który może zwrócić każda operacja, a
serwer MCP publikuje cały katalog jako zasób hushscript://error-codes.