Get started

To use Unmixr AI API service, you need to be in the eligible plan.

The API use token based authentication to authorize the API requests. Before calling API, you need to create API token from https://app.unmixr.com/manage-api-keys/

For any support, please contact us at support@unmixr.com.

Voice List

GET https://unmixr.com/api/v1/voice-list/

Request Headers

Field Description
Authorization The API Key in the format: Bearer <YOUR API KEY>
Content-Type application/json

QUERY PARAMETERS

Field Type Description
c String

(Optional) `c` refers to the Voice Category. You can specify: prebuilt-voices, openai-voices, multilingual-voices, community-shared-voices, animation-voices, child-voices, clones, narration-voices, assistant-voices, audiobook-voices, announcer-voices, gaming-voices, documentary-voices, podcast-voices, advertisement-voices, news-voices, elearning-voices, meditation-voices, chat-voices

If you don't specify `c` by default API returns prebuilt-voices

q String (optional) search query to find voice by name.
lang String (optional) Language code. Example: en, en-US, it etc
gender String (optional) Filter by gender. Supported values: any, male, female, child
capabilities String (optional) filter voice list by voice capabilities. Supported values: `pause`, `speech`, `speech:volume`, `speech:rate`, `speech:pitch`, `emphasize`, `abbr`, `custom_pause`
styles String (optional) Filter voices by styles: `chat`, `customerservice`, `narration-professional`, `newscast-casual`, `newscast-formal`, `cheerful`, `empathetic`, `angry`, `sad`, `excited`, `friendly`, `terrified`, `shouting`, `unfriendly`, `whispering`, `hopeful`
uc String (optional) Filter by use cases. Supported values: `audiobook-voices`, `podcast-voices`, `advertisement-voices`, `news-voices`, `elearning-voices`, `chat-voices`, `narration-voices`, `assistant-voices`, `announcer-voices`, `documentary-voices`, `gaming-voices`, `meditation-voices`
page Integer (optional - default: 1) Returns voice list in the specified page number
page_size Integer (optional - default: 12) Returns number of items in a page specified in page_size param
fields String (optional) Comma seperated fields to return in the API response. See the Response Fields section below.
curl --location 'https://unmixr.com/api/v1/voice-list/' \
--header 'Authorization: Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e' \
--header 'Content-Type: application/json' \
--data ''
        
import requests
import json

url = "https://unmixr.com/api/v1/voice-list/"

payload = ""
headers = {
  'Authorization': 'Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e',
  'Content-Type': 'application/json'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
const myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e");
myHeaders.append("Content-Type", "application/json");

const raw = "";

const requestOptions = {
  method: "GET",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://unmixr.com/api/v1/voice-list/", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

Example Response:

              Get https://unmixr.com/api/v1/voice-list/?page_size=2
Output:
{
    "count": 1133,
    "results": [
        {
            "uuid": "1283979c-87a5-44d5-a8de-4082ba20cc5b",
            "character": "Brian",
            "gender": "Male",
            "language": "en-US",
            "quality": "Premium",
            "sample_voice_url": "https://resource.unmixr.com/sample_audio/19282e7a-c77c-4432-aead-11ba634754bd.mp3",
            "emotions": [],
            "capabilities": [
                "speech",
                "speech:volume",
                "speech:rate",
                "speech:pitch",
                "custom_pause",
                "intensity"
            ],
            "roles": [],
            "use_cases": [
                "Podcast",
                "Chat"
            ],
            "other_languages": [
                "af-ZA",
                "am-ET",
                "ar-EG",
                "ar-SA",
                "az-AZ",
                "bg-BG",
                "bn-BD",
                "bn-IN",
                  ...
                  ...
            ],
            "supported_locales": {
                "en-AU": "https://unmixr.s3.amazonaws.com/sample_audio/e5481cdb-2d49-4654-b901-8f3c32d638b1.mp3",
                "en-CA": "https://unmixr.s3.amazonaws.com/sample_audio/6fc0c7d5-72e9-4353-b4b5-8aa2b1213c20.mp3",
                "en-GB": "https://unmixr.s3.amazonaws.com/sample_audio/6a4b940c-7c38-47ec-bf92-47529d4891e7.mp3",
                "en-IE": "https://unmixr.s3.amazonaws.com/sample_audio/003789c9-1a47-4457-865d-59d31cef478f.mp3",
                "en-IN": "https://unmixr.s3.amazonaws.com/sample_audio/5108a64f-7d19-470c-b7cb-6fbfea77e976.mp3",
                "en-US": "https://unmixr.s3.amazonaws.com/sample_audio/19282e7a-c77c-4432-aead-11ba634754bd.mp3"
            },
            "is_available": true,
            "date_created": "2024-04-22T14:32:56.201895Z",
            "is_multilingual": true,
            "wpm": 188,
            "is_new": true,
            "description": "A youthful, cheerful, and versatile voice that can handle any task you throw its way, well-suited to a wide variety of contexts.",
            "age": "YoungAdult",
            "personality": [
                "Sincere",
                "Calm",
                "Approachable"
            ],
            "avatar_url": "https://resource.unmixr.com/avatar/ec18fc06-f46b-4ff9-af55-c953ff47a2ef-0.png"
        },
        {
            "uuid": "57f0ec2e-bbb7-460f-92d5-e7277669b985",
            "character": "Steffan (Express)",
            "gender": "Male",
            "language": "en-US",
            "quality": "Premium",
            "sample_voice_url": "https://resource.unmixr.com/sample_audio/90ebe603-6de5-44d6-bca7-f2cb0232ba85.mp3",
            "emotions": [],
            "capabilities": [
                "abbr",
                "intensity"
            ],
            "roles": [],
            "use_cases": [
                "Assistant",
                "Narration"
            ],
            "other_languages": [
                "af-ZA",
                "am-ET",
                "ar-EG",
                "ar-SA",
                "az-AZ",
                "bg-BG",
                "bn-BD",
                "bn-IN",
                "bs-BA",
                "ca-ES",
                "cs-CZ",
                "cy-GB",
                "da-DK",
                "de-AT",
                  ...
                  ...
            ],
            "supported_locales": {
                "en-AU": "https://unmixr.s3.amazonaws.com/sample_audio/eb0cce7b-2720-4293-9605-2dd10136d624.mp3",
                "en-CA": "https://unmixr.s3.amazonaws.com/sample_audio/bc4cacde-b99e-4564-a015-5f05cccc8866.mp3",
                "en-GB": "https://unmixr.s3.amazonaws.com/sample_audio/6133a613-b317-4c24-8748-6600099872ad.mp3",
                "en-IE": "https://unmixr.s3.amazonaws.com/sample_audio/fecf1b90-1c1e-4d36-a524-c38bc49b471d.mp3",
                "en-IN": "https://unmixr.s3.amazonaws.com/sample_audio/3e113141-9b00-49f4-a7ff-206bd52d771a.mp3",
                "en-US": "https://unmixr.s3.amazonaws.com/sample_audio/90ebe603-6de5-44d6-bca7-f2cb0232ba85.mp3"
            },
            "is_available": true,
            "date_created": "2024-10-28T18:51:25.275300Z",
            "is_multilingual": true,
            "wpm": 178,
            "is_new": true,
            "description": "HD versions of Steffan with a wider range of styles, perfectly suited for audiobook narration and storytelling.",
            "age": "Adult",
            "personality": [
                "Mature",
                "Authentic",
                "Warm"
            ],
            "avatar_url": "https://resource.unmixr.com/avatar/fb1ba17d-c176-4622-adc5-e9192347c09d-0.png"
        }
    ],
    "current_page": 1,
    "page_start": 1,
    "page_end": 2,
    "next_page": 2,
    "prev_page": null,
    "total_page": 567
}
              
          

Response Fields

You can specify which fields should be in API response. To specify use `fields`. See example below:

https://unmixr.com/api/v1/voice-list/?fields=uuid,character,language
https://unmixr.com/api/v1/voice-list/?fields=uuid,character,gender,capabilities

Voice Details

GET https://unmixr.com/api/v1/voice/:uuid/

Request Headers

Field Description
Authorization The API Key in the format: Bearer <YOUR API KEY>
Content-Type application/json

Query Parameters

Field Type Description
fields String (optional) Comma seperated fields to return in the API response. See the Response Fields section below.
curl --location 'https://unmixr.com/api/v1/voice/1283979c-87a5-44d5-a8de-4082ba20cc5b/' \
--header 'Authorization: Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e' \
--header 'Content-Type: application/json' \
--data ''
import requests
import json

url = "https://unmixr.com/api/v1/voice/1283979c-87a5-44d5-a8de-4082ba20cc5b/"

payload = ""
headers = {
  'Authorization': 'Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e',
  'Content-Type': 'application/json'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
const myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e");
myHeaders.append("Content-Type", "application/json");

const raw = "";

const requestOptions = {
  method: "GET",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://unmixr.com/api/v1/voice/1283979c-87a5-44d5-a8de-4082ba20cc5b/", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

Example Response:

              Get https://unmixr.com/api/v1/voice/1283979c-87a5-44d5-a8de-4082ba20cc5b/
Output:
{
    "uuid": "1283979c-87a5-44d5-a8de-4082ba20cc5b",
    "character": "Brian",
    "gender": "Male",
    "language": "en-US",
    "quality": "Premium",
    "sample_voice_url": "https://resource.unmixr.com/sample_audio/19282e7a-c77c-4432-aead-11ba634754bd.mp3",
    "emotions": [],
    "capabilities": [
        "speech",
        "speech:volume",
        "speech:rate",
        "speech:pitch",
        "custom_pause",
        "intensity"
    ],
    "roles": [],
    "use_cases": [
        "Podcast",
        "Chat"
    ],
    "other_languages": [
        "af-ZA",
        "am-ET",
        "ar-EG",
        "ar-SA",
        "az-AZ",
          ...
          ...
    ],
    "supported_locales": {
        "en-AU": "https://unmixr.s3.amazonaws.com/sample_audio/e5481cdb-2d49-4654-b901-8f3c32d638b1.mp3",
        "en-CA": "https://unmixr.s3.amazonaws.com/sample_audio/6fc0c7d5-72e9-4353-b4b5-8aa2b1213c20.mp3",
        "en-GB": "https://unmixr.s3.amazonaws.com/sample_audio/6a4b940c-7c38-47ec-bf92-47529d4891e7.mp3",
        "en-IE": "https://unmixr.s3.amazonaws.com/sample_audio/003789c9-1a47-4457-865d-59d31cef478f.mp3",
        "en-IN": "https://unmixr.s3.amazonaws.com/sample_audio/5108a64f-7d19-470c-b7cb-6fbfea77e976.mp3",
        "en-US": "https://unmixr.s3.amazonaws.com/sample_audio/19282e7a-c77c-4432-aead-11ba634754bd.mp3"
    },
    "is_available": true,
    "date_created": "2024-04-22T14:32:56.201895Z",
    "is_multilingual": true,
    "wpm": 188,
    "is_new": true,
    "description": "A youthful, cheerful, and versatile voice that can handle any task you throw its way, well-suited to a wide variety of contexts.",
    "age": "YoungAdult",
    "personality": [
        "Sincere",
        "Calm",
        "Approachable"
    ],
    "avatar_url": "https://resource.unmixr.com/avatar/ec18fc06-f46b-4ff9-af55-c953ff47a2ef-0.png"
}
          

Response Fields

You can specify which fields should be in API response. To specify use `fields`. See example below:

https://unmixr.com/api/v1/voice/1283979c-87a5-44d5-a8de-4082ba20cc5b/?fields=uuid,character,language
https://unmixr.com/api/v1/voice/1283979c-87a5-44d5-a8de-4082ba20cc5b/?fields=uuid,character,gender,capabilities

Create TTS

POST https://unmixr.com/api/v1/short-tts/

Request Headers

Field Description
Authorization The API Key in the format: Bearer <YOUR API KEY>
Content-Type application/json

Request Fields

Field Type Description
text String (Required) The text you want to convert into audio. Max length 2000 characters.
voice_id String (Required) Voice ID to use to generate audio.
speaking_rate String (optional - Default: 0% or default) supported values: -100% to +100%, default, x-slow, slow, medium, fast, x-fast
speaking_pitch String (optional - Default: 0% or default) supported values: -50% to +50%, default, x-low, low, medium, high, x-high
speaking_volume String (optional - Default: 0% or default) supported values: -100% to +100%, default, silent, x-soft, soft, medium, loud, x-loud
intensity Integer (optional) -100 to +100. Note: Not all voices support intensity. Check supported capabilities for the selected vocie to use intensity.
output_type String (optional - Default: mp3). Supported values: mp3, wav
language String (optional) Specify language or locale to speak in that language and accent. Example: en, en-IN etc. Check the supported languages by the selected voice before using it in language field.
pronunciation_dict Dictionary (optional) A pronunciation dictionary to pronounce words in a different way. Example: {"SME": "Small and Medium Enterprise"}
response_type String (optional - Default: url) Supported values: url, base64, bytes
curl --location 'https://unmixr.com/api/v1/short-tts/' \
--header 'Authorization: Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e' \
--header 'Content-Type: application/json' \
--data '{
    "text": "Recent political developments have intensified global scrutiny over the Taiwan Strait, as China ramps up military drills near the island, prompting strong responses from the United States and its allies.",
    "voice_id": "1283979c-87a5-44d5-a8de-4082ba20cc5b",
    "language": "en-US",
    "response_type": "url",
    "speaking_volume": 200
}'
import requests
import json

url = "https://unmixr.com/api/v1/short-tts/"

payload = json.dumps({
  "text": "Recent political developments have intensified global scrutiny over the Taiwan Strait, as China ramps up military drills near the island, prompting strong responses from the United States and its allies.",
  "voice_id": "1283979c-87a5-44d5-a8de-4082ba20cc5b",
  "language": "en-US",
  "response_type": "url",
  "speaking_volume": 200
})
headers = {
  'Authorization': 'Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
const myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e");
myHeaders.append("Content-Type", "application/json");

const raw = JSON.stringify({
  "text": "Recent political developments have intensified global scrutiny over the Taiwan Strait, as China ramps up military drills near the island, prompting strong responses from the United States and its allies.",
  "voice_id": "1283979c-87a5-44d5-a8de-4082ba20cc5b",
  "language": "en-US",
  "response_type": "url",
  "speaking_volume": 200
});

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://unmixr.com/api/v1/short-tts/", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

Example Response:

              POST https://unmixr.com/api/v1/short-tts/
{
    "text": "Recent political developments have intensified global scrutiny over the Taiwan Strait, as China ramps up military drills near the island, prompting strong responses from the United States and its allies.",
    "voice_id": "1283979c-87a5-44d5-a8de-4082ba20cc5b",
    "language": "en-US",
    "response_type": "url",
    "speaking_volume": 200
}
Output:
{
    "success": true,
    "code": 200,
    "duration": 12.024,
    "credit_usage": {
        "prebuilt": 204,
        "voice_cloning": 0
    },
    "audio_url": "https://unmixr.s3.amazonaws.com/a/e8c5b838-f78f-4f5c-b597-5070248db3a4.mp3"
}
          

Create Voice Cloning

POST https://unmixr.com/api/v1/clone-voice/

Request Headers

Field Description
Authorization The API Key in the format: Bearer <YOUR API KEY>
Content-Type application/json

Request Fields

Field Type Description
audio Bytes (Required) The audio bytes for which you want to create clone. Max size: 120MB, Between 30 and 80 seconds.
name String (Required) Name of the new cloned voice.
description String (optional) Description of the cloned voice.
curl --location 'https://unmixr.com/api/v1/clone-voice/' \
--header 'Authorization: Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e' \
--form 'audio=@"/file_path/speech3.mp3"' \
--form 'name="Jack Sparrow"' \
--form 'description="The clone of Jack Sparrow voice"'
import requests

url = "https://unmixr.com/api/v1/clone-voice/"

payload = {'name': 'Jack Sparrow',
'description': 'The clone of Jack Sparrow voice'}
files=[
  ('audio',('speech3.mp3',open('/file_path/speech3.mp3','rb'),'audio/mpeg'))
]
headers = {
  'Authorization': 'Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e'
}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)
const myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e");

const formdata = new FormData();
formdata.append("audio", fileInput.files[0], "/file_path/speech3.mp3");
formdata.append("name", "Jack Sparrow");
formdata.append("description", "The clone of Jack Sparrow voice");

const requestOptions = {
  method: "POST",
  headers: myHeaders,
  body: formdata,
  redirect: "follow"
};

fetch("https://unmixr.com/api/v1/clone-voice/", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

Example Response:

              POST https://unmixr.com/api/v1/clone-voice/
payload = {'name': 'Jack Sparrow',
'description': 'The clone of Jack Sparrow voice'}
files=[
  ('audio',('speech3.mp3',open('/D:/WSL/Projects/SVE/test/speech3.mp3','rb'),'audio/mpeg'))
]
Output:
{
    "status": "SUCCESS",
    "voice_id": "b8c9a2e7-3159-4e39-a5d1-c87b9a229eb4",
    "code": 200
}
          

Cloned Voice List

GET https://unmixr.com/api/v1/cloned-voice-list/

Request Headers

Field Description
Authorization The API Key in the format: Bearer <YOUR API KEY>
Content-Type application/json

QUERY PARAMETERS

Field Type Description
q String (optional) search query to find voice by name.
page_size Integer (optional - default: 12) Returns number of items in a page specified in page_size param
fields String (optional) Comma seperated fields to return in the API response. See the Response Fields section below.
curl --location 'https://unmixr.com/api/v1/cloned-voice-list/?page_size=2' \
--header 'Authorization: Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e' \
--header 'Content-Type: application/json' \
--data ''
import requests
import json

url = "https://unmixr.com/api/v1/cloned-voice-list/?page_size=2"

payload = ""
headers = {
  'Authorization': 'Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e',
  'Content-Type': 'application/json'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
const myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e");
myHeaders.append("Content-Type", "application/json");

const raw = "";

const requestOptions = {
  method: "GET",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://unmixr.com/api/v1/cloned-voice-list/?page_size=2", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

Example Response:

                  
    Get https://unmixr.com/api/v1/cloned-voice-list/?page_size=2
    Output:
    {
        "count": 9,
        "results": [
            {
                "uuid": "7dfd1b64-9841-4229-89dc-65383bb35571",
                "character": "Test-Cloned",
                "gender": "",
                "language": "en",
                "quality": "",
                "sample_voice_url": "https://resource.unmixr.com/voiceprofile/7b1479af-6672-4426-a92f-c5313b7955e4-Test-Cloned.wav",
                "emotions": [],
                "capabilities": [],
                "roles": [],
                "use_cases": [],
                "other_languages": [
                    "en",
                    "zh",
                    "de",
                    "ja",
                    "fr",
                    "es",
                    "ko",
                    "ar",
                    "ru",
                    "nl",
                    "it",
                    "pl",
                    "pt"
                ],
                "supported_locales": {},
                "is_available": true,
                "date_created": "2024-11-09T16:34:44.843450Z",
                "is_multilingual": true,
                "wpm": null,
                "is_new": true,
                "description": "This is test cloned voice",
                "age": null,
                "personality": [],
                "avatar_url": null
            }
        ],
        "current_page": 1,
        "page_start": 1,
        "page_end": 1,
        "next_page": 2,
        "prev_page": null,
        "total_page": 9
    }
              

Response Fields

You can specify which fields should be in API response. To specify use `fields`. See example below:

https://unmixr.com/api/v1/cloned-voice-list/?fields=uuid,character,language
https://unmixr.com/api/v1/cloned-voice-list/?fields=uuid,character,gender,capabilities

API Credit Balance

GET https://unmixr.com/api/v1/credit-balance/

Request Headers

Field Description
Authorization The API Key in the format: Bearer <YOUR API KEY>
Content-Type application/json
curl --location 'https://unmixr.com/api/v1/credit-balance/' \
--header 'Authorization: Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e' \
--header 'Content-Type: application/json' \
--data ''
import requests
import json

url = "https://unmixr.com/api/v1/credit-balance/"

payload = ""
headers = {
  'Authorization': 'Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e',
  'Content-Type': 'application/json'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
const myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer 7f3d5c8e-91a2-4c1b-9f5b-3d66fc823b8e");
myHeaders.append("Content-Type", "application/json");

const raw = "";

const requestOptions = {
  method: "GET",
  headers: myHeaders,
  body: raw,
  redirect: "follow"
};

fetch("https://unmixr.com/api/v1/credit-balance/", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

Example Response:

                  
    Get https://unmixr.com/api/v1/credit-balance/
    Output:
    {
        "status": "SUCCESS",
        "code": 200,
        "credits": {
            "prebuilt_chars": 99388,
            "cloned_chars": 0
        }
    }
              

API Logs

API logs can be found at https://app.unmixr.com/api-logs/

API Response Codes

The Unmixr AI API uses the following error codes:

API Endpoint Code Description
All 200 Successful Response
All 404 Not Found
/short-tts/ 400 Invalid response_type. Supported values are: 'url', 'bytes', and 'base64'.
/short-tts/ 401 Input too long. Please limit your input to under 2000 characters.
/short-tts/ 500 Internal Server Error
/short-tts/ 501 Specify OpenAI API key in the header with key `OpenAI-API-Key`
/short-tts/ 502 Input too long. Please limit your input to under 2000 characters.
/short-tts/ 503 Multiple voices are not supported on this endpoint.
/short-tts/ 504 Insufficient API balance (cloned characters) to full-fill the request.
/short-tts/ 505 Insufficient API balance (prebuilt characters) to full-fill the request
/short-tts/ 508 Server Error - Something went wrong
/short-tts/ 509 Audio Generation Failed
/clone-voice/ 400 Audio is required
/clone-voice/ 401 Name is required
/clone-voice/ 402 You've reached the limit
/clone-voice/ 500 Internal Server Error
/clone-voice/ 501 Failed to create clone