Clone a voice
Makes a cloned voice from recordings of one person speaking, and charges the one-off fee in the price book (voice_clone). consent must be true. Send the recordings as files in a multipart request, or as audio_urls in JSON. The recordings are passed to the provider and not stored. Put the returned provider_voice_id in an agent’s tts.voice; only engines listed in engines can speak in it. Requires voices:write.
curl --request POST \
--url https://api.voice.wixzel.com/v1/voices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'name=Dr. Meera, front desk' \
--form consent=true \
--form files=@example-file \
--form 'description=<string>' \
--form provider=elevenlabs \
--form language=ml-IN \
--form remove_background_noise=trueimport requests
url = "https://api.voice.wixzel.com/v1/voices"
files = { "files": ("example-file", open("example-file", "rb")) }
payload = {
"name": "Dr. Meera, front desk",
"consent": "true",
"description": "<string>",
"provider": "elevenlabs",
"language": "ml-IN",
"remove_background_noise": "true"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('name', 'Dr. Meera, front desk');
form.append('consent', 'true');
form.append('files', '<string>');
form.append('description', '<string>');
form.append('provider', 'elevenlabs');
form.append('language', 'ml-IN');
form.append('remove_background_noise', 'true');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.voice.wixzel.com/v1/voices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.voice.wixzel.com/v1/voices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nDr. Meera, front desk\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"consent\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"provider\"\r\n\r\nelevenlabs\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nml-IN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"remove_background_noise\"\r\n\r\ntrue\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.voice.wixzel.com/v1/voices"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nDr. Meera, front desk\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"consent\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"provider\"\r\n\r\nelevenlabs\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nml-IN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"remove_background_noise\"\r\n\r\ntrue\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.voice.wixzel.com/v1/voices")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nDr. Meera, front desk\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"consent\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"provider\"\r\n\r\nelevenlabs\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nml-IN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"remove_background_noise\"\r\n\r\ntrue\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.voice.wixzel.com/v1/voices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nDr. Meera, front desk\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"consent\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"provider\"\r\n\r\nelevenlabs\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nml-IN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"remove_background_noise\"\r\n\r\ntrue\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "6a96a3ead6e886d42462dd3e",
"object": "voice",
"name": "<string>",
"description": "<string>",
"provider": "elevenlabs",
"provider_voice_id": "c38kUX8pkfYO2kHyqfFy",
"engines": [
"classic",
"deepgram_agent"
],
"language": "<string>",
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-01T12:00:00.000Z"
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}Authorizations
Your Wixzel Voice API key: Authorization: Bearer wv_live_.... Keys are scoped; grant only what the integration needs.
Body
1 - 100"Dr. Meera, front desk"
Must be true. You confirm that the voice is yours, or that the speaker has given you permission to clone it and use it on calls. Recorded with the time and your account.
The recordings. 30 seconds to a few minutes of one person speaking clearly, with no music or other voices. mp3, wav, m4a, ogg, webm or flac, up to 10 MB each. ElevenLabs takes up to 5 files; Sarvam takes 1, and 10 to 30 seconds is enough.
1 - 5 elements500Where the clone is made, which decides the engines it speaks on. elevenlabs for the classic and deepgram_agent engines; sarvam for the sarvam engine, which is the one to use for Indian languages.
elevenlabs, sarvam The language spoken in the recording. Required for sarvam.
^[a-z]{2}-[A-Z]{2}$"ml-IN"
ElevenLabs only. Cleans up a noisy recording; it can make a clean one worse.
Response
The new voice
^[0-9a-f]{24}$"6a96a3ead6e886d42462dd3e"
voice Where the clone is made, which decides the engines it speaks on. elevenlabs for the classic and deepgram_agent engines; sarvam for the sarvam engine, which is the one to use for Indian languages.
elevenlabs, sarvam Put this in an agent’s tts.voice to make it speak in this voice.
"c38kUX8pkfYO2kHyqfFy"
The engines that can speak in this voice.
["classic", "deepgram_agent"]
The language of the recording. Sarvam clones can still speak every language Sarvam supports.
ISO 8601, always UTC.
"2026-09-01T12:00:00.000Z"
ISO 8601, always UTC.
"2026-09-01T12:00:00.000Z"
curl --request POST \
--url https://api.voice.wixzel.com/v1/voices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form 'name=Dr. Meera, front desk' \
--form consent=true \
--form files=@example-file \
--form 'description=<string>' \
--form provider=elevenlabs \
--form language=ml-IN \
--form remove_background_noise=trueimport requests
url = "https://api.voice.wixzel.com/v1/voices"
files = { "files": ("example-file", open("example-file", "rb")) }
payload = {
"name": "Dr. Meera, front desk",
"consent": "true",
"description": "<string>",
"provider": "elevenlabs",
"language": "ml-IN",
"remove_background_noise": "true"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('name', 'Dr. Meera, front desk');
form.append('consent', 'true');
form.append('files', '<string>');
form.append('description', '<string>');
form.append('provider', 'elevenlabs');
form.append('language', 'ml-IN');
form.append('remove_background_noise', 'true');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.voice.wixzel.com/v1/voices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.voice.wixzel.com/v1/voices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nDr. Meera, front desk\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"consent\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"provider\"\r\n\r\nelevenlabs\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nml-IN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"remove_background_noise\"\r\n\r\ntrue\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.voice.wixzel.com/v1/voices"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nDr. Meera, front desk\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"consent\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"provider\"\r\n\r\nelevenlabs\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nml-IN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"remove_background_noise\"\r\n\r\ntrue\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.voice.wixzel.com/v1/voices")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nDr. Meera, front desk\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"consent\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"provider\"\r\n\r\nelevenlabs\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nml-IN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"remove_background_noise\"\r\n\r\ntrue\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.voice.wixzel.com/v1/voices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nDr. Meera, front desk\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"consent\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"files\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"description\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"provider\"\r\n\r\nelevenlabs\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"language\"\r\n\r\nml-IN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"remove_background_noise\"\r\n\r\ntrue\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "6a96a3ead6e886d42462dd3e",
"object": "voice",
"name": "<string>",
"description": "<string>",
"provider": "elevenlabs",
"provider_voice_id": "c38kUX8pkfYO2kHyqfFy",
"engines": [
"classic",
"deepgram_agent"
],
"language": "<string>",
"created_at": "2026-09-01T12:00:00.000Z",
"updated_at": "2026-09-01T12:00:00.000Z"
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}{
"error": {
"type": "invalid_request_error",
"code": "agent_not_found",
"message": "<string>",
"request_id": "req_01HXYZ...",
"param": "<string>",
"doc_url": "<string>"
}
}
