Skip to content

Suno API

RouteAPI provides a unified REST API for Suno AI music generation. Generate music from text, extend songs, clone voices, separate stems, and more.

Base URL: https://api.routeapi.ai
Authentication: Authorization: Bearer sk-xxxx

Suno music generation is asynchronous. The typical flow:

  1. Submit a task to /suno/audios → receive a task_id
  2. Wait 2-3 seconds before starting to poll
  3. Poll every 3-5 seconds via /suno/tasks with action: "retrieve"
  4. When status becomes success → fetch the audio_url
StatusMeaningNext Step
submittedQueued for processingContinue polling
queuedWaiting in queueContinue polling
in_progressGeneratingContinue polling
success✅ CompleteGet data.audio_url
failed❌ FailedCheck error field
Terminal window
curl -X POST "https://api.routeapi.ai/suno/audios" \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "chirp-v5-5",
"prompt": "A cheerful summer pop song with piano and guitar",
"async": true
}'

Response:

{ "success": true, "task_id": "task_xxxxx" }

Poll every 3-5 seconds until status becomes success:

Terminal window
curl -X POST "https://api.routeapi.ai/suno/tasks" \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{ "action": "retrieve", "id": "task_xxxxx" }'
{
"id": "task_xxxxx",
"status": "success",
"data": {
"audio_url": "https://cdn.suno.ai/xxx.mp3",
"video_url": "https://cdn.suno.ai/xxx.mp4",
"title": "Summer Breeze",
"duration": 183.5
}
}
Model IDMax DurationLyric LimitStyle LimitTitle Limit
chirp-v5-58 minutes5000 chars1000 chars100 chars
chirp-v58 minutes5000 chars1000 chars100 chars
chirp-v4-5-plus8 minutes5000 chars1000 chars100 chars
chirp-v4-54 minutes5000 chars1000 chars100 chars
chirp-v4150 seconds3000 chars200 chars80 chars
chirp-v3-5120 seconds3000 chars200 chars80 chars

The prompt field (non-custom mode) has a uniform 500 character limit across all models.

The core endpoint supporting all 18 audio operations.

FieldTypeDefaultDescription
modelstringchirp-v4Generation model, recommend chirp-v5-5
actionstringgenerateOperation type (see below)
asyncbooleanfalseStrongly recommended true to avoid timeouts
ActionDescriptionRequired Fields
generateGenerate new music from promptprompt or custom=true + lyric + style
extendExtend existing audioaudio_id + continue_at
concatConcatenate audio clips into full trackaudio_id
coverRe-interpret existing song in new styleaudio_id
upload_coverCover uploaded audioaudio_id (via /suno/upload)
upload_extendExtend uploaded audioaudio_id + continue_at
artist_consistencySing with specified Personapersona_id + lyric / prompt
artist_consistency_voxVOX mode Persona singing (higher quality)persona_id + lyric / prompt
stemsSeparate into vocals + instrumentalaudio_id
all_stemsSeparate into all tracks (vocals, drums, bass, other)audio_id
replace_sectionReplace audio segmentaudio_id + replace_section_start + replace_section_end
underpaintingAdd AI instrumental to vocal trackaudio_id + underpainting_start + underpainting_end
overpaintingAdd AI vocals to instrumental trackaudio_id + overpainting_start + overpainting_end
samplesAdd AI samples in time rangeaudio_id + samples_start + samples_end
remasterRemaster audio to improve qualityaudio_id
mashupMerge multiple songsmashup_audio_ids (array)
inspoGenerate music inspired by 1-4 reference tracksaudio_urls (1-4 URLs)
FieldTypeDescription
promptstringNatural language description of music theme, mood, scene
lyricstringCustom lyrics with section markers like [Verse], [Chorus], [Bridge]
custombooleanEnable custom mode (allows specifying lyrics, title, style)
instrumentalbooleanGenerate instrumental music (no vocals)
titlestringSong title
stylestringStyle/genre/mood description, comma-separated
style_negativestringUnwanted styles (e.g., “heavy, rock, guitar”)
durationintegerDesired duration in seconds (10-360), hint only in custom mode
FieldTypeDescription
audio_idstringExisting audio ID (from generation or /suno/upload)
audio_urlsstring[]Reference audio public URLs (1-4)
mashup_audio_idsstring[]Source audio IDs for mashup
continue_atnumberExtend start time (seconds)
FieldTypeDescription
persona_idstringVoice persona ID (created via /suno/persona)
vocal_genderstringVocal gender preference: f (female) / m (male)
variation_categorystringRemaster precision: high / normal / subtle
Terminal window
curl -X POST "https://api.routeapi.ai/suno/audios" \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "chirp-v5-5",
"prompt": "Uplifting electronic dance music with synth lead",
"async": true
}'
Terminal window
curl -X POST "https://api.routeapi.ai/suno/audios" \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "chirp-v5-5",
"custom": true,
"title": "Summer Dreams",
"style": "pop, upbeat, piano",
"lyric": "[Verse]\nWalking on the beach at sunset\n[Chorus]\nSummer dreams never fade",
"async": true
}'
Terminal window
curl -X POST "https://api.routeapi.ai/suno/audios" \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{
"model": "chirp-v5",
"action": "extend",
"audio_id": "abc123-audio-id",
"continue_at": 30.5,
"async": true
}'
Terminal window
curl -X POST "https://api.routeapi.ai/suno/audios" \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{
"action": "stems",
"audio_id": "song-to-split",
"async": true
}'

Query task status and results. This is the only way to retrieve results from /suno/audios.

Terminal window
curl -X POST "https://api.routeapi.ai/suno/tasks" \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{ "action": "retrieve", "id": "task_xxxxx" }'

Response:

{
"id": "task_xxxxx",
"status": "success",
"data": {
"audio_url": "https://cdn.suno.ai/xxx.mp3",
"video_url": "https://cdn.suno.ai/xxx.mp4",
"title": "Song Title",
"text": "Lyrics content",
"duration": 183.5,
"model_name": "chirp-v5-5"
}
}
Terminal window
curl -X POST "https://api.routeapi.ai/suno/tasks" \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{ "action": "retrieve_batch", "ids": ["task_001", "task_002"] }'

Generate lyrics that can be used in /suno/audios’s lyric field.

FieldTypeRequiredDescription
promptstring✅Lyrics creation prompt
modelstringDefault default
Terminal window
curl -X POST "https://api.routeapi.ai/suno/lyrics" \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{ "prompt": "Write upbeat summer pop lyrics with chorus" }'

Upload external audio file, returns audio_id for use in extend, cover, voice cloning operations.

Terminal window
curl -X POST "https://api.routeapi.ai/suno/upload" \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{ "audio_url": "https://example.com/my-audio.mp3" }'

Manage voice personas (voice cloning).

Terminal window
curl -X GET "https://api.routeapi.ai/suno/persona" \
-H "Authorization: Bearer sk-xxxx"
Terminal window
curl -X POST "https://api.routeapi.ai/suno/persona" \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-d '{
"audio_id": "uploaded-audio-id",
"name": "My Voice",
"vocal_start": 5.0,
"vocal_end": 15.0
}'
EndpointMethodDescription
/suno/voicesPOSTExtract vocal information from audio
/suno/stylePOSTGenerate style description from prompt
/suno/mashup-lyricsPOSTMerge two lyrics
/suno/wavPOSTExport WAV format (30-day validity)
/suno/mp4POSTExport MP4 video
/suno/midiPOSTExport MIDI file
/suno/timingPOSTGet lyrics timing for subtitles
/suno/voxPOSTExtract vocal segment (remove instrumental)
Status CodeDescription
400Invalid request parameters
401Authentication failed
502Upstream service error
500Internal server error

Error response format:

{ "success": false, "error": "error_code", "message": "Detailed error message" }
async function generateAndPoll(prompt) {
// Submit task
const res = await fetch('https://api.routeapi.ai/suno/audios', {
method: 'POST',
headers: { 'Authorization': 'Bearer sk-xxxx', 'Content-Type': 'application/json' },
body: JSON.stringify({ model: 'chirp-v5-5', prompt, async: true })
});
const { task_id } = await res.json();
// Wait before first poll
await new Promise(r => setTimeout(r, 3000));
const deadline = Date.now() + 3 * 60 * 1000; // 3 min timeout
while (Date.now() < deadline) {
const poll = await fetch('https://api.routeapi.ai/suno/tasks', {
method: 'POST',
headers: { 'Authorization': 'Bearer sk-xxxx', 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'retrieve', id: task_id })
});
const result = await poll.json();
if (result.status === 'success') return result.data;
if (result.status === 'failed') throw new Error(result.error);
await new Promise(r => setTimeout(r, 4000)); // Poll every 4s
}
throw new Error('Task timeout');
}

Q: Which model should I use?
Use chirp-v5-5 (latest and most capable). For stable older version, choose chirp-v4.

Q: How long does generation take?
generate usually 15-40 seconds. Processing operations like stems, all_stems, remaster may take 1-3 minutes.

Q: Can I use audio_url directly?
Yes, the CDN URL is ready for playback or download: curl -o song.mp3 "<audio_url>"

Q: How long is a single generate?
Usually 2-3 minutes. Use extend to continue to 4-5+ minutes by setting continue_at.

Q: Common failure reasons?

ErrorCauseSolution
prompt_emptyMissing prompt or lyricProvide content fields
audio_id_requiredAction requires audio_id but not providedCheck required fields for action
generation_failedContent violation or upstream errorModify prompt and retry
quota_exceededInsufficient quotaCheck account balance

Q: Concurrent request limits?
Yes, depends on account plan. Recommended concurrency ≤ 5, polling interval ≥ 3s.