ElevenLabs Eleven v4 API, ElevenLabs Music API, ElevenLabs Sound Effects, Dubbing, Voice Changer, Multilingual v2 API: Pricing, Documentation
by ElevenLabs
ElevenLabs is a premium AI platform for ultra-realistic voice synthesis, voice cloning, and music generation with industry-leading naturalness. Through Pixazo's API, developers can generate lifelike speech in multiple languages, clone voices from short audio samples, and create original music tracks. The API powers applications ranging from audiobook narration and podcast production to real-time voice assistants and multilingual content localization with human-quality audio output.

Models Version
Get 10% Cashback on Your First Payment (up to $500)
Add funds and get 10% cashback on your first payment (up to $500).
ElevenLabs Eleven v4 API Documentation
Turn text into lifelike, expressive speech with Eleven v4, ElevenLabs' most expressive text-to-speech model, in 90+ languages. Direct the delivery with audio tags such as [whispers] or [laughs]. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED. The speech is returned as an MP3 file.
POST https://gateway.pixazo.ai/elevenlabs-eleven-v4-tts/v1/text-to-speechAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Speech - ElevenLabs Eleven v4
Request Code
POST https://gateway.pixazo.ai/elevenlabs-eleven-v4-tts/v1/text-to-speech
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"text": "Welcome to Pixazo. [whispers] This is Eleven v4, the most expressive voice model from ElevenLabs.",
"stability": 0.5
}import requests
url = "https://gateway.pixazo.ai/elevenlabs-eleven-v4-tts/v1/text-to-speech"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"text": "Welcome to Pixazo. [whispers] This is Eleven v4, the most expressive voice model from ElevenLabs.",
"stability": 0.5
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/elevenlabs-eleven-v4-tts/v1/text-to-speech", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"text": "Welcome to Pixazo. [whispers] This is Eleven v4, the most expressive voice model from ElevenLabs.",
"stability": 0.5
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/elevenlabs-eleven-v4-tts/v1/text-to-speech' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"text": "Welcome to Pixazo. [whispers] This is Eleven v4, the most expressive voice model from ElevenLabs.", "stability": 0.5}'Output
{
"request_id": "elevenlabs-eleven-v4-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-eleven-v4-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/elevenlabs-eleven-v4-tts/v1/text-to-speech' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"text": "Welcome to Pixazo. [whispers] This is Eleven v4, the most expressive voice model from ElevenLabs.", "stability": 0.5}'Callback Payload (success)
{
"request_id": "elevenlabs-eleven-v4-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-eleven-v4-tts",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-30T10:04:54.387Z",
"completed_at": "2026-09-30 10:05:14"
}Failure callback shape
{
"request_id": "elevenlabs-eleven-v4-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-eleven-v4-tts",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
text | Yes | string | — | 1–5000 characters | The text to speak. Direct the delivery with audio tags in square brackets, such as [whispers], [laughs] or [excited]. Set a pronunciation with IPA between forward slashes, such as /təˈmɑːtəʊ/. |
voice | No | string | — (the provider's default voice) | An ElevenLabs voice name | The voice to speak with, by name — for example Roger, Sarah, Laura, Charlie, George. |
stability | No | number | 0.5 | 0–1 | Lower values give a more expressive, varied delivery; higher values keep the delivery closer to a steady baseline. |
similarity_boost | No | number | 0.75 | 0–1 | How closely the speech follows the chosen voice. Higher values sound more like the voice but can reduce naturalness. |
language_code | No | string | — (detected from the text) | ISO 639-1 code, e.g. en, es, ja | Forces the language, including how numbers and dates are read. Omit it to let the model detect the language. A code the model does not support is ignored, and the language is detected from the text. |
apply_text_normalization | No | string | auto | auto, on, off | Whether numbers, dates and abbreviations are spelled out before they are spoken. |
seed | No | integer | — | 0–4294967295 | Random seed for best-effort reproducibility. The same seed and text can still sound slightly different. |
output_format | No | string | mp3_44100_128 | mp3_22050_32, mp3_44100_32, mp3_44100_64, mp3_44100_96, mp3_44100_128, mp3_44100_192 | MP3 encoding of the speech, written as codec_sample-rate_bitrate. |
textis the only required field, 1–5000 characters. Spaces, punctuation and audio tags count towards the length; an emoji counts as two characters.- Omit optional fields you do not use — do not send them as
null. - Eleven v4 has two voice settings,
stabilityandsimilarity_boost. There is no style, speed or speaker-boost setting, and SSML tags such as<break>are not supported — use audio tags such as[pause]instead. timestamps(per-character timing) is not available on this endpoint. A request withtimestamps: trueis rejected.- ElevenLabs keeps improving Eleven v4 after launch, so the same text can sound slightly different over time.
Example Request
{
"text": "Welcome to Pixazo. [whispers] This is Eleven v4, the most expressive voice model from ElevenLabs.",
"stability": 0.5
}Example Response
{
"request_id": "elevenlabs-eleven-v4-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-eleven-v4-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid parameters — a required field is missing, a value has the wrong type or is out of range, or the text is too long. Rejected before any hold is placed on your balance. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Most parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. A few are only known once the provider has the request; they are reported through the status endpoint as status: "ERROR", with a message in error saying what to fix. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty text | synchronous 400 |
text longer than 5000 characters | synchronous 400 |
stability or similarity_boost not a number in 0–1, or seed not an integer in 0–4294967295 | synchronous 400 |
language_code longer than 3 characters (for example "auto"), or apply_text_normalization or output_format not one of the allowed values | synchronous 400 |
timestamps: true | synchronous 400 |
A voice name the provider does not recognise | status: "ERROR" |
| Text refused by the provider's content policy | status: "ERROR" |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the speech from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
curl 'https://gateway.pixazo.ai/v2/requests/status/elevenlabs-eleven-v4-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "elevenlabs-eleven-v4-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-eleven-v4-tts",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-30T10:04:54.387Z",
"completed_at": "2026-09-30 10:05:14"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — elevenlabs-eleven-v4-tts for this endpoint. |
| output.media_url | array of strings | URL of the speech, as an MP3 file. |
| output.media_type | string | audio/mpeg. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
How billing is measured
Billing is measured on the length of the text you submit: every started block of 1,000 characters — spaces, punctuation and audio tags included — is one billing unit, so a short request bills one block. The amount is placed as a hold when the request is submitted and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
ElevenLabs Eleven v4 API Pricing
ElevenLabs Eleven v4 Turbo API Documentation
Turn text into expressive speech with Eleven v4 Turbo, the faster variant of ElevenLabs Eleven v4, in 90+ languages. It keeps v4's audio tags such as [whispers] or [laughs] and trades a little audio quality for speed. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED. The speech is returned as an MP3 file.
POST https://gateway.pixazo.ai/elevenlabs-eleven-v4-turbo-tts/v1/text-to-speechAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Speech - ElevenLabs Eleven v4 Turbo
Request Code
POST https://gateway.pixazo.ai/elevenlabs-eleven-v4-turbo-tts/v1/text-to-speech
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"text": "Thanks for calling Pixazo. [warmly] How can I help you today?",
"stability": 0.5
}import requests
url = "https://gateway.pixazo.ai/elevenlabs-eleven-v4-turbo-tts/v1/text-to-speech"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"text": "Thanks for calling Pixazo. [warmly] How can I help you today?",
"stability": 0.5
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/elevenlabs-eleven-v4-turbo-tts/v1/text-to-speech", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"text": "Thanks for calling Pixazo. [warmly] How can I help you today?",
"stability": 0.5
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/elevenlabs-eleven-v4-turbo-tts/v1/text-to-speech' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"text": "Thanks for calling Pixazo. [warmly] How can I help you today?", "stability": 0.5}'Output
{
"request_id": "elevenlabs-eleven-v4-turbo-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-eleven-v4-turbo-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/elevenlabs-eleven-v4-turbo-tts/v1/text-to-speech' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"text": "Thanks for calling Pixazo. [warmly] How can I help you today?", "stability": 0.5}'Callback Payload (success)
{
"request_id": "elevenlabs-eleven-v4-turbo-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-eleven-v4-turbo-tts",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-30T10:04:54.387Z",
"completed_at": "2026-09-30 10:05:14"
}Failure callback shape
{
"request_id": "elevenlabs-eleven-v4-turbo-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-eleven-v4-turbo-tts",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
text | Yes | string | — | 1–5000 characters | The text to speak. Direct the delivery with audio tags in square brackets, such as [whispers], [laughs] or [excited]. |
voice | No | string | — (the provider's default voice) | An ElevenLabs voice name | The voice to speak with, by name — for example Roger, Sarah, Laura, Charlie, George. |
stability | No | number | 0.5 | 0–1 | Lower values give a more expressive, varied delivery; higher values keep the delivery closer to a steady baseline. |
similarity_boost | No | number | 0.75 | 0–1 | How closely the speech follows the chosen voice. Higher values sound more like the voice but can reduce naturalness. |
language_code | No | string | — (detected from the text) | ISO 639-1 code, e.g. en, es, ja | Forces the language, including how numbers and dates are read. Omit it to let the model detect the language. A code the model does not support is ignored, and the language is detected from the text. |
apply_text_normalization | No | string | auto | auto, on, off | Whether numbers, dates and abbreviations are spelled out before they are spoken. |
seed | No | integer | — | 0–4294967295 | Random seed for best-effort reproducibility. The same seed and text can still sound slightly different. |
output_format | No | string | mp3_44100_128 | mp3_22050_32, mp3_44100_32, mp3_44100_64, mp3_44100_96, mp3_44100_128, mp3_44100_192 | MP3 encoding of the speech, written as codec_sample-rate_bitrate. |
textis the only required field, 1–5000 characters. Spaces, punctuation and audio tags count towards the length; an emoji counts as two characters.- Omit optional fields you do not use — do not send them as
null. - Eleven v4 Turbo has two voice settings,
stabilityandsimilarity_boost. There is no style, speed or speaker-boost setting, and SSML tags such as<break>are not supported — use audio tags such as[pause]instead. timestamps(per-character timing) is not available on this endpoint. A request withtimestamps: trueis rejected.- ElevenLabs keeps improving Eleven v4 after launch, so the same text can sound slightly different over time.
Example Request
{
"text": "Thanks for calling Pixazo. [warmly] How can I help you today?",
"stability": 0.5
}Example Response
{
"request_id": "elevenlabs-eleven-v4-turbo-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-eleven-v4-turbo-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid parameters — a required field is missing, a value has the wrong type or is out of range, or the text is too long. Rejected before any hold is placed on your balance. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Most parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. A few are only known once the provider has the request; they are reported through the status endpoint as status: "ERROR", with a message in error saying what to fix. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty text | synchronous 400 |
text longer than 5000 characters | synchronous 400 |
stability or similarity_boost not a number in 0–1, or seed not an integer in 0–4294967295 | synchronous 400 |
language_code longer than 3 characters (for example "auto"), or apply_text_normalization or output_format not one of the allowed values | synchronous 400 |
timestamps: true | synchronous 400 |
A voice name the provider does not recognise | status: "ERROR" |
| Text refused by the provider's content policy | status: "ERROR" |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the speech from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
curl 'https://gateway.pixazo.ai/v2/requests/status/elevenlabs-eleven-v4-turbo-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "elevenlabs-eleven-v4-turbo-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-eleven-v4-turbo-tts",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-30T10:04:54.387Z",
"completed_at": "2026-09-30 10:05:14"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — elevenlabs-eleven-v4-turbo-tts for this endpoint. |
| output.media_url | array of strings | URL of the speech, as an MP3 file. |
| output.media_type | string | audio/mpeg. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
How billing is measured
Billing is measured on the length of the text you submit: every started block of 1,000 characters — spaces, punctuation and audio tags included — is one billing unit, so a short request bills one block. The amount is placed as a hold when the request is submitted and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
ElevenLabs Eleven v4 Turbo API Pricing
ElevenLabs Music v2.5 API Documentation
Generate an original, studio-quality music track from a text prompt or a section-by-section composition plan, with or without vocals, up to 10 minutes long. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED. The track is returned as an MP3 file.
POST https://gateway.pixazo.ai/elevenlabs-music/v2.5/text-to-musicAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Music - ElevenLabs Music v2.5
Request Code
POST https://gateway.pixazo.ai/elevenlabs-music/v2.5/text-to-music
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove",
"music_length_ms": 30000
}import requests
url = "https://gateway.pixazo.ai/elevenlabs-music/v2.5/text-to-music"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove",
"music_length_ms": 30000
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/elevenlabs-music/v2.5/text-to-music", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove",
"music_length_ms": 30000
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/elevenlabs-music/v2.5/text-to-music' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove", "music_length_ms": 30000}'Output
{
"request_id": "elevenlabs-music-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-music-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/elevenlabs-music/v2.5/text-to-music' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove", "music_length_ms": 30000}'Callback Payload (success)
{
"request_id": "elevenlabs-music-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-music-v2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-15T10:40:08.748Z",
"completed_at": "2026-09-15 10:40:36"
}Failure callback shape
{
"request_id": "elevenlabs-music-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-music-v2-5",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes, unless composition_plan is given | string | — | 1–4100 characters | A text description of the music to generate: genre, mood, instrumentation, tempo, and whether it has vocals. Cannot be combined with composition_plan. |
music_length_ms | No | integer | — (chosen by the model) | 3000–600000 | Length of the track in milliseconds, from 3 seconds to 10 minutes. Only valid with prompt. Set this. Without it the length is not known when the request is submitted, so the hold placed on your balance covers the 10-minute maximum until the real length is measured. |
force_instrumental | No | boolean | false | true, false | When true, guarantees the track has no vocals. When false, the prompt decides. Only valid with prompt. |
composition_plan | Yes, unless prompt is given | object | — | chunks: 1–30 entries | A section-by-section plan of the track, as an alternative to prompt. Uses the v2 chunks shape — the v1 sections shape is not accepted. See Composition plans below. |
seed | No | integer | — | 0–2147483647 | Random seed. Repeating a request with the same seed and parameters gives more consistent results, but exact reproducibility is not guaranteed. ElevenLabs documents seed as not usable in conjunction with prompt — use it on composition_plan requests. |
Prompt or composition plan
- Send exactly one of
promptorcomposition_plan. Sending both, or neither, fails the request. music_length_msandforce_instrumentalapply topromptonly. With a composition plan, the length is the sum of the chunk durations.- The model is fixed by the URL. Do not send a
model_idin the body — it is rejected. To use a different version, call its URL. - The track is at most 10 minutes long and is returned as an MP3.
Composition plans
A composition plan describes the track as an ordered list of chunks, each with its own lyrics, length and style. Use it when you need control over structure — an intro, verses, a chorus — rather than leaving the arrangement to the model.
| Chunk field | Required | Type | Description |
|---|---|---|---|
text | Yes | string | The lyrics or content of this section. May start with a section name in square brackets, e.g. [Verse 1], followed by lyric lines. |
duration_ms | Yes | integer | Length of this section, 3000–120000 ms. All chunks together must total 3000–600000 ms. |
positive_styles | Yes | array of strings | Styles and musical directions to include, e.g. ["synthwave", "analog drum machine"]. The first chunk's styles set the overall tone. Must not be empty. |
negative_styles | No | array of strings | Styles to keep out of this section. Leaving it empty is a good default. |
Example
{
"composition_plan": {
"chunks": [
{
"text": "[Intro]",
"duration_ms": 8000,
"positive_styles": [
"cinematic",
"soft strings",
"slow build"
]
},
{
"text": "[Verse 1]\nNeon rain on empty streets\nI keep walking to the beat",
"duration_ms": 20000,
"positive_styles": [
"synthwave",
"analog drum machine",
"male vocals"
],
"negative_styles": [
"distorted guitar"
]
}
]
}
}Migrating from ElevenLabs Music v1
The v1 composition plan used a sections array. This version uses chunks, and the two shapes are not interchangeable: a plan written for v1 fails here, and a plan written for this version fails on v1. Prompt-only requests work the same way on both.
Example Request
{
"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove",
"music_length_ms": 30000
}Example Response
{
"request_id": "elevenlabs-music-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-music-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid parameters — a required field is missing, or a value has the wrong type or is out of range. Rejected before any hold is placed on your balance. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Most parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. A few checks need the whole composition plan to be read, so they run after the request is accepted and are reported through the status endpoint as status: "ERROR", with a message in error saying what to fix. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Neither prompt nor composition_plan provided, or a blank prompt | synchronous 400 |
prompt longer than 4100 characters | synchronous 400 |
music_length_ms not an integer, or outside 3000–600000 | synchronous 400 |
force_instrumental not a boolean, or seed not an integer in 0–4294967295 | synchronous 400 |
Both prompt and composition_plan, or music_length_ms / force_instrumental sent with a composition plan | status: "ERROR" |
A composition plan using v1 sections instead of chunks | status: "ERROR" |
A chunk missing text, duration_ms or positive_styles, or chunks totalling more than 10 minutes | status: "ERROR" |
A model_id in the body | status: "ERROR" |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR), then download the track from output.media_url.
curl 'https://gateway.pixazo.ai/v2/requests/status/elevenlabs-music-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "elevenlabs-music-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-music-v2-5",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-15T10:40:08.748Z",
"completed_at": "2026-09-15 10:40:36"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request — elevenlabs-music-v2-5 for this endpoint. |
| output.media_url | array of strings | URL of the generated MP3 track. |
| output.media_type | string | audio/mpeg. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is FAILED/ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
How billing is measured
Billing is measured on the length of the generated track, rounded up to the next whole minute — not on how long generation takes. A hold is placed when the request is submitted, sized from music_length_ms or from the chunk durations of a composition plan; if neither is given, the hold covers the 10-minute maximum. The hold is reduced to the real cost once the finished track has been measured, and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
ElevenLabs Music v2.5 API Pricing
ElevenLabs Music v2 API Documentation
Generate an original, studio-quality music track from a text prompt or a section-by-section composition plan, with or without vocals, up to 10 minutes long. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED. The track is returned as an MP3 file.
POST https://gateway.pixazo.ai/elevenlabs-music/v2/text-to-musicAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Music - ElevenLabs Music v2
Request Code
POST https://gateway.pixazo.ai/elevenlabs-music/v2/text-to-music
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove",
"music_length_ms": 30000
}import requests
url = "https://gateway.pixazo.ai/elevenlabs-music/v2/text-to-music"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove",
"music_length_ms": 30000
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/elevenlabs-music/v2/text-to-music", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove",
"music_length_ms": 30000
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/elevenlabs-music/v2/text-to-music' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove", "music_length_ms": 30000}'Output
{
"request_id": "elevenlabs-music-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-music-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/elevenlabs-music/v2/text-to-music' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove", "music_length_ms": 30000}'Callback Payload (success)
{
"request_id": "elevenlabs-music-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-music-v2",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-15T10:40:08.748Z",
"completed_at": "2026-09-15 10:40:36"
}Failure callback shape
{
"request_id": "elevenlabs-music-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-music-v2",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes, unless composition_plan is given | string | — | 1–4100 characters | A text description of the music to generate: genre, mood, instrumentation, tempo, and whether it has vocals. Cannot be combined with composition_plan. |
music_length_ms | No | integer | — (chosen by the model) | 3000–600000 | Length of the track in milliseconds, from 3 seconds to 10 minutes. Only valid with prompt. Set this. Without it the length is not known when the request is submitted, so the hold placed on your balance covers the 10-minute maximum until the real length is measured. |
force_instrumental | No | boolean | false | true, false | When true, guarantees the track has no vocals. When false, the prompt decides. Only valid with prompt. |
composition_plan | Yes, unless prompt is given | object | — | chunks: 1–30 entries | A section-by-section plan of the track, as an alternative to prompt. Uses the v2 chunks shape — the v1 sections shape is not accepted. See Composition plans below. |
seed | No | integer | — | 0–2147483647 | Random seed. Repeating a request with the same seed and parameters gives more consistent results, but exact reproducibility is not guaranteed. ElevenLabs documents seed as not usable in conjunction with prompt — use it on composition_plan requests. |
Prompt or composition plan
- Send exactly one of
promptorcomposition_plan. Sending both, or neither, fails the request. music_length_msandforce_instrumentalapply topromptonly. With a composition plan, the length is the sum of the chunk durations.- The model is fixed by the URL. Do not send a
model_idin the body — it is rejected. To use a different version, call its URL. - The track is at most 10 minutes long and is returned as an MP3.
Composition plans
A composition plan describes the track as an ordered list of chunks, each with its own lyrics, length and style. Use it when you need control over structure — an intro, verses, a chorus — rather than leaving the arrangement to the model.
| Chunk field | Required | Type | Description |
|---|---|---|---|
text | Yes | string | The lyrics or content of this section. May start with a section name in square brackets, e.g. [Verse 1], followed by lyric lines. |
duration_ms | Yes | integer | Length of this section, 3000–120000 ms. All chunks together must total 3000–600000 ms. |
positive_styles | Yes | array of strings | Styles and musical directions to include, e.g. ["synthwave", "analog drum machine"]. The first chunk's styles set the overall tone. Must not be empty. |
negative_styles | No | array of strings | Styles to keep out of this section. Leaving it empty is a good default. |
Example
{
"composition_plan": {
"chunks": [
{
"text": "[Intro]",
"duration_ms": 8000,
"positive_styles": [
"cinematic",
"soft strings",
"slow build"
]
},
{
"text": "[Verse 1]\nNeon rain on empty streets\nI keep walking to the beat",
"duration_ms": 20000,
"positive_styles": [
"synthwave",
"analog drum machine",
"male vocals"
],
"negative_styles": [
"distorted guitar"
]
}
]
}
}Migrating from ElevenLabs Music v1
The v1 composition plan used a sections array. This version uses chunks, and the two shapes are not interchangeable: a plan written for v1 fails here, and a plan written for this version fails on v1. Prompt-only requests work the same way on both.
Example Request
{
"prompt": "Upbeat lofi hip hop with warm piano chords and a relaxed drum groove",
"music_length_ms": 30000
}Example Response
{
"request_id": "elevenlabs-music-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-music-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid parameters — a required field is missing, or a value has the wrong type or is out of range. Rejected before any hold is placed on your balance. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Most parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. A few checks need the whole composition plan to be read, so they run after the request is accepted and are reported through the status endpoint as status: "ERROR", with a message in error saying what to fix. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Neither prompt nor composition_plan provided, or a blank prompt | synchronous 400 |
prompt longer than 4100 characters | synchronous 400 |
music_length_ms not an integer, or outside 3000–600000 | synchronous 400 |
force_instrumental not a boolean, or seed not an integer in 0–4294967295 | synchronous 400 |
Both prompt and composition_plan, or music_length_ms / force_instrumental sent with a composition plan | status: "ERROR" |
A composition plan using v1 sections instead of chunks | status: "ERROR" |
A chunk missing text, duration_ms or positive_styles, or chunks totalling more than 10 minutes | status: "ERROR" |
A model_id in the body | status: "ERROR" |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR), then download the track from output.media_url.
curl 'https://gateway.pixazo.ai/v2/requests/status/elevenlabs-music-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "elevenlabs-music-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-music-v2",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-15T10:40:08.748Z",
"completed_at": "2026-09-15 10:40:36"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request — elevenlabs-music-v2 for this endpoint. |
| output.media_url | array of strings | URL of the generated MP3 track. |
| output.media_type | string | audio/mpeg. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is FAILED/ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
How billing is measured
Billing is measured on the length of the generated track, rounded up to the next whole minute — not on how long generation takes. A hold is placed when the request is submitted, sized from music_length_ms or from the chunk durations of a composition plan; if neither is given, the hold covers the 10-minute maximum. The hold is reduced to the real cost once the finished track has been measured, and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
ElevenLabs Music v2 API Pricing
ElevenLabs Video to Music API Documentation
Generate an original music track to accompany a video, guided by an optional description and style tags. Uses ElevenLabs Music v2.5. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED. The track is returned as an MP3 file.
POST https://gateway.pixazo.ai/elevenlabs-video-to-music/v1/video-to-musicAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Video to Music - ElevenLabs Video to Music
Request Code
POST https://gateway.pixazo.ai/elevenlabs-video-to-music/v1/video-to-music
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"description": "Warm, hopeful acoustic score that builds gently",
"tags": [
"cinematic",
"acoustic"
]
}import requests
url = "https://gateway.pixazo.ai/elevenlabs-video-to-music/v1/video-to-music"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"description": "Warm, hopeful acoustic score that builds gently",
"tags": [
"cinematic",
"acoustic"
]
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/elevenlabs-video-to-music/v1/video-to-music", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"description": "Warm, hopeful acoustic score that builds gently",
"tags": [
"cinematic",
"acoustic"
]
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/elevenlabs-video-to-music/v1/video-to-music' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4", "description": "Warm, hopeful acoustic score that builds gently", "tags": ["cinematic", "acoustic"]}'Output
{
"request_id": "elevenlabs-video-to-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-video-to-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/elevenlabs-video-to-music/v1/video-to-music' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4", "description": "Warm, hopeful acoustic score that builds gently", "tags": ["cinematic", "acoustic"]}'Callback Payload (success)
{
"request_id": "elevenlabs-video-to-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-video-to-music",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-15T10:40:08.748Z",
"completed_at": "2026-09-15 10:40:36"
}Failure callback shape
{
"request_id": "elevenlabs-video-to-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-video-to-music",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
video_url | Yes, unless video_urls is given | string | — | Public http(s) URL to an MP4 or MOV video | The video to write music for. Cannot be combined with video_urls. |
video_urls | Yes, unless video_url is given | array of strings | — | 1–10 URLs to MP4 or MOV videos | Several videos, combined in the order given and scored as one track. Cannot be combined with video_url. |
description | No | string | — | Up to 1000 characters | A description of the music you want: mood, genre, instruments, how it develops. |
tags | No | array of strings | — | Up to 10 tags, each up to 100 characters | Style tags, for example ["upbeat", "cinematic"]. |
- Send exactly one of
video_urlorvideo_urls. - Videos must be MP4 or MOV, at most 600 seconds (10 minutes) and 32 MB in total, at public http(s) URLs that stay reachable until the request has been processed.
- This endpoint always uses ElevenLabs Music v2.5. Do not send a
model_idin the body — it is rejected.
Input videos
- The videos are downloaded when the request is processed, so the URLs must stay reachable until then.
- Several videos in
video_urlsare combined in the order given, and one track is generated for the combined video. - The length of MP4 and MOV videos is read when you submit, so videos over 600 seconds in total are rejected straight away and the hold placed on your balance matches the videos. If the length of a single
video_urlcannot be read, the hold covers the 10-minute maximum until the track has been measured.
Example Request
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"description": "Warm, hopeful acoustic score that builds gently",
"tags": [
"cinematic",
"acoustic"
]
}Example Response
{
"request_id": "elevenlabs-video-to-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-video-to-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid parameters — a required field is missing, a value has the wrong type or is out of range, or an input is too long. Rejected before any hold is placed on your balance. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Most parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. A few checks run after the request is accepted and are reported through the status endpoint as status: "ERROR", with a message in error saying what to fix. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Neither video_url nor video_urls provided | synchronous 400 |
video_urls not an array of 1–10 entries | synchronous 400 |
A video_urls entry that cannot be read as an MP4 or MOV video, including one that cannot be downloaded | synchronous 400 |
| Videos longer than 600 seconds in total, when their length can be read on submit | synchronous 400 (Input too long) |
description longer than 1000 characters, or tags not an array of at most 10 | synchronous 400 |
Both video_url and video_urls | status: "ERROR" |
video_url not a public http(s) URL, not downloadable or empty; or videos larger than 32 MB in total | status: "ERROR" |
A tags entry that is empty or longer than 100 characters | status: "ERROR" |
A model_id in the body | status: "ERROR" |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR), then download the track from output.media_url.
curl 'https://gateway.pixazo.ai/v2/requests/status/elevenlabs-video-to-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "elevenlabs-video-to-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-video-to-music",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-15T10:40:08.748Z",
"completed_at": "2026-09-15 10:40:36"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request — elevenlabs-video-to-music for this endpoint. |
| output.media_url | array of strings | URL of the track, as an MP3 file. |
| output.media_type | string | audio/mpeg. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is FAILED/ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
How billing is measured
Billing is measured on the length of the generated track, rounded up to the next whole minute — not on how long generation takes. A hold sized from the combined length of the videos is placed when the request is submitted; if the length of a single video_url cannot be read, the hold covers the 10-minute maximum. The hold is reduced to the real cost once the track has been measured, and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
ElevenLabs Video to Music API Pricing
ElevenLabs Sound Effects v2 API Documentation
Generate a sound effect from a text description — an impact, an ambience, foley, an interface sound — up to 30 seconds long, optionally looping smoothly. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED. The sound effect is returned as an MP3 file.
POST https://gateway.pixazo.ai/elevenlabs-sound-effects/v1/text-to-sound-effectsAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Sound Effects - ElevenLabs Sound Effects v2
Request Code
POST https://gateway.pixazo.ai/elevenlabs-sound-effects/v1/text-to-sound-effects
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"text": "Heavy wooden door creaking open slowly in a large empty hall",
"duration_seconds": 5
}import requests
url = "https://gateway.pixazo.ai/elevenlabs-sound-effects/v1/text-to-sound-effects"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"text": "Heavy wooden door creaking open slowly in a large empty hall",
"duration_seconds": 5
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/elevenlabs-sound-effects/v1/text-to-sound-effects", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"text": "Heavy wooden door creaking open slowly in a large empty hall",
"duration_seconds": 5
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/elevenlabs-sound-effects/v1/text-to-sound-effects' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"text": "Heavy wooden door creaking open slowly in a large empty hall", "duration_seconds": 5}'Output
{
"request_id": "elevenlabs-sound-effects_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-sound-effects_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/elevenlabs-sound-effects/v1/text-to-sound-effects' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"text": "Heavy wooden door creaking open slowly in a large empty hall", "duration_seconds": 5}'Callback Payload (success)
{
"request_id": "elevenlabs-sound-effects_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-sound-effects",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-15T10:40:08.748Z",
"completed_at": "2026-09-15 10:40:36"
}Failure callback shape
{
"request_id": "elevenlabs-sound-effects_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-sound-effects",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
text | Yes | string | — | 1–1000 characters | A description of the sound effect to generate: what makes the sound, where it happens and how it changes over time. |
duration_seconds | No | number | — (chosen by the model) | 0.5–30 | Length of the sound effect in seconds. Omit it to let the model choose a length that suits the description. |
loop | No | boolean | false | true, false | When true, generates a sound effect that loops smoothly, for ambiences and backgrounds that repeat. |
prompt_influence | No | number | 0.3 | 0–1 | How closely the result follows the description. Higher values follow the text more closely and vary less between generations; lower values leave the model more room to interpret it. |
textis the only required field. The sound effect is at most 30 seconds long.- The model is fixed by the URL. Do not send a
model_idin the body — it is rejected.
Example Request
{
"text": "Heavy wooden door creaking open slowly in a large empty hall",
"duration_seconds": 5
}Example Response
{
"request_id": "elevenlabs-sound-effects_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-sound-effects_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid parameters — a required field is missing, a value has the wrong type or is out of range, or an input is too long. Rejected before any hold is placed on your balance. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Most parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. A few checks run after the request is accepted and are reported through the status endpoint as status: "ERROR", with a message in error saying what to fix. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty text | synchronous 400 |
text longer than 1000 characters | synchronous 400 |
duration_seconds not a number, or outside 0.5–30 | synchronous 400 |
loop not a boolean, or prompt_influence not a number in 0–1 | synchronous 400 |
A model_id in the body | status: "ERROR" |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR), then download the sound effect from output.media_url.
curl 'https://gateway.pixazo.ai/v2/requests/status/elevenlabs-sound-effects_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "elevenlabs-sound-effects_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-sound-effects",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-15T10:40:08.748Z",
"completed_at": "2026-09-15 10:40:36"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request — elevenlabs-sound-effects for this endpoint. |
| output.media_url | array of strings | URL of the sound effect, as an MP3 file. |
| output.media_type | string | audio/mpeg. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is FAILED/ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
How billing is measured
Billing is measured on the length of the generated sound effect, in seconds — not on how long generation takes. A hold covering the 30-second maximum is placed when the request is submitted; it is reduced to the real cost once the sound effect has been measured, and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
ElevenLabs Sound Effects v2 API Pricing
ElevenLabs Music API Documentation
https://gateway.pixazo.ai/elevenlabs-music/v1/elevenlabs-music-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
ElevenLabs Music generate request
Request Code
POST https://gateway.pixazo.ai/elevenlabs-music/v1/elevenlabs-music-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"prompt": "Uplifting indie folk track with acoustic guitar, soft piano, and warm harmonies",
"music_length_ms": 30000,
"force_instrumental": false,
"respect_sections_durations": true,
"output_format": "mp3_44100_128"
}
import requests
url = "https://gateway.pixazo.ai/elevenlabs-music/v1/elevenlabs-music-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
data = {
"prompt": "Uplifting indie folk track with acoustic guitar, soft piano, and warm harmonies",
"music_length_ms": 30000,
"force_instrumental": false,
"respect_sections_durations": true,
"output_format": "mp3_44100_128"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/elevenlabs-music/v1/elevenlabs-music-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
};
const data = {
"prompt": "Uplifting indie folk track with acoustic guitar, soft piano, and warm harmonies",
"music_length_ms": 30000,
"force_instrumental": false,
"respect_sections_durations": true,
"output_format": "mp3_44100_128"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data));
curl -X POST "https://gateway.pixazo.ai/elevenlabs-music/v1/elevenlabs-music-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
--data-raw '{
"prompt": "Uplifting indie folk track with acoustic guitar, soft piano, and warm harmonies",
"music_length_ms": 30000,
"force_instrumental": false,
"respect_sections_durations": true,
"output_format": "mp3_44100_128"
}'
Output
{
"request_id": "elevenlabs-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your generate request to receive a POST callback instead of polling.
X-Webhook-URL: https://your-server.com/webhook/callback
Request Parameters - ElevenLabs Music generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes, unless composition_plan is given | string | — | 1–4100 characters | A text description of the music to generate: genre, mood, instrumentation, tempo, and whether it has vocals. Example: “Uplifting indie folk track with acoustic guitar, soft piano, and warm harmonies.” Cannot be combined with composition_plan. |
music_length_ms | No | integer | — (chosen by the model) | 3000–600000 | Length of the track in milliseconds, from 3 seconds to 10 minutes. Only valid with prompt; it is not accepted alongside composition_plan, where the length comes from the section durations. Set this. Without it the length is not known when the request is submitted, so the hold placed on your balance covers the 10-minute maximum until the real length is measured. |
force_instrumental | No | boolean | false | true, false | When true, guarantees the track has no vocals. When false, the prompt decides. Only valid with prompt; it is not accepted alongside composition_plan. |
composition_plan | Yes, unless prompt is given | object | — | sections: 1–30 entries | A section-by-section plan of the track, as an alternative to prompt. Uses the v1 sections shape — the v2 chunks shape is not accepted. Requires positive_global_styles and negative_global_styles (arrays of up to 50 style strings each) plus sections. Every section requires section_name (1–100 characters), positive_local_styles and negative_local_styles (arrays of up to 50 strings each), duration_ms (3000–120000) and lines (up to 30 lyric lines, each at most 200 characters). The section durations must total between 3000 and 600000 ms, and that total is the length of the track. |
respect_sections_durations | No | boolean | true | true, false | Controls how strictly the duration_ms of each section in composition_plan is enforced. When false, the model may adjust individual section durations for better quality and latency while preserving the total length of the plan. Only applies with composition_plan; it has no effect on a prompt-only request. |
seed | No | integer | — | 0–2147483647 | Random seed used to initialize generation. Repeating a request with the same seed and the same parameters gives more consistent results, but exact reproducibility is not guaranteed and outputs may change across model updates. ElevenLabs accepts a seed only with composition_plan, not alongside prompt. |
Example Request
{
"prompt": "Uplifting indie folk track with acoustic guitar, soft piano, and warm harmonies",
"music_length_ms": 30000,
"force_instrumental": false
}
Response
{
"request_id": "elevenlabs-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_API_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'elevenlabs-music' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "elevenlabs-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-music",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/elevenlabs-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "elevenlabs-music_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-music",
"error": null,
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/elevenlabs-music_019dxxxx/output.mp3"],
"media_type": "audio/mpeg"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
ElevenLabs Music API Pricing
ElevenLabs Eleven v3 TTS API Documentation
https://gateway.pixazo.ai/elevenlabs-eleven-v3-tts/v1/elevenlabs-eleven-v3-tts-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
ElevenLabs Eleven v3 TTS generate request
Request Code
POST https://gateway.pixazo.ai/elevenlabs-eleven-v3-tts/v1/elevenlabs-eleven-v3-tts-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_API_KEY
{
"text": "[excited] Welcome to the future of voice. [whispers] Listen closely. [laughs] This is amazing.",
"voice": "Rachel",
"stability": 0.5,
"timestamps": false,
"apply_text_normalization": "auto"
}
import requests
url = "https://gateway.pixazo.ai/elevenlabs-eleven-v3-tts/v1/elevenlabs-eleven-v3-tts-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
}
data = {
"text": "[excited] Welcome to the future of voice. [whispers] Listen closely. [laughs] This is amazing.",
"voice": "Rachel",
"stability": 0.5,
"timestamps": false,
"apply_text_normalization": "auto"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/elevenlabs-eleven-v3-tts/v1/elevenlabs-eleven-v3-tts-request";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY"
};
const data = {
"text": "[excited] Welcome to the future of voice. [whispers] Listen closely. [laughs] This is amazing.",
"voice": "Rachel",
"stability": 0.5,
"timestamps": false,
"apply_text_normalization": "auto"
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data));
curl -X POST "https://gateway.pixazo.ai/elevenlabs-eleven-v3-tts/v1/elevenlabs-eleven-v3-tts-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
--data-raw '{
"text": "[excited] Welcome to the future of voice. [whispers] Listen closely. [laughs] This is amazing.",
"voice": "Rachel",
"stability": 0.5,
"timestamps": false,
"apply_text_normalization": "auto"
}'
Output
{
"request_id": "elevenlabs-eleven-v3-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-eleven-v3-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your generate request to receive a POST callback instead of polling.
X-Webhook-URL: https://your-server.com/webhook/callback
Request Parameters - ElevenLabs Eleven v3 TTS generate request
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| text | Yes | string | — | 1–5000 characters | Text to convert to speech (1–5000 characters). Supports inline emotion tags such as [whispers], [laughs], [excited]. |
| voice | No | string | "Rachel" | ElevenLabs voice name | The voice to use for speech generation. Named voices include: Rachel (the default), Aria, Roger, Sarah, Laura, Charlie, George, Callum, River, Liam, Charlotte, Alice, Matilda, Will, Jessica, Eric, Chris, Brian, Daniel, Lily and Bill. |
| stability | No | float | 0.5 | 0.0–1.0 | Voice stability. Lower values give more expressive, varied speech; higher values keep the voice more consistent across generations. |
| timestamps | No | boolean | false | — | If true, returns an array of per-word timestamps alongside the audio output. |
| language_code | No | string | — | ISO 639-1 code (e.g. "en", "es", "ja") | Language code (ISO 639-1) used to enforce a language for the model. If the model does not support the provided language code, it is ignored. |
| apply_text_normalization | No | enum | "auto" | "auto", "on", "off" | Controls text normalization, such as spelling out numbers. "auto" lets the model decide whether to apply it, "on" always applies it and "off" skips it. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| audio | 1 | MP3, WAV | Reference voice. |
Example Request
{
"text": "[excited] Welcome to the future of voice. [whispers] Listen closely. [laughs] This is amazing.",
"voice": "Rachel",
"stability": 0.5,
"timestamps": false,
"apply_text_normalization": "auto"
}
Response
{
"request_id": "elevenlabs-eleven-v3-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-eleven-v3-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_API_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'elevenlabs-eleven-v3-tts' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "elevenlabs-eleven-v3-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-eleven-v3-tts",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/elevenlabs-eleven-v3-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "elevenlabs-eleven-v3-tts_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-eleven-v3-tts",
"error": null,
"output": {
"media_url": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/elevenlabs-eleven-v3-tts_019dxxxx/output.mp3"],
"media_type": "audio/mpeg"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
ElevenLabs Eleven v3 TTS API Pricing
ElevenLabs Turbo v2.5 API Documentation
Low-latency ElevenLabs generation across 32 languages, at half the price of Multilingual v2 — the better default unless you need maximum fidelity. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the audio.
POST https://gateway.pixazo.ai/elevenlabs-turbo-v2-5/v1/text-to-speechAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Speech - ElevenLabs Turbo v2.5
Request Code
POST https://gateway.pixazo.ai/elevenlabs-turbo-v2-5/v1/text-to-speech
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"text": "Hello from Pixazo. This is a text to speech demo.",
"voice_id": "JBFqnCBsd6RMkjVDRZzb"
}import requests
url = "https://gateway.pixazo.ai/elevenlabs-turbo-v2-5/v1/text-to-speech"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"text": "Hello from Pixazo. This is a text to speech demo.",
"voice_id": "JBFqnCBsd6RMkjVDRZzb"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/elevenlabs-turbo-v2-5/v1/text-to-speech", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"text": "Hello from Pixazo. This is a text to speech demo.",
"voice_id": "JBFqnCBsd6RMkjVDRZzb"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/elevenlabs-turbo-v2-5/v1/text-to-speech' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"text": "Hello from Pixazo. This is a text to speech demo.", "voice_id": "JBFqnCBsd6RMkjVDRZzb"}'Output
{
"request_id": "elevenlabs-turbo-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-turbo-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/elevenlabs-turbo-v2-5/v1/text-to-speech' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"text": "Hello from Pixazo. This is a text to speech demo.", "voice_id": "JBFqnCBsd6RMkjVDRZzb"}'Callback Payload (success)
{
"request_id": "elevenlabs-turbo-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-turbo-v2-5",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-08-01T09:14:16.102Z",
"completed_at": "2026-08-01T09:14:22.870Z"
}Failure callback shape
{
"request_id": "elevenlabs-turbo-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-turbo-v2-5",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
text | Yes | string | — | 1 – 10,000 characters | The text to convert into speech. Billed per 1,000 characters of input text. |
voice_id | Yes | string | — | an ElevenLabs voice ID, up to 128 characters | The ElevenLabs voice to speak with, e.g. JBFqnCBsd6RMkjVDRZzb. Browse voices in the ElevenLabs voice library. |
output_format | No | string | mp3_44100_128 | mp3_22050_32, mp3_24000_48, mp3_44100_32, mp3_44100_64, mp3_44100_96, mp3_44100_128, mp3_44100_192, opus_48000_32, opus_48000_64, opus_48000_96, opus_48000_128, opus_48000_192 | Codec, sample rate and bitrate in one value, written codec_samplerate_bitrate. Only the twelve values listed are accepted. MP3 formats are returned as .mp3, Opus formats as .ogg. |
language_code | No | string | — | an ISO 639-1 code, e.g. en, es, ja | Enforces a language for the model and for text normalization. Omit the field to let the model detect the language from the text — there is no auto-detect sentinel value. A code the model does not support is ignored. |
voice_settings | No | object | — | stability, similarity_boost, style, use_speaker_boost, speed | Per-request overrides for the voice's stored settings. stability 0 – 1 (default 0.5) — lower widens emotional range, higher is more monotone; similarity_boost 0 – 1 (default 0.75) — how closely to adhere to the original voice; style (default 0) exaggerates the speaker's style; use_speaker_boost boolean (default true) raises similarity to the original speaker; speed (default 1.0) — below 1.0 is slower, above 1.0 is faster. |
seed | No | integer | — | 0 – 4294967295 | Best-effort deterministic sampling: repeating a request with the same seed and the same parameters should return the same result. Determinism is not guaranteed. |
previous_text | No | string | — | up to 10,000 characters | The text that comes before this request's text. Improves continuity when you stitch several generations together. |
next_text | No | string | — | up to 10,000 characters | The text that comes after this request's text. Improves continuity when you stitch several generations together. |
apply_text_normalization | No | string | auto | auto, on, off | Controls text normalization, such as spelling out numbers and dates. auto lets the model decide, on always normalizes, off skips it. |
Voices
32 languages. Use any voice id from your ElevenLabs voice library.
Example Request
{
"text": "Hello from Pixazo. This is a text to speech demo.",
"voice_id": "JBFqnCBsd6RMkjVDRZzb"
}Example Response
{
"request_id": "elevenlabs-turbo-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-turbo-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — a missing or out-of-range parameter. The message names the field. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or ERROR), then download output.media_url.
curl 'https://gateway.pixazo.ai/v2/requests/status/elevenlabs-turbo-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "elevenlabs-turbo-v2-5_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-turbo-v2-5",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-08-01T09:14:16.102Z",
"completed_at": "2026-08-01T09:14:22.870Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | array | URL of the generated audio file. |
| output.media_type | string | MIME type of the audio. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Pricing
Billed at $0.05 per 1,000 characters of input text, rounded up to the next whole 1,000. You are charged for the text you submit, not the length of the audio produced.
| Input text | Billed blocks | Cost |
|---|---|---|
| A short sentence (~50 characters) | 1 | $0.05 |
| A paragraph (~800 characters) | 1 | $0.05 |
| A 3,000-character article | 3 | $0.15 |
| 10,000 characters | 10 | $0.5 |
Failed requests are not billed.
ElevenLabs Turbo v2.5 API Pricing
ElevenLabs Voice Changer API Documentation
Convert the voice in a recording into one of ElevenLabs' preset voices, keeping the content and emotional delivery of the original. Works across languages. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED. The converted audio is returned as an MP3 file.
POST https://gateway.pixazo.ai/elevenlabs-voice-changer/v1/speech-to-speechAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Speech to Speech - ElevenLabs Voice Changer
Request Code
POST https://gateway.pixazo.ai/elevenlabs-voice-changer/v1/speech-to-speech
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3",
"voice": "Adam"
}import requests
url = "https://gateway.pixazo.ai/elevenlabs-voice-changer/v1/speech-to-speech"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3",
"voice": "Adam"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/elevenlabs-voice-changer/v1/speech-to-speech", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3",
"voice": "Adam"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/elevenlabs-voice-changer/v1/speech-to-speech' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3", "voice": "Adam"}'Output
{
"request_id": "elevenlabs-voice-changer_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-voice-changer_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/elevenlabs-voice-changer/v1/speech-to-speech' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3", "voice": "Adam"}'Callback Payload (success)
{
"request_id": "elevenlabs-voice-changer_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-voice-changer",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-15T10:40:08.748Z",
"completed_at": "2026-09-15 10:40:36"
}Failure callback shape
{
"request_id": "elevenlabs-voice-changer_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-voice-changer",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
audio_url | Yes | string | — | Public http(s) URL; up to 5 minutes and 32 MB | The recording whose voice is converted. MP3, WAV or M4A is recommended — see Input recording below. |
voice | Yes | string | — | A preset voice name from Voices below | The voice the recording is converted into, by name — for example Adam. Names are case-sensitive: send them exactly as listed. |
remove_background_noise | No | boolean | false | true, false | When true, removes background noise from the recording before its voice is converted. |
seed | No | integer | — | 0–4294967295 | Random seed. Repeating a request with the same seed and parameters gives more consistent results, but exact reproducibility is not guaranteed. |
voice_settings | No | object | — (the voice's own settings) | See Voice settings below | Overrides the chosen voice's settings for this request only. |
audio_urlmust be a public http(s) URL that stays reachable until the request has been processed. The recording is at most 5 minutes long and 32 MB.- The model is fixed by the URL. Do not send a
model_idor avoice_id— both are rejected. Choose the voice by name withvoice.
Voices
Choose one of ElevenLabs' preset voices by sending its name, exactly as written in the Voice column, as voice. Custom, cloned and Voice Library voices are not available.
| Voice | Character |
|---|---|
Adam | Dominant, Firm |
Alice | Clear, Engaging Educator |
Bella | Professional, Bright, Warm |
Bill | Wise, Mature, Balanced |
Brian | Deep, Resonant and Comforting |
Callum | Husky Trickster |
Charlie | Deep, Confident, Energetic |
Chris | Charming, Down-to-Earth |
Daniel | Steady Broadcaster |
Eric | Smooth, Trustworthy |
George | Warm, Captivating Storyteller |
Harry | Fierce Warrior |
Jessica | Playful, Bright, Warm |
Laura | Enthusiast, Quirky Attitude |
Liam | Energetic, Social Media Creator |
Lily | Velvety Actress |
Matilda | Knowledgable, Professional |
River | Relaxed, Neutral, Informative |
Roger | Laid-Back, Casual, Resonant |
Sarah | Mature, Reassuring, Confident |
Will | Relaxed Optimist |
Voice settings
Every field is optional. Send only the ones you want to change for this request.
| Field | Type | Range | Description |
|---|---|---|---|
stability | number | 0–1 | How stable the voice is between generations. Lower values give a broader emotional range; higher values sound steadier but can become monotonous. |
similarity_boost | number | 0–1 | How closely the output adheres to the chosen voice. |
style | number | 0–1 | Style exaggeration: amplifies the voice's speaking style. Any value above 0 can make processing slower. |
use_speaker_boost | boolean | true, false | Boosts similarity to the chosen voice, at a slightly higher processing time. |
{
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3",
"voice": "Adam",
"voice_settings": {
"stability": 0.4,
"similarity_boost": 0.8
}
}Input recording
- The recording is downloaded when the request is processed, so the URL must stay reachable until then.
- It can be at most 5 minutes long and 32 MB.
- MP3, WAV or M4A is recommended. The length of these formats is read when you submit, so a recording over 5 minutes is rejected straight away and the hold placed on your balance matches the recording. For other formats the hold covers the 5-minute maximum until the converted audio has been measured.
Example Request
{
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.mp3",
"voice": "Adam"
}Example Response
{
"request_id": "elevenlabs-voice-changer_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-voice-changer_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid parameters — a required field is missing, a value has the wrong type or is out of range, or an input is too long. Rejected before any hold is placed on your balance. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Most parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. A few checks run after the request is accepted and are reported through the status endpoint as status: "ERROR", with a message in error saying what to fix. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing audio_url or voice | synchronous 400 |
A voice that is not one of the preset voices listed under Voices | synchronous 400 |
remove_background_noise not a boolean, seed not an integer in 0–4294967295, or voice_settings not an object | synchronous 400 |
| A recording longer than 5 minutes whose length can be read on submit (MP3, WAV, M4A) | synchronous 400 (Input too long) |
audio_url not a public http(s) URL, not downloadable, empty, or larger than 32 MB | status: "ERROR" |
A voice_settings field not listed under Voice settings, or a value out of range | status: "ERROR" |
| A recording longer than 5 minutes whose length cannot be read on submit | status: "ERROR" |
A model_id or voice_id in the body | status: "ERROR" |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR), then download the converted audio from output.media_url.
curl 'https://gateway.pixazo.ai/v2/requests/status/elevenlabs-voice-changer_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "elevenlabs-voice-changer_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-voice-changer",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-09-15T10:40:08.748Z",
"completed_at": "2026-09-15 10:40:36"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request — elevenlabs-voice-changer for this endpoint. |
| output.media_url | array of strings | URL of the converted audio, as an MP3 file. |
| output.media_type | string | audio/mpeg. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is FAILED/ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
How billing is measured
Billing is measured on the length of the converted audio, rounded up to the next whole minute — not on how long processing takes. A hold sized from the length of audio_url is placed when the request is submitted; if that length cannot be read, the hold covers the 5-minute maximum. The hold is reduced to the real cost once the converted audio has been measured, and released in full if the request fails.
The current rate is shown in the pricing panel on this page.
ElevenLabs Voice Changer API Pricing
ElevenLabs Dubbing API Documentation
Dub a video or audio file into another language while preserving each speaker's voice. Video sources come back as dubbed video with the picture intact; audio sources come back as audio. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED.
POST https://gateway.pixazo.ai/elevenlabs-dubbing/v1/dubAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Dubbing - ElevenLabs Dubbing
Request Code
POST https://gateway.pixazo.ai/elevenlabs-dubbing/v1/dub
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"source_url": "",
"target_lang": "de",
"source_lang": "en",
"name": "q3-webinar-de",
"num_speakers": 2,
"start_time": 0,
"end_time": 120,
"drop_background_audio": true,
"highest_resolution": true
} import requests
url = "https://gateway.pixazo.ai/elevenlabs-dubbing/v1/dub"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"source_url": "",
"target_lang": "de",
"source_lang": "en",
"name": "q3-webinar-de",
"num_speakers": 2,
"start_time": 0,
"end_time": 120,
"drop_background_audio": True,
"highest_resolution": True
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json()) const res = await fetch("https://gateway.pixazo.ai/elevenlabs-dubbing/v1/dub", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"source_url": "",
"target_lang": "de",
"source_lang": "en",
"name": "q3-webinar-de",
"num_speakers": 2,
"start_time": 0,
"end_time": 120,
"drop_background_audio": true,
"highest_resolution": true
})
});
console.log(await res.json()); curl -X POST 'https://gateway.pixazo.ai/elevenlabs-dubbing/v1/dub' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"source_url": "", "target_lang": "de", "source_lang": "en", "name": "q3-webinar-de", "num_speakers": 2, "start_time": 0, "end_time": 120, "drop_background_audio": true, "highest_resolution": true}' Output
{
"request_id": "elevenlabs-dubbing_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-dubbing_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
Webhook Headers
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. Must respond 2xx. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/elevenlabs-dubbing/v1/dub' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
-H 'X-Webhook-Mode: terminal' \
--data-raw '{"source_url": "", "target_lang": "de"}' Callback Payload (success)
{
"request_id": "elevenlabs-dubbing_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-dubbing",
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/elevenlabs-dubbing/019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.mp4",
"media_type": "video/mp4"
},
"duration": 15.86
}Failure callback shape
{
"request_id": "elevenlabs-dubbing_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-dubbing",
"error": "Couldn't extract audio from the downloaded file.",
"output": null
}Delivery semantics
- terminal mode (default): one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200 OKwithin a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
source_url | Yes | string (uri) | — | public http(s); max 600 seconds of media | Public URL of the video or audio file to dub. Must be reachable without authentication and must contain an audible speech track. These aliases are also accepted: video_url, audio_url, media_url, url. |
target_lang | Yes | string | — | ISO-639-1 or ISO-639-3 code; 86 languages | Language to dub into, for example es, fr, de, hi, ja, pt. Use the base language tag — region-qualified tags such as pt-BR or es-MX are not supported. Alias: target_language. |
source_lang | No | string | auto | ISO-639-1 or ISO-639-3 code, or auto | Language of the source media, as a base language tag. auto detects it. Alias: source_language. |
name | No | string | — | truncated to 200 characters | Optional name for the dubbing job, useful for your own reconciliation. Longer values are truncated to the first 200 characters. |
num_speakers | No | integer | 0 | 0 – 32 | Number of distinct speakers in the source. 0 detects the count automatically. |
start_time | No | integer | — | 0 – 86400 (seconds) | Dub only from this offset into the source media, in seconds. |
end_time | No | integer | — | 0 – 86400 (seconds), must exceed start_time | Dub only up to this offset into the source media, in seconds. |
target_accent | No | string | — | free text; truncated to 200 characters | Experimental. Preferred accent for the dubbed voices; also informs the dialect chosen during translation. |
highest_resolution | No | boolean | false | true, false | Render the dubbed video at the highest resolution available. |
drop_background_audio | No | boolean | false | true, false | Remove background audio. Improves quality for speeches and monologues. |
use_profanity_filter | No | boolean | — | true, false | Beta. Censors profanities in the transcript as [censored]. |
disable_voice_cloning | No | boolean | false | true, false | Use a similar voice from the ElevenLabs Voice Library instead of cloning the speaker's own voice. Library voices count against the ElevenLabs workspace voice limit, and the dub fails if no slot is free. |
Minimum request
Only source_url and target_lang are required. Everything else has a working default.
{
"source_url": "https://storage.googleapis.com/eleven-public-cdn/audio/marketing/nicole.mp3",
"target_lang": "es"
}Source Media & Languages
Source requirements
source_urlmust be a publichttp(s)URL reachable without authentication — no signed-header or private-bucket URLs.- The file must contain an audible speech track. Silent video, music-only audio and files whose audio stream cannot be read are rejected.
- A video source returns dubbed video with the original picture intact (
video/mp4). An audio source returns audio (audio/mpeg).
Limits
| Limit | Value | Behaviour when exceeded |
|---|---|---|
| Maximum source length | 600 seconds (10 minutes) | Submit still returns 202. The source is measured after the request is queued and before anything is sent to ElevenLabs, so an over-length source ends the job there: the next status poll returns status: "ERROR" with Source media is <N>s long; this endpoint accepts up to 600s. Nothing is charged — the hold on your balance is released. |
| Concurrent dubbing jobs | 3 | Submit further jobs only after one finishes; keep no more than three in flight. |
To dub media longer than 600 seconds, split it into segments and submit each segment separately — or use start_time and end_time to dub only the portion you need.
The length check is best-effort: it depends on reading the duration out of the file at source_url. If that duration cannot be read, the job is not blocked — it is dubbed and billed normally. Keep your sources within 600 seconds rather than relying on the check to stop them.
Processing time
Processing time scales with media length. Measured: about 12 seconds for 15 seconds of audio, and about 22 seconds for 16 seconds of video.
Supported languages
This endpoint runs ElevenLabs dubbing_v1, which supports the 86 languages below. Give the code in target_lang (and optionally in source_lang). Use the base language tag — region-qualified variants such as pt-BR, es-MX or en-GB are not supported:
| Code | Language | Code | Language |
|---|---|---|---|
af | Afrikaans | ar | Arabic |
hy | Armenian | as | Assamese |
ast | Asturian | az | Azerbaijani |
be | Belarusian | bn | Bengali |
bs | Bosnian | bg | Bulgarian |
my | Burmese | yue | Cantonese |
ca | Catalan | ceb | Cebuano |
ny | Chichewa | zh | Chinese |
hr | Croatian | cs | Czech |
da | Danish | nl | Dutch |
en | English | et | Estonian |
fil | Filipino | fi | Finnish |
fr | French | gl | Galician |
ka | Georgian | de | German |
el | Greek | gu | Gujarati |
ha | Hausa | he | Hebrew |
hi | Hindi | hu | Hungarian |
is | Icelandic | id | Indonesian |
ga | Irish | it | Italian |
ja | Japanese | jv | Javanese |
kn | Kannada | kk | Kazakh |
ko | Korean | ky | Kyrgyz |
lv | Latvian | ln | Lingala |
lt | Lithuanian | lb | Luxembourgish |
mk | Macedonian | ms | Malay |
ml | Malayalam | mt | Maltese |
mi | Maori | mr | Marathi |
mn | Mongolian | ne | Nepali |
no | Norwegian | oc | Occitan |
or | Odia | ps | Pashto |
fa | Persian | pl | Polish |
pt | Portuguese | pa | Punjabi |
ro | Romanian | ru | Russian |
sr | Serbian | sd | Sindhi |
sk | Slovak | sl | Slovenian |
so | Somali | es | Spanish |
sw | Swahili | sv | Swedish |
tl | Tagalog | tg | Tajik |
ta | Tamil | te | Telugu |
th | Thai | tr | Turkish |
uk | Ukrainian | ur | Urdu |
uz | Uzbek | vi | Vietnamese |
cy | Welsh | yo | Yoruba |
Example Request
{
"source_url": "",
"target_lang": "de",
"source_lang": "en",
"name": "q3-webinar-de",
"num_speakers": 2,
"start_time": 0,
"end_time": 120,
"drop_background_audio": true,
"highest_resolution": true
} Example Response
{
"request_id": "elevenlabs-dubbing_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-dubbing_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync. |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — invalid or missing parameters: a missing or non-http(s) source_url, a missing or malformed target_lang, an end_time that is not greater than start_time, or a value outside its allowed range. Nothing is charged. Source media longer than 600 seconds is not a 400 — it is accepted here and fails on the status poll instead. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 403 | Forbidden. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Error Responses
{
"request_id": "elevenlabs-dubbing_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-dubbing",
"error": "Couldn't extract audio from the downloaded file.",
"output": null
}A failed dub is reported via the status endpoint (or Webhook) with status: "ERROR", an error message and output: null. The messages you are most likely to see:
| Cause | Message |
|---|---|
| Source URL unreachable, or its audio/video metadata cannot be read | URL 'https://…/does-not-exist.mp4' is invalid or audio/video metadata cannot be extracted from it. |
| Source has no audible speech track | Couldn't extract audio from the downloaded file. |
Source media longer than the 600-second limit. Submit returns 202; the job then fails on the first status poll, before anything is sent to ElevenLabs, and nothing is charged | Source media is 667s long; this endpoint accepts up to 600s. |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR).
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}curl 'https://gateway.pixazo.ai/v2/requests/status/elevenlabs-dubbing_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response (video source)
{
"request_id": "elevenlabs-dubbing_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-dubbing",
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/elevenlabs-dubbing/019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.mp4",
"media_type": "video/mp4"
},
"duration": 15.86
}An audio source returns the same envelope with media_type of audio/mpeg and an audio media_url. output.media_url is a Pixazo-hosted URL. The top-level duration is the length of the source media in seconds — it is what the per-minute charge is computed from.
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | string | Pixazo-hosted URL of the dubbed media. |
| output.media_type | string | MIME type of the output — video/mp4 for video sources, audio/mpeg for audio sources. |
| duration | number | Length of the source media in seconds. The per-minute charge is computed from this value. |
| polling_url | string | Status URL for this request. |
| error | string | Error message when status is FAILED/ERROR; output is null in that case. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
Typical Workflow
POST https://gateway.pixazo.ai/elevenlabs-dubbing/v1/dubwithsource_urlandtarget_lang; readrequest_idfrom the202response.- Poll
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}— or supplyX-Webhook-URLon submit and skip polling. - When
statusisCOMPLETED, downloadoutput.media_url. - Keep no more than 3 dubbing jobs in flight at once.
Pricing
Billed at $0.50 per minute of source media, rounded up to the next whole minute. Billing is measured on the source length, not on the length of the output, and a 15-second clip therefore bills one full minute.
| Source media | Billable minutes | Cost |
|---|---|---|
| 15 seconds | 1 | $0.50 |
| 60 seconds | 1 | $0.50 |
| 90 seconds | 2 | $1.00 |
| 600 seconds (the maximum accepted) | 10 | $5.00 |
Media longer than 600 seconds is rejected before anything is sent to ElevenLabs — the job ends as ERROR on the first status poll and nothing is charged — so the most expensive possible single request is $5.00.
ElevenLabs Dubbing API Pricing
ElevenLabs Multilingual v2 API Documentation
ElevenLabs' quality-first model. The most natural delivery of the ElevenLabs line, at the cost of higher latency. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the audio.
POST https://gateway.pixazo.ai/elevenlabs-multilingual-v2/v1/text-to-speechAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Speech - ElevenLabs Multilingual v2
Request Code
POST https://gateway.pixazo.ai/elevenlabs-multilingual-v2/v1/text-to-speech
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"text": "Hello from Pixazo. This is a text to speech demo.",
"voice_id": "JBFqnCBsd6RMkjVDRZzb"
}import requests
url = "https://gateway.pixazo.ai/elevenlabs-multilingual-v2/v1/text-to-speech"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"text": "Hello from Pixazo. This is a text to speech demo.",
"voice_id": "JBFqnCBsd6RMkjVDRZzb"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/elevenlabs-multilingual-v2/v1/text-to-speech", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"text": "Hello from Pixazo. This is a text to speech demo.",
"voice_id": "JBFqnCBsd6RMkjVDRZzb"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/elevenlabs-multilingual-v2/v1/text-to-speech' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"text": "Hello from Pixazo. This is a text to speech demo.", "voice_id": "JBFqnCBsd6RMkjVDRZzb"}'Output
{
"request_id": "elevenlabs-multilingual-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-multilingual-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/elevenlabs-multilingual-v2/v1/text-to-speech' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"text": "Hello from Pixazo. This is a text to speech demo.", "voice_id": "JBFqnCBsd6RMkjVDRZzb"}'Callback Payload (success)
{
"request_id": "elevenlabs-multilingual-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-multilingual-v2",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-08-01T09:14:16.102Z",
"completed_at": "2026-08-01T09:14:22.870Z"
}Failure callback shape
{
"request_id": "elevenlabs-multilingual-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "elevenlabs-multilingual-v2",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
text | Yes | string | — | 1 – 10,000 characters | The text that will be converted into speech. 10,000 characters is roughly 10 minutes of audio. |
voice_id | Yes | string | — | an ElevenLabs voice id | The ElevenLabs voice ID used for the generation, e.g. JBFqnCBsd6RMkjVDRZzb. Browse voices in the ElevenLabs voice library. |
output_format | No | string | mp3_44100_128 | mp3_22050_32, mp3_24000_48, mp3_44100_32, mp3_44100_64, mp3_44100_96, mp3_44100_128, mp3_44100_192, opus_48000_32, opus_48000_64, opus_48000_96, opus_48000_128, opus_48000_192 | Codec, sample rate and bitrate in one value, formatted as codec_samplerate_bitrate. MP3 values return .mp3, Opus values return .ogg. Only the twelve values listed are accepted — the PCM, WAV, u-law and A-law formats of the ElevenLabs REST API are not available for this model. |
language_code | No | string | — | ISO 639-1, e.g. en | Not supported by this model. ElevenLabs states the parameter "is not supported for multilingual_v2 models" and that a language code the model does not support is ignored, so Multilingual v2 always infers the language from the text. The field is accepted for compatibility but changes nothing here. |
voice_settings | No | object | — | stability 0 – 1, similarity_boost 0 – 1, style 0 – 1, use_speaker_boost boolean, speed 0.7 – 1.2 | Per-request overrides of the voice's stored settings; anything you omit keeps the voice's own value. stability trades emotional range for consistency, similarity_boost controls how closely the output adheres to the original voice, style exaggerates the speaker's style, use_speaker_boost boosts similarity to the original speaker, and speed scales delivery speed around 1.0. No other keys are accepted. |
seed | No | integer | — | 0 – 4294967295 | Best-effort determinism: repeated requests with the same seed and the same parameters should return the same result. ElevenLabs states that determinism is not guaranteed. |
previous_text | No | string | — | up to 10,000 characters | The text that came before this request's text. Improves continuity of delivery when you concatenate several generations. |
next_text | No | string | — | up to 10,000 characters | The text that comes after this request's text. Improves continuity of delivery when you concatenate several generations. |
apply_text_normalization | No | string | auto | auto, on, off | Controls text normalization, for example spelling out numbers and dates. auto lets ElevenLabs decide, on always normalizes, off skips it. |
Voices
29 languages. Use an ElevenLabs voice id in voice_id.
Example Request
{
"text": "Hello from Pixazo. This is a text to speech demo.",
"voice_id": "JBFqnCBsd6RMkjVDRZzb"
}Example Response
{
"request_id": "elevenlabs-multilingual-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/elevenlabs-multilingual-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — a missing or out-of-range parameter. The message names the field. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or ERROR), then download output.media_url.
curl 'https://gateway.pixazo.ai/v2/requests/status/elevenlabs-multilingual-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "elevenlabs-multilingual-v2_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "elevenlabs-multilingual-v2",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-08-01T09:14:16.102Z",
"completed_at": "2026-08-01T09:14:22.870Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | array | URL of the generated audio file. |
| output.media_type | string | MIME type of the audio. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
How billing is measured
Billing is measured on the input text you submit, in blocks of 1,000 characters rounded up to the next whole block — not on the length of the audio produced. The current rate is shown in the pricing panel on this page.
| Input text | Billed blocks |
|---|---|
| A short sentence (~50 characters) | 1 |
| A paragraph (~800 characters) | 1 |
| A 3,000-character article | 3 |
| 10,000 characters (the maximum) | 10 |
Failed requests are not billed.
ElevenLabs Multilingual v2 API Pricing
⚡ Performance
Live usage measured on Pixazo's gateway, split by model version. Generation time is how long a generation takes end-to-end (lower is better). Success rate is the percent of generations that complete (higher is better).
〰 Uptime
Percent of generations that succeeded over the selected period, per model version.