Mureka Song API, Mureka Instrumental API, Mureka Lyrics & Podcast API: Pricing, Documentation
by Mureka
Mureka API is an official programmatic platform designed to integrate advanced, studio-quality AI music generation directly into developer applications and business workflows. Powered by proprietary music models, it features a unique chain-of-thought architecture that maps out song structures and melodic progressions before outputting high-fidelity audio tokens. The asynchronous interface provides distinct endpoints for text-to-song generation, specialized instrumental tracks, and automated lyric composition, supporting extensive customization across genres like electronic, soul, and pop.

Models Version
Mureka Song API Documentation
Generate a song from a short description with Mureka: describe the song in prompt, optionally add genres in styles, and choose the model version in model. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the song from output.media_url.
POST https://gateway.pixazo.ai/mureka-song-prompt/v1/prompt-to-songAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Prompt to Song - Mureka Song
Request Code
POST https://gateway.pixazo.ai/mureka-song-prompt/v1/prompt-to-song
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "An upbeat summer song about a road trip with friends, with a catchy chorus",
"styles": [
"pop",
"rock"
],
"model": "mureka-9.5"
}import requests
url = "https://gateway.pixazo.ai/mureka-song-prompt/v1/prompt-to-song"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "An upbeat summer song about a road trip with friends, with a catchy chorus",
"styles": [
"pop",
"rock"
],
"model": "mureka-9.5"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/mureka-song-prompt/v1/prompt-to-song", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "An upbeat summer song about a road trip with friends, with a catchy chorus",
"styles": [
"pop",
"rock"
],
"model": "mureka-9.5"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/mureka-song-prompt/v1/prompt-to-song' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "An upbeat summer song about a road trip with friends, with a catchy chorus", "styles": ["pop", "rock"], "model": "mureka-9.5"}'Output
{
"request_id": "mureka-song-prompt_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-song-prompt_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/mureka-song-prompt/v1/prompt-to-song' \
-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": "An upbeat summer song about a road trip with friends, with a catchy chorus", "styles": ["pop", "rock"], "model": "mureka-9.5"}'Callback Payload (success)
{
"request_id": "mureka-song-prompt_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-song-prompt",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Failure callback shape
{
"request_id": "mureka-song-prompt_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "mureka-song-prompt",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Non-empty text, up to 2000 characters | A description of the song: what it is about, the mood, the genre, the instruments and the vocals. |
styles | No | array | — | 1–13 genres from: pop, rock, jazz, r&b, edm, ambient, folk, latin, k-pop, j-pop, house, gospel, lo-fi | Musical genres for the song, written exactly as listed (see Styles below). |
model | No | string | "mureka-9.5" | mureka-7.6, mureka-o2, mureka-8, mureka-9, mureka-9.5 | The model version. Each version has its own rate per song; mureka-9.5 applies when you leave it out. |
Good to know
- Each request returns one song.
batch_size,num_images,number_of_images,n,count,num_instrumentals,num_songsandnum_outputsare rejected — send one request per song. - This API has no length setting: the model sets the length of the song, and the length does not change the amount billed.
duration,seconds,num_frames,frames_per_secondandmusic_length_msare rejected. - Send every field at the top level of the JSON body;
parameters,contentandtextare rejected. - Choose the model version with
model:mureka-7.6,mureka-o2,mureka-8,mureka-9ormureka-9.5;mureka-9.5applies when you leave it out. Each version has its own rate per song. - To sing your own lyrics, use Lyrics to Song:
POST https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song.lyricsandgenderare rejected here; describe the voice inprompt. - Send 1 to 13 genres in
styles, written exactly as listed (see Styles below). - IDs from Mureka's own upload and voice-clone services are not offered:
reference_id,vocal_idandmelody_idare rejected. - Use the JSON types shown:
promptandmodelare strings andstylesis a list of strings, written exactly as listed. - Omit a field instead of sending
null. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_url,webhook_modeandcallback_urlin the JSON body are rejected. streamis not supported: the result is delivered when the job completes.
Styles
Send 1 to 13 genres in styles, written exactly as listed: pop, rock, jazz, r&b, edm, ambient, folk, latin, k-pop, j-pop, house, gospel, lo-fi. Leave styles out to describe the genre in prompt only.
Example: a prompt with two genres
{
"prompt": "A calm late-night song about the city lights",
"styles": [
"lo-fi",
"jazz"
],
"model": "mureka-9.5"
}Prompting Guide
- Describe the song in
prompt, up to 2000 characters: what it is about, the mood, the genre, the instruments and the vocals. - Add genres in
stylesto steer the genre (see Styles above). - To sing your own words, use Lyrics to Song instead:
POST https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song.
Example prompt
An upbeat summer song about a road trip with friends, with a catchy chorusModel Versions
Set model to mureka-7.6, mureka-o2, mureka-8, mureka-9 or mureka-9.5; mureka-9.5 applies when you leave it out. Each version is billed at its own rate per song; the pricing panel on this page lists them.
Example: choose a model version
{
"prompt": "A short, cheerful song for a birthday party",
"model": "mureka-7.6"
}Example Request
{
"prompt": "An upbeat summer song about a road trip with friends, with a catchy chorus",
"styles": [
"pop",
"rock"
],
"model": "mureka-9.5"
}Example Response
{
"request_id": "mureka-song-prompt_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-song-prompt_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty prompt, prompt not a string, or longer than 2000 characters | synchronous 400 |
styles not a list, an empty list, or more than 13 items | synchronous 400 |
model not one of the allowed values (written exactly as listed) | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
lyrics (to sing your own lyrics, use Lyrics to Song) | synchronous 400 |
gender (describe the voice in prompt) | synchronous 400 |
batch_size, num_images, number_of_images, n, count, num_instrumentals, num_songs, num_outputs (one song per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, music_length_ms (this API has no length setting) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body) | synchronous 400 |
webhook_url, webhook_mode, callback_url in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
stream (the result is delivered when the job completes) | synchronous 400 |
reference_id, vocal_id, melody_id (IDs from Mureka's own upload and voice services are not offered on this API) | synchronous 400 |
A styles entry that is not one of the genres listed | status: "ERROR" |
| A prompt the model refuses, for example under its content policy | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing prompt (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' is required",
"violations": [
"'prompt' is required"
]
}An empty styles list (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'styles' must have at least 1 item (got 0)",
"violations": [
"'styles' must have at least 1 item (got 0)"
]
}A model version that does not exist (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'model' must be one of: \"mureka-7.6\", \"mureka-o2\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-10\")",
"violations": [
"'model' must be one of: \"mureka-7.6\", \"mureka-o2\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-10\")"
]
}A field Prompt to Song does not accept (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'gender' must be one of: (got \"male\"); 'gender' is not accepted by prompt-to-song. Describe the voice in 'prompt'.",
"violations": [
"'gender' must be one of: (got \"male\")",
"'gender' is not accepted by prompt-to-song. Describe the voice in 'prompt'."
]
}More than one song per request (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'num_songs' must be one of: (got 2); 'num_songs' is not supported: each request returns one song. Send one request per song.",
"violations": [
"'num_songs' must be one of: (got 2)",
"'num_songs' is not supported: each request returns one song. Send one request per song."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the song from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/mureka-song-prompt_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "mureka-song-prompt_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-song-prompt",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — mureka-song-prompt for this endpoint. |
| output.media_url | array of strings | URL of the song (one MP3 file per request). |
| output.media_type | string | audio/mpeg. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/mureka-song-prompt/v1/prompt-to-song. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the song fromoutput.media_url.
How Billing Is Measured
Billing is measured per song: each request is billed once, at the rate of the model version you choose with model (mureka-9.5 when you leave it out). Prompt to Song and Lyrics to Song have separate rates. The length of the song does not change the amount. 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.
Mureka Song API Pricing
Billed per song at the rate of the model you choose with model (mureka-9.5 is the default). The length of the song does not change the price.
No data available
Could not load current pricing
Mureka Song API Documentation
Turn your own lyrics into a song with Mureka: send the words to sing in lyrics and, optionally, the musical style in prompt, the voice in gender and the model version in model. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the song from output.media_url.
POST https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-songAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Lyrics to Song - Mureka Song
Request Code
POST https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"lyrics": "[Verse]\nMorning light on an empty street\nCoffee warm and a steady beat\n[Chorus]\nWe keep on walking, side by side\nNothing to lose and nothing to hide",
"prompt": "indie pop, warm, acoustic guitar",
"model": "mureka-9.5"
}import requests
url = "https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"lyrics": "[Verse]\nMorning light on an empty street\nCoffee warm and a steady beat\n[Chorus]\nWe keep on walking, side by side\nNothing to lose and nothing to hide",
"prompt": "indie pop, warm, acoustic guitar",
"model": "mureka-9.5"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"lyrics": "[Verse]\nMorning light on an empty street\nCoffee warm and a steady beat\n[Chorus]\nWe keep on walking, side by side\nNothing to lose and nothing to hide",
"prompt": "indie pop, warm, acoustic guitar",
"model": "mureka-9.5"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"lyrics": "[Verse]\nMorning light on an empty street\nCoffee warm and a steady beat\n[Chorus]\nWe keep on walking, side by side\nNothing to lose and nothing to hide", "prompt": "indie pop, warm, acoustic guitar", "model": "mureka-9.5"}'Output
{
"request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"lyrics": "[Verse]\nMorning light on an empty street\nCoffee warm and a steady beat\n[Chorus]\nWe keep on walking, side by side\nNothing to lose and nothing to hide", "prompt": "indie pop, warm, acoustic guitar", "model": "mureka-9.5"}'Callback Payload (success)
{
"request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-song",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Failure callback shape
{
"request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "mureka-song",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
lyrics | Yes | string | — | Non-empty text, up to 5000 characters | The words to sing. Put section tags such as [Verse] and [Chorus] on their own lines (see the Prompting Guide below). |
prompt | No | string | Empty | Text, up to 1024 characters | The musical style: genre, mood, instruments and vocals, for example indie pop, warm, acoustic guitar. |
model | No | string | "mureka-9.5" | mureka-7.6, mureka-o2, mureka-8, mureka-9, mureka-9.5 | The model version. Each version has its own rate per song; mureka-9.5 applies when you leave it out. |
gender | No | string | — | female, male | Preferred voice for the vocals. |
Good to know
- Each request returns one song.
batch_size,num_images,number_of_images,n,count,num_instrumentals,num_songsandnum_outputsare rejected — send one request per song. - This API has no length setting: the model sets the length of the song, and the length does not change the amount billed.
duration,seconds,num_frames,frames_per_secondandmusic_length_msare rejected. - Send every field at the top level of the JSON body;
parameters,contentandtextare rejected. - Choose the model version with
model:mureka-7.6,mureka-o2,mureka-8,mureka-9ormureka-9.5;mureka-9.5applies when you leave it out. Each version has its own rate per song. - To describe a song instead of sending lyrics, use Prompt to Song:
POST https://gateway.pixazo.ai/mureka-song-prompt/v1/prompt-to-song.stylesis rejected here; describe the style inprompt. - IDs from Mureka's own upload and voice-clone services are not offered:
reference_id,vocal_idandmelody_idare rejected. Usegenderto ask for a female or male voice. - Use the JSON types shown: every field is a string, and
modelandgendertake exactly the values listed. - Omit a field instead of sending
null. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_url,webhook_modeandcallback_urlin the JSON body are rejected. streamis not supported: the result is delivered when the job completes.- Do not begin
lyricswithhttp://,https://ordata:— such a value is treated as a file to download, and the request is refused at submit with nothing charged.
Prompting Guide
- Write the words to sing in
lyrics, up to 5000 characters. Mark the parts of the song with section tags on their own lines, such as[Verse]and[Chorus], as in the example below. - Describe the musical style in
prompt, up to 1024 characters: genre, mood, instruments and the kind of vocals. - Use
genderto ask for a female or male voice.
Example lyrics with section tags
[Verse]
Morning light on an empty street
Coffee warm and a steady beat
[Chorus]
We keep on walking, side by side
Nothing to lose and nothing to hideExample: ask for a female voice
{
"lyrics": "[Verse]\nMorning light on an empty street\nCoffee warm and a steady beat\n[Chorus]\nWe keep on walking, side by side\nNothing to lose and nothing to hide",
"prompt": "acoustic ballad, gentle",
"gender": "female",
"model": "mureka-9.5"
}Model Versions
Set model to mureka-7.6, mureka-o2, mureka-8, mureka-9 or mureka-9.5; mureka-9.5 applies when you leave it out. Each version is billed at its own rate per song; the pricing panel on this page lists them.
Example: choose a model version
{
"lyrics": "[Verse]\nMorning light on an empty street\nCoffee warm and a steady beat\n[Chorus]\nWe keep on walking, side by side\nNothing to lose and nothing to hide",
"model": "mureka-7.6"
}Example Request
{
"lyrics": "[Verse]\nMorning light on an empty street\nCoffee warm and a steady beat\n[Chorus]\nWe keep on walking, side by side\nNothing to lose and nothing to hide",
"prompt": "indie pop, warm, acoustic guitar",
"model": "mureka-9.5"
}Example Response
{
"request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty lyrics, lyrics not a string, or longer than 5000 characters | synchronous 400 |
prompt not a string, or longer than 1024 characters | synchronous 400 |
model not one of the allowed values (written exactly as listed) | synchronous 400 |
gender not one of the allowed values (written exactly as listed) | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
styles (describe the style in prompt; genres in a list belong to Prompt to Song) | synchronous 400 |
batch_size, num_images, number_of_images, n, count, num_instrumentals, num_songs, num_outputs (one song per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, music_length_ms (this API has no length setting) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body) | synchronous 400 |
webhook_url, webhook_mode, callback_url in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
stream (the result is delivered when the job completes) | synchronous 400 |
reference_id, vocal_id, melody_id (IDs from Mureka's own upload and voice services are not offered on this API) | synchronous 400 |
| Lyrics or a style prompt the model refuses, for example under its content policy | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing lyrics (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'lyrics' is required",
"violations": [
"'lyrics' is required"
]
}A model version that does not exist (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'model' must be one of: \"mureka-7.6\", \"mureka-o2\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-10\")",
"violations": [
"'model' must be one of: \"mureka-7.6\", \"mureka-o2\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-10\")"
]
}A length setting (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be one of: (got 120); 'duration' is not accepted: this API has no length setting; the model sets the length of the song.",
"violations": [
"'duration' must be one of: (got 120)",
"'duration' is not accepted: this API has no length setting; the model sets the length of the song."
]
}More than one song per request (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'n' must be one of: (got 2); 'n' is not supported: each request returns one song. Send one request per song.",
"violations": [
"'n' must be one of: (got 2)",
"'n' is not supported: each request returns one song. Send one request per song."
]
}An ID from Mureka's own services (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'vocal_id' must be one of: (got \"1234567890\"); 'vocal_id' is not supported on this API: it needs an ID from Mureka's own voice clone service, which this API does not offer. Use 'gender' to ask for a female or male voice.",
"violations": [
"'vocal_id' must be one of: (got \"1234567890\")",
"'vocal_id' is not supported on this API: it needs an ID from Mureka's own voice clone service, which this API does not offer. Use 'gender' to ask for a female or male voice."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the song from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-song",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — mureka-song for this endpoint. |
| output.media_url | array of strings | URL of the song (one MP3 file per request). |
| output.media_type | string | audio/mpeg. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the song fromoutput.media_url.
How Billing Is Measured
Billing is measured per song: each request is billed once, at the rate of the model version you choose with model (mureka-9.5 when you leave it out). Lyrics to Song and Prompt to Song have separate rates. The length of the song does not change the amount. 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.
Mureka Song API Pricing
Billed per song at the rate of the model you choose with model (mureka-9.5 is the default). The length of the song does not change the price.
No data available
Could not load current pricing
Mureka Instrumental API Documentation
Generate instrumental music from a text prompt with Mureka: describe the music in prompt and choose the model version in model. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the track from output.media_url.
POST https://gateway.pixazo.ai/mureka-instrumental/v1/text-to-musicAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Music (Instrumental) - Mureka Instrumental
Request Code
POST https://gateway.pixazo.ai/mureka-instrumental/v1/text-to-music
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Warm lo-fi piano with soft drums and a slow, relaxed groove",
"model": "mureka-9.5"
}import requests
url = "https://gateway.pixazo.ai/mureka-instrumental/v1/text-to-music"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Warm lo-fi piano with soft drums and a slow, relaxed groove",
"model": "mureka-9.5"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/mureka-instrumental/v1/text-to-music", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "Warm lo-fi piano with soft drums and a slow, relaxed groove",
"model": "mureka-9.5"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/mureka-instrumental/v1/text-to-music' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "Warm lo-fi piano with soft drums and a slow, relaxed groove", "model": "mureka-9.5"}'Output
{
"request_id": "mureka-instrumental_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-instrumental_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/mureka-instrumental/v1/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": "Warm lo-fi piano with soft drums and a slow, relaxed groove", "model": "mureka-9.5"}'Callback Payload (success)
{
"request_id": "mureka-instrumental_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-instrumental",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Failure callback shape
{
"request_id": "mureka-instrumental_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "mureka-instrumental",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Non-empty text, up to 1024 characters | A description of the music: genre, mood, tempo and instruments. |
model | No | string | "mureka-9.5" | mureka-7.6, mureka-8, mureka-9, mureka-9.5 | The model version. Each version has its own rate per track; mureka-9.5 applies when you leave it out. |
Good to know
- Each request returns one track.
batch_size,num_images,number_of_images,n,count,num_instrumentals,num_songsandnum_outputsare rejected — send one request per track. - This API has no length setting: the model sets the length of the track, and the length does not change the amount billed.
duration,seconds,num_frames,frames_per_secondandmusic_length_msare rejected. - Send every field at the top level of the JSON body;
parameters,contentandtextare rejected. - Choose the model version with
model:mureka-7.6,mureka-8,mureka-9ormureka-9.5;mureka-9.5applies when you leave it out. Each version has its own rate per track. - This API makes instrumental music:
lyrics,styles,genderandvocal_idare rejected. To add vocals and lyrics, use Lyrics to Song:POST https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song. - IDs from Mureka's own upload services are not offered:
reference_id,melody_idandinstrumental_idare rejected; describe the music inprompt. - Use the JSON types shown:
promptandmodelare strings, andmodeltakes exactly the values listed. - Omit a field instead of sending
null. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_url,webhook_modeandcallback_urlin the JSON body are rejected. streamis not supported: the result is delivered when the job completes.
Prompting Guide
- Describe the music in
prompt, up to 1024 characters: genre, mood, tempo and instruments. - This API makes instrumental music. To add vocals and lyrics, use Lyrics to Song:
POST https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song.
Example prompt
Warm lo-fi piano with soft drums and a slow, relaxed grooveModel Versions
Set model to mureka-7.6, mureka-8, mureka-9 or mureka-9.5; mureka-9.5 applies when you leave it out. Each version is billed at its own rate per track; the pricing panel on this page lists them.
Example: choose a model version
{
"prompt": "Bright acoustic guitar with light percussion",
"model": "mureka-7.6"
}Example Request
{
"prompt": "Warm lo-fi piano with soft drums and a slow, relaxed groove",
"model": "mureka-9.5"
}Example Response
{
"request_id": "mureka-instrumental_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-instrumental_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty prompt, prompt not a string, or longer than 1024 characters | synchronous 400 |
model not one of the allowed values (written exactly as listed) | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
lyrics, styles, gender, vocal_id (this API makes instrumental music: describe it in prompt) | synchronous 400 |
batch_size, num_images, number_of_images, n, count, num_instrumentals, num_songs, num_outputs (one track per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, music_length_ms (this API has no length setting) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body) | synchronous 400 |
webhook_url, webhook_mode, callback_url in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
stream (the result is delivered when the job completes) | synchronous 400 |
reference_id, melody_id, instrumental_id (IDs from Mureka's own upload and voice services are not offered on this API) | synchronous 400 |
| A prompt the model refuses, for example under its content policy | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing prompt (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' is required",
"violations": [
"'prompt' is required"
]
}A model version this API does not offer (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'model' must be one of: \"mureka-7.6\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-o2\")",
"violations": [
"'model' must be one of: \"mureka-7.6\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-o2\")"
]
}An ID from Mureka's own services (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'instrumental_id' must be one of: (got \"1234567890\"); 'instrumental_id' is not supported on this API: it needs an ID from Mureka's own file upload service, which this API does not offer. Describe the music in 'prompt'.",
"violations": [
"'instrumental_id' must be one of: (got \"1234567890\")",
"'instrumental_id' is not supported on this API: it needs an ID from Mureka's own file upload service, which this API does not offer. Describe the music in 'prompt'."
]
}A length setting (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be one of: (got 60); 'duration' is not accepted: this API has no length setting; the model sets the length of the track.",
"violations": [
"'duration' must be one of: (got 60)",
"'duration' is not accepted: this API has no length setting; the model sets the length of the track."
]
}More than one track per request (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'num_instrumentals' must be one of: (got 2); 'num_instrumentals' is not supported: each request returns one instrumental track. Send one request per track.",
"violations": [
"'num_instrumentals' must be one of: (got 2)",
"'num_instrumentals' is not supported: each request returns one instrumental track. Send one request per track."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the track from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/mureka-instrumental_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "mureka-instrumental_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-instrumental",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — mureka-instrumental for this endpoint. |
| output.media_url | array of strings | URL of the track (one MP3 file per request). |
| output.media_type | string | audio/mpeg. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/mureka-instrumental/v1/text-to-music. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the track fromoutput.media_url.
How Billing Is Measured
Billing is measured per track: each request is billed once, at the rate of the model version you choose with model (mureka-9.5 when you leave it out). The length of the track does not change the amount. 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.
Mureka Instrumental API Pricing
Billed per track at the rate of the model you choose with model (mureka-9.5 is the default). The length of the track does not change the price.
No data available
Could not load current pricing
Mureka Podcast API Documentation
Turn a script into podcast audio with Mureka: send the conversation in conversations, one turn after another, each with its text and one of five voices. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the podcast from output.media_url.
POST https://gateway.pixazo.ai/mureka-podcast/v1/text-to-podcastAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Speech (Podcast) - Mureka Podcast
Request Code
POST https://gateway.pixazo.ai/mureka-podcast/v1/text-to-podcast
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"conversations": [
{
"text": "Welcome back to the show. Today we are talking about simple ways to sleep better.",
"voice": "Luna"
},
{
"text": "Thanks, Luna. The easiest one first: go to bed at the same time every night.",
"voice": "Jake"
}
]
}import requests
url = "https://gateway.pixazo.ai/mureka-podcast/v1/text-to-podcast"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"conversations": [
{
"text": "Welcome back to the show. Today we are talking about simple ways to sleep better.",
"voice": "Luna"
},
{
"text": "Thanks, Luna. The easiest one first: go to bed at the same time every night.",
"voice": "Jake"
}
]
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/mureka-podcast/v1/text-to-podcast", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"conversations": [
{
"text": "Welcome back to the show. Today we are talking about simple ways to sleep better.",
"voice": "Luna"
},
{
"text": "Thanks, Luna. The easiest one first: go to bed at the same time every night.",
"voice": "Jake"
}
]
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/mureka-podcast/v1/text-to-podcast' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"conversations": [{"text": "Welcome back to the show. Today we are talking about simple ways to sleep better.", "voice": "Luna"}, {"text": "Thanks, Luna. The easiest one first: go to bed at the same time every night.", "voice": "Jake"}]}'Output
{
"request_id": "mureka-podcast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-podcast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/mureka-podcast/v1/text-to-podcast' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"conversations": [{"text": "Welcome back to the show. Today we are talking about simple ways to sleep better.", "voice": "Luna"}, {"text": "Thanks, Luna. The easiest one first: go to bed at the same time every night.", "voice": "Jake"}]}'Callback Payload (success)
{
"request_id": "mureka-podcast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-podcast",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Failure callback shape
{
"request_id": "mureka-podcast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "mureka-podcast",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
conversations | Yes | array | — | 1–10 turns, in the order they are spoken | The script: one object per turn, each with text and voice (rows below). |
conversations[].text | Yes | string | — | 1–400 characters | What this turn says. |
conversations[].voice | Yes | string | — | Ethan, Victoria, Jake, Luna, Emma | The voice that speaks this turn. |
Good to know
- Each request returns one podcast.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per podcast. - The length of the podcast follows the script in
conversations.duration,seconds,num_frames,frames_per_secondandmusic_length_msare rejected. - Send every field at the top level of the JSON body;
parameters,contentandtextare rejected. - Send the script in
conversations: 1 to 10 turns, each withtext(up to 400 characters) andvoice(Ethan,Victoria,Jake,LunaorEmma). voice,modelandpromptare rejected at the top level: set a voice on each turn, and send the script asconversations.- The length of each turn and the voice names are checked when the podcast is generated: a turn over 400 characters or an unknown voice fails the request with
status: "ERROR", and nothing is charged. - Use the JSON types shown:
conversationsis a list of objects whosetextandvoiceare strings. - Omit a field instead of sending
null. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_url,webhook_modeandcallback_urlin the JSON body are rejected. streamis not supported: the result is delivered when the job completes.- Do not begin the
textof a turn withhttp://,https://ordata:— such a value is treated as a file to download, and the request is refused at submit with nothing charged.
Script and Voices
- Send the script in
conversations: 1 to 10 turns, in the order they are spoken. Each turn hastext(1 to 400 characters) andvoice. - Voices:
Ethan,Victoria,Jake,Luna,Emma, written exactly as listed. Give each speaker their own voice. - A turn over 400 characters or an unknown voice is refused when the podcast is generated (
status: "ERROR", nothing charged).
Example: a three-turn script with two voices
{
"conversations": [
{
"text": "Hello and welcome. This week we look at three easy habits for a calmer morning.",
"voice": "Ethan"
},
{
"text": "I tried the first one all week: no phone for the first ten minutes after waking up.",
"voice": "Victoria"
},
{
"text": "That is a great place to start. Let us hear how it went.",
"voice": "Ethan"
}
]
}Example Request
{
"conversations": [
{
"text": "Welcome back to the show. Today we are talking about simple ways to sleep better.",
"voice": "Luna"
},
{
"text": "Thanks, Luna. The easiest one first: go to bed at the same time every night.",
"voice": "Jake"
}
]
}Example Response
{
"request_id": "mureka-podcast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-podcast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty conversations, conversations not a list, or more than 10 items | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
voice at the top level (set a voice on each turn as conversations[].voice) | synchronous 400 |
model (podcast generation has no model setting) | synchronous 400 |
prompt (send the script as conversations) | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one podcast per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, music_length_ms (the length follows the script in conversations) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body) | synchronous 400 |
webhook_url, webhook_mode, callback_url in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
stream (the result is delivered when the job completes) | synchronous 400 |
A turn with empty text or more than 400 characters, or a voice that is not one of the five listed | status: "ERROR" |
| A script the model refuses, for example under its content policy | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
An empty script (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'conversations' is required",
"violations": [
"'conversations' is required"
]
}More than 10 turns (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'conversations' must have at most 10 items (got 11)",
"violations": [
"'conversations' must have at most 10 items (got 11)"
]
}A voice at the top level (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'voice' must be one of: (got \"Luna\"); 'voice' is not accepted at the top level. Set a voice on each turn as conversations[].voice.",
"violations": [
"'voice' must be one of: (got \"Luna\")",
"'voice' is not accepted at the top level. Set a voice on each turn as conversations[].voice."
]
}A length setting (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be one of: (got 60); 'duration' is not accepted: the length of the podcast follows the script in 'conversations'.",
"violations": [
"'duration' must be one of: (got 60)",
"'duration' is not accepted: the length of the podcast follows the script in 'conversations'."
]
}A prompt instead of a script (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'conversations' is required; 'prompt' must be one of: (got \"A podcast about sleep\"); 'prompt' is not accepted. Send the script as 'conversations': a list of turns, each with 'text' and 'voice'.",
"violations": [
"'conversations' is required",
"'prompt' must be one of: (got \"A podcast about sleep\")",
"'prompt' is not accepted. Send the script as 'conversations': a list of turns, each with 'text' and 'voice'."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the podcast from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/mureka-podcast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "mureka-podcast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-podcast",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — mureka-podcast for this endpoint. |
| output.media_url | array of strings | URL of the podcast (one MP3 file per request). |
| output.media_type | string | audio/mpeg. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/mureka-podcast/v1/text-to-podcast. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the podcast fromoutput.media_url.
How Billing Is Measured
Billing is measured per minute of generated audio. A podcast is billed in whole minutes: its length is rounded up to the next full minute. A hold is placed on your balance when you submit; when the podcast is ready, the charge is set from the length of the generated audio and any unused part of the hold is released. A failed request is not charged. The current rate is shown in the pricing panel on this page.
Mureka Podcast API Pricing
No data available
Could not load current pricing
Mureka Lyrics API Documentation
Write song lyrics and a title with Mureka: send the topic, theme or title of the song in prompt. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then read the title and the lyrics from output.
POST https://gateway.pixazo.ai/mureka-lyrics/v1/text-to-lyricsAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Text to Lyrics - Mureka Lyrics
Request Code
POST https://gateway.pixazo.ai/mureka-lyrics/v1/text-to-lyrics
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A song about leaving home for the first time"
}import requests
url = "https://gateway.pixazo.ai/mureka-lyrics/v1/text-to-lyrics"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A song about leaving home for the first time"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/mureka-lyrics/v1/text-to-lyrics", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "A song about leaving home for the first time"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/mureka-lyrics/v1/text-to-lyrics' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "A song about leaving home for the first time"}'Output
{
"request_id": "mureka-lyrics_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-lyrics_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/mureka-lyrics/v1/text-to-lyrics' \
-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": "A song about leaving home for the first time"}'Callback Payload (success)
{
"request_id": "mureka-lyrics_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-lyrics",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.json"
],
"media_type": "application/json",
"title": "The generated title",
"lyrics": "The generated lyrics"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Failure callback shape
{
"request_id": "mureka-lyrics_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "mureka-lyrics",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Non-empty text, up to 2000 characters | The topic, theme or title of the song to write lyrics for. |
Good to know
- Each request returns one set of lyrics.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per set of lyrics. - This API has no length setting.
duration,seconds,num_frames,frames_per_secondandmusic_length_msare rejected. - Send every field at the top level of the JSON body;
parameters,contentandtextare rejected. - Lyrics generation has no model setting:
modelis rejected. - Send the topic in
prompt;lyricsis rejected. - Each result holds one title and one set of lyrics. To turn the lyrics into a song, send them as
lyricsto Lyrics to Song:POST https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song. - Use the JSON types shown:
promptis a string. - Omit a field instead of sending
null. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_url,webhook_modeandcallback_urlin the JSON body are rejected. streamis not supported: the result is delivered when the job completes.
Using the Lyrics
A completed request holds a title in output.title and the lyrics in output.lyrics; the same two fields are also stored as a JSON file at output.media_url[0]. To turn the lyrics into a song, send output.lyrics as lyrics to Lyrics to Song: POST https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song.
Example Request
{
"prompt": "A song about leaving home for the first time"
}Example Response
{
"request_id": "mureka-lyrics_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-lyrics_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty prompt, prompt not a string, or longer than 2000 characters | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
model (lyrics generation has no model setting) | synchronous 400 |
lyrics (send the topic in prompt) | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one set of lyrics per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, music_length_ms (this API has no length setting) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body) | synchronous 400 |
webhook_url, webhook_mode, callback_url in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
stream (the result is delivered when the job completes) | synchronous 400 |
| A prompt the model refuses, for example under its content policy | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing prompt (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' is required",
"violations": [
"'prompt' is required"
]
}A prompt longer than 2000 characters (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' must be at most 2000 characters (got 2001)",
"violations": [
"'prompt' must be at most 2000 characters (got 2001)"
]
}A field this API does not accept (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'model' must be one of: (got \"mureka-9.5\"); 'model' is not accepted: lyrics generation has no model setting.",
"violations": [
"'model' must be one of: (got \"mureka-9.5\")",
"'model' is not accepted: lyrics generation has no model setting."
]
}More than one set of lyrics per request (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'n' must be one of: (got 2); 'n' is not supported: each request returns one set of lyrics. Send one request per set.",
"violations": [
"'n' must be one of: (got 2)",
"'n' is not supported: each request returns one set of lyrics. Send one request per set."
]
}Lyrics sent instead of a topic (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'lyrics' must be one of: (got \"[Verse]\"); 'lyrics' is not accepted by this API. Send the topic of the song in 'prompt'.",
"violations": [
"'lyrics' must be one of: (got \"[Verse]\")",
"'lyrics' is not accepted by this API. Send the topic of the song in 'prompt'."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then read output.title and output.lyrics (the same two fields are stored as a JSON file at output.media_url[0]). Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/mureka-lyrics_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "mureka-lyrics_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-lyrics",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.json"
],
"media_type": "application/json",
"title": "The generated title",
"lyrics": "The generated lyrics"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — mureka-lyrics for this endpoint. |
| output.title | string | The title of the song. |
| output.lyrics | string | The lyrics. |
| output.media_url | array of strings | URL of a JSON file holding the same title and lyrics. |
| output.media_type | string | application/json. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/mureka-lyrics/v1/text-to-lyrics. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, readoutput.titleandoutput.lyrics(the same two fields are stored as a JSON file atoutput.media_url[0]).
How Billing Is Measured
Billing is measured per request: each request is billed once, for one title and one set of lyrics. 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.
Mureka Lyrics API Pricing
No data available
Could not load current pricing
Mureka Lyrics Video API Documentation
Make a lyrics video with Mureka for a song you generated with Lyrics to Song, Prompt to Song or Text to Music (Instrumental): send the request_id of that song request as song_request_id and, optionally, a layout, an aspect ratio, a title, a cover image and the part of the song to use. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url.
POST https://gateway.pixazo.ai/mureka-lyrics-video/v1/song-to-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
Audio to Video (Lyrics Video) - Mureka Lyrics Video
Request Code
POST https://gateway.pixazo.ai/mureka-lyrics-video/v1/song-to-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"song_request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"selection_start": 0,
"selection_end": 30000,
"aspect_ratio": "9:16",
"layout": "layout_1"
}import requests
url = "https://gateway.pixazo.ai/mureka-lyrics-video/v1/song-to-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"song_request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"selection_start": 0,
"selection_end": 30000,
"aspect_ratio": "9:16",
"layout": "layout_1"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/mureka-lyrics-video/v1/song-to-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"song_request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"selection_start": 0,
"selection_end": 30000,
"aspect_ratio": "9:16",
"layout": "layout_1"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/mureka-lyrics-video/v1/song-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"song_request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "selection_start": 0, "selection_end": 30000, "aspect_ratio": "9:16", "layout": "layout_1"}'Output
{
"request_id": "mureka-lyrics-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-lyrics-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/mureka-lyrics-video/v1/song-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"song_request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "selection_start": 0, "selection_end": 30000, "aspect_ratio": "9:16", "layout": "layout_1"}'Callback Payload (success)
{
"request_id": "mureka-lyrics-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-lyrics-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Failure callback shape
{
"request_id": "mureka-lyrics-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "mureka-lyrics-video",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
song_request_id | Yes | string | — | A request_id, up to 84 characters | The request_id of a completed Lyrics to Song, Prompt to Song or Text to Music (Instrumental) request made with the same API key in the last 28 days. |
title | No | string | — | Text | A title to show in the video. |
cover_url | No | string | — | A publicly reachable https URL (recommended) or a data URI of a JPG, PNG or WebP image | A cover image. It needs layout set to one of layout_2 to layout_7. |
aspect_ratio | No | string | "9:16" | 16:9, 9:16, 3:4, 4:3 | Frame shape of the video. It does not change the amount billed. |
layout | No | string | "layout_1" | layout_1, layout_2, layout_3, layout_4, layout_5, layout_6, layout_7 | The visual template of the video; layout_1 has no cover. |
lyrics_start_row | No | integer | — | Whole number, 1 or more | First lyric row to show, counting from 1. Send it with lyrics_end_row, or send a time range instead: one of the two pairs is required. |
lyrics_end_row | No | integer | — | Whole number, 1 or more | Last lyric row to show. Send it with lyrics_start_row. |
selection_start | No | integer | — | Whole number, 0 or more | Start of the part of the song to use, in milliseconds. Send it with selection_end; required unless you send the lyric rows instead. |
selection_end | No | integer | — | Whole number, 1 or more | End of the part of the song to use, in milliseconds. Send it with selection_start. |
Good to know
- Each request returns one video.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per video. - This API has no length setting: the video covers the part of the song you choose with a time range or lyric rows (see below).
duration,seconds,num_frames,frames_per_secondandmusic_length_msare rejected. - Send every field at the top level of the JSON body;
parameters,contentandtextare rejected. - Name the song by
song_request_id: therequest_idyou received when you submitted a Lyrics to Song, Prompt to Song or Text to Music (Instrumental) request with the same API key. The song must have completed in the last 28 days. A request made with another API key is never accepted, and songs generated before lyrics videos were available cannot be used. song_idis rejected: sendsong_request_idinstead.- Lyric rows (
lyrics_start_row/lyrics_end_row) need a song with lyrics: they are refused for an instrumental track, whereselection_start/selection_endselect the part to use. cover_urlneedslayoutset to one oflayout_2tolayout_7;layout_1, the default, has no cover.- Choose the part of the song: send
selection_startandselection_end(milliseconds), orlyrics_start_rowandlyrics_end_row. One of the two pairs is required: a request with neither is refused. For the whole song, sendselection_start0andselection_endat the song's length, rounded down to the whole second. Each pair goes together, and the two kinds cannot be combined. - Send a cover image as
cover_url;coveris rejected. - Files from Mureka's own upload service are not offered:
upload_audio_idandbackground_idare rejected. - Use the JSON types shown:
lyrics_start_row,lyrics_end_row,selection_startandselection_endare whole numbers (0, not"0"); the other fields are strings. - Omit a field instead of sending
null. - Results are always returned as a URL in
output.media_url;sync_modeis accepted only asfalse. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_url,webhook_modeandcallback_urlin the JSON body are rejected. streamis not supported: the result is delivered when the job completes.- Do not begin
titlewithhttp://,https://ordata:— such a value is treated as a file to download, and the request is refused at submit with nothing charged. - Options this API does not offer are rejected:
show_author_name.
Song, Layout and Selection
song_request_idis therequest_idyou received when you submitted the song: a Lyrics to Song, Prompt to Song or Text to Music (Instrumental) request made with the same API key, completed in the last 28 days. Lyric rows need a song with lyrics.- Choose the template with
layout:layout_1,layout_2,layout_3,layout_4,layout_5,layout_6orlayout_7;layout_1applies when you leave it out and has no cover. Acover_urlneeds one oflayout_2tolayout_7. - Choose the frame shape with
aspect_ratio:16:9,9:16,3:4or4:3;9:16applies when you leave it out. - Choose the part of the song for the video: send either
selection_startandselection_endin milliseconds (for example a 30-second part), orlyrics_start_rowandlyrics_end_row, not both. One of the two is required. For the whole song, sendselection_start0andselection_endat the song's length in milliseconds, rounded down to the whole second (for example160000for a song of 160.2 seconds).
Example: a title, a cover image and lyric rows 1 to 8
{
"song_request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"title": "Morning Light",
"layout": "layout_2",
"cover_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"lyrics_start_row": 1,
"lyrics_end_row": 8
}Example: 30 seconds from the middle of the song, in landscape
{
"song_request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"selection_start": 60000,
"selection_end": 90000,
"aspect_ratio": "16:9"
}Example Request
{
"song_request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"selection_start": 0,
"selection_end": 30000,
"aspect_ratio": "9:16",
"layout": "layout_1"
}Example Response
{
"request_id": "mureka-lyrics-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/mureka-lyrics-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. A cover_url that cannot be downloaded is also refused at submit with a 400, and its hold is released at once: nothing is charged. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty song_request_id, song_request_id not a string, or longer than 84 characters | synchronous 400 |
A cover_url that cannot be downloaded when you submit (the hold is released at once: nothing is charged) | synchronous 400 |
cover_url needs layout set to one of layout_2 to layout_7: layout_1 (the default) has no cover | synchronous 400 |
lyrics_start_row must be sent with lyrics_end_row and cannot be combined with selection_start / selection_end | synchronous 400 |
lyrics_end_row must be sent with lyrics_start_row | synchronous 400 |
selection_start must be sent with selection_end (milliseconds) and cannot be combined with lyric-row selection | synchronous 400 |
selection_end must be sent with selection_start | synchronous 400 |
aspect_ratio not one of the allowed values (written exactly as listed) | synchronous 400 |
layout not one of the allowed values (written exactly as listed) | synchronous 400 |
title not a string | synchronous 400 |
cover_url not a string | synchronous 400 |
lyrics_start_row not a whole number of at least 1 — for example 0 or the string "1" | synchronous 400 |
lyrics_end_row not a whole number of at least 1 — for example 0 or the string "1" | synchronous 400 |
selection_start not a whole number of at least 0 — for example -1 or the string "0" | synchronous 400 |
selection_end not a whole number of at least 1 — for example 0 or the string "1" | synchronous 400 |
sync_mode set to anything other than false (results are always returned as a URL in output.media_url) | synchronous 400 |
song_id (name the song by its song_request_id) | synchronous 400 |
cover (send the cover image URL as cover_url) | synchronous 400 |
show_author_name (not offered on this API) | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one video per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, music_length_ms (the video covers the part of the song you choose: selection_start / selection_end or the lyric rows) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body) | synchronous 400 |
webhook_url, webhook_mode, callback_url in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
stream (the result is delivered when the job completes) | synchronous 400 |
upload_audio_id, background_id (IDs from Mureka's own upload and voice services are not offered on this API) | synchronous 400 |
A song_request_id that does not match a Lyrics to Song, Prompt to Song or Text to Music (Instrumental) request made with the same API key | synchronous 400 |
| A song request that has not completed, or that was generated more than 28 days ago | synchronous 400 |
| A song generated before lyrics videos were available (it has no reusable song reference) | synchronous 400 |
lyrics_start_row / lyrics_end_row with an instrumental track (it has no lyrics) | synchronous 400 |
song_id under another spelling or inside an object, for example SONG_ID, songId or input.song_id | synchronous 400 |
A song the model no longer keeps, although its song_request_id was accepted | status: "ERROR" |
| A selection that ends before it starts, or lyric rows beyond the end of the lyrics | status: "ERROR" |
| A request the model refuses, for example under its content policy | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing song_request_id (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'song_request_id' is required",
"violations": [
"'song_request_id' is required"
]
}A song_id sent instead of song_request_id (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'song_request_id' is required; 'song_id' must be one of: (got \"1234567890\"); 'song_id' is not accepted on this API. Send 'song_request_id': the request_id of a song or instrumental job made with this API key.",
"violations": [
"'song_request_id' is required",
"'song_id' must be one of: (got \"1234567890\")",
"'song_id' is not accepted on this API. Send 'song_request_id': the request_id of a song or instrumental job made with this API key."
]
}A value that is not allowed (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"3:4\", \"4:3\" (got \"21:9\")",
"violations": [
"'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"3:4\", \"4:3\" (got \"21:9\")"
]
}A cover with layout_1 (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'cover_url' needs 'layout' set to one of layout_2 to layout_7: layout_1 (the default) has no cover.",
"violations": [
"'cover_url' needs 'layout' set to one of layout_2 to layout_7: layout_1 (the default) has no cover."
]
}No part of the song chosen (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'selection_start' is required unless 'lyrics_start_row' is provided",
"violations": [
"'selection_start' is required unless 'lyrics_start_row' is provided"
]
}Half of a selection (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'selection_start' must be sent with 'selection_end' (milliseconds) and cannot be combined with lyric-row selection.",
"violations": [
"'selection_start' must be sent with 'selection_end' (milliseconds) and cannot be combined with lyric-row selection."
]
}A length setting (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be one of: (got 30); 'duration' is not accepted: to use part of the song, send 'selection_start' and 'selection_end' (milliseconds) or 'lyrics_start_row' and 'lyrics_end_row'.",
"violations": [
"'duration' must be one of: (got 30)",
"'duration' is not accepted: to use part of the song, send 'selection_start' and 'selection_end' (milliseconds) or 'lyrics_start_row' and 'lyrics_end_row'."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the video from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/mureka-lyrics-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "mureka-lyrics-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "mureka-lyrics-video",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-09T10:04:54.387Z",
"completed_at": "2026-10-09 10:06:21"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request — mureka-lyrics-video for this endpoint. |
| output.media_url | array of strings | URL of the video (one MP4 file per request). |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/mureka-lyrics-video/v1/song-to-video. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the video fromoutput.media_url.
How Billing Is Measured
Billing is measured per video: each request is billed once. The layout, aspect ratio, title, cover and the selected part of the song do not change the amount. The amount is placed as a hold when the request is submitted and released in full if the request fails. A song_request_id that is refused is answered before any hold, so nothing is charged. The current rate is shown in the pricing panel on this page.
Mureka Lyrics Video API Pricing
No data available
Could not load current pricing
⚡ Performance
Live usage measured on Pixazo's gateway, split by model version. Generation time is how long a generation takes end-to-end (lower is better). Success rate is the percent of generations that complete (higher is better).
〰 Uptime
Percent of generations that succeeded over the selected period, per model version.