Skip to content

Suno API Quickstart

Quickstart

Create one song and follow its playable candidates. Use an API key with task:create and task:read, and check your balance before submitting. The Task tracks execution and billing; the Generation tracks song candidates.

For each new logical operation, set and save a fresh REQUEST_KEY once. Reuse it with the exact same route and body only when recovering that operation. Use a different saved key when trying a different example or export format.

Terminal window
export REQUEST_KEY="$(uuidgen)"
Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/songs \
-H "x-api-key: $OMNAPI_KEY" \
-H "Idempotency-Key: $REQUEST_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "simple",
"prompt": "upbeat city pop, bright guitars, summer night drive",
"model": "chirp-hawk",
"config": {
"metadata": { "source": "suno-quickstart" }
}
}'

Response example (excerpt):

{
"taskId": "task_01J...",
"generationId": "task_01J...",
"status": "PROCESSING",
"clipIds": [
"clip_a",
"clip_b"
],
"deliveryStatus": "submitted",
"pollUrl": "/api/v1/tasks/task_01J...",
"viewUrl": "/api/v1/suno/generations/task_01J...",
"creditsRequired": 28
}

This example explicitly selects chirp-hawk, so it costs 28 standard credits. chirp-goose costs 25; other published models remain 28. suno/chirp-v3-5 is retired. Always treat the task receipt as authoritative.

The endpoint normally waits briefly for Suno to acknowledge real clipIds. Send Prefer: respond-async when even that short wait is undesirable. The receipt never contains a Suno /stream link.

Terminal window
curl https://api.omnapi.com/api/v1/suno/generations/task_01J... \
-H "x-api-key: $OMNAPI_KEY"

Each entry in clips[] has an independent submitted | queued | streaming | complete | error state. Start playback when a clip is playable: true and has a non-null playback.url; it does not need to wait for sibling candidates or the overall Task to complete. audioUrl can remain null during live playback, so do not use it as the readiness check. Use GET /api/v1/tasks/{taskId} separately for billing and execution diagnostics. For model identity, use modelCode for the OmnAPI request model, providerModelName for the exact clip model name, and majorModelVersion for the exact major version reported for that clip. model remains a compatibility label.

No SSE subscription or separate playback-session request is required. Poll the Generation every few seconds, respecting playback.retryAfterMs and request limits. Resolve a relative playback.url against https://api.omnapi.com, then open that URL in a browser or use it as an <audio src> without an API key. Live URLs are temporary; query the Generation again after playback.expiresAt or a playback error. Keep your API key on your server.

playback.state: "live" is non-seekable audio while generation continues; "final" is the completed, seekable audio. Do not replace an actively playing source on every poll. See the browser example and recovery guidance.

Terminal window
curl "https://api.omnapi.com/api/v1/suno/clips/clip_123" \
-H "x-api-key: $OMNAPI_KEY"

Clip detail is a free direct 200 lookup and creates no Task. For multiple external Suno clip IDs, use GET /api/v1/suno/clips?clipIds=clip_a,clip_b; these values are legacy mid values, never internal OmnAPI row IDs. Owned clips expose style tags and prompts. Shared public or remixable clips expose style tags but keep prompts private; merely readable external clips return only minimal media fields. Missing tags or duration are repaired on later Clip and Generation reads when the metadata becomes available.

OperationCredits
Song generation with chirp-goose25
Song generation with another published model, including Upload + Extend/Cover28
Existing-clip Extend or Cover25 with chirp-goose; 28 with either Pro model
WAV native / managed fallback3
Lyrics generation0
Clip, analysis, style, and Voice reads0
Aligned lyrics timeline1; 0 for the legacy Suno 55,000 plan
Owned completed clip → reusable public Voice5
Verified recordings → reusable public Voice66
Twelve-stem export140
Named stem extract (98 native Suno names)56

See Suno API endpoints for the complete route directory, then use the Interactive API Reference for exact generated schemas.

Use the Python and TypeScript examples for persisted requests and resumable task polling. Browse the endpoint directory for the full public surface.