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.

Get API Key
Mureka API

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

Authentication

All requests require an API key passed via header.

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

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/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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Non-empty text, up to 2000 charactersA description of the song: what it is about, the mood, the genre, the instruments and the vocals.
stylesNoarray—1–13 genres from: pop, rock, jazz, r&b, edm, ambient, folk, latin, k-pop, j-pop, house, gospel, lo-fiMusical genres for the song, written exactly as listed (see Styles below).
modelNostring"mureka-9.5"mureka-7.6, mureka-o2, mureka-8, mureka-9, mureka-9.5The 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_songs and num_outputs are 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_second and music_length_ms are rejected.
  • Send every field at the top level of the JSON body; parameters, content and text are rejected.
  • Choose the model version with model: mureka-7.6, mureka-o2, mureka-8, mureka-9 or mureka-9.5; mureka-9.5 applies 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. lyrics and gender are rejected here; describe the voice in prompt.
  • 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_id and melody_id are rejected.
  • Use the JSON types shown: prompt and model are strings and styles is 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_mode is accepted only as false.
  • Webhooks are set with the X-Webhook-URL / X-Webhook-Mode headers; webhook_url, webhook_mode and callback_url in the JSON body are rejected.
  • stream is 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 styles to 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 chorus

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

{
  "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

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 (see Webhook section).

Response Handling

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

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty prompt, prompt not a string, or longer than 2000 characterssynchronous 400
styles not a list, an empty list, or more than 13 itemssynchronous 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 listedstatus: "ERROR"
A prompt the model refuses, for example under its content policystatus: "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_KEY

cURL 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — mureka-song-prompt for this endpoint.
output.media_urlarray of stringsURL of the song (one MP3 file per request).
output.media_typestringaudio/mpeg.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.
polling_urlstringStatus URL for this request (submit response only).

Status Values & Flow

QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).

Typical workflow

  1. Send the request to POST https://gateway.pixazo.ai/mureka-song-prompt/v1/prompt-to-song.
  2. Save the request_id from the 202 response.
  3. Poll GET /v2/requests/status/{request_id} every 10 seconds or so, or use a Webhook instead.
  4. When status is COMPLETED, download the song from output.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

Text to Song (Lyrics)

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

Authentication

All requests require an API key passed via header.

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

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/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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
lyricsYesstring—Non-empty text, up to 5000 charactersThe words to sing. Put section tags such as [Verse] and [Chorus] on their own lines (see the Prompting Guide below).
promptNostringEmptyText, up to 1024 charactersThe musical style: genre, mood, instruments and vocals, for example indie pop, warm, acoustic guitar.
modelNostring"mureka-9.5"mureka-7.6, mureka-o2, mureka-8, mureka-9, mureka-9.5The model version. Each version has its own rate per song; mureka-9.5 applies when you leave it out.
genderNostring—female, malePreferred voice for the vocals.

Good to know

  • Each request returns one song. batch_size, num_images, number_of_images, n, count, num_instrumentals, num_songs and num_outputs are 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_second and music_length_ms are rejected.
  • Send every field at the top level of the JSON body; parameters, content and text are rejected.
  • Choose the model version with model: mureka-7.6, mureka-o2, mureka-8, mureka-9 or mureka-9.5; mureka-9.5 applies 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. styles is rejected here; describe the style in prompt.
  • IDs from Mureka's own upload and voice-clone services are not offered: reference_id, vocal_id and melody_id are rejected. Use gender to ask for a female or male voice.
  • Use the JSON types shown: every field is a string, and model and gender take exactly the values listed.
  • Omit a field instead of sending null.
  • Results are always returned as a URL in output.media_url; sync_mode is accepted only as false.
  • Webhooks are set with the X-Webhook-URL / X-Webhook-Mode headers; webhook_url, webhook_mode and callback_url in the JSON body are rejected.
  • stream is not supported: the result is delivered when the job completes.
  • Do not begin lyrics with http://, https:// or data: — 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 gender to 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 hide

Example: 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

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 (see Webhook section).

Response Handling

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

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty lyrics, lyrics not a string, or longer than 5000 characterssynchronous 400
prompt not a string, or longer than 1024 characterssynchronous 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 policystatus: "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_KEY

cURL 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — mureka-song for this endpoint.
output.media_urlarray of stringsURL of the song (one MP3 file per request).
output.media_typestringaudio/mpeg.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.
polling_urlstringStatus URL for this request (submit response only).

Status Values & Flow

QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).

Typical workflow

  1. Send the request to POST https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song.
  2. Save the request_id from the 202 response.
  3. Poll GET /v2/requests/status/{request_id} every 10 seconds or so, or use a Webhook instead.
  4. When status is COMPLETED, download the song from output.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

2. Mureka Instrumental

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

Authentication

All requests require an API key passed via header.

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

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/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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Non-empty text, up to 1024 charactersA description of the music: genre, mood, tempo and instruments.
modelNostring"mureka-9.5"mureka-7.6, mureka-8, mureka-9, mureka-9.5The 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_songs and num_outputs are 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_second and music_length_ms are rejected.
  • Send every field at the top level of the JSON body; parameters, content and text are rejected.
  • Choose the model version with model: mureka-7.6, mureka-8, mureka-9 or mureka-9.5; mureka-9.5 applies when you leave it out. Each version has its own rate per track.
  • This API makes instrumental music: lyrics, styles, gender and vocal_id are 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_id and instrumental_id are rejected; describe the music in prompt.
  • Use the JSON types shown: prompt and model are strings, and model takes exactly the values listed.
  • Omit a field instead of sending null.
  • Results are always returned as a URL in output.media_url; sync_mode is accepted only as false.
  • Webhooks are set with the X-Webhook-URL / X-Webhook-Mode headers; webhook_url, webhook_mode and callback_url in the JSON body are rejected.
  • stream is 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 groove

Model 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

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 (see Webhook section).

Response Handling

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

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty prompt, prompt not a string, or longer than 1024 characterssynchronous 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 policystatus: "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_KEY

cURL 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — mureka-instrumental for this endpoint.
output.media_urlarray of stringsURL of the track (one MP3 file per request).
output.media_typestringaudio/mpeg.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.
polling_urlstringStatus URL for this request (submit response only).

Status Values & Flow

QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).

Typical workflow

  1. Send the request to POST https://gateway.pixazo.ai/mureka-instrumental/v1/text-to-music.
  2. Save the request_id from the 202 response.
  3. Poll GET /v2/requests/status/{request_id} every 10 seconds or so, or use a Webhook instead.
  4. When status is COMPLETED, download the track from output.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

3. Mureka Podcast

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

Authentication

All requests require an API key passed via header.

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

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/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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
conversationsYesarray—1–10 turns, in the order they are spokenThe script: one object per turn, each with text and voice (rows below).
conversations[].textYesstring—1–400 charactersWhat this turn says.
conversations[].voiceYesstring—Ethan, Victoria, Jake, Luna, EmmaThe voice that speaks this turn.

Good to know

  • Each request returns one podcast. batch_size, num_images, number_of_images, n and count are rejected — send one request per podcast.
  • The length of the podcast follows the script in conversations. duration, seconds, num_frames, frames_per_second and music_length_ms are rejected.
  • Send every field at the top level of the JSON body; parameters, content and text are rejected.
  • Send the script in conversations: 1 to 10 turns, each with text (up to 400 characters) and voice (Ethan, Victoria, Jake, Luna or Emma).
  • voice, model and prompt are rejected at the top level: set a voice on each turn, and send the script as conversations.
  • 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: conversations is a list of objects whose text and voice are strings.
  • Omit a field instead of sending null.
  • Results are always returned as a URL in output.media_url; sync_mode is accepted only as false.
  • Webhooks are set with the X-Webhook-URL / X-Webhook-Mode headers; webhook_url, webhook_mode and callback_url in the JSON body are rejected.
  • stream is not supported: the result is delivered when the job completes.
  • Do not begin the text of a turn with http://, https:// or data: — 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 has text (1 to 400 characters) and voice.
  • 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

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 (see Webhook section).

Response Handling

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

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty conversations, conversations not a list, or more than 10 itemssynchronous 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 listedstatus: "ERROR"
A script the model refuses, for example under its content policystatus: "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_KEY

cURL 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — mureka-podcast for this endpoint.
output.media_urlarray of stringsURL of the podcast (one MP3 file per request).
output.media_typestringaudio/mpeg.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.
polling_urlstringStatus URL for this request (submit response only).

Status Values & Flow

QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).

Typical workflow

  1. Send the request to POST https://gateway.pixazo.ai/mureka-podcast/v1/text-to-podcast.
  2. Save the request_id from the 202 response.
  3. Poll GET /v2/requests/status/{request_id} every 10 seconds or so, or use a Webhook instead.
  4. When status is COMPLETED, download the podcast from output.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

4. Mureka Lyrics

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

Authentication

All requests require an API key passed via header.

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

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/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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Non-empty text, up to 2000 charactersThe 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, n and count are rejected — send one request per set of lyrics.
  • This API has no length setting. duration, seconds, num_frames, frames_per_second and music_length_ms are rejected.
  • Send every field at the top level of the JSON body; parameters, content and text are rejected.
  • Lyrics generation has no model setting: model is rejected.
  • Send the topic in prompt; lyrics is rejected.
  • Each result holds one title and one set of lyrics. To turn the lyrics into a song, send them as lyrics to Lyrics to Song: POST https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song.
  • Use the JSON types shown: prompt is a string.
  • Omit a field instead of sending null.
  • Results are always returned as a URL in output.media_url; sync_mode is accepted only as false.
  • Webhooks are set with the X-Webhook-URL / X-Webhook-Mode headers; webhook_url, webhook_mode and callback_url in the JSON body are rejected.
  • stream is 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

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 (see Webhook section).

Response Handling

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

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty prompt, prompt not a string, or longer than 2000 characterssynchronous 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 policystatus: "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_KEY

cURL 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — mureka-lyrics for this endpoint.
output.titlestringThe title of the song.
output.lyricsstringThe lyrics.
output.media_urlarray of stringsURL of a JSON file holding the same title and lyrics.
output.media_typestringapplication/json.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.
polling_urlstringStatus URL for this request (submit response only).

Status Values & Flow

QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).

Typical workflow

  1. Send the request to POST https://gateway.pixazo.ai/mureka-lyrics/v1/text-to-lyrics.
  2. Save the request_id from the 202 response.
  3. Poll GET /v2/requests/status/{request_id} every 10 seconds or so, or use a Webhook instead.
  4. When status is COMPLETED, read output.title and output.lyrics (the same two fields are stored as a JSON file at output.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

5. Mureka Lyrics Video

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

Authentication

All requests require an API key passed via header.

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

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/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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
song_request_idYesstring—A request_id, up to 84 charactersThe 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.
titleNostring—TextA title to show in the video.
cover_urlNostring—A publicly reachable https URL (recommended) or a data URI of a JPG, PNG or WebP imageA cover image. It needs layout set to one of layout_2 to layout_7.
aspect_ratioNostring"9:16"16:9, 9:16, 3:4, 4:3Frame shape of the video. It does not change the amount billed.
layoutNostring"layout_1"layout_1, layout_2, layout_3, layout_4, layout_5, layout_6, layout_7The visual template of the video; layout_1 has no cover.
lyrics_start_rowNointeger—Whole number, 1 or moreFirst 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_rowNointeger—Whole number, 1 or moreLast lyric row to show. Send it with lyrics_start_row.
selection_startNointeger—Whole number, 0 or moreStart of the part of the song to use, in milliseconds. Send it with selection_end; required unless you send the lyric rows instead.
selection_endNointeger—Whole number, 1 or moreEnd 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, n and count are 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_second and music_length_ms are rejected.
  • Send every field at the top level of the JSON body; parameters, content and text are rejected.
  • Name the song by song_request_id: the request_id you 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_id is rejected: send song_request_id instead.
  • Lyric rows (lyrics_start_row / lyrics_end_row) need a song with lyrics: they are refused for an instrumental track, where selection_start / selection_end select the part to use.
  • cover_url needs layout set to one of layout_2 to layout_7; layout_1, the default, has no cover.
  • Choose the part of the song: send selection_start and selection_end (milliseconds), or lyrics_start_row and lyrics_end_row. One of the two pairs is required: a request with neither is refused. For the whole song, send selection_start 0 and selection_end at 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; cover is rejected.
  • Files from Mureka's own upload service are not offered: upload_audio_id and background_id are rejected.
  • Use the JSON types shown: lyrics_start_row, lyrics_end_row, selection_start and selection_end are 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_mode is accepted only as false.
  • Webhooks are set with the X-Webhook-URL / X-Webhook-Mode headers; webhook_url, webhook_mode and callback_url in the JSON body are rejected.
  • stream is not supported: the result is delivered when the job completes.
  • Do not begin title with http://, https:// or data: — 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_id is the request_id you 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_6 or layout_7; layout_1 applies when you leave it out and has no cover. A cover_url needs one of layout_2 to layout_7.
  • Choose the frame shape with aspect_ratio: 16:9, 9:16, 3:4 or 4:3; 9:16 applies when you leave it out.
  • Choose the part of the song for the video: send either selection_start and selection_end in milliseconds (for example a 30-second part), or lyrics_start_row and lyrics_end_row, not both. One of the two is required. For the whole song, send selection_start 0 and selection_end at the song's length in milliseconds, rounded down to the whole second (for example 160000 for 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

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 (see Webhook section).

Response Handling

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

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty song_request_id, song_request_id not a string, or longer than 84 characterssynchronous 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 coversynchronous 400
lyrics_start_row must be sent with lyrics_end_row and cannot be combined with selection_start / selection_endsynchronous 400
lyrics_end_row must be sent with lyrics_start_rowsynchronous 400
selection_start must be sent with selection_end (milliseconds) and cannot be combined with lyric-row selectionsynchronous 400
selection_end must be sent with selection_startsynchronous 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 stringsynchronous 400
cover_url not a stringsynchronous 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 keysynchronous 400
A song request that has not completed, or that was generated more than 28 days agosynchronous 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_idsynchronous 400
A song the model no longer keeps, although its song_request_id was acceptedstatus: "ERROR"
A selection that ends before it starts, or lyric rows beyond the end of the lyricsstatus: "ERROR"
A request the model refuses, for example under its content policystatus: "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_KEY

cURL 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — mureka-lyrics-video for this endpoint.
output.media_urlarray of stringsURL of the video (one MP4 file per request).
output.media_typestringvideo/mp4.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.
polling_urlstringStatus URL for this request (submit response only).

Status Values & Flow

QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).

Typical workflow

  1. Send the request to POST https://gateway.pixazo.ai/mureka-lyrics-video/v1/song-to-video.
  2. Save the request_id from the 202 response.
  3. Poll GET /v2/requests/status/{request_id} every 10 seconds or so, or use a Webhook instead.
  4. When status is COMPLETED, download the video from output.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).

Show data for the last
Generations
1,100last 30d
~37 per day
Success rate
81.8%
of completed generations
Generation time
80.6savg
p95 111.0s
Requests
Sep 16max 300Oct 15
Mureka SongAvg 13/day
Mureka Lyrics VideoAvg 10/day
Mureka PodcastAvg 7/day
Mureka InstrumentalAvg 3/day
Mureka LyricsAvg 3/day
Generation Time
Sep 16max 2.3minOct 15
Mureka SongAvg 99.6s
Mureka Lyrics VideoAvg 108.1s
Mureka PodcastAvg 27.1s
Mureka InstrumentalAvg 69.5s
Mureka LyricsAvg 13.8s
Error Rate
Sep 16max 50.0%Oct 15
Mureka SongAvg 0.0%
Mureka Lyrics VideoAvg 33.3%
Mureka PodcastAvg 50.0%
Mureka InstrumentalAvg 0.0%
Mureka LyricsAvg 0.0%

〰 Uptime

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

Avg. Success Rate (30d)
81.82%
across all generations of this model family
Uptime
Sep 16max 100%Oct 15
Mureka SongAvg 100.00%
Mureka Lyrics VideoAvg 66.67%
Mureka PodcastAvg 50.00%
Mureka InstrumentalAvg 100.00%
Mureka LyricsAvg 100.00%