Skip to main content
POST
/
v1
/
voices
/
clone
Clone Voice
curl --request POST \
  --url https://api.bland.ai/v1/voices/clone \
  --header 'Content-Type: multipart/form-data' \
  --header 'authorization: <authorization>' \
  --form 'name=<string>' \
  --form 'gender=<string>' \
  --form 'description=<string>' \
  --form isBTTS_V3=true \
  --form isBTTS_V2=true \
  --form audio_samples.items='@example-file'
{
  "status": 200,
  "data": {
    "voice_id": "4cc89edf-c4b7-4df8-98c5-f8548fcd7c62",
    "name": "DocTestClone"
  },
  "errors": null
}

Overview

Creates a Bland TTS voice clone from one or more audio samples. Sent as multipart/form-data. The new voice is private to your org and immediately usable with Speak. Two cloning engines are available, selectable per request:
  • BTTS V3 (default), single 10-second sample, 17+ languages, highest fidelity. Returned service: "BTTS_V3".
  • BTTS V2, exactly 1 WAV file, 17+ languages. Returned service: "BTTS_V2".

Headers

authorization
string
required
Your API key for authentication.

Form Fields

name
string
required
Display name for the voice clone. 1-30 characters. Must be unique in your library.
audio_samples
file[]
required
Audio file or files. Constraints depend on the engine flag (see below). WAV format recommended.
gender
string
male or female. Optional but recommended; helps the underlying model.
description
string
Free-text description. Surfaced as additional context to the model for tone and style.
isBTTS_V3
boolean
Use the V3 engine. Default if no engine flag is set. Pass "true" as a multipart string.
isBTTS_V2
boolean
Use the V2 engine instead of V3. Pass "true" as a multipart string.

Engine constraints

Each engine validates audio_samples differently. Mismatched files will return a Validation Error before the clone is created.
  • Exactly 1 audio file.
  • Roughly 10 seconds is ideal.
  • Max 10 MB.
  • 17+ languages supported.
  • Exactly 1 audio file.
  • Roughly 10 seconds is ideal.
  • Max 10 MB.
  • 17+ languages supported.

Response

Returns 200 OK with the new voice on success.
data.voice_id
string
UUID of the new voice clone. Use it as voice_id in Speak.
data.name
string
The display name you provided.
errors
null | array
null on success.
{
  "status": 200,
  "data": {
    "voice_id": "4cc89edf-c4b7-4df8-98c5-f8548fcd7c62",
    "name": "DocTestClone"
  },
  "errors": null
}

V2 and V3 voices are single-sample by design. Use List Voice Samples to inspect the source sample attached to a voice.
Docs for agents: llms.txt