Skip to content

Suno API for AI Music Generation

Suno endpoints provide direct music generation, remixing, export, lyrics, upload, and persona workflows. They follow the standard task model: authenticate with x-api-key, create a task with a POST /api/v1/suno/* endpoint, and poll GET /api/v1/tasks/{taskId} until terminal. The shared request config (priority / tags / metadata / webhookUrl), the status enum, and the resources[] output shape live in the hub — this page covers only Suno-specific inputs and outputs.

The model field on generation and derive endpoints accepts a Suno model identifier such as chirp-fenix, chirp-bluejay, or chirp-v4-5. Default when omitted: chirp-fenix.


Read-style Suno endpoints such as clip detail and timeline use the same task system but wait briefly for a result inline. If they don’t finish in that window they return 202 with the taskId (and pollUrl) — poll it like any other task. (See the task model for the sync/202 contract.)

One paid Suno song-generation or derive request is 28 credits. Read-only operations are free unless the request creates, stores, or packages a new asset.

OperationCredits
Song generation, derive, cover, extend, sample, mashup, persona song28
Lyrics generation0
Clip detail, batch clip query, timeline, style recommendation, persona reads0
Upload audio, WAV export, local concat, persona creation5
MP4 visualizer export10
Stems two / basic28
Stems twelve / full140

Create a new song. Dispatch is controlled by mode.

ModePurposeRequired fields
simplePrompt-only generationprompt
customLyrics + style generationlyrics or prompt
mashupBlend source clipsseed.clipIds with 2-4 clips
sampleCondition on a clip regionseed.sampleClipId, seed.sampleStartS, seed.sampleEndS
inspoGenerate from reference playlist clipsseed.playlistClipIds; prompt for simple inspo

If personaId is present, the request routes to persona music regardless of mode.

FieldTypeNotes
controlSliders.style_weightnumber 0–1How strongly the style hint biases the model. Higher = stricter adherence to tags / style.
controlSliders.audio_weightnumber 0–1For sample/mashup modes — how strongly the model conditions on the seed audio.
controlSliders.weirdness_constraintnumber 0–1Diversity dial. Higher = more experimental output.

Values outside the allowed range are clamped to 01.

Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/songs \
-H "x-api-key: $OMNAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "simple",
"prompt": "bright city pop about a late train home",
"instrumental": false
}'

Create a derivative from an existing clip.

actionWhat it doesCommon fields
extendContinue a clipcontinueAt, prompt, tags, title
coverReinterpret a clipprompt, tags, title
overpaintReplace vocals, keep backingprompt, tags, vocalGender
underpaintReplace instruments, keep vocalsprompt, tags, vocalGender
Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/clips/clip_123/derive \
-H "x-api-key: $OMNAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "extend",
"continueAt": 92.5,
"prompt": "add a bigger final chorus",
"tags": "anthemic pop rock"
}'

Export generated assets.

formatOutputNotes
wavWAV audioAvailability depends on the source clip and account capabilities
videoMP4 visualizerCreates or returns the clip video
stemsSeparated audiostemsMode: "two" or "twelve"
Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/clips/clip_123/export \
-H "x-api-key: $OMNAPI_KEY" \
-H "Content-Type: application/json" \
-d '{ "format": "stems", "stemsMode": "two" }'

Generate Suno lyrics. Set candidates: 2 for paired candidates. Returns a task id — poll GET /api/v1/tasks/{taskId} for the result.

Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/lyrics \
-H "x-api-key: $OMNAPI_KEY" \
-H "Content-Type: application/json" \
-d '{ "prompt": "bittersweet indie pop about moving away", "candidates": 2 }'
EndpointPurpose
GET /api/v1/suno/clips/{clipId}Single clip detail, including viewer-scoped fields
GET /api/v1/suno/clips?ids=a,b,cBatch clip query
GET /api/v1/suno/clips/{clipId}/timelineAligned lyrics timeline
GET /api/v1/suno/styles/recommendRecommended styles. Optional ?exclude=a,b,c filters up to 50 styles out of the response.
Terminal window
curl https://api.omnapi.com/api/v1/suno/clips/clip_123/timeline \
-H "x-api-key: $OMNAPI_KEY"

Create a persona either from an existing rootClipId, or from two remote audio URLs that OmnAPI validates before use.

Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/personas \
-H "x-api-key: $OMNAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Demo Voice",
"voiceAudioUrl": "https://example.com/voice.mp3",
"verificationAudioUrl": "https://example.com/verification.mp3"
}'

Use GET /api/v1/suno/personas to list personas and GET /api/v1/suno/personas/{personaId} for details.

Upload a remote audio URL into Suno. URLs must use http or https; private network addresses and oversized files are rejected.

Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/uploads \
-H "x-api-key: $OMNAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/source.mp3",
"title": "Imported Demo",
"describeAudio": true
}'

For minimal client changes, legacy Suno Cloud clients can use the /v1/* migration routes with the legacy api-key header. x-api-key is also accepted. Migration routes return OmnAPI task identifiers; poll GET /api/v1/tasks/{taskId} for the canonical result.

Legacy suno-cloud endpointNew OmnAPI endpoint
POST /v1/generate-gptPOST /api/v1/suno/songs with mode: "simple"
POST /v1/generatePOST /api/v1/suno/songs with mode: "custom"
POST /v1/generate/lyricPOST /api/v1/suno/lyrics
GET /v1/songsGET /api/v1/suno/clips?ids=...
GET /v1/songs/lyric-stampGET /api/v1/suno/clips/{clipId}/timeline
POST /v1/uploadPOST /api/v1/suno/uploads
POST /v1/stemsPOST /api/v1/suno/clips/{clipId}/export with format: "stems"
POST /v1/generate-wavPOST /api/v1/suno/clips/{clipId}/export with format: "wav"
POST /v1/concatenatePOST /api/v1/suno/clips/{clipId}/derive with action: "extend" plus auto-concat configuration
POST /v1/create-personaPOST /api/v1/suno/personas
POST /v1/extend-and-concatMigration route that submits an extend task
GET /v1/extend-and-concat/{jobId}GET /api/v1/tasks/{taskId}