---
type: AI Model
id: mureka
title: Mureka API
provider: Mureka
description: "Music generation by Mureka. Generate a song from your own lyrics or from a short description of the song you want, or an instrumental track from a text prompt. Choose the model version with the model field; mureka-9.5 is the default."
resource: https://www.pixazo.ai/models/mureka
docs_url: https://www.pixazo.ai/models/mureka
latest_version: 9.5
tags:
  - text-to-song
  - text-to-music
  - text-to-speech
  - audio-to-video
  - mureka
variants:
  - id: mureka-song
    name: Mureka Song
    version: 9.5
    capabilities:
      - Text to Song
      - Text to Song (Lyrics)
  - id: mureka-instrumental
    name: Mureka Instrumental
    version: 9.5
    capabilities:
      - Text to Music (Instrumental)
  - id: mureka-podcast
    name: Mureka Podcast
    version: Podcast
    capabilities:
      - Text to Speech (Podcast)
  - id: mureka-lyrics
    name: Mureka Lyrics
    version: Lyrics
    capabilities:
      - Text to Song (Lyrics)
  - id: mureka-lyrics-video
    name: Mureka Lyrics Video
    version: Lyrics Video
    capabilities:
      - Audio to Video (Lyrics Video)
timestamp: 2026-10-14T17:01:08.764Z
---

# Mureka API

> Provider: **Mureka**
> Source: https://www.pixazo.ai/models/mureka

Music generation by Mureka. Generate a song from your own lyrics or from a short description of the song you want, or an instrumental track from a text prompt. Choose the model version with the model field; mureka-9.5 is the default.

## Mureka Song

### Text to Song

## Mureka Prompt to 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.

Header

Type

Required

Description

Ocp-Apim-Subscription-Key

string

Yes

Your API subscription key

## Prompt to Song - Mureka Song

## Request Code

HTTP Python JavaScript cURL

```
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"
}
```

[Try Now](https://api.pixazo.ai/api-details#api=mureka-song-prompt&operation=prompt-to-song)

## Webhook (Optional)

Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.

Header

Required

Description

X-Webhook-URL

To enable

HTTPS URL to receive the Webhook callback.

X-Webhook-Mode

No

`terminal` (default, one callback on COMPLETED/ERROR) or `sync` (per-poll callbacks).

### Example: enable Webhook

```
curl -X POST 'https://gateway.pixazo.ai/mureka-song-prompt/v1/prompt-to-song' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  -H 'X-Webhook-URL: https://your-server.com/webhook' \
  --data-raw '{"prompt": "An upbeat summer song about a road trip with friends, with a catchy chorus", "styles": ["pop", "rock"], "model": "mureka-9.5"}'
```

### Callback Payload (success)

```
{
  "request_id": "mureka-song-prompt_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "mureka-song-prompt",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
    ],
    "media_type": "audio/mpeg"
  },
  "created_at": "2026-10-09T10:04:54.387Z",
  "completed_at": "2026-10-09 10:06:21"
}
```

### Failure callback shape

```
{
  "request_id": "mureka-song-prompt_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "mureka-song-prompt",
  "error": "Description of the failure"
}
```

#### Delivery semantics

-   **terminal** mode: one Webhook callback when the request is COMPLETED or ERROR.
-   **sync** mode: a Webhook callback on every poll while the request is processing (status `PROCESSING`), plus the final COMPLETED/ERROR callback.
-   Callbacks are idempotent on `request_id` — de-duplicate on it.
-   Respond `200` within a few seconds; the Webhook endpoint must be HTTPS.

## Request Parameters

Parameter

Required

Type

Default

Allowed values / range

Description

`prompt`

Yes

string

—

Non-empty text, up to 2000 characters

A description of the song: what it is about, the mood, the genre, the instruments and the vocals.

`styles`

No

array

—

1–13 genres from: `pop`, `rock`, `jazz`, `r&b`, `edm`, `ambient`, `folk`, `latin`, `k-pop`, `j-pop`, `house`, `gospel`, `lo-fi`

Musical genres for the song, written exactly as listed (see Styles below).

`model`

No

string

`"mureka-9.5"`

`mureka-7.6`, `mureka-o2`, `mureka-8`, `mureka-9`, `mureka-9.5`

The model version. Each version has its own rate per song; `mureka-9.5` applies when you leave it out.

### Good to know

-   Each request returns **one song**. `batch_size`, `num_images`, `number_of_images`, `n`, `count`, `num_instrumentals`, `num_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

Header

Required

Description

Content-Type

Yes

`application/json`

Ocp-Apim-Subscription-Key

Yes

Your API subscription key.

X-Webhook-URL

No

Enable Webhook callbacks (see Webhook section).

X-Webhook-Mode

No

`terminal` (default) or `sync` (see Webhook section).

## Response Handling

Status Code

Meaning

202

Accepted — request queued; returns `request_id` and `polling_url`.

400

Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix.

401

Unauthorized — missing or invalid subscription key.

402

Insufficient balance for the hold this request needs.

429

Too many requests.

500

Internal server error.

Parameter problems are caught when you submit and returned as a `400`, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as `status: "ERROR"`, with a message in `error` saying what went wrong. Failed requests are not billed — the hold is released in full.

Condition

How it surfaces

Missing or invalid subscription key

synchronous `401`

Balance too low for the hold

synchronous `402`

Missing or empty `prompt`, `prompt` not a string, or longer than 2000 characters

synchronous `400`

`styles` not a list, an empty list, or more than 13 items

synchronous `400`

`model` not one of the allowed values (written exactly as listed)

synchronous `400`

`sync_mode` set to anything other than `false` (results are always returned as a URL in `output.media_url`)

synchronous `400`

`lyrics` (to sing your own lyrics, use Lyrics to Song)

synchronous `400`

`gender` (describe the voice in `prompt`)

synchronous `400`

`batch_size`, `num_images`, `number_of_images`, `n`, `count`, `num_instrumentals`, `num_songs`, `num_outputs` (one song per request)

synchronous `400`

`duration`, `seconds`, `num_frames`, `frames_per_second`, `music_length_ms` (this API has no length setting)

synchronous `400`

`parameters`, `content`, `text` (send the fields at the top level of the JSON body)

synchronous `400`

`webhook_url`, `webhook_mode`, `callback_url` in the JSON body (use the `X-Webhook-URL` / `X-Webhook-Mode` headers)

synchronous `400`

`stream` (the result is delivered when the job completes)

synchronous `400`

`reference_id`, `vocal_id`, `melody_id` (IDs from Mureka's own upload and voice services are not offered on this API)

synchronous `400`

A `styles` entry that is not one of the genres listed

`status: "ERROR"`

A prompt the model refuses, for example under its content policy

`status: "ERROR"`

### Example error responses

A refused request returns `error`, a `message` that joins every problem found, and the same problems one by one in `violations`.

#### Missing `prompt` (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'prompt' is required",
  "violations": [
    "'prompt' is required"
  ]
}
```

#### An empty `styles` list (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'styles' must have at least 1 item (got 0)",
  "violations": [
    "'styles' must have at least 1 item (got 0)"
  ]
}
```

#### A model version that does not exist (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'model' must be one of: \"mureka-7.6\", \"mureka-o2\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-10\")",
  "violations": [
    "'model' must be one of: \"mureka-7.6\", \"mureka-o2\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-10\")"
  ]
}
```

#### A field Prompt to Song does not accept (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'gender' must be one of:  (got \"male\"); 'gender' is not accepted by prompt-to-song. Describe the voice in 'prompt'.",
  "violations": [
    "'gender' must be one of:  (got \"male\")",
    "'gender' is not accepted by prompt-to-song. Describe the voice in 'prompt'."
  ]
}
```

#### More than one song per request (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'num_songs' must be one of:  (got 2); 'num_songs' is not supported: each request returns one song. Send one request per song.",
  "violations": [
    "'num_songs' must be one of:  (got 2)",
    "'num_songs' is not supported: each request returns one song. Send one request per song."
  ]
}
```

## Retrieving Results

Poll the status endpoint with the `request_id` from the submit response until `status` is `COMPLETED` or `ERROR`, then download the song from `output.media_url`. Treat any status other than `QUEUED`, `PROCESSING` or `COMPLETED` as a failure.

### Endpoint

```
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_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

Field

Type

Description

request\_id

string

Unique request identifier.

status

string

QUEUED, PROCESSING, COMPLETED or ERROR.

model\_id

string

The model that handled the request — `mureka-song-prompt` for this endpoint.

output.media\_url

array of strings

URL of the song (one MP3 file per request).

output.media\_type

string

`audio/mpeg`.

created\_at

string

Request creation timestamp.

completed\_at

string

Completion timestamp.

error

string

Error message when `status` is ERROR.

polling\_url

string

Status URL for this request (submit response only).

## Status Values & Flow

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

### Typical workflow

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.

### Text to Song (Lyrics)

## Mureka Lyrics to 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.

Header

Type

Required

Description

Ocp-Apim-Subscription-Key

string

Yes

Your API subscription key

## Lyrics to Song - Mureka Song

## Request Code

HTTP Python JavaScript cURL

```
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"
}
```

[Try Now](https://api.pixazo.ai/api-details#api=mureka-song&operation=lyrics-to-song)

## Webhook (Optional)

Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.

Header

Required

Description

X-Webhook-URL

To enable

HTTPS URL to receive the Webhook callback.

X-Webhook-Mode

No

`terminal` (default, one callback on COMPLETED/ERROR) or `sync` (per-poll callbacks).

### Example: enable Webhook

```
curl -X POST 'https://gateway.pixazo.ai/mureka-song/v1/lyrics-to-song' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  -H 'X-Webhook-URL: https://your-server.com/webhook' \
  --data-raw '{"lyrics": "[Verse]\nMorning light on an empty street\nCoffee warm and a steady beat\n[Chorus]\nWe keep on walking, side by side\nNothing to lose and nothing to hide", "prompt": "indie pop, warm, acoustic guitar", "model": "mureka-9.5"}'
```

### Callback Payload (success)

```
{
  "request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "mureka-song",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
    ],
    "media_type": "audio/mpeg"
  },
  "created_at": "2026-10-09T10:04:54.387Z",
  "completed_at": "2026-10-09 10:06:21"
}
```

### Failure callback shape

```
{
  "request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "mureka-song",
  "error": "Description of the failure"
}
```

#### Delivery semantics

-   **terminal** mode: one Webhook callback when the request is COMPLETED or ERROR.
-   **sync** mode: a Webhook callback on every poll while the request is processing (status `PROCESSING`), plus the final COMPLETED/ERROR callback.
-   Callbacks are idempotent on `request_id` — de-duplicate on it.
-   Respond `200` within a few seconds; the Webhook endpoint must be HTTPS.

## Request Parameters

Parameter

Required

Type

Default

Allowed values / range

Description

`lyrics`

Yes

string

—

Non-empty text, up to 5000 characters

The words to sing. Put section tags such as `[Verse]` and `[Chorus]` on their own lines (see the Prompting Guide below).

`prompt`

No

string

Empty

Text, up to 1024 characters

The musical style: genre, mood, instruments and vocals, for example `indie pop, warm, acoustic guitar`.

`model`

No

string

`"mureka-9.5"`

`mureka-7.6`, `mureka-o2`, `mureka-8`, `mureka-9`, `mureka-9.5`

The model version. Each version has its own rate per song; `mureka-9.5` applies when you leave it out.

`gender`

No

string

—

`female`, `male`

Preferred voice for the vocals.

### Good to know

-   Each request returns **one song**. `batch_size`, `num_images`, `number_of_images`, `n`, `count`, `num_instrumentals`, `num_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

Header

Required

Description

Content-Type

Yes

`application/json`

Ocp-Apim-Subscription-Key

Yes

Your API subscription key.

X-Webhook-URL

No

Enable Webhook callbacks (see Webhook section).

X-Webhook-Mode

No

`terminal` (default) or `sync` (see Webhook section).

## Response Handling

Status Code

Meaning

202

Accepted — request queued; returns `request_id` and `polling_url`.

400

Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix.

401

Unauthorized — missing or invalid subscription key.

402

Insufficient balance for the hold this request needs.

429

Too many requests.

500

Internal server error.

Parameter problems are caught when you submit and returned as a `400`, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as `status: "ERROR"`, with a message in `error` saying what went wrong. Failed requests are not billed — the hold is released in full.

Condition

How it surfaces

Missing or invalid subscription key

synchronous `401`

Balance too low for the hold

synchronous `402`

Missing or empty `lyrics`, `lyrics` not a string, or longer than 5000 characters

synchronous `400`

`prompt` not a string, or longer than 1024 characters

synchronous `400`

`model` not one of the allowed values (written exactly as listed)

synchronous `400`

`gender` not one of the allowed values (written exactly as listed)

synchronous `400`

`sync_mode` set to anything other than `false` (results are always returned as a URL in `output.media_url`)

synchronous `400`

`styles` (describe the style in `prompt`; genres in a list belong to Prompt to Song)

synchronous `400`

`batch_size`, `num_images`, `number_of_images`, `n`, `count`, `num_instrumentals`, `num_songs`, `num_outputs` (one song per request)

synchronous `400`

`duration`, `seconds`, `num_frames`, `frames_per_second`, `music_length_ms` (this API has no length setting)

synchronous `400`

`parameters`, `content`, `text` (send the fields at the top level of the JSON body)

synchronous `400`

`webhook_url`, `webhook_mode`, `callback_url` in the JSON body (use the `X-Webhook-URL` / `X-Webhook-Mode` headers)

synchronous `400`

`stream` (the result is delivered when the job completes)

synchronous `400`

`reference_id`, `vocal_id`, `melody_id` (IDs from Mureka's own upload and voice services are not offered on this API)

synchronous `400`

Lyrics or a style prompt the model refuses, for example under its content policy

`status: "ERROR"`

### Example error responses

A refused request returns `error`, a `message` that joins every problem found, and the same problems one by one in `violations`.

#### Missing `lyrics` (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'lyrics' is required",
  "violations": [
    "'lyrics' is required"
  ]
}
```

#### A model version that does not exist (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'model' must be one of: \"mureka-7.6\", \"mureka-o2\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-10\")",
  "violations": [
    "'model' must be one of: \"mureka-7.6\", \"mureka-o2\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-10\")"
  ]
}
```

#### A length setting (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'duration' must be one of:  (got 120); 'duration' is not accepted: this API has no length setting; the model sets the length of the song.",
  "violations": [
    "'duration' must be one of:  (got 120)",
    "'duration' is not accepted: this API has no length setting; the model sets the length of the song."
  ]
}
```

#### More than one song per request (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'n' must be one of:  (got 2); 'n' is not supported: each request returns one song. Send one request per song.",
  "violations": [
    "'n' must be one of:  (got 2)",
    "'n' is not supported: each request returns one song. Send one request per song."
  ]
}
```

#### An ID from Mureka's own services (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'vocal_id' must be one of:  (got \"1234567890\"); 'vocal_id' is not supported on this API: it needs an ID from Mureka's own voice clone service, which this API does not offer. Use 'gender' to ask for a female or male voice.",
  "violations": [
    "'vocal_id' must be one of:  (got \"1234567890\")",
    "'vocal_id' is not supported on this API: it needs an ID from Mureka's own voice clone service, which this API does not offer. Use 'gender' to ask for a female or male voice."
  ]
}
```

## Retrieving Results

Poll the status endpoint with the `request_id` from the submit response until `status` is `COMPLETED` or `ERROR`, then download the song from `output.media_url`. Treat any status other than `QUEUED`, `PROCESSING` or `COMPLETED` as a failure.

### Endpoint

```
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_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

Field

Type

Description

request\_id

string

Unique request identifier.

status

string

QUEUED, PROCESSING, COMPLETED or ERROR.

model\_id

string

The model that handled the request — `mureka-song` for this endpoint.

output.media\_url

array of strings

URL of the song (one MP3 file per request).

output.media\_type

string

`audio/mpeg`.

created\_at

string

Request creation timestamp.

completed\_at

string

Completion timestamp.

error

string

Error message when `status` is ERROR.

polling\_url

string

Status URL for this request (submit response only).

## Status Values & Flow

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

### Typical workflow

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 Instrumental

### Text to Music (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.

Header

Type

Required

Description

Ocp-Apim-Subscription-Key

string

Yes

Your API subscription key

## Text to Music (Instrumental) - Mureka Instrumental

## Request Code

HTTP Python JavaScript cURL

```
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"
}
```

[Try Now](https://api.pixazo.ai/api-details#api=mureka-instrumental&operation=text-to-music)

## Webhook (Optional)

Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.

Header

Required

Description

X-Webhook-URL

To enable

HTTPS URL to receive the Webhook callback.

X-Webhook-Mode

No

`terminal` (default, one callback on COMPLETED/ERROR) or `sync` (per-poll callbacks).

### Example: enable Webhook

```
curl -X POST 'https://gateway.pixazo.ai/mureka-instrumental/v1/text-to-music' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  -H 'X-Webhook-URL: https://your-server.com/webhook' \
  --data-raw '{"prompt": "Warm lo-fi piano with soft drums and a slow, relaxed groove", "model": "mureka-9.5"}'
```

### Callback Payload (success)

```
{
  "request_id": "mureka-instrumental_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "mureka-instrumental",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
    ],
    "media_type": "audio/mpeg"
  },
  "created_at": "2026-10-09T10:04:54.387Z",
  "completed_at": "2026-10-09 10:06:21"
}
```

### Failure callback shape

```
{
  "request_id": "mureka-instrumental_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "mureka-instrumental",
  "error": "Description of the failure"
}
```

#### Delivery semantics

-   **terminal** mode: one Webhook callback when the request is COMPLETED or ERROR.
-   **sync** mode: a Webhook callback on every poll while the request is processing (status `PROCESSING`), plus the final COMPLETED/ERROR callback.
-   Callbacks are idempotent on `request_id` — de-duplicate on it.
-   Respond `200` within a few seconds; the Webhook endpoint must be HTTPS.

## Request Parameters

Parameter

Required

Type

Default

Allowed values / range

Description

`prompt`

Yes

string

—

Non-empty text, up to 1024 characters

A description of the music: genre, mood, tempo and instruments.

`model`

No

string

`"mureka-9.5"`

`mureka-7.6`, `mureka-8`, `mureka-9`, `mureka-9.5`

The model version. Each version has its own rate per track; `mureka-9.5` applies when you leave it out.

### Good to know

-   Each request returns **one track**. `batch_size`, `num_images`, `number_of_images`, `n`, `count`, `num_instrumentals`, `num_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

Header

Required

Description

Content-Type

Yes

`application/json`

Ocp-Apim-Subscription-Key

Yes

Your API subscription key.

X-Webhook-URL

No

Enable Webhook callbacks (see Webhook section).

X-Webhook-Mode

No

`terminal` (default) or `sync` (see Webhook section).

## Response Handling

Status Code

Meaning

202

Accepted — request queued; returns `request_id` and `polling_url`.

400

Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix.

401

Unauthorized — missing or invalid subscription key.

402

Insufficient balance for the hold this request needs.

429

Too many requests.

500

Internal server error.

Parameter problems are caught when you submit and returned as a `400`, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as `status: "ERROR"`, with a message in `error` saying what went wrong. Failed requests are not billed — the hold is released in full.

Condition

How it surfaces

Missing or invalid subscription key

synchronous `401`

Balance too low for the hold

synchronous `402`

Missing or empty `prompt`, `prompt` not a string, or longer than 1024 characters

synchronous `400`

`model` not one of the allowed values (written exactly as listed)

synchronous `400`

`sync_mode` set to anything other than `false` (results are always returned as a URL in `output.media_url`)

synchronous `400`

`lyrics`, `styles`, `gender`, `vocal_id` (this API makes instrumental music: describe it in `prompt`)

synchronous `400`

`batch_size`, `num_images`, `number_of_images`, `n`, `count`, `num_instrumentals`, `num_songs`, `num_outputs` (one track per request)

synchronous `400`

`duration`, `seconds`, `num_frames`, `frames_per_second`, `music_length_ms` (this API has no length setting)

synchronous `400`

`parameters`, `content`, `text` (send the fields at the top level of the JSON body)

synchronous `400`

`webhook_url`, `webhook_mode`, `callback_url` in the JSON body (use the `X-Webhook-URL` / `X-Webhook-Mode` headers)

synchronous `400`

`stream` (the result is delivered when the job completes)

synchronous `400`

`reference_id`, `melody_id`, `instrumental_id` (IDs from Mureka's own upload and voice services are not offered on this API)

synchronous `400`

A prompt the model refuses, for example under its content policy

`status: "ERROR"`

### Example error responses

A refused request returns `error`, a `message` that joins every problem found, and the same problems one by one in `violations`.

#### Missing `prompt` (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'prompt' is required",
  "violations": [
    "'prompt' is required"
  ]
}
```

#### A model version this API does not offer (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'model' must be one of: \"mureka-7.6\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-o2\")",
  "violations": [
    "'model' must be one of: \"mureka-7.6\", \"mureka-8\", \"mureka-9\", \"mureka-9.5\" (got \"mureka-o2\")"
  ]
}
```

#### An ID from Mureka's own services (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'instrumental_id' must be one of:  (got \"1234567890\"); 'instrumental_id' is not supported on this API: it needs an ID from Mureka's own file upload service, which this API does not offer. Describe the music in 'prompt'.",
  "violations": [
    "'instrumental_id' must be one of:  (got \"1234567890\")",
    "'instrumental_id' is not supported on this API: it needs an ID from Mureka's own file upload service, which this API does not offer. Describe the music in 'prompt'."
  ]
}
```

#### A length setting (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'duration' must be one of:  (got 60); 'duration' is not accepted: this API has no length setting; the model sets the length of the track.",
  "violations": [
    "'duration' must be one of:  (got 60)",
    "'duration' is not accepted: this API has no length setting; the model sets the length of the track."
  ]
}
```

#### More than one track per request (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'num_instrumentals' must be one of:  (got 2); 'num_instrumentals' is not supported: each request returns one instrumental track. Send one request per track.",
  "violations": [
    "'num_instrumentals' must be one of:  (got 2)",
    "'num_instrumentals' is not supported: each request returns one instrumental track. Send one request per track."
  ]
}
```

## Retrieving Results

Poll the status endpoint with the `request_id` from the submit response until `status` is `COMPLETED` or `ERROR`, then download the track from `output.media_url`. Treat any status other than `QUEUED`, `PROCESSING` or `COMPLETED` as a failure.

### Endpoint

```
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_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

Field

Type

Description

request\_id

string

Unique request identifier.

status

string

QUEUED, PROCESSING, COMPLETED or ERROR.

model\_id

string

The model that handled the request — `mureka-instrumental` for this endpoint.

output.media\_url

array of strings

URL of the track (one MP3 file per request).

output.media\_type

string

`audio/mpeg`.

created\_at

string

Request creation timestamp.

completed\_at

string

Completion timestamp.

error

string

Error message when `status` is ERROR.

polling\_url

string

Status URL for this request (submit response only).

## Status Values & Flow

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

### Typical workflow

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 Podcast

### Text to Speech (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.

Header

Type

Required

Description

Ocp-Apim-Subscription-Key

string

Yes

Your API subscription key

## Text to Speech (Podcast) - Mureka Podcast

## Request Code

HTTP Python JavaScript cURL

```
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"
}
```

[Try Now](https://api.pixazo.ai/api-details#api=mureka-podcast&operation=text-to-podcast)

## Webhook (Optional)

Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.

Header

Required

Description

X-Webhook-URL

To enable

HTTPS URL to receive the Webhook callback.

X-Webhook-Mode

No

`terminal` (default, one callback on COMPLETED/ERROR) or `sync` (per-poll callbacks).

### Example: enable Webhook

```
curl -X POST 'https://gateway.pixazo.ai/mureka-podcast/v1/text-to-podcast' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  -H 'X-Webhook-URL: https://your-server.com/webhook' \
  --data-raw '{"conversations": [{"text": "Welcome back to the show. Today we are talking about simple ways to sleep better.", "voice": "Luna"}, {"text": "Thanks, Luna. The easiest one first: go to bed at the same time every night.", "voice": "Jake"}]}'
```

### Callback Payload (success)

```
{
  "request_id": "mureka-podcast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "mureka-podcast",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp3"
    ],
    "media_type": "audio/mpeg"
  },
  "created_at": "2026-10-09T10:04:54.387Z",
  "completed_at": "2026-10-09 10:06:21"
}
```

### Failure callback shape

```
{
  "request_id": "mureka-podcast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "mureka-podcast",
  "error": "Description of the failure"
}
```

#### Delivery semantics

-   **terminal** mode: one Webhook callback when the request is COMPLETED or ERROR.
-   **sync** mode: a Webhook callback on every poll while the request is processing (status `PROCESSING`), plus the final COMPLETED/ERROR callback.
-   Callbacks are idempotent on `request_id` — de-duplicate on it.
-   Respond `200` within a few seconds; the Webhook endpoint must be HTTPS.

## Request Parameters

Parameter

Required

Type

Default

Allowed values / range

Description

`conversations`

Yes

array

—

1–10 turns, in the order they are spoken

The script: one object per turn, each with `text` and `voice` (rows below).

`conversations[].text`

Yes

string

—

1–400 characters

What this turn says.

`conversations[].voice`

Yes

string

—

`Ethan`, `Victoria`, `Jake`, `Luna`, `Emma`

The voice that speaks this turn.

### Good to know

-   Each request returns **one podcast**. `batch_size`, `num_images`, `number_of_images`, `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

Header

Required

Description

Content-Type

Yes

`application/json`

Ocp-Apim-Subscription-Key

Yes

Your API subscription key.

X-Webhook-URL

No

Enable Webhook callbacks (see Webhook section).

X-Webhook-Mode

No

`terminal` (default) or `sync` (see Webhook section).

## Response Handling

Status Code

Meaning

202

Accepted — request queued; returns `request_id` and `polling_url`.

400

Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix.

401

Unauthorized — missing or invalid subscription key.

402

Insufficient balance for the hold this request needs.

429

Too many requests.

500

Internal server error.

Parameter problems are caught when you submit and returned as a `400`, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as `status: "ERROR"`, with a message in `error` saying what went wrong. Failed requests are not billed — the hold is released in full.

Condition

How it surfaces

Missing or invalid subscription key

synchronous `401`

Balance too low for the hold

synchronous `402`

Missing or empty `conversations`, `conversations` not a list, or more than 10 items

synchronous `400`

`sync_mode` set to anything other than `false` (results are always returned as a URL in `output.media_url`)

synchronous `400`

`voice` at the top level (set a voice on each turn as `conversations[].voice`)

synchronous `400`

`model` (podcast generation has no model setting)

synchronous `400`

`prompt` (send the script as `conversations`)

synchronous `400`

`batch_size`, `num_images`, `number_of_images`, `n`, `count` (one podcast per request)

synchronous `400`

`duration`, `seconds`, `num_frames`, `frames_per_second`, `music_length_ms` (the length follows the script in `conversations`)

synchronous `400`

`parameters`, `content`, `text` (send the fields at the top level of the JSON body)

synchronous `400`

`webhook_url`, `webhook_mode`, `callback_url` in the JSON body (use the `X-Webhook-URL` / `X-Webhook-Mode` headers)

synchronous `400`

`stream` (the result is delivered when the job completes)

synchronous `400`

A turn with empty `text` or more than 400 characters, or a `voice` that is not one of the five listed

`status: "ERROR"`

A script the model refuses, for example under its content policy

`status: "ERROR"`

### Example error responses

A refused request returns `error`, a `message` that joins every problem found, and the same problems one by one in `violations`.

#### An empty script (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'conversations' is required",
  "violations": [
    "'conversations' is required"
  ]
}
```

#### More than 10 turns (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'conversations' must have at most 10 items (got 11)",
  "violations": [
    "'conversations' must have at most 10 items (got 11)"
  ]
}
```

#### A voice at the top level (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'voice' must be one of:  (got \"Luna\"); 'voice' is not accepted at the top level. Set a voice on each turn as conversations[].voice.",
  "violations": [
    "'voice' must be one of:  (got \"Luna\")",
    "'voice' is not accepted at the top level. Set a voice on each turn as conversations[].voice."
  ]
}
```

#### A length setting (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'duration' must be one of:  (got 60); 'duration' is not accepted: the length of the podcast follows the script in 'conversations'.",
  "violations": [
    "'duration' must be one of:  (got 60)",
    "'duration' is not accepted: the length of the podcast follows the script in 'conversations'."
  ]
}
```

#### A prompt instead of a script (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'conversations' is required; 'prompt' must be one of:  (got \"A podcast about sleep\"); 'prompt' is not accepted. Send the script as 'conversations': a list of turns, each with 'text' and 'voice'.",
  "violations": [
    "'conversations' is required",
    "'prompt' must be one of:  (got \"A podcast about sleep\")",
    "'prompt' is not accepted. Send the script as 'conversations': a list of turns, each with 'text' and 'voice'."
  ]
}
```

## Retrieving Results

Poll the status endpoint with the `request_id` from the submit response until `status` is `COMPLETED` or `ERROR`, then download the podcast from `output.media_url`. Treat any status other than `QUEUED`, `PROCESSING` or `COMPLETED` as a failure.

### Endpoint

```
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_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

Field

Type

Description

request\_id

string

Unique request identifier.

status

string

QUEUED, PROCESSING, COMPLETED or ERROR.

model\_id

string

The model that handled the request — `mureka-podcast` for this endpoint.

output.media\_url

array of strings

URL of the podcast (one MP3 file per request).

output.media\_type

string

`audio/mpeg`.

created\_at

string

Request creation timestamp.

completed\_at

string

Completion timestamp.

error

string

Error message when `status` is ERROR.

polling\_url

string

Status URL for this request (submit response only).

## Status Values & Flow

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

### Typical workflow

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 Lyrics

### Text to Song (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.

Header

Type

Required

Description

Ocp-Apim-Subscription-Key

string

Yes

Your API subscription key

## Text to Lyrics - Mureka Lyrics

## Request Code

HTTP Python JavaScript cURL

```
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"
}
```

[Try Now](https://api.pixazo.ai/api-details#api=mureka-lyrics&operation=text-to-lyrics)

## Webhook (Optional)

Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.

Header

Required

Description

X-Webhook-URL

To enable

HTTPS URL to receive the Webhook callback.

X-Webhook-Mode

No

`terminal` (default, one callback on COMPLETED/ERROR) or `sync` (per-poll callbacks).

### Example: enable Webhook

```
curl -X POST 'https://gateway.pixazo.ai/mureka-lyrics/v1/text-to-lyrics' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  -H 'X-Webhook-URL: https://your-server.com/webhook' \
  --data-raw '{"prompt": "A song about leaving home for the first time"}'
```

### Callback Payload (success)

```
{
  "request_id": "mureka-lyrics_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "mureka-lyrics",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.json"
    ],
    "media_type": "application/json",
    "title": "The generated title",
    "lyrics": "The generated lyrics"
  },
  "created_at": "2026-10-09T10:04:54.387Z",
  "completed_at": "2026-10-09 10:06:21"
}
```

### Failure callback shape

```
{
  "request_id": "mureka-lyrics_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "mureka-lyrics",
  "error": "Description of the failure"
}
```

#### Delivery semantics

-   **terminal** mode: one Webhook callback when the request is COMPLETED or ERROR.
-   **sync** mode: a Webhook callback on every poll while the request is processing (status `PROCESSING`), plus the final COMPLETED/ERROR callback.
-   Callbacks are idempotent on `request_id` — de-duplicate on it.
-   Respond `200` within a few seconds; the Webhook endpoint must be HTTPS.

## Request Parameters

Parameter

Required

Type

Default

Allowed values / range

Description

`prompt`

Yes

string

—

Non-empty text, up to 2000 characters

The topic, theme or title of the song to write lyrics for.

### Good to know

-   Each request returns **one set of lyrics**. `batch_size`, `num_images`, `number_of_images`, `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

Header

Required

Description

Content-Type

Yes

`application/json`

Ocp-Apim-Subscription-Key

Yes

Your API subscription key.

X-Webhook-URL

No

Enable Webhook callbacks (see Webhook section).

X-Webhook-Mode

No

`terminal` (default) or `sync` (see Webhook section).

## Response Handling

Status Code

Meaning

202

Accepted — request queued; returns `request_id` and `polling_url`.

400

Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix.

401

Unauthorized — missing or invalid subscription key.

402

Insufficient balance for the hold this request needs.

429

Too many requests.

500

Internal server error.

Parameter problems are caught when you submit and returned as a `400`, before any hold is placed on your balance. Problems that need the model to run are reported through the status endpoint as `status: "ERROR"`, with a message in `error` saying what went wrong. Failed requests are not billed — the hold is released in full.

Condition

How it surfaces

Missing or invalid subscription key

synchronous `401`

Balance too low for the hold

synchronous `402`

Missing or empty `prompt`, `prompt` not a string, or longer than 2000 characters

synchronous `400`

`sync_mode` set to anything other than `false` (results are always returned as a URL in `output.media_url`)

synchronous `400`

`model` (lyrics generation has no model setting)

synchronous `400`

`lyrics` (send the topic in `prompt`)

synchronous `400`

`batch_size`, `num_images`, `number_of_images`, `n`, `count` (one set of lyrics per request)

synchronous `400`

`duration`, `seconds`, `num_frames`, `frames_per_second`, `music_length_ms` (this API has no length setting)

synchronous `400`

`parameters`, `content`, `text` (send the fields at the top level of the JSON body)

synchronous `400`

`webhook_url`, `webhook_mode`, `callback_url` in the JSON body (use the `X-Webhook-URL` / `X-Webhook-Mode` headers)

synchronous `400`

`stream` (the result is delivered when the job completes)

synchronous `400`

A prompt the model refuses, for example under its content policy

`status: "ERROR"`

### Example error responses

A refused request returns `error`, a `message` that joins every problem found, and the same problems one by one in `violations`.

#### Missing `prompt` (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'prompt' is required",
  "violations": [
    "'prompt' is required"
  ]
}
```

#### A prompt longer than 2000 characters (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'prompt' must be at most 2000 characters (got 2001)",
  "violations": [
    "'prompt' must be at most 2000 characters (got 2001)"
  ]
}
```

#### A field this API does not accept (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'model' must be one of:  (got \"mureka-9.5\"); 'model' is not accepted: lyrics generation has no model setting.",
  "violations": [
    "'model' must be one of:  (got \"mureka-9.5\")",
    "'model' is not accepted: lyrics generation has no model setting."
  ]
}
```

#### More than one set of lyrics per request (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'n' must be one of:  (got 2); 'n' is not supported: each request returns one set of lyrics. Send one request per set.",
  "violations": [
    "'n' must be one of:  (got 2)",
    "'n' is not supported: each request returns one set of lyrics. Send one request per set."
  ]
}
```

#### Lyrics sent instead of a topic (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'lyrics' must be one of:  (got \"[Verse]\"); 'lyrics' is not accepted by this API. Send the topic of the song in 'prompt'.",
  "violations": [
    "'lyrics' must be one of:  (got \"[Verse]\")",
    "'lyrics' is not accepted by this API. Send the topic of the song in 'prompt'."
  ]
}
```

## Retrieving Results

Poll the status endpoint with the `request_id` from the submit response until `status` is `COMPLETED` or `ERROR`, then read `output.title` and `output.lyrics` (the same two fields are stored as a JSON file at `output.media_url[0]`). Treat any status other than `QUEUED`, `PROCESSING` or `COMPLETED` as a failure.

### Endpoint

```
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_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

Field

Type

Description

request\_id

string

Unique request identifier.

status

string

QUEUED, PROCESSING, COMPLETED or ERROR.

model\_id

string

The model that handled the request — `mureka-lyrics` for this endpoint.

output.title

string

The title of the song.

output.lyrics

string

The lyrics.

output.media\_url

array of strings

URL of a JSON file holding the same `title` and `lyrics`.

output.media\_type

string

`application/json`.

created\_at

string

Request creation timestamp.

completed\_at

string

Completion timestamp.

error

string

Error message when `status` is ERROR.

polling\_url

string

Status URL for this request (submit response only).

## Status Values & Flow

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

### Typical workflow

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 Video

### Audio to Video (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.

Header

Type

Required

Description

Ocp-Apim-Subscription-Key

string

Yes

Your API subscription key

## Audio to Video (Lyrics Video) - Mureka Lyrics Video

## Request Code

HTTP Python JavaScript cURL

```
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"
}
```

[Try Now](https://api.pixazo.ai/api-details#api=mureka-lyrics-video&operation=song-to-video)

## Webhook (Optional)

Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.

Header

Required

Description

X-Webhook-URL

To enable

HTTPS URL to receive the Webhook callback.

X-Webhook-Mode

No

`terminal` (default, one callback on COMPLETED/ERROR) or `sync` (per-poll callbacks).

### Example: enable Webhook

```
curl -X POST 'https://gateway.pixazo.ai/mureka-lyrics-video/v1/song-to-video' \
  -H 'Content-Type: application/json' \
  -H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
  -H 'X-Webhook-URL: https://your-server.com/webhook' \
  --data-raw '{"song_request_id": "mureka-song_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "selection_start": 0, "selection_end": 30000, "aspect_ratio": "9:16", "layout": "layout_1"}'
```

### Callback Payload (success)

```
{
  "request_id": "mureka-lyrics-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "COMPLETED",
  "model_id": "mureka-lyrics-video",
  "error": null,
  "output": {
    "media_url": [
      "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
    ],
    "media_type": "video/mp4"
  },
  "created_at": "2026-10-09T10:04:54.387Z",
  "completed_at": "2026-10-09 10:06:21"
}
```

### Failure callback shape

```
{
  "request_id": "mureka-lyrics-video_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "status": "ERROR",
  "model_id": "mureka-lyrics-video",
  "error": "Description of the failure"
}
```

#### Delivery semantics

-   **terminal** mode: one Webhook callback when the request is COMPLETED or ERROR.
-   **sync** mode: a Webhook callback on every poll while the request is processing (status `PROCESSING`), plus the final COMPLETED/ERROR callback.
-   Callbacks are idempotent on `request_id` — de-duplicate on it.
-   Respond `200` within a few seconds; the Webhook endpoint must be HTTPS.

## Request Parameters

Parameter

Required

Type

Default

Allowed values / range

Description

`song_request_id`

Yes

string

—

A `request_id`, up to 84 characters

The `request_id` of a completed Lyrics to Song, Prompt to Song or Text to Music (Instrumental) request made with the same API key in the last 28 days.

`title`

No

string

—

Text

A title to show in the video.

`cover_url`

No

string

—

A publicly reachable `https` URL (recommended) or a data URI of a JPG, PNG or WebP image

A cover image. It needs `layout` set to one of `layout_2` to `layout_7`.

`aspect_ratio`

No

string

`"9:16"`

`16:9`, `9:16`, `3:4`, `4:3`

Frame shape of the video. It does not change the amount billed.

`layout`

No

string

`"layout_1"`

`layout_1`, `layout_2`, `layout_3`, `layout_4`, `layout_5`, `layout_6`, `layout_7`

The visual template of the video; `layout_1` has no cover.

`lyrics_start_row`

No

integer

—

Whole number, 1 or more

First lyric row to show, counting from 1. Send it with `lyrics_end_row`, or send a time range instead: one of the two pairs is required.

`lyrics_end_row`

No

integer

—

Whole number, 1 or more

Last lyric row to show. Send it with `lyrics_start_row`.

`selection_start`

No

integer

—

Whole number, 0 or more

Start of the part of the song to use, in milliseconds. Send it with `selection_end`; required unless you send the lyric rows instead.

`selection_end`

No

integer

—

Whole number, 1 or more

End of the part of the song to use, in milliseconds. Send it with `selection_start`.

### Good to know

-   Each request returns **one video**. `batch_size`, `num_images`, `number_of_images`, `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

Header

Required

Description

Content-Type

Yes

`application/json`

Ocp-Apim-Subscription-Key

Yes

Your API subscription key.

X-Webhook-URL

No

Enable Webhook callbacks (see Webhook section).

X-Webhook-Mode

No

`terminal` (default) or `sync` (see Webhook section).

## Response Handling

Status Code

Meaning

202

Accepted — request queued; returns `request_id` and `polling_url`.

400

Invalid request — a required field is missing, a value has the wrong type, is too long, out of range or not one of the allowed values, or a field this operation does not accept was sent. The message says what to fix.

401

Unauthorized — missing or invalid subscription key.

402

Insufficient balance for the hold this request needs.

429

Too many requests.

500

Internal server error.

Parameter problems are caught when you submit and returned as a `400`, before any hold is placed on your balance. A `cover_url` that cannot be downloaded is also refused at submit with a `400`, and its hold is released at once: nothing is charged. Problems that need the model to run are reported through the status endpoint as `status: "ERROR"`, with a message in `error` saying what went wrong. Failed requests are not billed — the hold is released in full.

Condition

How it surfaces

Missing or invalid subscription key

synchronous `401`

Balance too low for the hold

synchronous `402`

Missing or empty `song_request_id`, `song_request_id` not a string, or longer than 84 characters

synchronous `400`

A `cover_url` that cannot be downloaded when you submit (the hold is released at once: nothing is charged)

synchronous `400`

`cover_url` needs `layout` set to one of layout\_2 to layout\_7: layout\_1 (the default) has no cover

synchronous `400`

`lyrics_start_row` must be sent with `lyrics_end_row` and cannot be combined with `selection_start` / `selection_end`

synchronous `400`

`lyrics_end_row` must be sent with `lyrics_start_row`

synchronous `400`

`selection_start` must be sent with `selection_end` (milliseconds) and cannot be combined with lyric-row selection

synchronous `400`

`selection_end` must be sent with `selection_start`

synchronous `400`

`aspect_ratio` not one of the allowed values (written exactly as listed)

synchronous `400`

`layout` not one of the allowed values (written exactly as listed)

synchronous `400`

`title` not a string

synchronous `400`

`cover_url` not a string

synchronous `400`

`lyrics_start_row` not a whole number of at least 1 — for example `0` or the string `"1"`

synchronous `400`

`lyrics_end_row` not a whole number of at least 1 — for example `0` or the string `"1"`

synchronous `400`

`selection_start` not a whole number of at least 0 — for example `-1` or the string `"0"`

synchronous `400`

`selection_end` not a whole number of at least 1 — for example `0` or the string `"1"`

synchronous `400`

`sync_mode` set to anything other than `false` (results are always returned as a URL in `output.media_url`)

synchronous `400`

`song_id` (name the song by its `song_request_id`)

synchronous `400`

`cover` (send the cover image URL as `cover_url`)

synchronous `400`

`show_author_name` (not offered on this API)

synchronous `400`

`batch_size`, `num_images`, `number_of_images`, `n`, `count` (one video per request)

synchronous `400`

`duration`, `seconds`, `num_frames`, `frames_per_second`, `music_length_ms` (the video covers the part of the song you choose: `selection_start` / `selection_end` or the lyric rows)

synchronous `400`

`parameters`, `content`, `text` (send the fields at the top level of the JSON body)

synchronous `400`

`webhook_url`, `webhook_mode`, `callback_url` in the JSON body (use the `X-Webhook-URL` / `X-Webhook-Mode` headers)

synchronous `400`

`stream` (the result is delivered when the job completes)

synchronous `400`

`upload_audio_id`, `background_id` (IDs from Mureka's own upload and voice services are not offered on this API)

synchronous `400`

A `song_request_id` that does not match a Lyrics to Song, Prompt to Song or Text to Music (Instrumental) request made with the same API key

synchronous `400`

A song request that has not completed, or that was generated more than 28 days ago

synchronous `400`

A song generated before lyrics videos were available (it has no reusable song reference)

synchronous `400`

`lyrics_start_row` / `lyrics_end_row` with an instrumental track (it has no lyrics)

synchronous `400`

`song_id` under another spelling or inside an object, for example `SONG_ID`, `songId` or `input.song_id`

synchronous `400`

A song the model no longer keeps, although its `song_request_id` was accepted

`status: "ERROR"`

A selection that ends before it starts, or lyric rows beyond the end of the lyrics

`status: "ERROR"`

A request the model refuses, for example under its content policy

`status: "ERROR"`

### Example error responses

A refused request returns `error`, a `message` that joins every problem found, and the same problems one by one in `violations`.

#### Missing `song_request_id` (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'song_request_id' is required",
  "violations": [
    "'song_request_id' is required"
  ]
}
```

#### A `song_id` sent instead of `song_request_id` (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'song_request_id' is required; 'song_id' must be one of:  (got \"1234567890\"); 'song_id' is not accepted on this API. Send 'song_request_id': the request_id of a song or instrumental job made with this API key.",
  "violations": [
    "'song_request_id' is required",
    "'song_id' must be one of:  (got \"1234567890\")",
    "'song_id' is not accepted on this API. Send 'song_request_id': the request_id of a song or instrumental job made with this API key."
  ]
}
```

#### A value that is not allowed (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"3:4\", \"4:3\" (got \"21:9\")",
  "violations": [
    "'aspect_ratio' must be one of: \"16:9\", \"9:16\", \"3:4\", \"4:3\" (got \"21:9\")"
  ]
}
```

#### A cover with `layout_1` (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'cover_url' needs 'layout' set to one of layout_2 to layout_7: layout_1 (the default) has no cover.",
  "violations": [
    "'cover_url' needs 'layout' set to one of layout_2 to layout_7: layout_1 (the default) has no cover."
  ]
}
```

#### No part of the song chosen (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'selection_start' is required unless 'lyrics_start_row' is provided",
  "violations": [
    "'selection_start' is required unless 'lyrics_start_row' is provided"
  ]
}
```

#### Half of a selection (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'selection_start' must be sent with 'selection_end' (milliseconds) and cannot be combined with lyric-row selection.",
  "violations": [
    "'selection_start' must be sent with 'selection_end' (milliseconds) and cannot be combined with lyric-row selection."
  ]
}
```

#### A length setting (synchronous `400`)

```
{
  "error": "Invalid request parameters",
  "message": "'duration' must be one of:  (got 30); 'duration' is not accepted: to use part of the song, send 'selection_start' and 'selection_end' (milliseconds) or 'lyrics_start_row' and 'lyrics_end_row'.",
  "violations": [
    "'duration' must be one of:  (got 30)",
    "'duration' is not accepted: to use part of the song, send 'selection_start' and 'selection_end' (milliseconds) or 'lyrics_start_row' and 'lyrics_end_row'."
  ]
}
```

## Retrieving Results

Poll the status endpoint with the `request_id` from the submit response until `status` is `COMPLETED` or `ERROR`, then download the video from `output.media_url`. Treat any status other than `QUEUED`, `PROCESSING` or `COMPLETED` as a failure.

### Endpoint

```
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_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

Field

Type

Description

request\_id

string

Unique request identifier.

status

string

QUEUED, PROCESSING, COMPLETED or ERROR.

model\_id

string

The model that handled the request — `mureka-lyrics-video` for this endpoint.

output.media\_url

array of strings

URL of the video (one MP4 file per request).

output.media\_type

string

`video/mp4`.

created\_at

string

Request creation timestamp.

completed\_at

string

Completion timestamp.

error

string

Error message when `status` is ERROR.

polling\_url

string

Status URL for this request (submit response only).

## Status Values & Flow

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

### Typical workflow

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.
