curl --request POST \
--url https://app.thinnest.ai/api/v1/voice-clones \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'name=Dr Mehta (clinic)' \
--form 'description=Warm, unhurried' \
--form 'tags=warm, healthcare' \
--form language=en-IN \
--form removeNoise=true \
--form consentOwnVoice=true \
--form consentNoImpersonation=true \
--form sample=@example-fileconst form = new FormData();
form.append('name', 'Dr Mehta (clinic)');
form.append('description', 'Warm, unhurried');
form.append('tags', 'warm, healthcare');
form.append('language', 'en-IN');
form.append('removeNoise', 'true');
form.append('consentOwnVoice', 'true');
form.append('consentNoImpersonation', 'true');
form.append('sample', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://app.thinnest.ai/api/v1/voice-clones', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/voice-clones"
files = { "sample": ("example-file", open("example-file", "rb")) }
payload = {
"name": "Dr Mehta (clinic)",
"description": "Warm, unhurried",
"tags": "warm, healthcare",
"language": "en-IN",
"removeNoise": "true",
"consentOwnVoice": "true",
"consentNoImpersonation": "true"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text){
"id": "vc_c4a19e72-0b3d-4f58-a6e1-9d2c7b5f8a03",
"voiceId": "c4a19e72-0b3d-4f58-a6e1-9d2c7b5f8a03",
"name": "Dr Mehta (clinic)",
"language": "en-IN",
"description": "Warm, unhurried",
"tags": [
"warm",
"healthcare"
],
"noiseRemoved": true,
"previewUrl": "https://files.example.com/voice-previews/c4a19e72.mp3?token=eyJhbGciOi…",
"usableOnAgents": true,
"consent": {
"text": "This recording is of my own voice, or I hold the rights and permissions needed to clone the voice in it. I will not use it to impersonate anyone, or for anything illegal, harmful or misleading.",
"at": "2026-10-06T10:02:17.335Z"
},
"createdAt": "2026-10-06T10:02:26.018Z"
}Create Voice Clone
Clones a voice from a 5–30 second recording, sent as multipart/form-data with the audio as sample. Both consent fields must be true — the two promises the console shows — or nothing is stored or sent anywhere; the refusal carries the two sentences so you can show your own user the same words. Cloning is on the Pro plan and above, up to your plan’s number of voices (10 on Pro, 20 on Scale). Needs a full key.
curl --request POST \
--url https://app.thinnest.ai/api/v1/voice-clones \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'name=Dr Mehta (clinic)' \
--form 'description=Warm, unhurried' \
--form 'tags=warm, healthcare' \
--form language=en-IN \
--form removeNoise=true \
--form consentOwnVoice=true \
--form consentNoImpersonation=true \
--form sample=@example-fileconst form = new FormData();
form.append('name', 'Dr Mehta (clinic)');
form.append('description', 'Warm, unhurried');
form.append('tags', 'warm, healthcare');
form.append('language', 'en-IN');
form.append('removeNoise', 'true');
form.append('consentOwnVoice', 'true');
form.append('consentNoImpersonation', 'true');
form.append('sample', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://app.thinnest.ai/api/v1/voice-clones', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/voice-clones"
files = { "sample": ("example-file", open("example-file", "rb")) }
payload = {
"name": "Dr Mehta (clinic)",
"description": "Warm, unhurried",
"tags": "warm, healthcare",
"language": "en-IN",
"removeNoise": "true",
"consentOwnVoice": "true",
"consentNoImpersonation": "true"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text){
"id": "vc_c4a19e72-0b3d-4f58-a6e1-9d2c7b5f8a03",
"voiceId": "c4a19e72-0b3d-4f58-a6e1-9d2c7b5f8a03",
"name": "Dr Mehta (clinic)",
"language": "en-IN",
"description": "Warm, unhurried",
"tags": [
"warm",
"healthcare"
],
"noiseRemoved": true,
"previewUrl": "https://files.example.com/voice-previews/c4a19e72.mp3?token=eyJhbGciOi…",
"usableOnAgents": true,
"consent": {
"text": "This recording is of my own voice, or I hold the rights and permissions needed to clone the voice in it. I will not use it to impersonate anyone, or for anything illegal, harmful or misleading.",
"at": "2026-10-06T10:02:17.335Z"
},
"createdAt": "2026-10-06T10:02:26.018Z"
}Authorizations
Your API key (ta_live_…) from Settings → API keys, sent as Authorization: Bearer <key>. Keep it on a server: it can message every customer you have. A key is full, build or read-only; a request its level does not allow is refused with 403.
Headers
Developers only: the customer workspace this request acts in — its org_… id from POST /customers. Leave it out to act in your own workspace.
"org_3fKq9TzQ1mN8vB2xR7cLpA"
Body
The recording: WAV, MP3, M4A or WebM audio, 5 to 30 seconds (15 is best), at most 10 MB.
A name for the voice, up to 40 characters.
40true to promise: "This recording is of my own voice, or I hold the rights and permissions needed to clone the voice in it."
true true to promise: "I will not use it to impersonate anyone, or for anything illegal, harmful or misleading."
true A note about the voice, up to 200 characters.
200Comma-separated labels, e.g. warm, healthcare. Lower-cased, de-duplicated, eight at most.
What the recording is in, as a language tag: hi, ta, bn, mr… for Indian languages, en-IN, en-US, en-GB, en-AU, en-NG, en-PH or en-SG for English, or another language the console's Voice Clone page offers. A language with no accent choice takes no region (ta, not ta-IN); en alone means en-IN. Refused when it is not one of them.
Clean background noise from the recording before cloning.
true, false Response
The cloned voice. Put voiceId on an agent as voice.voice.
A voice your workspace cloned.
The clone's id.
"vc_c4a19e72-0b3d-4f58-a6e1-9d2c7b5f8a03"
What an agent's voice.voice takes — the id List Voices shows it under.
Its name, up to 40 characters.
What it was recorded in, as a language tag: en-IN, hi, ta.
A note about it, up to 200 characters.
Lower-case labels such as warm.
8Whether background noise was cleaned from the recording before cloning.
A link to its preview that works for sixty seconds, or null.
Whether your plan may put a cloned voice on an agent.
What was agreed to when it was made, and when.
Show child attributes
Show child attributes
When the voice was made.