# Mureka 9.5 Song Generation API

> Tạo bài hát có giọng hát từ lời nhắc hoặc lời bài hát, với các tùy chỉnh về phong cách, giọng và giai điệu

Dùng `lyrics` (tối đa 5000 ký tự) để chuyển lời thành bài hát, hoặc dùng `prompt` (tối đa 2000 ký tự) và `styles` để chuyển lời nhắc thành bài hát. Các tùy chọn gồm `gender`, `reference_id`, `vocal_id` và `melody_id`. Danh sách `model` gồm mureka-7.6, mureka-o2, mureka-8, mureka-9 và mureka-9.5 (mặc định). Trả về âm thanh, thời lượng và `song_id`.

- Model id: `mureka/api/generate/song`
- Made by: Mureka
- Category: Text to Music
- Output: audio
- Price per run: from $0.45 / run (cheapest run $0.45 (450 API credits))
- Run: `POST https://api.doitong.com/v1/run/mureka/api/generate/song`
- Quote: `POST https://api.doitong.com/v1/quote/mureka/api/generate/song`
- Docs page: https://doitong.com/vi/developers/models/mureka/api/generate/song

## Pricing

Price: **from $0.45 / run** (the lowest tier; the quote prices your exact input). Price per run: the input files are measured before the run (length, resolution, frame rate). The quote measures the same files and is exactly what the run charges.

Price by tier:

- mureka-7.6: $0.45 / run
- mureka-o2: $0.45 / run
- mureka-8: $0.45 / run
- mureka-9: $0.45 / run
- mureka-9.5: $0.75 / run

The full example input below costs $0.75 = 750 API credits (1 run × $0.75 (mureka-9.5)).

Prices are the upstream price in USD, paid from the API balance in API credits (1000 API credits = 1 USD). `POST https://api.doitong.com/v1/quote/mureka/api/generate/song` with the same JSON body returns the exact price for that input; the quote is exactly what a run charges. Invalid input is never charged and failed or canceled requests are refunded automatically.

## Input parameters

| Parameter | Canonical name | Type | Required | Default | Allowed values / range | Description |
|---|---|---|---|---|---|---|
| `model` |  | enum (string) | no | `mureka-9.5` | `mureka-7.6`, `mureka-o2`, `mureka-8`, `mureka-9`, `mureka-9.5` | Mô hình dùng để tạo sinh bài hát. |
| `lyrics` |  | string \| null | no |  | 1 – 5000 characters | Văn bản được hát để tạo sinh bài hát từ lời bài hát, với độ dài tối đa 5.000 ký tự. Để tạo sinh bài hát từ lời nhắc, hãy cung cấp lời nhắc thay vì lyrics. |
| `styles` |  | array of enum (string) \| null | no |  | ≥ 1 items | Lựa chọn thể loại chỉ khả dụng khi tạo sinh bài hát từ lời nhắc mà không có lời bài hát; chọn một hoặc nhiều thể loại nhạc. |
| `prompt` |  | string \| null | no |  | 1 – 2000 characters | Mô tả bài hát, với vai trò phụ thuộc vào việc có cung cấp lyrics hay không: tham số này kiểm soát phong cách âm nhạc cùng với lyrics và là bắt buộc khi không có lyrics. Mô tả bài hát mong muốn, bao gồm tâm trạng, nhạc cụ và giọng hát. |
| `gender` |  | enum (string) \| null | no |  | `female`, `male` | Tùy chọn giới tính giọng hát khi tạo sinh bài hát từ lời bài hát, chỉ được dùng khi không có giọng đã tải lên hoặc giọng nhân bản ghi đè. |
| `reference_id` |  | string \| null | no |  | ≥ 1 characters | Mã định danh nhạc tham chiếu nhận được từ /files/upload bằng purpose='reference'. |
| `vocal_id` |  | string \| null | no |  | ≥ 1 characters | Mã định danh giọng nhận được từ /voice/clone. |
| `melody_id` |  | string \| null | no |  | ≥ 1 characters | Mã định danh giai điệu dùng khi không có lời nhắc, reference_id hoặc vocal_id. Nhận mã này qua /files/upload với purpose='melody'. |
| `enable_safety_checker` |  | boolean | no | `true` |  | Có thể nới lỏng việc kiểm duyệt bằng cách đặt thành false, nếu người gọi được cấp quyền. |

## Example input

Required parameters only:

```json
{}
```

A fuller example:

```json
{
  "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
}
```

## Run it

Set `DOITONG_API_KEY` to a key from https://doitong.com/developers/dashboard#keys. `?wait=20` returns the finished request in the same call when it is ready within 20 seconds; otherwise poll `GET /requests/{id}` (it also accepts `?wait=`), or pass `webhook_url`.

### curl

```bash
# Run the model; wait up to 20 s for the finished result in the same call
curl -X POST "https://api.doitong.com/v1/run/mureka/api/generate/song?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  }'

# Still "queued" or "running"? Poll with the id from the response:
curl "https://api.doitong.com/v1/requests/REQUEST_ID?wait=20" \
  -H "Authorization: Bearer $DOITONG_API_KEY"
```

### JavaScript

```javascript
const API = "https://api.doitong.com/v1";
const headers = {
  "Authorization": "Bearer " + process.env.DOITONG_API_KEY,
  "Content-Type": "application/json",
};

// Run the model; wait up to 20 s for the finished result in the same call
let res = await fetch(API + "/run/mureka/api/generate/song?wait=20", {
  method: "POST",
  headers,
  body: JSON.stringify({
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  }),
});
let request = await res.json();
if (!res.ok) throw new Error(request.error.code + ": " + request.error.message);

// Not finished yet: long-poll until it is
while (request.status === "queued" || request.status === "running") {
  res = await fetch(API + "/requests/" + request.id + "?wait=20", { headers });
  request = await res.json();
}
if (request.status !== "succeeded") throw new Error(JSON.stringify(request.error));
console.log(request.outputs.map((o) => o.url), request.cost.credits + " API credits ($" + request.cost.usd + ")");
```

### Python

```python
import os
import requests

API = "https://api.doitong.com/v1"
headers = {"Authorization": "Bearer " + os.environ["DOITONG_API_KEY"]}

payload = {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field",
}

# Run the model; wait up to 20 s for the finished result in the same call
r = requests.post(API + "/run/mureka/api/generate/song", params={"wait": 20}, json=payload, headers=headers)
request = r.json()
if not r.ok:
    raise RuntimeError(request["error"]["code"] + ": " + request["error"]["message"])

# Not finished yet: long-poll until it is
while request["status"] in ("queued", "running"):
    request = requests.get(API + "/requests/" + request["id"], params={"wait": 20}, headers=headers).json()
if request["status"] != "succeeded":
    raise RuntimeError(request["error"])
print([o["url"] for o in request["outputs"]], request["cost"]["credits"], "API credits", "$" + request["cost"]["usd"])
```

### MCP

The MCP server at `https://api.doitong.com/v1/mcp` exposes the tools `search_models`, `get_model`, `quote`, `run`, `get_request`, `cancel_request`, `list_requests`, `create_upload` and `get_account`. A `run` call for this model:

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run",
    "arguments": {
      "model_id": "mureka/api/generate/song",
      "input": {
        "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
      },
      "wait_seconds": 20
    }
  }
}
```

## Response

Every call returns a request object. `status` is one of `queued`, `running`, `succeeded`, `failed`, `canceled`. `outputs` lists the generated files with URLs on our storage (kept forever, or 7 days with `?storage=temporary`; `storage` says which); `output` is the model's own result object with the same URLs.

```json
{
  "id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
  "object": "request",
  "model": "mureka/api/generate/song",
  "status": "succeeded",
  "created_at": "2026-10-20T12:00:00Z",
  "started_at": "2026-10-20T12:00:02Z",
  "completed_at": "2026-10-20T12:00:09Z",
  "queue_position": null,
  "cost": {
    "credits": 750,
    "usd": "0.75",
    "charged": 750,
    "refunded": 0
  },
  "input": {
    "prompt": "A red fox trots through fresh snow at sunrise, soft golden light, shallow depth of field"
  },
  "output": {
    "song_id": "string",
    "audio": {
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp3",
      "content_type": "audio/mpeg",
      "file_name": "0-output.mp3",
      "file_size": 1843200
    },
    "duration": 5,
    "lyrics_sections": [
      {
        "section_type": "intro",
        "start": 1,
        "end": 1,
        "lines": [
          {}
        ]
      }
    ]
  },
  "outputs": [
    {
      "type": "audio",
      "url": "https://content.doitong.com/dev-api/2026/10/20/req_8k2m4q7x1z9c3v5b6n0p2r4t/0-output.mp3",
      "content_type": "audio/mpeg",
      "file_size": 1843200,
      "duration": 12,
      "stored": true
    }
  ],
  "error": null,
  "metrics": {
    "inference_seconds": 6.8
  },
  "urls": {
    "self": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
    "cancel": "https://api.doitong.com/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
  }
}
```

### Output fields (`output`)

| Field | Type | Description |
|---|---|---|
| `song_id` | string \| null | Mã định danh âm thanh có thể tái sử dụng cho các điểm cuối chấp nhận song_id. |
| `audio` | object {url, content_type, file_name, file_size} | Tệp âm thanh được tạo sinh. |
| `duration` | integer \| null | Độ dài âm thanh được tạo, tính bằng mili giây, nếu có. |
| `lyrics_sections` | array of object {section_type, start, end, lines} \| null | Các phần lời bài hát kèm thông tin thời gian của âm thanh được tạo, nếu có. |

## Related models

- [Mureka 9.5 Lyrics Video](https://doitong.com/developers/models/mureka/api/generate/lyrics-video.md) (`mureka/api/generate/lyrics-video`): $0.15 / video
- [Mureka 9.5 Instrumental Generation](https://doitong.com/developers/models/mureka/api/generate/instrumental.md) (`mureka/api/generate/instrumental`): from $0.045 / request
- [Mureka 9.5 Podcast Generation](https://doitong.com/developers/models/mureka/api/generate/podcast.md) (`mureka/api/generate/podcast`): $0.019 / run
- [Mureka 9.5 Lyrics Generation](https://doitong.com/developers/models/mureka/api/generate/lyrics.md) (`mureka/api/generate/lyrics`): $0.0135 / request
- [MiniMax Music 3](https://doitong.com/developers/models/minimax/music-3.md) (`minimax/music-3`): $0.002 / second
- [ACE Step](https://doitong.com/developers/models/ace-step.md) (`ace-step`): $0.0002 / second
- [ACE Step Audio Inpaint](https://doitong.com/developers/models/ace-step/audio-inpaint.md) (`ace-step/audio-inpaint`): $0.0002 / second of input audio
- [ACE Step Audio Outpaint](https://doitong.com/developers/models/ace-step/audio-outpaint.md) (`ace-step/audio-outpaint`): $0.0002 / second of output audio

## Links

- HTML page: https://doitong.com/developers/models/mureka/api/generate/song
- All models and guides for AI agents: https://doitong.com/developers/llms.txt
- OpenAPI 3.1 with this model's typed request body: https://doitong.com/developers/openapi.json?model=mureka/api/generate/song
- Errors: https://doitong.com/developers/docs/errors
- Model details as JSON: https://api.doitong.com/v1/models/mureka/api/generate/song
