My first request is slow or times out
My first request is slow or times out
Both GPU services scale to zero when idle, so the first call after a quiet period pays a cold start (tens of seconds); the next calls are fast. Keep the SDK’s default 120 s timeout, and for predictable traffic send a lightweight
geko.health() to pre-warm. Note the two services warm independently — a synthesis call doesn’t warm the transcriber. See Latency & quality.I'm getting 429 (out of credits)
I'm getting 429 (out of credits)
I'm getting 413 on a transcription
I'm getting 413 on a transcription
The audio is longer than the 2 hour per-request cap. Split it and send the pieces. Within that cap, long audio is chunked automatically at pauses, so you don’t need to split for quality reasons. See Limits.
Why is the transcript all lowercase with no punctuation?
Why is the transcript all lowercase with no punctuation?
By design, not post-processing. The model’s output vocabulary is 70 characters — both alphabets plus Latin
a–z — and contains no capitals and no punctuation, so there’s nothing being stripped. Punctuation and truecasing are on the roadmap. See the STT overview.How do I tell it the audio is Kazakh (or Russian)?
How do I tell it the audio is Kazakh (or Russian)?
You don’t, and you can’t — there’s deliberately no
language parameter. Both languages share one output vocabulary, so the model is never told which to expect and a speaker can switch mid-sentence, even inside a word. language is accepted and ignored on the OpenAI-compatible endpoint so existing clients don’t break. See the STT overview.Can I call the API from the browser?
Can I call the API from the browser?
CORS is enabled, so cross-origin calls work — but never ship your API key to the client (it’s public the moment it’s in browser code). Proxy through your own server. See Use it in your app.
How do I get MP3 or Opus instead of WAV?
How do I get MP3 or Opus instead of WAV?
Synthesis returns WAV (and raw
pcm via the OpenAI endpoint) today. Convert locally with ffmpeg — see Playing & saving audio. Native MP3/Opus is on the roadmap. For input to transcription, MP3 and Opus already work — anything ffmpeg reads.Which voice should I use?
Which voice should I use?
Fetch the live catalog with
geko.tts.voices() (or GET /v1/voices) — each entry has style and best_for to guide the choice. Aigerim is the default.How do I stream audio for a voice agent?
How do I stream audio for a voice agent?
Use
geko.tts.stream(), which yields one WAV chunk per sentence so playback can start sooner. Pair it with geko.stt.transcribe() for the listening half — see Voice agents for the full loop.Can I get word-level timestamps or subtitles?
Can I get word-level timestamps or subtitles?
Yes. Add
?timestamps=true and the response gains words ({ word, start, end }) and segments, in seconds from the start of the audio. It costs nothing extra — the alignment is a by-product of the same decode pass, and you are billed on audio_seconds either way. For subtitles use toSubtitles() in the SDK, or response_format=srt / vtt on the OpenAI-compatible endpoint. Full details: word-level timestamps.Speaker labels (diarization) are not included yet — that is on the roadmap.Is there a Python SDK?
Is there a Python SDK?
Not yet — use the OpenAI-compatible endpoints with the
openai Python package (speech, transcription), or call the HTTP API directly. A native Python SDK is on the roadmap.How is usage billed?
How is usage billed?
Per organization, from one balance: text-to-speech by input characters (0.36 / hour). Only successful requests are billed. See Billing & credits.
Next steps
Errors & retries
Every status code, when it retries, and how to handle it.
Latency & quality
Cold starts, keep-warm, and the
nfe dial.Billing & credits
How usage is metered and what 429 means.
Authentication
Create keys and fix a 401.