Hushscript konuşmayı yazıya çevirme API’si, /v1/ üzerinden kayıtlı sesi kabul
eder; ardından betiğin işi yoklayıp deşifreyi okuyabilir. Bu, çevrimiçi bir
deşifre iş akışıdır; canlı akış ya da ham tanıma modeli uç noktası
değildir. İstemcin HTTP çağrıları yerine araçları tercih ediyorsa
MCP sunucusu aynı hesabı, aynı bakiyeyi ve aynı bearer jetonu kullanır.
API ile ses ve videoyu yazıya çevirme
Ses deşifresi API’si, kayıtlı ses dahil hazırlanmış ses dosyalarını kabul eder. STT (speech-to-text) entegrasyonu için kayıtlı dosyalar gönder; canlı mikrofon akışı yoktur. Video deşifresi için ses parçası olan bir MP4 veya MOV dosyasını olduğu gibi yükle: sunucu ses parçasını okur, videoyu atlar. Diğer tüm video biçimlerinde önce sesi çıkar; API video URL’sini kabul etmez. Tarayıcı iş akışı videoyu metne çevirme sayfasında anlatılır.
Hızlı başlangıç
API bir kişisel erişim jetonu ister ve birini elde etmenin iki yolu vardır. Bir
kişi, hesaptaki MCP sayfasında
Jetonlar altında bir jeton oluşturur, izinlerini seçer ve dakika satın alıp
alamayacağına karar verir. Ya da bir ajan, hesap sahibi bir insan olmadan kendi
hesabını açar: POST /v1/agent/accounts ücretli bir kaydı başlatır,
POST /v1/agent/accounts/{signup_id}/claim ise tek kullanımlık talep gizli
anahtarını gerçek bir hesap ve ilk jetonla değiştirir. Hangi yolla olursa olsun
jeton bir kez gösterilir ve hsr1:<region>:pat.<id>.<secret> biçimindedir. MCP
sunucusunun OAuth ile giriş akışıyla basılan bir jeton da burada çalışır; bkz.
Bağlan. Bir jeton başka jeton basamaz, listeleyemez ya da iptal edemez
ve bir hesap en fazla 25 etkin jeton tutar; kimlik bilgisi döndürme dahil ajan
hesabı akışının tamamı Otomatik kullanım anlatımındadır.
Bir jetonun olunca API’yi doğrudan çağır. Bu örnek, kart doğrulaması ya da satın alma öncesindeki yeni bir kişisel hesabı gösterir; ajanın oluşturduğu hesap ise ödediği dakika paketiyle başlar:
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
}
}
Yanıt; saniye cinsinden bakiyeyi, çalışan işlerin bekletilen saniyelerini,
credits_expire_at (dakikaların süresi dolmadığı için her zaman null), bir kartın kayıtlı olup olmadığını, veri
bölgesini ve kabul sınırlarını (max_active_jobs, max_daily_seconds ve ne
kadarının kullanıldığı) içerir. Günlük sınır hesabın o anki geçerli sınırıdır,
koda sabitlenecek bir değer değildir. POST /v1/uploads kartı değil,
kullanılabilir dakikaları denetler: yeterli dakika yoksa
3001 insufficient_balance döndürür.
Konuşmayı yazıya çevirme API’si ücretsiz mi?
Genel bir ücretsiz API katmanı yoktur, ama tek satır kod yazmadan iş akışını deneyebilirsin: herkese açık önizleme, giriş yapmadan tek bir kayıttan beş dakikaya kadarını yazıya çevirir. Uygun bir kişisel hesap, kart doğrulamasından sonra 30 ücretsiz dakika alır (nasıl işlediği için bkz. fiyatlandırma); ajan hesabı karşılama dakikalarını atlar ve kayıtta satın aldığı paketle başlar. Tam bir API işi her durumda bir hesap ve dakika gerektirir.
Uçtan uca otomasyon
Aynı /v1/ çağrıları, uygulamada bir kişinin oluşturduğu ya da ücretli
kayıttan sonra bir ajanın talep ettiği jetonla çalışır (bkz.
Otomatik kullanım). Kart kaydetmek için tarayıcıda barındırılan
Checkout gerekir; bunu bir ajan yürütebilir. Sonraki oturum dışı (off-session)
satın almalar, kartı veren banka doğrulama isterse yine de reddedilebilir.
-
Hesabı oku.
GET /v1/account. Dakika satın alman gerekiyorsa vecard_on_filefalse ise önce bir kart kaydet. -
Bir kez kart kaydet.
POST /v1/billing/setup-session, bircheckout_url, birsession_idve birexpires_atdöndürür: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" }URL’yi kontrol ettiğin bir tarayıcıda aç ve barındırılan Stripe sayfasını tamamla; hiçbir şey ücretlendirilmez ve Hushscript kartı asla görmez. Ardından
GET /v1/billing/cardskartı kimliğiyle birlikte listeler. Hesapta birden fazla kart varsaPOST /v1/billing/cards/defaultvarsayılanı değiştirir. -
Dakika satın al.
GET /v1/billing/packsbeş paketiid,seconds,amountvecurrencyile listeler: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(kayıtlı kartın kimliği) ve biridempotency_keyile kartı oturum dışında ücretlendirir ve yenibalance_secondsdeğerini döndürür: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 }Bunun için
billingizni, jetonda faturalandırmanın açık olması ve hesap için faturalandırmanın açık olması gerekir. Kart kimliği içermeyen bir gövde ya da reddedilen bir kart4021 pat_purchase_requires_appile reddedilir; kartı veren bankanın ek doğrulama (challenge) istediği bir kart4023 pat_purchase_requires_authenticationile reddedilir. İkisi de kimsenin tamamlayamayacağı bir sayfa açmaz. -
Yükle.
POST /v1/uploads;size_bytes,duration_seconds(15 saniye ile 10 saat arası), isteğe bağlı birtitle,transcription_options,matter_codeve biridempotency_keyile: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, en fazla 64 karakterlik serbest metindir ve yalnızca bir kuruluşa ait jeton için anlam taşır: iş, o kuruluşun havuz etkinliğinde ve kullanım raporlarında bu kodla birlikte görünür. Dosya kodu politikası zorunlu olarak ayarlanmış bir kuruluş, kodsuz gelen bir yüklemeyiorg_matter_code_requiredile reddeder.client_codekabul edilir ama yok sayılır, çünkü müvekkil dosyanın bir özelliğidir ve kuruluşun bir yöneticisi tarafından belirlenir.Bir kredi bekletmesi koyar; bir
job_idile ön imzalı (presigned) parça URL’lerinin ilk sayfasını döndürür:{ "job_id": "job_5e2a91cf4d7b6081a9f3c2e4b5d6a7c8", "part_urls": [ { "n": 1, "url": "https://r2.hushscript.com/uploads/job_5e2a91cf.../part-1?X-Amz-Signature=..." } ] }Her parçayı kendi URL’sine
PUTet (varsayılan olarak 32 MiB’lik parçalar, sonuncusu daha küçük):curl -X PUT "https://r2.hushscript.com/uploads/job_5e2a91cf.../part-1?X-Amz-Signature=..." \ --data-binary @part-01.binSonraki sayfaları
GET /v1/uploads/{job}/part-urls?start=<n>ile al; uzun bir aktarım sırasında 20 dakikalık boşta kalma zaman aşımına düşmeden çok öncePOST /v1/uploads/{job}/heartbeatçağır. Ön imzalı URL’ler kullanılamıyorsa ya da bir parça başarısız olursaPUT /v1/uploads/{job}/parts/{n}o parçanın baytlarını bunun yerine API üzerinden gönderir; tekrarlanan birPUTparçanın yerini alır, bu yüzden yeniden denemeler güvenlidir. Desteklenenler: mp3, m4a, mp4 veya mov (ses parçası kullanılır, video parçaları atlanır), wav, flac, ogg veya opus; sunucuda denetlenir. Diğer tüm video biçimlerinde yüklemeden önce sesi çıkar. -
Başlat ve bekle.
POST /v1/uploads/{job}/complete; ön imzalı bir URL’ye gönderdiğin her parçanınnveetagdeğerleriyle (her parça API üzerinden gittiyseparts’ı çıkar):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\"" } ] }'Ardından
GET /v1/jobs/{id}ile yokla:statesırasıylauploading,queuedveprocessingaşamalarından geçipdoneya dafailedolur; biten bir iştetranscript_idbulunur: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" } -
Sonucu oku.
GET /v1/transcripts/{id}, konuşmacı adları, algılanan dil, etiketler ve otomatik silme tarihiyle birlikte meta verileri ve tam metni döndürür:curl https://api.hushscript.com/v1/transcripts/trs_2b6e1d4a9f7c3088a1b2c3d4e5f6a7b9 \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"GET /v1/transcriptslisteyi sayfalar.
Deşifre seçenekleri uygulamadakilerle birebir aynıdır: language_code
ya da otomatik algılama, speaker_detection, medical_mode (language_code
değerinin en, es, fr veya de olmasını gerektirir, %100 ek ücretle
faturalandırılır), translation_targets (dil başına %25), multichannel,
keyterms_prompt, serbest metinli bir prompt ve
GET /v1/transcription-context çağrısının listelediği kayıtlı
dictionary_ids ile prompt_preset_id.
Hesabın bir kısmına hâlâ yalnızca MCP üzerinden ulaşılıyor. Bir bağlantıdan
içe aktarma, deşifreleri düzenleme ya da silme, Insights, dışa aktarmalar,
sözlük ve istem ön ayarı kaydetme ile hesap ayarları için henüz /v1/ rotası
yok; MCP sunucusu bunların hepsini aynı jetonla kapsar.
Kimlik doğrulama
Her /v1/ çağrısı Authorization başlığında bir bearer jeton taşır ve MCP
sunucusunun kullandığı izinlere göre denetlenir:
| İzin | Ne yapabilir |
|---|---|
transcripts:read |
Deşifreleri, meta verilerini ve silinenler listesini okur ve dışa aktarır |
transcripts:write |
Deşifreleri düzenler, etiketler, çevirir, geri yükler ve siler |
transcribe |
Kayıt yükler, bir bağlantıdan içe aktarır ve deşifre işlemi çalıştırır |
insights |
Insights’ı okur, oluşturur ve siler |
context |
Kayıtlı sözlükleri ve istem ön ayarlarını yönetir |
account:read |
Bakiyeyi, kullanımı, işlemleri ve bekletmeleri okur |
settings:write |
Hesap ayarlarını değiştirir |
org:read |
Kuruluş üyelerini, havuz etkinliğini, faturaları ve denetim kaydını okur |
org:write |
Üye haklarını değiştirir, firma muhafazasına (kalıcı) geçişi zamanlar, yasal tutma koyar veya kaldırır |
export |
Tam hesap dışa aktarımı ister, durumunu denetler ve indirir |
billing |
Kart kaydeder ve dakika paketi satın alır |
İzinlerin dışında kalan bir çağrı 403 ile pat_scope_missing hatası verir.
billing izni de, faturalandırma hem jetonda hem hesapta açık olmadıkça
etkisizdir. Ayarlardan biri kapalıyken yapılan bir faturalandırma çağrısı
aynı pat_scope_missing hatasıyla sonuçlanır; jetonu yeniden basmak hesap
ayarını açmaz. Bir jeton başka jeton oluşturamaz, listeleyemez ya da iptal
edemez ve bir hesap en fazla 25 etkin jeton tutar.
Bu 11 izni çağıran seçebilir. pat:rotate ayrı bir izindir; bir ajan
hesabının ilk jetonuna ve döndürülmüş ardıllarına verilir. Bu izin, jetonun
kendini değiştirmesine izin verir, başka jetonları yönetmesine değil.
Uygulamada jeton oluştururken bu izni seçemezsin.
Uç noktalar
Üretimdeki OpenAPI belgesi, 37 yol üzerinde 38 yöntem/yol işlemi listeler. Aşağıdaki her işlem, gösterilen izinle korunur:
| Yöntem | Yol | İzin |
|---|---|---|
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 henüz jeton yokken başsız (headless) bir kayıt açar,
/v1/agent/accounts/{signup_id}/claim ücretli bir kaydı gerçek bir hesaba ve
onun ilk jetonuna çevirir, /v1/agent/credentials/rotate ise çağıran jeton
için bir ardıl basar ve ardıl ilk kez kullanıldığında onu devre dışı bırakır;
hesaptaki başka hiçbir kimlik bilgisine
dokunmaz. Otomatik kullanım anlatımı üçünü de uçtan uca ele
alır.
Her liste bir limit ve opak bir cursor alır, son sayfada null olan bir
next_cursor döndürür. Cursor’ı değiştirmeden geri gönder; konumu kodlar, bu
yüzden çağrılar arasında yeni satırlar gelse bile bir sayfa asla atlanmaz ya
da tekrarlanmaz.
Her işlemin parametreleri ve yanıt şemalarıyla birlikte eksiksiz, güncel tanımı OpenAPI belgesidir: bu tabloya değil ona güven. İzninden bağımsız olarak her bearer jetona sunulur, dolayısıyla bir istemci onu elindeki kimlik bilgileriyle alabilir.
MCP arayüzü
Ham HTTP yerine araçları mı tercih ediyorsun? MCP sunucusu, zaten REST yerine MCP konuşan bir istemci için aynı hesabı bu uç noktaların yerine 56 aracın arkasına koyar. Yalnızca bağlı jetonun izinlerinin izin verdiği araçları duyurur.
Sınırlar
Bir insan hesabının jetonuyla yapılan istekler, jeton başına dakikada 1.200 istekle
sınırlıdır. Bir ajan hesabının döndürülmüş jetonları bu bütçeyi hesap genelinde
paylaşır. Stripe’ı çağıran faturalandırma rotaları, PAT ile çağıranlar için
hesap başına dakikada 60’lık daha sıkı bir bütçeyi paylaşır: kurulum oturumu,
satın alma, varsayılan kartı değiştirme, kart kaldırma ve kart listesi
önbelleğinde ıskalama. Olağan kısıtlama, saniye cinsinden Retry-After ile
429 rate_limited döndürür; yeniden denemeden önce o kadar bekle. Bir ajan
hesabının ya da bir insan hesabının PAT’iyle yapılan satın almalar, hesap
başına kayan 24 saatte 3 denemelik bir üst sınırı paylaşır. Ajanın kayıt
satın alması sayılır; rezervasyondan sonraki ret ya da hatalar da sayılır.
İnsan tarayıcı oturumundaki satın alma muaftır. Üst sınıra takılan bir ret,
4038 agent_purchase_capped ve Retry-After ile HTTP 429 döndürür. Kayıtlar
15 saniyeden 10 saate kadar olabilir. GET /v1/account hesabın geçerli kabul
sınırlarını (max_active_jobs, max_daily_seconds) bildirir.
Sandbox
Genel bir deşifre sandbox’ı yoktur: olağan /v1/ çağrıları gerçek
hesaplara karşı çalışır ve satın almalar gerçek para harcar. İstisna kayıt
doğrulamasıdır: POST /v1/agent/accounts dry_run: true kabul eder, talep
edilemeyen bir dry_ kayıt kimliği döndürür ve ne Stripe oturumu ne de hesap
açar.
Hatalar
Bir hata, aşağıda gösterilen HTTP durumunda, sabit bir sayısal code ve bir
error slug’ı taşıyan JSON gövdesidir. /v1/ hata gövdeleri
sabitlenmiş bir alt kümedir: error, code ve sabit bir ayrıntı anahtarları
kümesi. /api’nin hata şekli sabit değildir ve daha fazlasını taşıyabilir.
Otomatik bir çağıranın ele alması gereken kodlar:
| Durum | Kod | Slug | Anlamı |
|---|---|---|---|
| 401 | 2000 | unauthorized |
Eksik veya geçersiz bearer jeton |
| 403 | 2022 | pat_forbidden |
Rota hiçbir jetonu kabul etmez |
| 403 | 2023 | pat_scope_missing |
Jetonda bu çağrının gerektirdiği izin yok ya da hesapta faturalandırma kapalı |
| 403 | 4021 | pat_purchase_requires_app |
Kayıtlı bir kart belirtilmedi ya da ücretlendirme reddedildi; hiçbir şey ücretlendirilmedi |
| 403 | 4023 | pat_purchase_requires_authentication |
Kartı veren banka, çağıranın tamamlayamayacağı bir doğrulama istiyor; kartın kendisinde sorun yok |
| 402 | 3001 | insufficient_balance |
İşi kabul etmeye yetecek bakiye yok |
| 402 | 3002 | card_declined |
Kayıtlı kart reddedildi |
| 402 | 3003 | org_insufficient_balance |
Bu yüklemeyi karşılayan kuruluşun ortak saat havuzu yetersiz |
| 404 | 4000 | not_found |
Böyle bir iş, yükleme ya da kaynak yok |
| 409 | 4001 | wrong_state |
Kaynak buna izin veren bir durumda değil |
| 422 | 1021 | duration_out_of_range |
Bildirilen süre 15 saniyenin altında veya 10 saatin üzerinde |
| 429 | 4038 | agent_purchase_capped |
Hesap, jetonla satın alma denemesi hakkını doldurdu; Retry-After süresini bekle |
| 429 | 5000 | rate_limited |
Çok fazla istek; Retry-After süresini bekle |
| 502 | 6001 | provider_error |
Harici bir hizmet başarısız oldu |
| 500 | 9000 | internal_error |
Beklenmeyen bir sunucu hatası |
OpenAPI belgesi her işlemin döndürebileceği kesin kodu adlandırır; MCP sunucusu
ise kodların tüm kataloğunu hushscript://error-codes kaynağı olarak
yayınlar.