Skip to main content
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.
The Authorization: Bearer sk-tokay-… header is missing or the key is wrong/revoked. Create or check keys in the console. With the SDK, pass apiKey or set GEKO_API_KEY. The same key works for both directions — if one works and the other doesn’t, check the base URL, not the key.
Your organization’s balance is depleted. Because it’s one balance for both products, synthesis and transcription stop together. Top up in the console. The SDK does not retry 429 — a retry can’t create credits. See Billing.
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.
A transient hiccup validating the key. The SDK retries 503 automatically with backoff; if it persists, retry shortly or check the console.
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.
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.
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.
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.
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.
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.
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.
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.
Per organization, from one balance: text-to-speech by input characters (0.04/1,000)andspeechtotextbysecondsofaudio(0.04 / 1,000) and **speech-to-text by seconds of audio** (0.36 / hour). Only successful requests are billed. See Billing & credits.
Still stuck? Open an issue on GitHub or email amirlan@geko.sh.

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.