Skip to main content
A voice is referenced in TTS requests as {"mode": "id", "id": "<voice_id>"}. Your organization sees two kinds of voices: platform voices from the shared library, which are read-only, and its own voices, created by cloning or localization. Editing or deleting a platform voice returns 403 voice_read_only; a voice outside your visibility returns 404 voice_not_found.

GET /voices

List and filter voices.
The response is {"voices": [Voice, ...], "next_cursor": "..." | null}. Pass next_cursor back as cursor until it is null.

The voice object

Each profile records that the voice is prepared for one model: {model_id, profile_kind, profile_version, status, cached_at, expires_at}. status is pending, ready, or failed. A TTS request only succeeds against a model with a ready profile.

GET /voices/:id

Returns the Voice, or 404 voice_not_found.

PATCH /voices/:id

Body: {name?, description?, tags?}name must be non-empty, tags a string array. Own voices only; returns the updated Voice.

DELETE /voices/:id

Soft-deletes an owned voice. Returns {"id": "...", "deleted": true}.

Save and unsave

POST /voices/:id/save returns {"id": "...", "saved": true}; DELETE /voices/:id/save returns saved: false. Saved voices appear under scope=saved. Any visible voice can be saved, including platform voices.

Voice profiles

POST /voices/:id/profiles prepares a voice for a model. OmniVoice uses in-context-learning (ICL) profiles built from the voice’s source audio. Body: {model_id?} — default omnivoice.
  • A cached profile already exists: 200 {"voice_id": "...", "status": "ready", "profile": {...}}. The voice is usable immediately.
  • No cached profile: 202 {"job_id": "...", "voice_id": "...", "status": "..."}. Poll GET /jobs/:id until the job succeeds.
  • The voice has no canonical source audio: 409 voice_source_missing.
A TTS request that names a voice without a ready profile for the target model returns 409 voice_profile_missing.