Hushscript, bir MCP istemcisi çalıştırmak yerine doğrudan bir HTTP uç noktasını çağırmayı tercih eden ajanlar ve betikler için düz REST çağrılarını da yanıtlar. Baştan sona aynı hesap, aynı bakiye ve aynı taşıyıcı (bearer) jetonlardır: burada hiçbir şey transkripsiyonun nasıl fiyatlandırıldığını veya saklandığını değiştirmez.
Hızlı başlangıç
API bir kişisel erişim jetonu gerektirir ve birini elde etmenin iki yolu
vardır. Bir kişi, hesaptaki MCP sayfasında
Jetonlar altında bir tane oluşturur, izinlerini seçer ve dakika satın
alıp alamayacağına karar verir. Ya da bir ajan, hiçbir kişi karışmadan kendi
hesabını açar: POST /v1/agent/accounts ücretli bir kaydı başlatır ve
POST /v1/agent/accounts/{signup_id}/claim, tek kullanımlık talep gizli
bilgisini gerçek bir hesap ve ilk jetonla değiştirir. Her iki durumda da
jeton bir kez gösterilir ve hsr1:<region>:pat.<id>.<secret> biçimindedir.
MCP sunucusunun OAuth ile oturum açmasıyla basılan bir jeton da burada
çalışır; bkz. Bağlanın. Bir jeton başka jetonlar asla
basamaz, listeleyemez veya iptal edemez ve bir hesap en fazla 25 etkin jeton
tutar; kimlik bilgisi döndürme dahil eksiksiz ajan-hesap akışı
Otomatik kullanım adım adım anlatımıdır.
Bir jetona sahip olduğunuzda API’yi doğrudan çağırın:
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
}
}
Bu, bakiyeyi saniye cinsinden, çalışan işlerin bekletilen saniyelerini,
kredinin son kullanma tarihini, bir kartın kayıtlı olup olmadığını, veri
bölgesini ve kabul sınırlarını (max_active_jobs, max_daily_seconds ve
bunların ne kadarının kullanıldığı) yanıtlar. Yeni bir hesap sıfır bakiyeyle
başlar. POST /v1/uploads, kartı değil bakiyeyi denetler: dakika yoksa
3001 insufficient_balance döner. Bakiyenin oraya ulaşmasını sağlayan şey
karttır, çünkü uygulamadaki tek seferlik kart doğrulaması 30 ücretsiz
dakikayı serbest bırakır ve paketler kayıtlı bir karta karşı satın alınır.
Uçtan uca otomasyon
Hesap var olduktan sonraki her şey, o hesabı uygulamada bir kişi mi yoksa
/v1/agent/accounts üzerinden bir ajan mı açtığından bağımsız olarak
insansız çalışır (bkz. Otomatik kullanım). Tek bir tarayıcı
adımı kalır ve bir ajan o tarayıcıyı kendisi de sürebilir.
-
Hesabı okuyun.
GET /v1/account.card_on_filefalse ise önce bir kart kaydedin. -
Bir kart kaydedin, bir kez.
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ünüzdeki bir tarayıcıda açın ve barındırılan Stripe sayfasını tamamlayın; hiçbir şey ücretlendirilmez ve Hushscript kartı asla görmez. Ardından
GET /v1/billing/cards, onu kimliğiyle birlikte listeler. Hesap birden fazla kart tutuyorsaPOST /v1/billing/cards/defaultvarsayılanı değiştirir. -
Dakika satın alın.
GET /v1/billing/packs, beş paketiid,seconds,amountvecurrencyile listeler:curl https://api.hushscript.com/v1/billing/packs \ -H "Authorization: Bearer hsr1:eu:pat.7f3a9c.2b6e1d4a9f2c88b1a3d4e5f60718293"pack,quick_payment_method_id(kayıtlı kartın kimliği) ve biridempotency_keyilePOST /v1/billing/purchase, kartı oturum dışında (off-session) ücretlendirir ve yenibalance_secondsdeğerini yanıtlar: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 }Bu, jetonda
billingiznini ve hesap için faturalandırmanın açık olmasını gerektirir. Kart kimliği içermeyen bir gövde veya reddedilen bir kart4021 pat_purchase_requires_appile reddedilir; kart çıkarıcısının doğrulamak istediği bir kart4023 pat_purchase_requires_authenticationile reddedilir. İkisi de kimsenin tamamlayamayacağı bir sayfa açmaz. -
Yükleyin.
size_bytes,duration_seconds(15 saniye ile 10 saat arası), isteğe bağlı birtitle,transcription_optionsve biridempotency_keyilePOST /v1/uploads: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" }'Bir kredi bekletmesi koyar ve bir
job_idile ön imzalı (presigned) parça URL’lerinin ilk sayfasını yanıtlar:{ "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
PUTedin (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>üzerinden alın ve uzun bir aktarım sırasında 20 dakikalık boşta kalma (idle) zaman aşımının iyice içindePOST /v1/uploads/{job}/heartbeatçağrısı yapın. Ön imzalı URL’ler kullanılamıyorsa veya bir parça başarısız olursa,PUT /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. Yalnızca ses: mp3, m4a, wav, flac, ogg veya opus, en fazla 5 GB, sunucuda denetlenir; bir videodan yüklemeden önce ses parçasını çıkarın. -
Başlatın ve bekleyin. Ön imzalı bir URL’ye gönderdiğiniz her parçanın
nveetagdeğerleriylePOST /v1/uploads/{job}/complete(her parça API üzerinden gittiyseparts’ı atlayın):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}’i yoklayın:state,uploading,queuedveprocessing’dendoneveyafailed’e geçer, ve tamamlanmış bir iş birtranscript_idtaşır: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 okuyun.
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.
Transkripsiyon seçenekleri uygulamanınkiyle birebir aynıdır: language_code
veya otomatik algılama, speaker_detection, medical_mode (language_code’un
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 metin bir prompt, ve GET /v1/transcription-context’in
listelediği kayıtlı dictionary_ids ve prompt_preset_id.
Hesabın bir kısmı hâlâ yalnızca MCP üzerinden erişilebilir. Bir bağlantıdan
içe aktarma, transkriptleri düzenleme veya silme, Insights, dışa aktarmalar,
sözlük ve istem ön ayarı kaydetme, ve hesap ayarları henüz bir /v1/
rotasına sahip değildir; MCP sunucusu bunların tamamını aynı jetonla
kapsar.
Kimlik doğrulama
Her /v1/ çağrısı, Authorization başlığında bir taşıyıcı (bearer) jeton
taşır ve bu, MCP sunucusunun kullandığı aynı izinlere göre denetlenir:
| İzin | Ne yapabilir |
|---|---|
transcripts:read |
Transkriptleri, meta verilerini ve silinenler listesini okur ve dışa aktarır |
transcripts:write |
Transkriptleri düzenler, etiketler, çevirir, geri yükler ve siler |
transcribe |
Kayıt yükler, bir bağlantıdan içe aktarır ve transkripsiyon ç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, hesap dökümünü, faturaları ve denetim kaydını okur |
export |
Tam hesap dışa aktarımı ister, durumunu denetler ve indirir |
billing |
Kart kaydeder ve dakika paketi satın alır |
Jetonun izinleri dışındaki bir çağrı, 403 durumunda pat_scope_missing ile
başarısız olur. billing izni de hesap sahibi uygulamada hesap için
faturalandırmayı açana kadar etkisizdir; bu anahtar kapalıyken yapılan bir
faturalandırma çağrısı aynı pat_scope_missing ile başarısız olur ve
jetonu yeniden basmak bunu temizlemez. Bir jeton başka jetonlar
oluşturamaz, listeleyemez veya iptal edemez, ve bir hesap en fazla 25 etkin
jeton tutar.
Uç noktalar
Bugün canlı, her biri 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 |
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, henüz jeton olmadan başsız (headless) bir kaydı açar,
/v1/agent/accounts/{signup_id}/claim ücretli bir kaydı gerçek bir hesaba
ve onun ilk jetonuna dönüştürür, ve /v1/agent/credentials/rotate çağıran
jeton için bir ardıl basar ve onu iptal eder, hesaptaki başka hiçbir kimlik
bilgisine dokunmaz. Otomatik kullanım adım adım anlatımı
üçünü de uçtan uca kapsar.
Her liste bir limit ve opak bir cursor alır ve son sayfada null olan
bir next_cursor yanıtlar. Cursor’ı değiştirmeden geri gönderin; konumu
kodlar, bu yüzden çağrılar arasında yeni satırlar geldiğinde bir sayfa asla
atlanmaz veya tekrarlanmaz.
Her işlem için parametreler ve yanıt şemalarıyla birlikte eksiksiz, güncel tanım OpenAPI belgesidir: bu tabloya değil ona güvenin. İzninden bağımsız olarak her taşıyıcı jetona sunulur, bu yüzden bir istemci onu zaten sahip olduğu kimlik bilgileriyle alabilir.
MCP arayüzü
Ham HTTP yerine araçları mı tercih ediyorsunuz? MCP sunucusu, REST yerine zaten MCP konuşan bir istemci için aynı hesabı bu uç noktalar yerine 51 aracın ardına yerleştirir.
Sınırlar
Bir jetonla yapılan istekler jeton başına dakikada 1.200 ile sınırlıdır.
POST /v1/billing/setup-session ve POST /v1/billing/purchase,
yapacakları Stripe çağrısından önce uygulanan, hesap başına dakikada
60’lık daha sıkı bir bütçeyi paylaşır. Reddedilen bir istek, bekleme
süresini saniye olarak adlandıran bir Retry-After başlığıyla
429 rate_limited yanıtı verir; yeniden denemeden önce o kadar bekleyin.
Yüklemeler 5 GB ve 10 saatle sınırlıdır, 15 saniyelik bir asgari ile, ve
hesabın kendi kabul sınırları (max_active_jobs, max_daily_seconds)
GET /v1/account tarafından bildirilir.
Sandbox
Kuru çalıştırma (dry-run) modu yoktur: her /v1/ çağrısı gerçek bir hesaba
karşı çalışır ve dakika satın almak gerçek para harcar.
Hatalar
Bir hata, aşağıda gösterilen HTTP durumunda, sabit bir sayısal code ve
bir error kısaltması (slug) taşıyan bir JSON gövdesidir. /v1/ hata
gövdeleri sabitlenmiş bir izdüşümdür: error, code ve sabit bir ayrıntı
anahtarları kümesi. /api’nin hata şekli sabit değildir ve daha fazlasını
taşıyabilir. Otomatikleştirilmiş bir çağıranın ele alması gereken kodlar:
| Durum | Kod | Kısaltma | Anlamı |
|---|---|---|---|
| 401 | 2000 | unauthorized |
Eksik veya geçersiz bearer jetonu |
| 403 | 2022 | pat_forbidden |
Rota hiçbir jetonu kabul etmez |
| 403 | 2023 | pat_scope_missing |
Jeton bu çağrının gerektirdiği izne sahip değil, ya da hesap için faturalandırma kapalı |
| 403 | 4021 | pat_purchase_requires_app |
Kayıtlı bir kart adlandırılmadı veya ücretlendirme reddedildi; hiçbir şey ücretlendirilmedi |
| 403 | 4023 | pat_purchase_requires_authentication |
Kart çıkarıcısı, çağıranın tamamlayamayacağı bir doğrulama istiyor; kartın kendisi sorunsuz |
| 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 finanse eden çalışma alanı havuzu yetersiz |
| 404 | 4000 | not_found |
Böyle bir iş, yükleme veya kaynak yok |
| 409 | 4001 | wrong_state |
Kaynak buna izin veren bir durumda değil |
| 422 | 1021 | duration_out_of_range |
Belirtilen süre 15 saniyenin altında veya 10 saatin üzerinde |
| 429 | 5000 | rate_limited |
Çok fazla istek; Retry-After için bekleyin |
| 502 | 6001 | provider_error |
Bir üst akış hizmeti 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 ve MCP
sunucusu eksiksiz kataloğu hushscript://error-codes kaynağı olarak
yayınlar.