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.

Get API Key
ElevenLabs Audio API

Models Version

WELCOME BONUS

Get 10% Cashback on Your First Payment (up to $500)

Add funds and get 10% cashback on your first payment (up to $500).

Claim Your Cashback →

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-speech

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
textYesstring—1–5000 charactersThe 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əʊ/.
voiceNostring— (the provider's default voice)An ElevenLabs voice nameThe voice to speak with, by name — for example Roger, Sarah, Laura, Charlie, George.
stabilityNonumber0.50–1Lower values give a more expressive, varied delivery; higher values keep the delivery closer to a steady baseline.
similarity_boostNonumber0.750–1How closely the speech follows the chosen voice. Higher values sound more like the voice but can reduce naturalness.
language_codeNostring— (detected from the text)ISO 639-1 code, e.g. en, es, jaForces 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_normalizationNostringautoauto, on, offWhether numbers, dates and abbreviations are spelled out before they are spoken.
seedNointeger—0–4294967295Random seed for best-effort reproducibility. The same seed and text can still sound slightly different.
output_formatNostringmp3_44100_128mp3_22050_32, mp3_44100_32, mp3_44100_64, mp3_44100_96, mp3_44100_128, mp3_44100_192MP3 encoding of the speech, written as codec_sample-rate_bitrate.
  • text is 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, stability and similarity_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 with timestamps: true is rejected.
  • ElevenLabs keeps improving Eleven v4 after launch, so the same text can sound slightly different over time.

Audio tags

Write a short instruction in square brackets where the delivery should change — an emotion such as [excited], a way of speaking such as [whispers], a reaction such as [laughs], or a pause such as [pause]. Tags are free-form: describe the voice you want in plain words. Because the model can also produce sound effects, a tag that names a sound may be read as one, so describe how the voice should sound.

{
  "text": "[excited] We did it! [pause] [whispers] Now keep it a secret.",
  "language_code": "en"
}

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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty textsynchronous 400
text longer than 5000 characterssynchronous 400
stability or similarity_boost not a number in 0–1, or seed not an integer in 0–4294967295synchronous 400
language_code longer than 3 characters (for example "auto"), or apply_text_normalization or output_format not one of the allowed valuessynchronous 400
timestamps: truesynchronous 400
A voice name the provider does not recognisestatus: "ERROR"
Text refused by the provider's content policystatus: "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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — elevenlabs-eleven-v4-tts for this endpoint.
output.media_urlarray of stringsURL of the speech, as an MP3 file.
output.media_typestringaudio/mpeg.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError 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

Your request will cost $0.08 per 1,000 characters of input text.
each started block of 1,000 characters is billed once
equivalent to $80 per 1M characters
2. ElevenLabs Eleven v4 Turbo

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-speech

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
textYesstring—1–5000 charactersThe text to speak. Direct the delivery with audio tags in square brackets, such as [whispers], [laughs] or [excited].
voiceNostring— (the provider's default voice)An ElevenLabs voice nameThe voice to speak with, by name — for example Roger, Sarah, Laura, Charlie, George.
stabilityNonumber0.50–1Lower values give a more expressive, varied delivery; higher values keep the delivery closer to a steady baseline.
similarity_boostNonumber0.750–1How closely the speech follows the chosen voice. Higher values sound more like the voice but can reduce naturalness.
language_codeNostring— (detected from the text)ISO 639-1 code, e.g. en, es, jaForces 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_normalizationNostringautoauto, on, offWhether numbers, dates and abbreviations are spelled out before they are spoken.
seedNointeger—0–4294967295Random seed for best-effort reproducibility. The same seed and text can still sound slightly different.
output_formatNostringmp3_44100_128mp3_22050_32, mp3_44100_32, mp3_44100_64, mp3_44100_96, mp3_44100_128, mp3_44100_192MP3 encoding of the speech, written as codec_sample-rate_bitrate.
  • text is 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, stability and similarity_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 with timestamps: true is rejected.
  • ElevenLabs keeps improving Eleven v4 after launch, so the same text can sound slightly different over time.

Audio tags

Write a short instruction in square brackets where the delivery should change — an emotion such as [excited], a way of speaking such as [whispers], a reaction such as [laughs], or a pause such as [pause]. Tags are free-form: describe the voice you want in plain words. Because the model can also produce sound effects, a tag that names a sound may be read as one, so describe how the voice should sound.

{
  "text": "[excited] We did it! [pause] [whispers] Now keep it a secret.",
  "language_code": "en"
}

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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty textsynchronous 400
text longer than 5000 characterssynchronous 400
stability or similarity_boost not a number in 0–1, or seed not an integer in 0–4294967295synchronous 400
language_code longer than 3 characters (for example "auto"), or apply_text_normalization or output_format not one of the allowed valuessynchronous 400
timestamps: truesynchronous 400
A voice name the provider does not recognisestatus: "ERROR"
Text refused by the provider's content policystatus: "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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — elevenlabs-eleven-v4-turbo-tts for this endpoint.
output.media_urlarray of stringsURL of the speech, as an MP3 file.
output.media_typestringaudio/mpeg.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError 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

Your request will cost $0.04 per 1,000 characters of input text.
each started block of 1,000 characters is billed once
equivalent to $40 per 1M characters
3. ElevenLabs Music v2.5

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-music

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYes, unless composition_plan is givenstring—1–4100 charactersA text description of the music to generate: genre, mood, instrumentation, tempo, and whether it has vocals. Cannot be combined with composition_plan.
music_length_msNointeger— (chosen by the model)3000–600000Length 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_instrumentalNobooleanfalsetrue, falseWhen true, guarantees the track has no vocals. When false, the prompt decides. Only valid with prompt.
composition_planYes, unless prompt is givenobject—chunks: 1–30 entriesA 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.
seedNointeger—0–2147483647Random 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 prompt or composition_plan. Sending both, or neither, fails the request.
  • music_length_ms and force_instrumental apply to prompt only. 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_id in 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 fieldRequiredTypeDescription
textYesstringThe lyrics or content of this section. May start with a section name in square brackets, e.g. [Verse 1], followed by lyric lines.
duration_msYesintegerLength of this section, 3000–120000 ms. All chunks together must total 3000–600000 ms.
positive_stylesYesarray of stringsStyles 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_stylesNoarray of stringsStyles 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Neither prompt nor composition_plan provided, or a blank promptsynchronous 400
prompt longer than 4100 characterssynchronous 400
music_length_ms not an integer, or outside 3000–600000synchronous 400
force_instrumental not a boolean, or seed not an integer in 0–4294967295synchronous 400
Both prompt and composition_plan, or music_length_ms / force_instrumental sent with a composition planstatus: "ERROR"
A composition plan using v1 sections instead of chunksstatus: "ERROR"
A chunk missing text, duration_ms or positive_styles, or chunks totalling more than 10 minutesstatus: "ERROR"
A model_id in the bodystatus: "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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR.
model_idstringThe model that handled the request — elevenlabs-music-v2-5 for this endpoint.
output.media_urlarray of stringsURL of the generated MP3 track.
output.media_typestringaudio/mpeg.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError 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

Your request will cost $0.30 per minute of generated music.
billed in 1-minute increments, rounded up
4. ElevenLabs Music v2

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-music

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYes, unless composition_plan is givenstring—1–4100 charactersA text description of the music to generate: genre, mood, instrumentation, tempo, and whether it has vocals. Cannot be combined with composition_plan.
music_length_msNointeger— (chosen by the model)3000–600000Length 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_instrumentalNobooleanfalsetrue, falseWhen true, guarantees the track has no vocals. When false, the prompt decides. Only valid with prompt.
composition_planYes, unless prompt is givenobject—chunks: 1–30 entriesA 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.
seedNointeger—0–2147483647Random 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 prompt or composition_plan. Sending both, or neither, fails the request.
  • music_length_ms and force_instrumental apply to prompt only. 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_id in 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 fieldRequiredTypeDescription
textYesstringThe lyrics or content of this section. May start with a section name in square brackets, e.g. [Verse 1], followed by lyric lines.
duration_msYesintegerLength of this section, 3000–120000 ms. All chunks together must total 3000–600000 ms.
positive_stylesYesarray of stringsStyles 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_stylesNoarray of stringsStyles 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Neither prompt nor composition_plan provided, or a blank promptsynchronous 400
prompt longer than 4100 characterssynchronous 400
music_length_ms not an integer, or outside 3000–600000synchronous 400
force_instrumental not a boolean, or seed not an integer in 0–4294967295synchronous 400
Both prompt and composition_plan, or music_length_ms / force_instrumental sent with a composition planstatus: "ERROR"
A composition plan using v1 sections instead of chunksstatus: "ERROR"
A chunk missing text, duration_ms or positive_styles, or chunks totalling more than 10 minutesstatus: "ERROR"
A model_id in the bodystatus: "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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR.
model_idstringThe model that handled the request — elevenlabs-music-v2 for this endpoint.
output.media_urlarray of stringsURL of the generated MP3 track.
output.media_typestringaudio/mpeg.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError 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

Your request will cost $0.30 per minute of generated music.
billed in 1-minute increments, rounded up
5. ElevenLabs Video to Music

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-music

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
video_urlYes, unless video_urls is givenstring—Public http(s) URL to an MP4 or MOV videoThe video to write music for. Cannot be combined with video_urls.
video_urlsYes, unless video_url is givenarray of strings—1–10 URLs to MP4 or MOV videosSeveral videos, combined in the order given and scored as one track. Cannot be combined with video_url.
descriptionNostring—Up to 1000 charactersA description of the music you want: mood, genre, instruments, how it develops.
tagsNoarray of strings—Up to 10 tags, each up to 100 charactersStyle tags, for example ["upbeat", "cinematic"].
  • Send exactly one of video_url or video_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_id in 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_urls are 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_url cannot 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Neither video_url nor video_urls providedsynchronous 400
video_urls not an array of 1–10 entriessynchronous 400
A video_urls entry that cannot be read as an MP4 or MOV video, including one that cannot be downloadedsynchronous 400
Videos longer than 600 seconds in total, when their length can be read on submitsynchronous 400 (Input too long)
description longer than 1000 characters, or tags not an array of at most 10synchronous 400
Both video_url and video_urlsstatus: "ERROR"
video_url not a public http(s) URL, not downloadable or empty; or videos larger than 32 MB in totalstatus: "ERROR"
A tags entry that is empty or longer than 100 charactersstatus: "ERROR"
A model_id in the bodystatus: "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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR.
model_idstringThe model that handled the request — elevenlabs-video-to-music for this endpoint.
output.media_urlarray of stringsURL of the track, as an MP3 file.
output.media_typestringaudio/mpeg.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError 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

Your request will cost $0.15 per minute of generated music.
billed in 1-minute increments, rounded up
6. ElevenLabs Sound Effects v2

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-effects

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
textYesstring—1–1000 charactersA description of the sound effect to generate: what makes the sound, where it happens and how it changes over time.
duration_secondsNonumber— (chosen by the model)0.5–30Length of the sound effect in seconds. Omit it to let the model choose a length that suits the description.
loopNobooleanfalsetrue, falseWhen true, generates a sound effect that loops smoothly, for ambiences and backgrounds that repeat.
prompt_influenceNonumber0.30–1How 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.
  • text is 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_id in 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty textsynchronous 400
text longer than 1000 characterssynchronous 400
duration_seconds not a number, or outside 0.5–30synchronous 400
loop not a boolean, or prompt_influence not a number in 0–1synchronous 400
A model_id in the bodystatus: "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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR.
model_idstringThe model that handled the request — elevenlabs-sound-effects for this endpoint.
output.media_urlarray of stringsURL of the sound effect, as an MP3 file.
output.media_typestringaudio/mpeg.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError 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

Your request will cost $0.002 per second of generated audio.
billed on the length of the sound effect produced
7. ElevenLabs Music

ElevenLabs Music API Documentation

https://gateway.pixazo.ai/elevenlabs-music/v1/elevenlabs-music-request

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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
promptYes, unless composition_plan is givenstring—1–4100 charactersA 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_msNointeger— (chosen by the model)3000–600000Length 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_instrumentalNobooleanfalsetrue, falseWhen true, guarantees the track has no vocals. When false, the prompt decides. Only valid with prompt; it is not accepted alongside composition_plan.
composition_planYes, unless prompt is givenobject—sections: 1–30 entriesA 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_durationsNobooleantruetrue, falseControls 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.
seedNointeger—0–2147483647Random 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_API_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal 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

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstringWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

ElevenLabs Music API Pricing

Your request will cost $0.30 per minute of generated music.
billed in 1-minute increments, rounded up
8. ElevenLabs Eleven v3 TTS

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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
textYesstring—1–5000 charactersText to convert to speech (1–5000 characters). Supports inline emotion tags such as [whispers], [laughs], [excited].
voiceNostring"Rachel"ElevenLabs voice nameThe 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.
stabilityNofloat0.50.0–1.0Voice stability. Lower values give more expressive, varied speech; higher values keep the voice more consistent across generations.
timestampsNobooleanfalse—If true, returns an array of per-word timestamps alongside the audio output.
language_codeNostring—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_normalizationNoenum"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

TypeMaxFormat / SizeDescription
audio1MP3, WAVReference 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_API_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal 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

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstringWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

ElevenLabs Eleven v3 TTS API Pricing

Your request will cost $0.10 per 1,000 characters.
about $0.120 for a typical 200-word paragraph
equivalent to $100 per 1M characters
9. ElevenLabs Turbo v2.5

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-speech

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
textYesstring—1 – 10,000 charactersThe text to convert into speech. Billed per 1,000 characters of input text.
voice_idYesstring—an ElevenLabs voice ID, up to 128 charactersThe ElevenLabs voice to speak with, e.g. JBFqnCBsd6RMkjVDRZzb. Browse voices in the ElevenLabs voice library.
output_formatNostringmp3_44100_128mp3_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_192Codec, 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_codeNostring—an ISO 639-1 code, e.g. en, es, jaEnforces 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_settingsNoobject—stability, similarity_boost, style, use_speaker_boost, speedPer-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.
seedNointeger—0 – 4294967295Best-effort deterministic sampling: repeating a request with the same seed and the same parameters should return the same result. Determinism is not guaranteed.
previous_textNostring—up to 10,000 charactersThe text that comes before this request's text. Improves continuity when you stitch several generations together.
next_textNostring—up to 10,000 charactersThe text that comes after this request's text. Improves continuity when you stitch several generations together.
apply_text_normalizationNostringautoauto, on, offControls 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Bad request — a missing or out-of-range parameter. The message names the field.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance.
429Too many requests.
500Internal 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request.
output.media_urlarrayURL of the generated audio file.
output.media_typestringMIME type of the audio.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError 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 textBilled blocksCost
A short sentence (~50 characters)1$0.05
A paragraph (~800 characters)1$0.05
A 3,000-character article3$0.15
10,000 characters10$0.5

Failed requests are not billed.

ElevenLabs Turbo v2.5 API Pricing

Your request will cost $0.05 per 1,000 characters of input text.
half the price of Multilingual v2 at $0.05 per 1,000 characters
equivalent to $50 per 1M characters
10. ElevenLabs Voice Changer

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-speech

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
audio_urlYesstring—Public http(s) URL; up to 5 minutes and 32 MBThe recording whose voice is converted. MP3, WAV or M4A is recommended — see Input recording below.
voiceYesstring—A preset voice name from Voices belowThe voice the recording is converted into, by name — for example Adam. Names are case-sensitive: send them exactly as listed.
remove_background_noiseNobooleanfalsetrue, falseWhen true, removes background noise from the recording before its voice is converted.
seedNointeger—0–4294967295Random seed. Repeating a request with the same seed and parameters gives more consistent results, but exact reproducibility is not guaranteed.
voice_settingsNoobject— (the voice's own settings)See Voice settings belowOverrides the chosen voice's settings for this request only.
  • audio_url must 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_id or a voice_id — both are rejected. Choose the voice by name with voice.

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.

VoiceCharacter
AdamDominant, Firm
AliceClear, Engaging Educator
BellaProfessional, Bright, Warm
BillWise, Mature, Balanced
BrianDeep, Resonant and Comforting
CallumHusky Trickster
CharlieDeep, Confident, Energetic
ChrisCharming, Down-to-Earth
DanielSteady Broadcaster
EricSmooth, Trustworthy
GeorgeWarm, Captivating Storyteller
HarryFierce Warrior
JessicaPlayful, Bright, Warm
LauraEnthusiast, Quirky Attitude
LiamEnergetic, Social Media Creator
LilyVelvety Actress
MatildaKnowledgable, Professional
RiverRelaxed, Neutral, Informative
RogerLaid-Back, Casual, Resonant
SarahMature, Reassuring, Confident
WillRelaxed Optimist

Voice settings

Every field is optional. Send only the ones you want to change for this request.

FieldTypeRangeDescription
stabilitynumber0–1How stable the voice is between generations. Lower values give a broader emotional range; higher values sound steadier but can become monotonous.
similarity_boostnumber0–1How closely the output adheres to the chosen voice.
stylenumber0–1Style exaggeration: amplifies the voice's speaking style. Any value above 0 can make processing slower.
use_speaker_boostbooleantrue, falseBoosts 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing audio_url or voicesynchronous 400
A voice that is not one of the preset voices listed under Voicessynchronous 400
remove_background_noise not a boolean, seed not an integer in 0–4294967295, or voice_settings not an objectsynchronous 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 MBstatus: "ERROR"
A voice_settings field not listed under Voice settings, or a value out of rangestatus: "ERROR"
A recording longer than 5 minutes whose length cannot be read on submitstatus: "ERROR"
A model_id or voice_id in the bodystatus: "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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR.
model_idstringThe model that handled the request — elevenlabs-voice-changer for this endpoint.
output.media_urlarray of stringsURL of the converted audio, as an MP3 file.
output.media_typestringaudio/mpeg.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError 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

Your request will cost $0.12 per minute of converted audio.
billed in 1-minute increments, rounded up
11. ElevenLabs Dubbing

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/dub

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback. Must respond 2xx.
X-Webhook-ModeNoterminal (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 OK within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
source_urlYesstring (uri)—public http(s); max 600 seconds of mediaPublic 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_langYesstring—ISO-639-1 or ISO-639-3 code; 86 languagesLanguage 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_langNostringautoISO-639-1 or ISO-639-3 code, or autoLanguage of the source media, as a base language tag. auto detects it. Alias: source_language.
nameNostring—truncated to 200 charactersOptional name for the dubbing job, useful for your own reconciliation. Longer values are truncated to the first 200 characters.
num_speakersNointeger00 – 32Number of distinct speakers in the source. 0 detects the count automatically.
start_timeNointeger—0 – 86400 (seconds)Dub only from this offset into the source media, in seconds.
end_timeNointeger—0 – 86400 (seconds), must exceed start_timeDub only up to this offset into the source media, in seconds.
target_accentNostring—free text; truncated to 200 charactersExperimental. Preferred accent for the dubbed voices; also informs the dialect chosen during translation.
highest_resolutionNobooleanfalsetrue, falseRender the dubbed video at the highest resolution available.
drop_background_audioNobooleanfalsetrue, falseRemove background audio. Improves quality for speeches and monologues.
use_profanity_filterNoboolean—true, falseBeta. Censors profanities in the transcript as [censored].
disable_voice_cloningNobooleanfalsetrue, falseUse 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_url must be a public http(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

LimitValueBehaviour when exceeded
Maximum source length600 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 jobs3Submit 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:

CodeLanguageCodeLanguage
afAfrikaansarArabic
hyArmenianasAssamese
astAsturianazAzerbaijani
beBelarusianbnBengali
bsBosnianbgBulgarian
myBurmeseyueCantonese
caCatalancebCebuano
nyChichewazhChinese
hrCroatiancsCzech
daDanishnlDutch
enEnglishetEstonian
filFilipinofiFinnish
frFrenchglGalician
kaGeorgiandeGerman
elGreekguGujarati
haHausaheHebrew
hiHindihuHungarian
isIcelandicidIndonesian
gaIrishitItalian
jaJapanesejvJavanese
knKannadakkKazakh
koKoreankyKyrgyz
lvLatvianlnLingala
ltLithuanianlbLuxembourgish
mkMacedonianmsMalay
mlMalayalammtMaltese
miMaorimrMarathi
mnMongolianneNepali
noNorwegianocOccitan
orOdiapsPashto
faPersianplPolish
ptPortuguesepaPunjabi
roRomanianruRussian
srSerbiansdSindhi
skSlovakslSlovenian
soSomaliesSpanish
swSwahilisvSwedish
tlTagalogtgTajik
taTamilteTelugu
thThaitrTurkish
ukUkrainianurUrdu
uzUzbekviVietnamese
cyWelshyoYoruba

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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).
X-Webhook-ModeNoterminal (default) or sync.

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Bad 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance.
403Forbidden.
429Too many requests.
500Internal 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:

CauseMessage
Source URL unreachable, or its audio/video metadata cannot be readURL 'https://…/does-not-exist.mp4' is invalid or audio/video metadata cannot be extracted from it.
Source has no audible speech trackCouldn'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 chargedSource 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR.
model_idstringThe model that handled the request.
output.media_urlstringPixazo-hosted URL of the dubbed media.
output.media_typestringMIME type of the output — video/mp4 for video sources, audio/mpeg for audio sources.
durationnumberLength of the source media in seconds. The per-minute charge is computed from this value.
polling_urlstringStatus URL for this request.
errorstringError 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

  1. POST https://gateway.pixazo.ai/elevenlabs-dubbing/v1/dub with source_url and target_lang; read request_id from the 202 response.
  2. Poll GET https://gateway.pixazo.ai/v2/requests/status/{request_id} — or supply X-Webhook-URL on submit and skip polling.
  3. When status is COMPLETED, download output.media_url.
  4. 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 mediaBillable minutesCost
15 seconds1$0.50
60 seconds1$0.50
90 seconds2$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

Your request will cost $0.50 per minute of source media.
a 90-second clip bills 2 minutes, $1.00
equivalent to $0.50 per minute, rounded up to the next full minute
12. ElevenLabs Multilingual v2

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-speech

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
textYesstring—1 – 10,000 charactersThe text that will be converted into speech. 10,000 characters is roughly 10 minutes of audio.
voice_idYesstring—an ElevenLabs voice idThe ElevenLabs voice ID used for the generation, e.g. JBFqnCBsd6RMkjVDRZzb. Browse voices in the ElevenLabs voice library.
output_formatNostringmp3_44100_128mp3_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_192Codec, 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_codeNostring—ISO 639-1, e.g. enNot 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_settingsNoobject—stability 0 – 1, similarity_boost 0 – 1, style 0 – 1, use_speaker_boost boolean, speed 0.7 – 1.2Per-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.
seedNointeger—0 – 4294967295Best-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_textNostring—up to 10,000 charactersThe text that came before this request's text. Improves continuity of delivery when you concatenate several generations.
next_textNostring—up to 10,000 charactersThe text that comes after this request's text. Improves continuity of delivery when you concatenate several generations.
apply_text_normalizationNostringautoauto, on, offControls 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Bad request — a missing or out-of-range parameter. The message names the field.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance.
429Too many requests.
500Internal 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request.
output.media_urlarrayURL of the generated audio file.
output.media_typestringMIME type of the audio.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError 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 textBilled blocks
A short sentence (~50 characters)1
A paragraph (~800 characters)1
A 3,000-character article3
10,000 characters (the maximum)10

Failed requests are not billed.

ElevenLabs Multilingual v2 API Pricing

Your request will cost $0.10 per 1,000 characters of input text.
the highest-fidelity ElevenLabs voice, $0.10 per 1,000 characters
equivalent to $100 per 1M characters

⚡ 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).

Show data for the last
Generations
25,700last 30d
~857 per day
Success rate
98.4%
of completed generations
Generation time
70.6savg
p95 2.4min
Requests
Sep 17max 7,900Oct 16
ElevenLabs Turbo v2.5Avg 527/day
ElevenLabs Eleven v4Avg 263/day
ElevenLabs Multilingual v2Avg 30/day
ElevenLabs Sound Effects v2Avg 17/day
OtherAvg 20/day
Generation Time
Sep 17max 18.1minOct 16
ElevenLabs Turbo v2.5Avg 88.9s
ElevenLabs Eleven v4Avg 23.2s
ElevenLabs Multilingual v2Avg 4.0min
ElevenLabs Sound Effects v2Avg 24.9s
OtherAvg 38.4s
Error Rate
Sep 17max 100.0%Oct 16
ElevenLabs Turbo v2.5Avg 0.0%
ElevenLabs Eleven v4Avg 1.3%
ElevenLabs Multilingual v2Avg 22.2%
ElevenLabs Sound Effects v2Avg 0.0%
OtherAvg 16.7%

〰 Uptime

Percent of generations that succeeded over the selected period, per model version.

Avg. Success Rate (30d)
98.44%
across all generations of this model family
Uptime
Sep 17max 100%Oct 16
ElevenLabs Turbo v2.5Avg 100.00%
ElevenLabs Eleven v4Avg 98.73%
ElevenLabs Multilingual v2Avg 77.78%
ElevenLabs Sound Effects v2Avg 100.00%
OtherAvg 83.33%