Free2 download API
Endpoint description
Free2 is a separate paid download channel: it resolves MP3/WAV/lyrics/metadata files from a song ID (or a suno.com song link) and returns platform-hosted download addresses. It accepts an API key only — it does not accept a browser login session — and the response never contains Suno's encrypted playback source.
Endpoint: POST /api/music/free2
Billing: Charged per successful song, currently 0.2 CNY per song by default. Choosing several file types in one request costs nothing extra; songs that fail to resolve are not charged. At most 10 songs per request (after de-duplication); the amount actually charged follows the back-office price configuration.
Recommended model: suno-v6. suno-v6, suno-v6-wild and suno-v6-mini are available.
Authentication
| Parameter | Type | Required | Notes |
|---|---|---|---|
| Authorization | string | yes | Bearer YOUR_API_KEY |
| Content-Type | string | yes | application/json |
Request parameters
| Parameter | Type | Required | Default | Notes |
|---|---|---|---|---|
| song_id | string | no | - | A single song ID; a suno.com song link (including the /s/ short link) also works |
| song_ids | string[] | no | - | Multi-song form (recommended); at most 10 songs per request |
| songs | string[] | no | - | Alias of song_ids |
| files | string[] | yes | - | The file types you need: mp3, wav, lyrics, metadata; m4a is not supported |
Provide at least one of song_id and song_ids; provide at least one entry in files.
Request example
curl -X POST https://www.suno-api.io/api/music/free2 \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"song_ids": ["song_id_1", "song_id_2"],
"files": ["mp3", "wav", "lyrics"]
}'
Response
{
"code": 200,
"message": "success",
"data": {
"songs": [
{
"song_id": "song_id_1",
"files": [
{"type": "mp3", "url": "https://media.suno-api.io/assets/song_id_1-free2-v1-mp3.mp3"}
]
},
{
"song_id": "song_id_2",
"files": [],
"error": {"code": "song_not_found", "message": "song not found or not owned by the current user"}
}
],
"requested_songs": 2,
"succeeded_songs": 1,
"price": 0.2
}
}
| Field | Type | Notes |
|---|---|---|
| songs | array | Per-song result: song_id, files[], and error on failure |
| requested_songs | number | Number of songs after normalisation and de-duplication |
| succeeded_songs | number | Number of successes; billing is based on this number |
| price | number | Amount actually charged for this call (yuan) |
When only one song is requested, the response also returns top-level song_id and files, for compatibility with the older single-song form.
Reusing cached addresses (not charged)
For a song you have already downloaded, downloading it again does not need a new resolution and is not charged again: use POST /api/music/free2/cached to get the current addresses of the files this account downloaded before.
Endpoint: POST /api/music/free2/cached
Billing: Free. It is a read-only cache: no resolving, no transcoding, no charge; it only returns addresses that are already prepared and have not been reclaimed.
⚠️ Download address validity: 7 days — save it in time.
songs[].files[].urlis served by the platform's object storage and expires after 7 days by default (the files are reclaimed and the old address returns 404); save them to your own storage within those 7 days. Once an address has expired, callPOST /api/music/free2again to prepare it anew and get a fresh valid address (that re-preparation is charged under the normal rules;/api/music/free2/cachedonly returns cache addresses that are still valid).
Request parameters: identical to POST /api/music/free2 (any one of song_id / song_ids / songs, and at least one entry in files).
curl -X POST https://www.suno-api.io/api/music/free2/cached \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "song_ids": ["98ca3f1d-…", "a185b3d9-…"], "files": ["mp3"] }'
{
"success": true,
"data": {
"items": [
{ "song_id": "98ca3f1d-…", "type": "mp3", "url": "https://…/assets/98ca3f1d-…-free2-v1-mp3.mp3" }
],
"songs": [
{ "song_id": "98ca3f1d-…", "files": [ { "type": "mp3", "url": "https://…" } ], "missing_files": [] },
{ "song_id": "a185b3d9-…", "files": [], "missing_files": ["mp3"] }
],
"missing": ["a185b3d9-…"]
}
}
| Field | Type | Notes |
|---|---|---|
| items | array | List of addresses ready to download (song_id + type + url) |
| songs | array | Per-song results; missing_files are the formats that did not hit the cache this time |
| missing | string[] | This song has no usable cache at all (you need to re-resolve with POST /api/music/free2, which is charged per song) |
Addresses are returned only for songs you have downloaded before; songs with no download record, or whose assets have been reclaimed, appear only in missing and no address is returned for them.
Notes
POST /api/music/free2can resolve any public song on Suno (including songs that are not on this platform); when a song cannot be resolved, anerroris returned for that song only and the other songs in the same batch are unaffected.POST /api/music/free2/cachedreturns addresses only for songs this account has downloaded.- The first resolution of a song creates the hosted files, which are then reused; do not pass duplicate types in
files, the server de-duplicates automatically. - Difference from the song media download and preview API: Free2 is paid, supports passing suno.com links directly, and does not provide timeline/MIDI types beyond lyrics.
Get an API key
Create an API key in the console after signing up. ¥0.6 per run returns 2 tracks, downloads are unlimited, and no phone number is required.
Get API key Back to overview