Clone a voice
Create a cloned voice on this account from a recording: a name, the language, the exact text spoken, and the audio either inline as base64 (`audio`) or as an https:// URL (`audio_url`). The recording must be 2–30 seconds of clear speech. Returns the new profile's id, name, voice type and engine; use the id as `voice_id` on POST /v1/speech. A duplicate name is refused, so send an Idempotency-Key header to make a retry safe. On the free plan the account keeps one saved cloned voice; Pro is unlimited. Only clone a voice whose owner has agreed to it. Requires the `voice:clone` scope.
Create a cloned voice on this account from a recording: a name, the language, the exact text spoken, and the audio either inline as base64 (audio) or as an https:// URL (audio_url). The recording must be 2–30 seconds of clear speech. Returns the new profile's id, name, voice type and engine; use the id as voice_id on POST /v1/speech. A duplicate name is refused, so send an Idempotency-Key header to make a retry safe. On the free plan the account keeps one saved cloned voice; Pro is unlimited. Only clone a voice whose owner has agreed to it.
Requires the voice:clone scope.
A VoiceLabs API key, sent in the x-api-key header. Keys begin with vl_sandbox_. This is the simplest way to authenticate and is what most callers should use.
Create one in the developer console at https://voicelabs.now/connections, on the API keys tab, choosing the scopes it carries. A key does exactly what its scopes allow: one without voice:generate is answered 403 insufficient_scope on the generation operations and cannot spend the account's allowance. The secret is shown once, at creation; revoking a key takes effect on its very next request.
In: header
Header Parameters
An optional client-generated key that makes a retry safe. Replaying the same key with the same body returns the ORIGINAL response byte-for-byte instead of doing the work a second time; replaying it with a different body is refused with idempotency_key_reused.
length <= 255Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X POST "https://example.com/v1/voices/clone" \ -H "Content-Type: application/json" \ -d '{ "name": "string", "reference_text": "string" }'{ "id": "string", "name": "string", "voice_type": "string", "engine": "string", "language": "string", "sample_id": "string"}Ensure the default voice POST
Make sure this account has VoiceLabs' default built-in voice ("Heart", the Kokoro preset `af_heart`), creating it only if it is missing, and return it. Safe to call on every start: a second call returns the same voice with `created: false` and creates nothing. Use it when GET /v1/voices comes back empty, then pass the returned id as `voice_id` (POST /v1/speech) or `voice` (POST /v1/audio/speech). It adds a built-in voice only; it never clones anyone's voice. Requires the `voice:generate` scope.
List voices GET
List the voice profiles on this account — both cloned voices and built-in presets — with language, default engine, and usage counts. A new account has none until a voice is created. Requires the `voice:read` scope.