Separation (vocal & backing split) API
Endpoint description
Separation splits an existing song into vocals, backing or multi-track results. The recommended integration flow is:
- If the source audio is not a song generated on this platform, call the upload source audio API first.
- Call
POST /api/music/separateto submit the separation task. - Poll the separation result with the song query API.
- Use the download endpoints to download the audio file of each separation result.
Endpoint: POST /api/music/separate
Billing: Paid. stem_mode=two currently defaults to 0.6 ¥ per call; stem_mode=twelve is a multi-track split and currently defaults to 3.0 ¥ per call. The amount actually charged follows the back-office price configuration.
Wait times and timeouts (important): this is a synchronous endpoint — the order is only accepted and handed to generation when the response arrives. Measured, most requests return in 1-3 seconds, about 10% take longer than 30 seconds, and the longest is about 230 seconds. Set your client timeout to 300 seconds or more; no response does not mean nothing was generated, and do not retry immediately after a timeout (that duplicates the order and charges again). If the connection dropped, confirm later with
GET /api/music/songs. See "Wait times and timeout settings" in the New API overview.
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 | yes | - | ID of the source song to separate |
| stem_mode | string | yes | - | Separation mode: two or twelve |
| source_audio_url | string | no | - | Source audio URL |
| source_file_name | string | no | - | Source audio file name |
| source_title | string | no | - | Source song title |
About stem_mode
| Value | Entries returned | Notes |
|---|---|---|
two |
4 | Two-track separation: vocals + backing. One submission produces 2 versions × 2 tracks |
twelve |
24 | Multi-track split: 2 versions × 12 tracks; track names are in the table below |
About separation
Separation is an independent fixed capability; there is no need to fill in or choose a song generation model. The customer simply submits the source song and stem_mode; the server handles the rest according to the mode.
Where the counts come from: one submission produces 2 versions (two results from the same batch of material), so the count is 2 × the track count of that mode: 4 for two, 24 for twelve.
Always go by the actual length of the clips array in the response; do not hard-code a loop over a fixed count (individual tracks may fail while the successful ones are returned as usual).
Which tracks each mode returns
The 12 tracks of twelve mode (the names are fixed by the platform; the order may vary):
| # | Track title | Notes |
|---|---|---|
| 1 | (Vocals) |
Lead vocals |
| 2 | (Backing Vocals) |
Harmonies / backing vocals |
| 3 | (Drums) |
Drum kit |
| 4 | (Bass) |
Bass |
| 5 | (Guitar) |
Guitar |
| 6 | (Keyboard) |
Keyboards / piano |
| 7 | (Percussion) |
Percussion |
| 8 | (Strings) |
Strings |
| 9 | (Synth) |
Synth |
| 10 | (FX) |
Sound effects / ambience |
| 11 | (Brass) |
Brass |
| 12 | (Woodwinds) |
Woodwinds |
two mode returns two tracks, (Vocals) and (Instrumental), each in 2 versions.
The track titles for both two and twelve are fixed names (they do not carry the source song name), so do not expect to see which song it was from the title.
Track titles cannot be used as unique keys. The two versions contain tracks with the same name (for example two
(Vocals), two(Strings)), and one separation returns many tracks. Always usesong_idas the identifier andsong_titlefor display only; do not use array indexes either (the order may change).
Request examples
Vocal / backing separation (stem_mode: "two")
curl -X POST https://www.suno-api.io/api/music/separate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"song_id": "source_clip_id",
"stem_mode": "two",
"source_audio_url": "https://example.com/source.mp3",
"source_file_name": "source.mp3",
"source_title": "Source Song"
}'
Multi-track split (stem_mode: "twelve")
curl -X POST https://www.suno-api.io/api/music/separate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"song_id": "source_clip_id",
"stem_mode": "twelve",
"source_audio_url": "https://example.com/source.mp3"
}'
Response
On success an array of separation results is usually returned. Each separation result is an independent song clip and must keep being queried until status becomes a completed state.
{
"code": 200,
"message": "success",
"data": {
"clips": [
{
"song_id": "stem_clip_id_1",
"song_title": "(Vocals)",
"status": "pending",
"generation_type": "separate",
"created_at": "2026-06-06T10:00:00Z"
},
{
"song_id": "stem_clip_id_2",
"song_title": "(Instrumental)",
"status": "pending",
"generation_type": "separate",
"created_at": "2026-06-06T10:00:00Z"
}
]
}
}
The above shows only 2 of the 4 entries for
twomode; in practice 4 are returned (2 versions × {(Vocals),(Instrumental)});twelvemode returns 24. The real count is the length of theclipsarray.
Customers usually only need to save clips[].song_id; later queries and downloads revolve around those IDs.
Notes
- Separation results do not appear in the
GET /api/music/songssong history (that list returns ordinary generated songs only). After a successful submission, saveclips[].song_idimmediately, otherwise you will have no way to find them later. - Each track is an independent work: every track has its own
song_idand must be polled to completion and downloaded separately. - Billing is unrelated to the number of entries: it is charged per call (
two0.6 ¥ per call,twelve3.0 ¥ per call), and 4 entries or 24 entries cost the same. - Download: use that track's
song_idwithPOST /api/music/download-url/download-file(free), or use theaudio_urlfrom the query result directly; for MIDI see the MIDI retrieval API. - Do not submit twice: separation is a synchronous endpoint, so after a timeout confirm with the song query first instead of retrying directly (that duplicates the order and charges again).
- Hide tracks you no longer need with the stem delete API.
Querying separation results
After a successful submission, query the results with clips[].song_id via POST /api/music/query.
curl -X POST https://www.suno-api.io/api/music/query \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"song_ids": "stem_clip_id_1,stem_clip_id_2"
}'
Example of a completed query:
[
{
"song_id": "stem_clip_id_1",
"song_title": "(Vocals)",
"status": "complete",
"audio_url": "https://...",
"cover_url": "https://...",
"duration": 180.5,
"generation_type": "separate",
"stem_from_id": "source_clip_id"
}
]
Downloading stem files
Once a separation result is complete, you can download a single stem file with the download endpoint.
Endpoint: POST /api/music/download-file
curl -X POST https://www.suno-api.io/api/music/download-file \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"song_id": "stem_clip_id_1",
"kind": "audio"
}' \
--output stem.mp3
kind supports:
| kind | Notes |
|---|---|
audio / song / music |
Download the MP3 audio |
cover / image |
Download the cover |
wav |
Download the WAV audio |
video / mp4 |
Download the video |
To package the related assets of one separation result, call:
curl -X POST https://www.suno-api.io/api/music/download-all \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"song_id": "stem_clip_id_1"
}' \
--output stem-resources.zip
Status values
| Status | Notes |
|---|---|
pending |
Submitted, waiting to be processed |
queued |
Queued |
generating / processing |
Being processed |
complete / completed |
Completed |
error / failed |
Failed; check error_message |
Common errors
| HTTP status | Notes | Suggested handling |
|---|---|---|
| 400 | Wrong parameters, for example a missing song_id or stem_mode |
Check the request parameters |
| 401 | The API key is invalid or missing | Check Authorization |
| 402 | Insufficient balance | Top up and retry |
| 409 | The source song cannot be processed for now | Check song_id or retry later |
| 500/503 | Temporary service or platform problem | Retry later or contact technical support |
Compatibility notes
Older documentation used single-object examples such as success/task_id/vocals_url/instrumental_url. The current separation API works with the clips[] song array: every separation result has its own song_id, and later queries and downloads revolve around those song_id values.
Related pages
- If you only want to split vocals and backing without choosing a mode, use the vocal removal API; it is the two-track shortcut form of this endpoint and is currently free.
- Hide separation tracks you no longer need with the stem delete API (a soft delete, not charged).
- For the MIDI of a stem see the MIDI retrieval API; for audio, cover and other media see the song media download and preview API.
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