This guide complements the parameter tables on the Suno model API pages. The API page is still the source of truth for request fields, field types, and endpoint examples, but this document explains the business rules that are harder to understand from the schema alone.
prompt.A common Suno integration flow looks like this:
taskId.callBackUrl webhook or poll the task query endpoint.The original source documents describe 4 creation patterns. The most common integration mistake is assuming some fields can simply be omitted when they actually need to be sent as empty strings.
| Mode | prompt | title | style | customMode / custom | instrumental | Notes |
|---|---|---|---|---|---|---|
| Vocal song from description | Required | Empty string | Empty string | false | false | title and style must be present as empty strings |
| Instrumental song from description | Required | Empty string | Empty string | false | true | Do not omit title or style |
| Custom vocal song | Required | Required | Required | true | false | prompt represents lyrics content |
| Custom instrumental song | Empty string | Required | Required | true | true | prompt should be sent as an empty string, not omitted |
Use this mode when the user gives you a natural-language description of the song they want.
prompt is the song description.title must be an empty string.style must be an empty string.customMode / custom must be false.instrumental must be false.Example:
1{
2 "input": {
3 "prompt": "A happy and uplifting pop song",
4 "title": "",
5 "style": "",
6 "customMode": false,
7 "instrumental": false
8 }
9}This mode is similar to the previous one, except that the output should not contain vocals.
prompt is still a description, not lyrics.title should be an empty string.style should be an empty string.customMode / custom must be false.instrumental must be true.Example:
1{
2 "input": {
3 "prompt": "A bright cinematic synthwave track for a night drive",
4 "title": "",
5 "style": "",
6 "customMode": false,
7 "instrumental": true
8 }
9}Use this mode when you want to control lyrics, style, and title directly.
prompt contains the lyrics or lyric draft.title is required.style is required.customMode / custom must be true.instrumental must be false.Based on the source material:
prompt should not exceed 3000 characters.style should not exceed 200 characters.Example:
1{
2 "input": {
3 "prompt": "Write heartfelt lyrics about a summer romance by the sea",
4 "title": "Summer Love",
5 "style": "Warm pop, catchy, radio-friendly",
6 "customMode": true,
7 "instrumental": false
8 }
9}This is another frequent source of bugs.
prompt should be an empty string.title is required.style is required.customMode / custom must be true.instrumental must be true.Example:
1{
2 "input": {
3 "prompt": "",
4 "title": "Night Drive",
5 "style": "Synthwave, cinematic, neon atmosphere",
6 "customMode": true,
7 "instrumental": true
8 }
9}Extend is used when you already have a generated Suno song and want to continue it from a specific timestamp.
The fields that matter most are:
audio_idcontinue_attitlestylepromptIf the continuation should remain a vocal song:
prompt should contain the continuation lyrics or vocal guidance.title should have a value.style should have a value.continue_at tells the system from which second the original song should continue.Example:
1{
2 "input": {
3 "audio_id": "song audio id",
4 "style": "pop",
5 "title": "Extended Song Title",
6 "prompt": "Continue with a new chorus and a longer outro",
7 "continue_at": 60
8 }
9}If the continuation should stay instrumental:
prompt should be an empty string.title should have a value.style should have a value.prompt is empty.Example:
1{
2 "input": {
3 "audio_id": "song audio id",
4 "style": "pop",
5 "title": "Extended Song Title",
6 "prompt": "",
7 "continue_at": 60
8 }
9}Concat is used after extension when you want a merged full song rather than only the newly extended segment.
Key points:
audio_id you pass here is usually the audio_id returned by the extended result.Example:
1{
2 "input": {
3 "audio_id": "8c9f6a88-672b-4b7c-93e0-31dbfdf42349"
4 }
5}Whether you are generating, extending, or concatenating, the create call usually returns a task identifier first.
You then have two ways to get the final result:
callBackUrl and wait for the webhook.Recommended approach:
callBackUrl for backend production workflows.This is the part many users miss.
In the current ApiPass callback examples, the key task-level state is usually in data.state:
success: the task completed successfullyfail: the task failedTypical success callback:
1{
2 "code": 200,
3 "data": {
4 "taskId": "task_abc123xyz",
5 "state": "success",
6 "completeTime": 1755599644000,
7 "costTime": 45000,
8 "createTime": 1755599599000,
9 "model": "suno/generate",
10 "resultJson": {
11 "data": [
12 {
13 "id": "audio_001",
14 "audio_url": "https://cdn.apipass.dev/results/task_abc123xyz_0_audio.mp3",
15 "image_url": "https://cdn.apipass.dev/results/task_abc123xyz_0_cover.jpeg",
16 "duration": 180.5,
17 "title": "Summer Love",
18 "style": "Pop"
19 }
20 ]
21 }
22 },
23 "msg": "Task completed successfully."
24}Typical failure callback:
1{
2 "code": 501,
3 "data": {
4 "taskId": "task_abc123xyz",
5 "state": "fail",
6 "failCode": "GENERATION_FAILED",
7 "failMsg": "Music generation failed due to content policy violation"
8 },
9 "msg": "Task failed."
10}In production, a safe minimum is:
code === 200 and data.state === "success".data.state === "fail" as a hard failure branch.failCode and failMsg for troubleshooting.In the source documents, each audio object often has its own status field, for example:
completeThat means you should distinguish:
data.state for task-level completionresultJson.data[].status for each returned audio itemIf your business consumes both generated variants, process the array item by item instead of assuming there is only one result.
callbackType in the Source DocumentsThe source documents also show:
callbackType: "complete"You can treat that as a helpful secondary signal, but the safer approach is still:
data.stateresultJson.dataIf you want a stable integration, store at least the following:
taskIdmodelstatefailCodefailMsgaudio_idaudio_urlimage_urldurationtitlestylestatuscompleteTimeThis will make retries, reconciliation, support investigations, and callback replays much easier later.
Some Suno modes do not want a missing field. They want an explicitly empty string. The most common cases are:
title in description modestyle in description modeprompt in custom instrumental modeIf you already have direct lyrics, title, and style, use custom mode. If you only have a natural-language idea of the song, use description mode.
prompt Logicprompt should contain contentprompt should be an empty stringThat is not enough. At minimum, verify:
codedata.stateIf you are integrating Suno into a real product, the safest order is:
This is much safer than trying to launch every Suno branch at once.