13 uç · /api/callcenter/v1/sounds
İstek örnekleri ucun GERÇEK metodu ve yolundan üretilir. 13 ucun elle doğrulanmış gövde örneği henüz yok; o uçlarda iskelet gövdesizdir — uydurma bir alan yazmıyoruz.
id`storage_ref` bir İÇ uçtur (kenarda yalnız medya VM'inin IP'sine açık) → tarayıcı onu çekemez. Önizleme bu yüzden oturum yetkisiyle buradan akar. Kaynak, kaydın hangi yolla ses kazandığına göre iki yerden gelir: yüklenen/birleştirilen bayt kaydın kendisinde, sentezlenen TTS baytı `tts_audio_cache`'te.
curl -X GET "https://{slug}.call.blesyum.app/api/callcenter/v1/sounds/<id>/audio" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}idcurl -X GET "https://{slug}.call.blesyum.app/api/callcenter/v1/sounds/<id>/files" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}id**Multipart değil, ham bayt — bilinçli:** panel `fetch(body: File)` ile gönderir; multipart bir ayrıştırıcı bağımlılığı ve ikinci bir tavan yüzeyi (parça başına limit) getirirdi. Dosya adı sorgu dizesinde taşınır. Yüklenen bayt **telefon formatına normalize edilir** (8 kHz/16-bit/mono WAV) ve DB'ye o hâliyle girer; ham dosya SAKLANMAZ. Gerekçe: medya sunucusunda `mod_shout` yok (mp3 çalınmaz) ve süre hesabı bayt uzunluğundan çıkar (bkz. `audio` modülü).
curl -X POST "https://{slug}.call.blesyum.app/api/callcenter/v1/sounds/<id>/files" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}idfidcurl -X DELETE "https://{slug}.call.blesyum.app/api/callcenter/v1/sounds/<id>/files/<fid>" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}idSıra **tek UPDATE turunda** yazılır ve `position` kolonunda unique kısıt vardır: iki parçayı takas ederken ara adım çakışırdı. Bu yüzden önce hepsi negatife taşınır (çakışmayan geçici alan), sonra hedef sıraya yazılır — hepsi aynı transaction'da.
curl -X PUT "https://{slug}.call.blesyum.app/api/callcenter/v1/sounds/<id>/files/order" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}id`storage_ref`'i FreeSWITCH'in çalabileceği gerçek adrese set et. **2026-08-15'te kapatılan boşluk:** bu uç eskiden sentezliyor, ücret düşüyor ve üretilen sesi ATIYORDU (`let _audio = …`); `storage_ref` yalnız *planlanan* bir yolu tutuyor, arkasında dosya olmuyordu. Artık `tts_cache::get_or_synthesize` baytı `callcenter.tts_audio_cache`'e yazar ve dönen URL doğrudan çalınabilir olur. **Cache artık içerik-adresli ve GLOBAL:** anahtar (sağlayıcı, çözülmüş-ses, format, metin) HMAC'idir. Bunun iki sonucu var: (1) sağlayıcı ya da varsayılan ses değişirse anahtar da değişir → eski ses servis edilmeye devam etmez (2026-07-13 FORWARD-NOTE'u); (2) aynı metni içeren FARKLI satırlar tek sentezi paylaşır — paneldeki karşılama ile akıştaki aynı cümle ikinci kez ücretlendirilmez (eski satır-başına dedup'ın aksine). **Ücretlendirme fail-CLOSED KALIR (çağrı yolundan farklı — bilinçli):** burada kullanıcı interaktif bir düğmeye basıyor, "yetersiz kredi" mesajını GÖREBİLİYOR ve tekrar deneyebiliyor. Çağrı yolunda böyle bir alıcı yok; orada reddetmek IVR'ı yeniden sessizleştirirdi, bu yüzden orası post-paid'dir (bkz. `tts_cache` modül başlığı).
curl -X POST "https://{slug}.call.blesyum.app/api/callcenter/v1/sounds/<id>/synthesize" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}verilir: panel adres/akış adı SABİT YAZMAZ (modül adresleri kuralının aynısı).
curl -X GET "https://{slug}.call.blesyum.app/api/callcenter/v1/sounds/moh-streams" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}curl -X GET "https://{slug}.call.blesyum.app/api/callcenter/v1/sounds/voices" \
-H "Authorization: Bearer <oturum-token>" \
-H "Accept: application/json"{
"data": "…",
"trace_id": "01JC…"
}