Vocal remover and stems
curl --request POST \
--url https://apistable.com/api/v1/tasks/create_task \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "suno_separate_vocals",
"input": {
"type": "separate_vocal",
"upload_url": "https://example.com/song.mp3"
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'suno_separate_vocals',
input: {type: 'separate_vocal', upload_url: 'https://example.com/song.mp3'}
})
};
fetch('https://apistable.com/api/v1/tasks/create_task', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://apistable.com/api/v1/tasks/create_task"
payload = {
"model": "suno_separate_vocals",
"input": {
"type": "separate_vocal",
"upload_url": "https://example.com/song.mp3"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"code": 200,
"msg": "success",
"data": {
"task_id": "<string>"
}
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}Suno
Vocal remover and stems
Use an audio URL for toolbox separation or an APIstable audio ID for native stems, then listen to and download individual parts.
POST
/
api
/
v1
/
tasks
/
create_task
Vocal remover and stems
curl --request POST \
--url https://apistable.com/api/v1/tasks/create_task \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "suno_separate_vocals",
"input": {
"type": "separate_vocal",
"upload_url": "https://example.com/song.mp3"
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'suno_separate_vocals',
input: {type: 'separate_vocal', upload_url: 'https://example.com/song.mp3'}
})
};
fetch('https://apistable.com/api/v1/tasks/create_task', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://apistable.com/api/v1/tasks/create_task"
payload = {
"model": "suno_separate_vocals",
"input": {
"type": "separate_vocal",
"upload_url": "https://example.com/song.mp3"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"code": 200,
"msg": "success",
"data": {
"task_id": "<string>"
}
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}{
"code": 123,
"msg": "<string>",
"data": null
}Operations are enabled individually by server configuration. Disabled operations return 503 without a task. Music credit deduction is currently disabled.
Using this operation
Use an audio URL for toolbox separation or an APIstable audio ID for native stems, then listen to and download individual parts.-
- Prepare the fields shown in the example below. Replace sample URLs and IDs with resources you can access.
-
- Set model to suno_separate_vocals and place the parameters inside input. Submit once and save the returned task_id.
-
- Query the saved task or receive its callback. A processing result is not a reason to submit the operation again.
- Iterate result.stems to access each part’s download_url and expiry. Use the returned stem names and count.
Create task
Send model and input to the common task endpoint. callback_url is an optional top-level public HTTPS address. All resource IDs are APIstable IDs owned by your account. Music credit deduction is currently disabled.{
"model": "suno_separate_vocals",
"input": {
"type": "separate_vocal",
"upload_url": "https://example.com/song.mp3"
}
}
Acceptance response
HTTP 200 confirms acceptance, not completion. Query GET /api/v1/tasks/{task_id} until data.status is succeeded or failed. Read data.result only after success; a failed task has its error in data.message.{
"code": 200,
"msg": "success",
"data": {
"task_id": "YOUR_TASK_ID"
}
}
Fields: type = separate_vocal
| Field | Type | Required | Description and limits |
|---|---|---|---|
| type | string | Yes | separate_vocal (2 tracks), split_stem (4/6), or native split_stem_advanced. = separate_vocal |
| upload_url | string | Yes | Public HTTPS audio URL on port 443, without URL credentials. Use MP3/WAV/FLAC/OGG/M4A/AAC with a readable audio track. See the operation size limit. |
| output_format | string | No / conditional | Toolbox output: mp3, wav (default), flac, ogg, m4a or aac. Not accepted for native stem extraction. values: mp3, wav, flac, ogg, m4a, aac; default: wav |
Fields: type = split_stem
| Field | Type | Required | Description and limits |
|---|---|---|---|
| type | string | Yes | separate_vocal (2 tracks), split_stem (4/6), or native split_stem_advanced. = split_stem |
| upload_url | string | Yes | Public HTTPS audio URL on port 443, without URL credentials. Use MP3/WAV/FLAC/OGG/M4A/AAC with a readable audio track. See the operation size limit. |
| stem_mode | number | Yes | Toolbox separation: 4 or 6 stems. Vocal remover fixes this to 2 internally. values: 4, 6 |
| output_format | string | No / conditional | Toolbox output: mp3, wav (default), flac, ogg, m4a or aac. Not accepted for native stem extraction. values: mp3, wav, flac, ogg, m4a, aac; default: wav |
Fields: type = split_stem_advanced
| Field | Type | Required | Description and limits |
|---|---|---|---|
| type | string | Yes | separate_vocal (2 tracks), split_stem (4/6), or native split_stem_advanced. = split_stem_advanced |
| audio_id | string | Yes | APIstable song ID belonging to your account. Cover/extend accept this ID only, without a source task_id or external URL. maxLength: 200 |
| stem_name | string | No / conditional | Native extraction name. Only Piano is documented and enabled; omit for twelve-stem separation. maxLength: 100 |
Inputs and limits
The schema lists supported fields, types and basic limits. Also follow Important conditions: cross-field and source-resource checks are not fully represented in JSON Schema. Unknown parameters are rejected. URL fields accept public HTTPS URLs, never file objects.{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"oneOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "separate_vocal",
"description": "separate_vocal (2 tracks), split_stem (4/6), or native split_stem_advanced."
},
"upload_url": {
"type": "string",
"format": "uri",
"description": "Public HTTPS audio URL on port 443, without URL credentials. Use MP3/WAV/FLAC/OGG/M4A/AAC with a readable audio track. See the operation size limit."
},
"output_format": {
"default": "wav",
"type": "string",
"enum": [
"mp3",
"wav",
"flac",
"ogg",
"m4a",
"aac"
],
"description": "Toolbox output: mp3, wav (default), flac, ogg, m4a or aac. Not accepted for native stem extraction."
}
},
"required": [
"type",
"upload_url"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "split_stem",
"description": "separate_vocal (2 tracks), split_stem (4/6), or native split_stem_advanced."
},
"upload_url": {
"type": "string",
"format": "uri",
"description": "Public HTTPS audio URL on port 443, without URL credentials. Use MP3/WAV/FLAC/OGG/M4A/AAC with a readable audio track. See the operation size limit."
},
"stem_mode": {
"anyOf": [
{
"type": "number",
"const": 4
},
{
"type": "number",
"const": 6
}
],
"description": "Toolbox separation: 4 or 6 stems. Vocal remover fixes this to 2 internally."
},
"output_format": {
"default": "wav",
"type": "string",
"enum": [
"mp3",
"wav",
"flac",
"ogg",
"m4a",
"aac"
],
"description": "Toolbox output: mp3, wav (default), flac, ogg, m4a or aac. Not accepted for native stem extraction."
}
},
"required": [
"type",
"upload_url",
"stem_mode"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "split_stem_advanced",
"description": "separate_vocal (2 tracks), split_stem (4/6), or native split_stem_advanced."
},
"audio_id": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "APIstable song ID belonging to your account. Cover/extend accept this ID only, without a source task_id or external URL."
},
"stem_name": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Native extraction name. Only Piano is documented and enabled; omit for twelve-stem separation."
}
},
"required": [
"type",
"audio_id"
],
"additionalProperties": false
}
]
}
Important conditions
- separate_vocal and split_stem use upload_url with an audio limit of 100 MiB. separate_vocal requests two stems; split_stem requires stem_mode=4 or 6. Choose the documented output_format; default wav.
- Native split_stem_advanced uses audio_id, not upload_url or output_format. Omit stem_name for twelve-stem separation, or pass Piano for the enabled single-stem extraction. Other names return 42201. Multiple groups may be returned; use the actual stems array rather than a fixed count.
- Audio URL inputs must contain readable MP3/WAV/FLAC/OGG/M4A/AAC audio with positive duration; the limit is 100 MiB per file. URLs must be publicly accessible HTTPS on port 443, without embedded credentials or private-network addresses. Keep them accessible until the task finishes.
- Uploaded files last 24 hours, generated files 14 days and task details 30 days. Reused files keep their original expiry. Valid Voice/Persona identity mappings are separate from task-log cleanup. Download files you need to retain.
Result schema
The creation response is {code:200,msg:“success”,data:{task_id}}. Poll GET /api/v1/tasks/{task_id}. On success, data.result is an object matching the schema below; it is otherwise null. input remains a JSON string.{
"type": "object",
"required": [
"stems"
],
"properties": {
"stems": {
"type": "array",
"items": {
"type": "object",
"properties": {
"stem_name": {
"type": [
"string",
"null"
]
},
"download_url": {
"type": "string"
},
"expires_at": {
"type": "string"
}
}
}
}
},
"additionalProperties": false
}
Related workflows
Voice: all four steps File uploads CallbacksAuthorizations
Every valid key can submit and query its own account. Revoked keys are rejected.
Body
application/json