{"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.{"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 404voice_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": "..."}. PollGET /jobs/:iduntil the job succeeds. - The voice has no canonical source audio: 409
voice_source_missing.
voice_profile_missing.