Suno · Music
Song DownloadNEW
📌 What is this:Download a Suno song as a real audio file. The audio on the official page is an encrypted stream — saving it directly gives you garbage bytes. This endpoint restores the full audio, re-hosts it on our CDN and returns a direct download link.
💡 When to use:Use when you need to save a finished song locally, feed it into your own player / editor, or post-process it. Three ways to specify the song: a clip ID, a Suno song page URL, or one of your own suno task IDs (the clip is resolved automatically, so you don’t have to query the task result first). Works for any public song (not just your own); 64MB per song.
⚡ Synchronous endpoint: one request returns the download link directly — no polling needed. Typically 5-20s (fetch + re-host), so set your client timeout above 60s.
Endpoints
| Usage | Method | Path |
|---|---|---|
| Synchronous call | POST | /api/cqt/v2/suno/download |
Request Parameters
| Param | Type | Required | Description |
|---|---|---|---|
| clipId | string | — | Song clip ID. Exactly one of clipId / url / taskId is required (if several are sent, priority is clipId > url > taskId) |
| url | string | — | Suno song page URL, e.g. https://suno.com/song/<clipId>; the ID is extracted automatically (one of the three) |
| taskId | string | — | One of your suno task IDs (the one returned on submit and used with GET /api/cqt/info/suno?id=); the clip ID is resolved from that task automatically (one of the three). If the task result is queryable, it is downloadable — ownership is not checked here either. For export tasks (mp4 / wav / timeline / downbeats) that have no clip list, the clip ID submitted with the task is used |
| clipIndex | number | — | Used with taskId: a generation task usually yields 2 songs — pick which one (0-based, default 0). One call downloads one song; if out of range, the error tells you how many songs the task actually has |
Request Example
curl -X POST https://api.cqtai.com/api/cqt/v2/suno/download \
-H 'Authorization: Bearer <API_KEY>' \
-H 'Content-Type: application/json' \
-d '{ "clipId":"e1a78bfe-2e53-4207-9cd8-c764c4bfc621" }'
# 也可以直接传歌曲页地址:
# -d '{ "url":"https://suno.com/song/e1a78bfe-2e53-4207-9cd8-c764c4bfc621" }'
# 或者用平台的 suno 任务 ID 反查(clipIndex 选第几首,默认 0):
# -d '{ "taskId":"<task id>", "clipIndex":1 }'
# -> { "code":200, "data":{ "url":"https://<cdn>/suno-download/....m4a", "format":"m4a", ... } }Response Example
{
"code": 200,
"msg": "success",
"data": {
"clipId": "e1a78bfe-2e53-4207-9cd8-c764c4bfc621",
"title": "两只老虎",
"url": "https://cdn.cqtai.com/suno-download/1757300000000_ab12cd34.m4a",
"format": "m4a",
"bytes": 4213760,
"cached": false
}
}Response Fields
| Field | Type | Description |
|---|---|---|
| code | number | Status code; 200 = success. On non-200, msg carries the reason and credits are fully refunded |
| msg | string | Message |
| data.clipId | string | Song clip ID |
| data.title | string | Song title |
| data.url | string | Direct download URL (CDN) |
| data.format | string | File format: m4a or webm |
| data.bytes | number | File size in bytes |
| data.cached | bool | Whether it came from cache (30-day TTL). true = the previous file was reused and returned faster; billing is unchanged |
Common Errors
| msg | Meaning |
|---|---|
| param_invalid: clipId, url or taskId is required | None of the three inputs was provided (all param_invalid errors below are rejected before billing — no charge) |
| param_invalid: unrecognized clipId: ... | The value is neither a clip ID nor a Suno song page URL |
| param_invalid: task not found: ... | No such suno task ID on the platform |
| param_invalid: task has no clip yet, status=running | That task has no result yet — wait until it finishes, then download |
| param_invalid: clipIndex out of range, this task has N clip(s) | clipIndex is out of range; N is how many songs the task actually has (0-based) |
| clip not found: ... | The song page cannot be opened, or has no audio URL (song missing or not public) |
| rights unavailable: ... | No download permission granted for this song (restricted or temporarily unavailable) — try another song or retry later |
| decrypt failed | The restored bytes are not a recognizable media file — we fail loudly rather than hand back a broken file |
| Points insufficient | Insufficient credits |
| The request is too fast. Please try again later | Too many downloads in flight (default 5 concurrent) — retry shortly; no credits are charged |
Billing & Credits
2 credits per call. Note: every call is charged; cached=true in the response only means it was served faster from cache, not for free. One call downloads one song — a generation task usually yields 2 songs, so getting both means two calls (4 credits total) (x your user rate). Auto-refunded on failure.