job_id; poll GET /jobs/:id until the job settles.
Instant clone
POST /voices/clone accepts the audio in one of three forms:
- multipart/form-data — one file field plus the text fields below.
- Raw body —
Content-Type: audio/*orapplication/octet-stream; text fields go in query params. - JSON —
{"blob_id": "..."}referencing audio already stored with your organization.
missing_clip. Use 10–30 seconds of clean speech — 10 seconds is the working minimum. Caps: 25 MB per clip (413) and 250 MB of stored audio per organization (413 blob_quota_exceeded).
- 201 — the clone ran synchronously; the body is the finished Voice, usable in TTS immediately.
- 202 —
{"job_id": "...", "voice_id": "...", "status": "queued"}. The voice row exists now under the returnedvoice_id; its profile attaches when the job succeeds.
Pro clone
POST /voices/clone/pro builds a higher-fidelity voice from a dataset. Provide 10+ minutes of audio across files, 25 MB per file. Input forms: multipart with multiple file fields, a raw audio body, or JSON {"blob_ids": ["..."]}. name is required. There is no mode field.
Pro clones never complete synchronously. The endpoint always returns 202 {"job_id": "...", "status": "..."}.
Localize
POST /voices/:id/localize derives a new voice in another language.
Body: {"target_language": "..."} (required — 400 without it) plus optional model_id. Returns 202 {"job_id": "...", "status": "..."}.
The result is a new voice your organization owns, with source: "localized" and parent_voice_id pointing at the original. Featured platform voices can be localized; the original is untouched.
Polling jobs
GET /jobs/:id returns the state of any clone or localize job in your organization; unknown ids return 404.
Poll until the status leaves
queued/running: