API Reference

An OpenAI-compatible REST API for speech, transcription and voices. Point an existing client at our base URL and it works.

Base URL and authentication

Every request is authenticated with a bearer token. Keys are created in your dashboard and belong on the server side.

https://api.kiritts.com/v1
Authorization: Bearer YOUR_API_KEY
Create an API key

Endpoints

The full surface. Paths are relative to the host above.

Speech

POST/v1/audio/speechGenerate audio from text. Returns the audio file itself.
WS/v1/realtimeStream speech as it is generated, or stream microphone audio in for live transcription.

Transcription

POST/v1/audio/transcriptionsTranscribe a file and wait for the transcript on the same connection.
POST/v1/audio/transcriptions/jobsQueue a transcription and get a job id back immediately. Use this for long audio.
GET/v1/audio/transcriptions/jobs/{id}Check a job’s status.
GET/v1/audio/transcriptions/jobs/{id}/contentDownload a finished job’s transcript.

Voices & models

GET/v1/voicesEvery voice your key can use, built-in and cloned.
GET/v1/modelsAvailable models, in OpenAI’s list shape.
POST/v1/audio/voice-clonesCreate a cloned voice from a reference recording.
GET/v1/audio/voice-clonesList the cloned voices on your account.

Create speech

POST /v1/audio/speech. The response body is the audio file, so write it to disk or stream it straight to a player.

curl https://api.kiritts.com/v1/audio/speech \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "kiritts",
"input": "សួស្តី ពិភពលោក! Hello, world!",
"voice": "Maly",
"response_format": "mp3"
}' \
--output speech.mp3
modelrequiredstring

Model id, for example kiritts. GET /v1/models lists what your key can use.

inputrequiredstring

Text to speak. Up to 4,096 characters per request.

voicerequiredstring

A voice name from GET /v1/voices — a built-in such as Maly, or one of your own cloned voices.

instructionsoptionalstring

Style guidance: tone, emotion, pacing. Up to 100 characters, and not accepted alongside a speed other than 1.0.

response_formatoptionalstring

mp3 (default), opus, aac, flac, wav or pcm.

speedoptionalnumber

0.7 to 1.2. Defaults to 1.0.

stream_formatoptionalstring

sse for delta events, audio for raw chunks. Omit for a complete file.

stabilityoptionalnumber

How strictly the voice follows the text, 0.1 to 2.5. Lower reads more freely and varies between takes; higher sticks closer to the script. Omit for your account’s default.

voice_matchingoptionalstring

natural uses the voice sample alone, so the voice reads your text in its own way; precise also uses the sample’s transcript and copies its exact delivery. Applies to built-in and cloned voices. Omit for your account’s default.

Create a transcription

POST /v1/audio/transcriptions as multipart form data. For long or unattended audio, queue a job instead so a timeout cannot lose the work.

curl https://api.kiritts.com/v1/audio/transcriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@meeting.mp3" \
-F "model=kiristt" \
-F "response_format=verbose_json" \
-F "timestamp_granularities=word,segment"
filerequiredfile

The audio to transcribe, sent as multipart form data.

modelrequiredstring

Transcription model id — kiristt for files, or kiristt-pro (Pro mode: a larger model for hard audio, billed at a higher per-second rate). GET /v1/models lists them all.

languageoptionalstring

BCP-47 hint such as km-KH. Detected automatically when omitted.

promptoptionalstring

Context to bias the transcript, such as names or jargon.

response_formatoptionalstring

json (default), text, verbose_json, srt or vtt.

temperatureoptionalnumber

Sampling temperature.

timestamp_granularitiesoptionalstring[]

word, segment, or both. Requires response_format=verbose_json.

Errors

Failures come back as JSON with a detail message and the matching status code.

// 401 — missing or invalid API key
{ "detail": "Invalid credentials" }
// 403 — plan has no API access, or someone else's cloned voice
{ "detail": "Your plan does not include API access." }
// 429 — monthly credit limit reached
{ "detail": "Monthly credit limit exceeded" }
// 429 — rate limit (plan-based; default 100/min) — wait and retry
{ "detail": "Rate limit exceeded: 100 per 1 minute" }

Playground

Send a real request with your own key and hear the result.

Realtime, voices, cloning and limits

Streaming sockets, the voice catalogue, cloning rules and per-plan rate limits are covered in the main documentation.

Open the documentation