Skip to content

Suno API for AI Music Generation

Suno endpoints provide music generation, managed audio-to-song workflows, lyrics, stems, and reusable Voice workflows. Authenticate with x-api-key. Song and derive writes create both an execution Task and a customer-facing Suno Generation. Use the Generation to follow songs and candidate clips; use the Task for execution, billing, webhooks, cancellation, and diagnostics.

The model field on song-generation and derive requests accepts exactly one of the six identifiers below. Default when omitted: chirp-fenix.

model valueSuno generation familyCredits per generationPublic Voice mode
chirp-auk-turbov4.5-all / Full25No
chirp-v4v428No
chirp-aukv4.528No
chirp-bluejayv4.5+28No
chirp-crowv528Yes
chirp-fenixv5.5; default28Yes

Use the bare value above in /api/v1/suno/songs and /api/v1/suno/clips/{clipId}/derive. The generic Task API uses a full path such as suno/chirp-fenix/text-to-music-simple; do not send that full path in the direct Suno model field. chirp-v3-5 is retired, and remaster-only models are not selectable through these public operations.


The modern Suno surface is a production, task-backed API for:

  • new songs from prompts, custom lyrics, a reusable public Voice, or caller-owned audio;
  • existing-clip Extend and Cover, with Concat included automatically in Extend;
  • lyrics, native or managed WAV, full or named stems, aligned lyrics, audio analysis, and style recommendations;
  • Voice creation from an owned completed clip or verified recordings, and public Voice reuse.

OmnAPI owns request validation, idempotent task creation, account selection, provider polling, required post-processing, retained output delivery, webhooks, and credit settlement. Model output quality and wall-clock time still depend on Suno and the validity of caller-supplied media.

Technical failures that end a paid Task as FAILED or CANCELLED follow the shared refund rules. Subjective music quality is not an automatic refund condition. Callers are responsible for having the rights to prompts, lyrics, recordings, and uploaded audio.

Unlike MV, Suno operations use catalog operation prices and do not expose quote, preflight, or maxCredits. Read GET /api/v1/pricing/catalog before presenting a purchase and treat the create receipt’s creditsRequired as authoritative.

The following provider capabilities are deliberately outside the public contract:

CapabilityPublic statusReason
CoverPublic through action: "cover"Stable source-bound contract and billing
Extend + ConcatPublic as one action: "extend" taskThe complete song is one product; a separate Concat would permit duplicate work and charging
Remaster / Infill / Editor actionsInternalProvider contracts and finalization semantics are not stable enough for a durable public API
Video / Opus exportsInternalNot part of the supported retained-audio delivery contract
Standalone uploadNot publicUpload is exposed only inside atomic Upload + Extend/Cover workflows

Every endpoint below requires x-api-key. Send Content-Type: application/json on JSON requests. Idempotency-Key is optional on POST requests and strongly recommended when a client may retry a write.

MethodPathFunctionDescription
GET/api/v1/suno/availabilityAvailabilityRead advisory delivery health and advanced-operation availability
POST/api/v1/suno/songsSong creationCreate from a prompt, custom lyrics, public Voice, or managed upload workflow
POST/api/v1/suno/lyricsLyricsGenerate one or two lyrics candidates without creating a song
GET/api/v1/suno/generationsGeneration trackingList the caller’s song-product history with cursor pagination
GET/api/v1/suno/generations/{generationId}Generation trackingRead candidate states, early playable URLs, finalization, and billing
GET/api/v1/suno/clipsClip readsBatch-read external clip IDs with ordered partial-result reporting
GET/api/v1/suno/clips/{clipId}Clip readsRead one external clip directly without creating a Task
POST/api/v1/suno/clips/{clipId}/deriveClip derivationExtend with automatic Concat or Cover an existing clip
POST/api/v1/suno/clips/{clipId}/exportAudio exportExport native/managed WAV or retained stems
GET/api/v1/suno/clips/{clipId}/timelineMusic metadataRead aligned lyric words, lines, and waveform timing
GET/api/v1/suno/clips/{clipId}/audio-analysisMusic metadataRead typed beat, key, downbeat, and waveform analysis
GET/api/v1/suno/styles/recommendMusic metadataGet style recommendations with an optional exclusion list
GET/api/v1/suno/voices/verification-phraseVoice workflowObtain a phrase task for recording verification
POST/api/v1/suno/voicesVoice workflowCreate a reusable public Voice from verified recordings
POST/api/v1/suno/voices/from-clipVoice workflowCreate a reusable public Voice from a completed clip owned by the caller
GET/api/v1/suno/voicesVoice workflowList completed public Voices created by the caller
GET/api/v1/suno/voices/{voiceId}Voice workflowInspect a known public Voice that can be reused for generation

The shared Task API completes the asynchronous workflow:

MethodPathDescription
GET/api/v1/tasks/{taskId}Read execution, billing, terminal error, and retained resources
POST/api/v1/tasks/{taskId}/cancelRequest safe cancellation; refund eligibility depends on provider submission state

Suno uses a small set of consistent response shapes:

Endpoint familySuccess responseHow to continue
Song and derive writesGeneration receipt with taskId, generationId, clipIds, pollUrl, and viewUrlPoll viewUrl for candidates; poll pollUrl for execution and billing
Lyrics, export, and Voice creationTask create receipt with taskId, links, pricing, and productPoll links.task; consume retained resources after completion
Generation readsSunoGeneration or { items, nextCursor, hasMore }Continue with the opaque cursor; never derive cursor values
Clip detail and batch readsDirect SunoClip or { items, missingClipIds, errors }No Task is created and no credits are charged
Timeline, analysis, styles, verification phrase, and Voice detailRead-style Task response200 is ready; 202 means poll the returned pollUrl
AvailabilityAdvisory health objectRespect retryAfterSec; the actual task receipt remains authoritative

Write responses are business objects directly. Errors use the shared envelope:

{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Human-readable message",
"details": {}
}
}

Use the Interactive API Reference for the generated schema of every request and response.


IDMeaningUse it with
taskIdOmnAPI execution and billing ID/api/v1/tasks/{taskId}, cancellation, webhooks
generationIdSuno product ID; currently equal to taskId/api/v1/suno/generations/{generationId}
clipIdExternal Suno clip ID; the legacy midClip reads, Extend, Cover, WAV, Stems, MV

Internal database row IDs are never part of the modern Suno contract.

POST /songs and POST /clips/{clipId}/derive normally wait up to 15 seconds for Suno’s acknowledgement. The usual response arrives in about 2–4 seconds and already contains clipIds, so clients can buffer a candidate as soon as its audioUrl becomes available. Send Prefer: respond-async to skip this acknowledgement wait. If the wait expires, the request still returns the same Generation receipt rather than a gateway timeout; keep polling its viewUrl.

There is no Suno /stream endpoint. Poll the Generation, use its webhook-backed Task, or poll the Task when execution diagnostics are needed.

Direct clip detail and batch clip reads are free 200 responses and do not create Tasks. Timeline, analysis, style, and Voice detail reads may require a short provider lookup; they return 200 when ready or 202 with taskId and pollUrl when that lookup continues.

The service pricing catalog is the source of truth. Fetch GET /api/v1/pricing/catalog and cache it according to its Cache-Control header; the create receipt’s creditsRequired is authoritative for that task. Suno uses operation prices and does not accept maxCredits. The create receipt is authoritative if pricing changes after a catalog response was cached.

OperationCredits
Song generation with chirp-auk-turbo, including Upload + Extend/Cover25
Song generation with chirp-v4, chirp-auk, chirp-bluejay, chirp-crow, or chirp-fenix28
Song generation with a public Voice28; Vox accepts only chirp-crow or chirp-fenix
Existing-clip Extend (automatic Concat included)28
Existing-clip Cover28
WAV managed delivery3
Lyrics generation, including paired candidates0
Clip detail, batch clip query, audio analysis, style recommendation, Voice reads0
Aligned lyrics timeline1; 0 for the legacy Suno 55,000 plan
Owned completed clip → reusable public Voice5
Verified recordings → reusable public Voice66
Stems twelve / full140
Named stem extract (one of 98 native Suno names)56

suno/chirp-v3-5 is retired and cannot be selected for new requests. Voice generation is not exposed on v4.5-all/full, v4, v4.5, or v4.5+. Use the v5 (chirp-crow) or v5.5 (chirp-fenix) lane.

These are standard catalog prices. Customer pricing applies to every paid Suno operation—not only song generation—and the returned creditsRequired already contains the caller’s rate. For variable delivery such as WAV, authorization, actual settlement, and refunds all reuse the same frozen customer-pricing rule.

When you send an Idempotency-Key, reuse it only when retrying the same logical request after a transport timeout; use a new key for a new attempt. Omitting the header creates a new task on every accepted write.


Call POST /api/v1/suno/songs when the input is generation text, a reusable public Voice, or caller-owned audio that has not already become a Suno clip. The request creates both a billing/execution Task and a song Generation.

ModePurposeRequired fields
simplePrompt-only generationprompt
customLyrics + style generationlyrics or prompt
voxGenerate with a reusable public VoicevoiceId and generation text
upload-extendUpload customer audio and continue itaudio.url; generation fields are optional
upload-coverUpload customer audio and reinterpret itaudio.url; generation fields are optional

Standalone audio upload is not part of the public API. The two upload modes perform import and song generation as one billable operation.

FieldTypeApplies toNotes
modestringallRequired discriminator; unsupported modes are rejected.
promptstring, max 5,000allRequired by simple; can provide generation direction in other modes.
lyricsstring, max 5,000custom, voxcustom requires lyrics or prompt.
tags / negativeTagsstring, max 1,000non-simple creative modesPositive and excluded style hints.
titlestring, max 200optionalOutput title hint.
instrumentalbooleangenerationDo not send string values such as "false".
modelenumallchirp-auk-turbo, chirp-v4, chirp-auk, chirp-bluejay, chirp-crow, or chirp-fenix; defaults to chirp-fenix. With mode: "vox", only chirp-crow or chirp-fenix is accepted; invalid combinations return FEATURE_NOT_SUPPORTED before task creation or charging.
voiceIdstringvoxPublic reusable Voice ID.
audio.urlHTTPS URLupload modesMust be publicly retrievable and owned/licensed by the caller.
audio.extensionTypeenumupload modesmp3, wav, m4a, flac, or ogg.
continueAtnumber ≥ 0upload-extendContinuation point in seconds.
continuedAlignedPromptstring, max 5,000upload-extendOptional aligned continuation context.
configobjectallShared priority, webhook, tags, and metadata. See Task Model.
FieldTypeNotes
controlSliders.style_weightnumber 0–1How strongly the style hint biases the model. Higher = stricter adherence to tags / style.
controlSliders.audio_weightnumber 0–1How strongly a supported managed-audio workflow follows the source audio.
controlSliders.weirdness_constraintnumber 0–1Diversity dial. Higher = more experimental output.

Values outside the allowed range are rejected with HTTP 400 and VALIDATION_ERROR. error.details.issues[] identifies the nested field, for example body.controlSliders.style_weight.

Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/songs \
-H "x-api-key: $OMNAPI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"mode": "simple",
"prompt": "bright city pop about a late train home",
"instrumental": false
}'
{
"taskId": "task_01J...",
"generationId": "task_01J...",
"status": "PROCESSING",
"creditsRequired": 28,
"estimatedCompletionTime": "2026-07-30T12:03:00.000Z",
"requestId": "req_01J...",
"links": {
"task": "/api/v1/tasks/task_01J...",
"resource": "/api/v1/suno/generations/task_01J...",
"final": null
},
"pricing": {
"baseCredits": 28,
"calculatedCredits": 28,
"chargedCredits": 28,
"adjustmentCredits": 0,
"settlementRoundingCredits": 0,
"settlementPolicyVersion": "whole-credit-v1",
"billingIncrementCredits": 1,
"source": "standard",
"quoteVersion": 2
},
"product": {
"type": "suno",
"providerCode": "suno",
"modelCode": "chirp-fenix",
"featureCode": "text-to-music-simple",
"resourceId": "task_01J...",
"deliveryStatus": "submitted",
"autoFinalize": false
},
"warningCodes": [],
"clipIds": ["clip_a", "clip_b"],
"deliveryStatus": "submitted",
"pollUrl": "/api/v1/tasks/task_01J...",
"viewUrl": "/api/v1/suno/generations/task_01J...",
"finalUrl": null,
"autoFinalize": false
}

The receipt intentionally has no stream link. Before acknowledgement, clipIds can be empty and deliveryStatus can be null; the Generation ID and both polling URLs remain stable. Replaying the same request with the same Idempotency-Key returns this same product identity and never creates a second paid generation.

FieldMeaning
taskIdExecution, billing, cancellation, and webhook identity
generationIdStable song-product identity; currently equal to taskId
clipIdsExternal Suno candidate IDs already acknowledged when available
pollUrlCanonical Task read for execution and settlement
viewUrlCanonical Generation read for candidate and playback state
deliveryStatusAggregate candidate state; nullable before provider acknowledgement
pricingFrozen standard or customer-adjusted quote used for this task; see customer pricing and settlement rounding
productNormalized product descriptor used across OmnAPI create responses
warningCodesNon-fatal delivery or intent warnings; empty when none
estimatedCompletionTimeBest-effort RFC 3339 estimate, not a delivery guarantee

POST /api/v1/suno/songs creates a new root song. It also owns the managed upload composites because the caller supplies audio rather than an existing Suno clip.

POST /api/v1/suno/clips/{clipId}/derive creates a derivative whose identity and access depend on an existing clip. Keeping that relationship in the path makes ownership checks, idempotency scope, audit records, and SDK types unambiguous.

Call POST /api/v1/suno/clips/{clipId}/derive when the source is already a concrete Suno clip. The path expresses the source relationship; the body selects what to create from it.

Only two existing-clip actions are public:

actionResultStandard credits
extendContinuation candidates plus an automatically concatenated complete song28
coverA reinterpretation of the source clip28
Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/clips/clip_123/derive \
-H "x-api-key: $OMNAPI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"action": "extend",
"continueAt": 58.5,
"prompt": "build into a final chorus"
}'

Extend and Concat are one public operation, one task, and one charge. When the task completes, prefer the resource with role: "final"; the continuation alternatives retain role: "candidate". There is no public standalone Concat endpoint.

The path parameter must identify a concrete source clip/result, not an OmnAPI task ID. Unknown fields and actions other than extend / cover are rejected. The optional controlSliders object contains the three bounded weights listed below.

FieldTypeApplies toLimits and meaning
action"extend" | "cover"bothRequired operation discriminator.
promptstringbothOptional creative instruction; max 5000 chars.
tagsstringbothOptional style tags; max 1000 chars.
negativeTagsstringbothOptional exclusions; max 1000 chars.
titlestringbothOptional title; max 200 chars.
isInstrumentalbooleanbothOptional instrumental intent.
isRemixbooleanbothOptional remix intent.
continueAtnumberExtendContinuation timestamp in seconds, minimum 0. Values beyond the source duration continue from the clip end.
continuedAlignedPromptstringExtendOptional aligned continuation prompt; max 5000 chars.
controlSliders.style_weightnumberbothOptional style weight from 0 to 1.
controlSliders.audio_weightnumberbothOptional source-audio weight from 0 to 1.
controlSliders.weirdness_constraintnumberbothOptional creative-variation constraint from 0 to 1.
modelenumbothOne of the six values in Supported generation models.
configobjectbothStandard task config: priority, tags, metadata, webhookUrl.

The response is the same Generation receipt returned by song creation. autoFinalize is true for Extend because the required Concat is part of the same product. Cover returns candidates without a separate finalization request.

Use the Generation API for product state, candidate discovery, early playback, and final output selection. Use the Task API separately for execution, cancellation, billing, and terminal diagnostics.

GET /api/v1/suno/generations/{generationId} is the canonical song product view. It is available before completion and exposes every candidate independently:

Terminal window
curl https://api.omnapi.com/api/v1/suno/generations/task_01J... \
-H "x-api-key: $OMNAPI_KEY"
{
"generationId": "task_01J...",
"taskId": "task_01J...",
"status": "PROCESSING",
"phase": "generating",
"progress": 42,
"deliveryStatus": "streaming",
"clips": [
{
"clipId": "clip_a",
"index": 0,
"role": "candidate",
"deliveryStatus": "streaming",
"audioUrl": "https://...",
"playable": true
},
{
"clipId": "clip_b",
"index": 1,
"role": "candidate",
"deliveryStatus": "queued",
"audioUrl": null,
"playable": false
}
],
"finalClipId": null,
"autoFinalize": false
}
FieldMeaning
versionMonotonic product snapshot version
statusShared Task status: PENDING, PROCESSING, COMPLETED, FAILED, or CANCELLED
phaseProduct phase: accepted, generating, finalizing, completed, or failed
progressBest-effort 0..100 progress indicator
deliveryStatusAggregate clip delivery state; nullable before acknowledgement
clips[]Every independently queryable candidate and automatic final resource
finalClipId / finalUrlSelected final output when one exists
billingRequired, charged, refunded, settlement, and frozen pricing data
retryable / refundableClient retry guidance and failure-refund eligibility
warningCodesNon-fatal result warnings

Clip delivery states are monotonic: submitted → queued → streaming → complete, with error as a terminal per-clip failure. One candidate can be playable while another remains queued. The Generation is not complete until the Task’s required finalization is complete. For Extend, the automatic Concat appears as role: "final".

GET /api/v1/suno/generations?limit=20&cursor=... lists the current user’s Generation history. Its cursor is opaque.

Terminal window
curl "https://api.omnapi.com/api/v1/suno/generations?limit=20" \
-H "x-api-key: $OMNAPI_KEY"
{
"items": [
{
"generationId": "task_01J...",
"taskId": "task_01J...",
"status": "PROCESSING",
"phase": "generating",
"clips": []
}
],
"nextCursor": "opaque-cursor",
"hasMore": true
}

limit accepts 1..100 and defaults to 20. Omit cursor on the first request, then pass nextCursor unchanged while hasMore is true. Each item has the complete Generation shape; the shortened object above highlights only pagination-relevant fields.

Call POST /api/v1/suno/clips/{clipId}/export to turn one completed source clip into WAV or retained separated tracks. The body is a discriminated union: send either the WAV fields or the Stems fields, never a mixture.

WAV export always uses managed delivery and costs 3 standard credits. OmnAPI manages compatible delivery and retention. When direct delivery is not available, supported sources may use managed compatibility processing without a second customer charge; successful alternate processing is reported through SUNO_ALTERNATE_PROCESSING_USED.

Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/clips/clip_123/export \
-H "x-api-key: $OMNAPI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "format": "wav" }'
FieldTypeRequiredNotes
format"stems"yesSelects separated-track export. Use "wav" instead for WAV export.
stemsMode"twelve" | "extract"Default twelve.
stemNameenumfor extractExactly one of the 98 names below. Do not send it with twelve or wav.
configobjectStandard task config: priority, tags, metadata, webhookUrl.
stemsModeOutputCredits
twelveFull separated-track set; default140
extractIsolate/remove one named stem; requires one of the 98 allowed stemName values56
Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/clips/clip_123/export \
-H "x-api-key: $OMNAPI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "format": "stems", "stemsMode": "twelve" }'

Named Extract uses Suno’s native separator; OmnAPI does not regenerate the song or send it to another AI service. For example:

Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/clips/clip_123/export \
-H "x-api-key: $OMNAPI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "format": "stems", "stemsMode": "extract", "stemName": "Drum Kit" }'

The 98 accepted names are:

Lead Vocal, Drum Kit, Kick, Snare, Risers, Bass, Backing Vocals, Piano,
Electric Guitar, Percussion, String Section, Synth, Acoustic Guitar,
Sound Effects, Synth Pad, Synth Bass, Guitar, Brass Section, Organ,
Electronic Drum Kit, Lead Electric Guitar, Synth Keys,
Rhythm Electric Guitar, Electric Piano, Upright Bass, Keyboards,
Distorted Electric Guitar, Synth Strings, Synth Lead, Woodwinds,
Rhythm Acoustic Guitar, Flute, Harp, Tambourine, Trumpet, Arpeggiator,
Accordion, Fiddle, Pedal Steel Guitar, Synth Voice, Violin, Digital Piano,
Synth Brass, Mandolin, Choir, Banjo, Bells, Clarinet, Tenor Saxophone,
Trombone, Shaker, French Horn, Glockenspiel, Electric Bass, Cello, Timpani,
Harmonica, Marimba, Vibraphone, Lap Steel Guitar, Saxophone, Orchestra,
Horns, Cymbals, Hand Clap, Oboe, Celesta, Congas, Drone, Alto Saxophone,
Double Bass, Ukulele, Harpsichord, Baritone Saxophone, Xylophone, Tuba,
Bass Guitar, Whistle, Lead Guitar, Rhodes, 808, Bongos, Bassoon, Cowbell,
Viola, Sitar, Steel Drums, Piccolo, Theremin, Bagpipes, Hi-Hat, Music Box,
Melodica, Tabla, Koto, Djembe, Taiko, Didgeridoo

Values are case- and spacing-sensitive. Send one name exactly as shown; the API rejects aliases, translated labels, and names outside this list.

For Twelve, a complete API response currently contains 24 clips from the same source: 12 fixed groups (Vocals, Backing Vocals, Drums, Bass, Guitar, Keyboard, Percussion, Strings, Synth, FX, Brass, and Woodwinds), each with separator candidates V1 and V2. Suno’s UI can show only the eight groups detected for a particular song; it labels Vocals as Lead Vocal and FX as Other. The UI buttons 1 and 2 select the two separator candidates, not two source clips.

Stem task results expose sourceClipId, stemsMode, stemGroup, displayName, batchIndex, and variant where available, so integrations do not need to infer these semantics from array position or title. Extract results also expose stemName and extractRole (target or without-target). Named Extract may return a near-silent target when the requested instrument is not meaningfully present. Suno provides no reliable preflight presence signal, so an accepted Extract request is still charged.

The service manages delivery and retention automatically. Repeating an identical completed request may reuse retained assets, but the public operation price remains unchanged. The former two mode is not accepted. When native delivery is unavailable and the source supports it, OmnAPI may use managed compatibility processing. The caller never selects or reconciles delivery infrastructure.

If you supplied an Idempotency-Key, reuse it when retrying the same logical request so a transport retry does not create or charge a second task.

Export returns a Task create receipt rather than a Generation receipt:

{
"taskId": "task_export_01J...",
"status": "PENDING",
"creditsRequired": 3,
"estimatedCompletionTime": "2026-07-30T12:04:00.000Z",
"requestId": "req_01J...",
"links": {
"task": "/api/v1/tasks/task_export_01J...",
"resource": null,
"final": null
},
"pricing": {
"baseCredits": 3,
"calculatedCredits": 3,
"chargedCredits": 3,
"adjustmentCredits": 0,
"settlementRoundingCredits": 0,
"settlementPolicyVersion": "whole-credit-v1",
"billingIncrementCredits": 1,
"source": "standard",
"quoteVersion": 2
},
"product": {
"type": "suno",
"providerCode": "suno",
"modelCode": "chirp-fenix",
"featureCode": "get-wav",
"resourceId": null
},
"warningCodes": []
}

Poll links.task. A completed export Task returns retained resources with url, contentType, assetStatus, urlExpiresAt, and retainedUntil when available. creditsCharged reflects final WAV settlement; do not assume the authorized maximum was ultimately charged. For a provider-hosted native WAV, contentType is audio/wav, assetStatus is READY, and null urlExpiresAt/retainedUntil means OmnAPI did not issue a presigned URL or set an OmnAPI retention deadline. Copy business-critical output to your own storage.

Call POST /api/v1/suno/lyrics when you need lyrics without starting song generation. Set candidates: 2 for two independently generated candidates in one Task. A paired Task succeeds only after two distinct candidates, A and B, both complete. OmnAPI reserves two distinct provider accounts before starting the pair; if that cannot be done, neither candidate is submitted. One delivered candidate is not reported as a successful pair. The operation returns a Task receipt; poll GET /api/v1/tasks/{taskId} for the result.

FieldTypeNotes
promptstring, max 3,000Required subject, story, mood, or structural direction
candidatesinteger literal 1 or 2Omit or send 1 for one result; 2 requests paired candidates for the same operation price. Strings and 0 are invalid.
lyricsModelstring, max 100Single-candidate requests use the stable default workflow; when candidates is 2, the only accepted value is default
sourcestring, max 100With candidates: 2, an optional caller label retained with the Task for audit; it is not a model selector
configobjectPriority, webhook URL, tags, and metadata
Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/lyrics \
-H "x-api-key: $OMNAPI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "prompt": "bittersweet indie pop about moving away", "candidates": 2 }'

The immediate response is the same Task create receipt shape used by export. After completion, read the generated text from the Task’s outputResults and standardized text resources. Paired candidates remain part of one Task, one billing decision, and one idempotency scope. The two resources preserve their A/B order.

Each completed text resource can also contain metadata.stylePrompt. For compatibility, the same complete style prompt is returned as the single item in metadata.tags; it is not split on commas. Style expansion is best-effort. If it is temporarily unavailable, the lyrics Task still succeeds, those optional fields are omitted, and outputResults.warnings can include SUNO_STYLE_UPSAMPLE_UNAVAILABLE.

{
"type": "text",
"index": 0,
"externalId": "lyrics_a",
"content": "[Verse 1]\n...",
"metadata": {
"stylePrompt": "Intimate indie folk built around fingerpicked acoustic guitar...",
"tags": [
"Intimate indie folk built around fingerpicked acoustic guitar..."
]
}
}

If either candidate is not delivered, the Task fails atomically, is refunded, and exposes SUNO_LYRICS_PAIR_TEMPORARILY_UNAVAILABLE with retryable: true. Retry later as a new request. Idempotency-Key remains optional; when the failed request supplied one, use a new value for that new attempt.

Use these APIs after a Generation returns concrete clipIds, or when migrating stored legacy mid values. They never accept a Task ID in place of a clip ID.

APIWhen to use itBilling
GET /api/v1/suno/clips/{clipId}Read one known external clip IDFree direct read; no Task
GET /api/v1/suno/clips?clipIds=a,b,cResolve several external clip IDs in caller orderFree direct read; no Task
Terminal window
curl https://api.omnapi.com/api/v1/suno/clips/clip_123 \
-H "x-api-key: $OMNAPI_KEY"

clipIds contains external Suno IDs (legacy mid values), not Task IDs or internal row IDs. clipIds is the only accepted batch parameter.

Direct detail returns one normalized clip:

{
"clipId": "clip_a",
"accessLevel": "owned",
"index": 0,
"role": "candidate",
"deliveryStatus": "streaming",
"title": "Late Train",
"tags": "city pop, warm bass",
"prompt": "bright city pop about a late train home",
"model": "chirp-fenix",
"modelCode": "chirp-fenix",
"providerModelName": "chirp-auk",
"majorModelVersion": "v4.5-all",
"instrumental": false,
"audioUrl": "https://...",
"imageUrl": "https://...",
"videoUrl": null,
"playable": true,
"duration": 183.2,
"errorCode": null,
"errorMessage": null,
"createdAt": "2026-07-30T12:00:00.000Z",
"updatedAt": "2026-07-30T12:01:00.000Z"
}

Model identity is intentionally split into independent fields:

FieldMeaning
modelCodeCanonical OmnAPI model selected for an owned generation; null for a direct clip with no local task
providerModelNameExact model name reported for the clip
majorModelVersionExact major model version reported for the clip
modelCompatibility label; new integrations should use the explicit fields above

Merely readable external clips redact all model fields. Shared clips may return the two provider-reported fields but do not invent a local modelCode. Owned clips return tags and prompt; shared public or remixable clips return their public style tags while keeping prompt: null; external clips keep both fields null. If tags or duration become available after the first completion snapshot, later Clip and Generation reads automatically return the repaired metadata.

Batch responses never hide partial results:

{
"items": [
{
"clipId": "clip_a",
"index": 0,
"role": "candidate",
"deliveryStatus": "streaming",
"audioUrl": "https://...",
"playable": true
}
],
"missingClipIds": ["clip_b"],
"errors": []
}

The batch response preserves requested order. missingClipIds is the only place for clips that were definitively not found or not visible. errors[] is reserved for transient per-ID read failures and contains code, message, and retryable. A missing or failed sibling never removes a successful item. Public clip results omit account identity and provider-only controls.

Call GET /api/v1/suno/clips/{clipId}/timeline when playback, karaoke, or subtitle rendering needs word and line timing. This operation costs 1 standard credit and returns:

  • words[] with word, start, end, and optional confidence;
  • lines[] with line timing, optional section, and nested words[];
  • waveform_data for time-aligned visualization.
Terminal window
curl https://api.omnapi.com/api/v1/suno/clips/clip_123/timeline \
-H "x-api-key: $OMNAPI_KEY"

Call GET /api/v1/suno/clips/{clipId}/audio-analysis when an editor or visualizer needs musical structure. The free result exposes typed outputResults: { clipId, downbeats, key, waveform }.

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

Call GET /api/v1/suno/styles/recommend to obtain prompt-ready style names. Pass an optional comma-separated exclude list to remove up to 50 unwanted styles. The free result is outputResults: { recommendStyles }.

Terminal window
curl "https://api.omnapi.com/api/v1/suno/styles/recommend?exclude=metal,opera" \
-H "x-api-key: $OMNAPI_KEY"

Timeline, analysis, and style recommendation use this read-style Task response:

{
"taskId": "task_read_01J...",
"status": "COMPLETED",
"creditsRequired": 1,
"creditsCharged": 1,
"outputResults": {
"clipId": "clip_a",
"words": [
{ "word": "Neon", "start": 1.2, "end": 1.6, "confidence": 0.98 }
],
"lines": [
{
"text": "Neon rain",
"start": 1.2,
"end": 2.1,
"words": [
{ "word": "Neon", "start": 1.2, "end": 1.6 },
{ "word": "rain", "start": 1.7, "end": 2.1 }
]
}
],
"waveform_data": []
},
"resources": [],
"pollUrl": null,
"errorCode": null,
"errorMessage": null,
"processingDuration": 1820,
"processingDurationText": "1.8s"
}

The example is a timeline response. Audio analysis replaces outputResults with { clipId, downbeats, key, waveform }; style recommendation returns { recommendStyles }. If the bounded inline lookup is not ready, HTTP 202 returns the same envelope with status: "PROCESSING" and a non-null pollUrl. Polling that Task, receiving its terminal SSE event, or processing its webhook preserves the same feature-specific outputResults shape as the direct 200 response.

Call GET /api/v1/suno/availability before enabling paid Suno actions in a customer UI, and again after a transient availability failure.

GET /api/v1/suno/availability returns available, degraded, unavailable, or unknown, plus advisory checks and retryAfterSec. It also reports whether advanced operations are currently available. The checks use customer-safe service, processing, capacity, advanced-operation, and delivery categories. The endpoint is advisory; the task receipt and terminal task state remain authoritative.

Terminal window
curl https://api.omnapi.com/api/v1/suno/availability \
-H "x-api-key: $OMNAPI_KEY"
{
"status": "available",
"checkedAt": "2026-07-30T12:00:00.000Z",
"retryAfterSec": null,
"message": "Suno delivery is available",
"guidance": "Requests can be submitted normally.",
"subscriptionOperationsAvailable": true,
"checks": [
{
"name": "generation-capacity",
"status": "pass",
"message": "Generation capacity is available"
}
]
}

subscriptionOperationsAvailable describes the health of supported subscription-backed operations. It does not make internal Remaster, Infill, Editor, Video, Opus, or standalone Concat endpoints public.

Some clips and Voices carry access relationships that must be preserved for follow-up operations. When a referenced resource is not compatible with the requested action, the task fails with SUNO_RESOURCE_ACCESS_DENIED. Do not blind-retry with the same resource; select another compatible resource or upload audio that you have the right to use.

Public Voices are the exception at the product boundary: a caller who knows the public Voice ID may read it and use it for generation even when another OmnAPI user created it. Availability and access are revalidated when generation starts.

There are two public Voice creation workflows:

  • Create from a completed clip owned by your OmnAPI user for 5 credits. This derives a reusable singer from generated song audio and does not require a verification phrase or separate recordings.
  • Create from recordings for 66 credits. This verifies a real speaker with an assigned phrase and clean singing audio.

Both workflows return one asynchronous Task and produce a public voiceId that can be listed and reused with mode: "vox".

The minimum request needs only the clip ID:

Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/voices/from-clip \
-H "x-api-key: $OMNAPI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"clipId": "clip_owned_123",
"name": "My Singer"
}'

clipId must refer to a completed Suno clip owned by the current OmnAPI user. OmnAPI selects a compatible vocal range automatically. Advanced callers may provide both vocalRange.startSeconds and vocalRange.endSeconds; the ordered range must fit inside the source clip. name, description, imageUrl, and config are optional.

The source relationship and account routing are managed by OmnAPI. Do not send a provider account ID, source-account token, verification phrase, or recording URLs. A clip that is not owned by the caller returns 404 before paid task creation; an incomplete clip returns 409.

Request the phrase before recording the verification audio:

Terminal window
curl "https://api.omnapi.com/api/v1/suno/voices/verification-phrase?language=zh" \
-H "x-api-key: $OMNAPI_KEY"

The response follows the read-style task contract. On an inline 200, use taskId as verificationPhraseTaskId and read the phrase from outputResults.phraseText. A 202 means the phrase task is still running; poll its pollUrl before recording.

The phrase task belongs to the current API user and is valid only for its associated Voice creation attempt.

  • voiceAudioUrl: clean singing or a cappella material used to build the reusable voice.
  • verificationAudioUrl: the same person reading the returned phrase.

Both URLs must be publicly retrievable over HTTPS. Supported extension hints are mp3, wav, m4a, flac, and ogg.

FieldTypeNotes
verificationPhraseTaskIdstringRequired Task ID returned by the verification-phrase request
voiceAudioUrlHTTPS URLRequired clean singing recording
verificationAudioUrlHTTPS URLRequired phrase-reading recording from the same person
voiceExtensionType / verificationExtensionTypeenumOptional mp3, wav, m4a, flac, or ogg hints
namestring, max 100Optional public display name
descriptionstring, max 2,000Optional public description
imageUrlHTTPS URLOptional public image for the Voice
configobjectPriority, webhook URL, tags, and metadata
Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/voices \
-H "x-api-key: $OMNAPI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "Demo Voice",
"verificationPhraseTaskId": "task_phrase_01J...",
"voiceAudioUrl": "https://example.com/clean-vocal.m4a",
"verificationAudioUrl": "https://example.com/phrase-reading.m4a",
"voiceExtensionType": "m4a",
"verificationExtensionType": "m4a"
}'

The request creates one asynchronous task and returns the standard Task create receipt. Poll links.task; on success, outputResults.voiceId is the reusable public ID and outputResults.voice is the normalized public Voice object.

If the verification session expires before task creation, the API returns 409. Obtain a new verification phrase instead of retrying with the old phrase task.

GET /api/v1/suno/voices?page=1&pageSize=20 returns only completed public Voices created by the current OmnAPI user through either public creation workflow.

Terminal window
curl "https://api.omnapi.com/api/v1/suno/voices?page=1&pageSize=20" \
-H "x-api-key: $OMNAPI_KEY"
{
"voices": [
{
"voiceId": "voice_public_123",
"name": "Demo Voice",
"description": "Warm acoustic vocal",
"imageUrl": "https://...",
"voiceType": "recording",
"isPublic": true,
"taskId": "task_voice_01J...",
"createdAt": "2026-07-30T12:00:00.000Z"
}
],
"currentPage": 1,
"pageSize": 20,
"totalResults": 1
}

page defaults to 1; pageSize defaults to 20 and accepts up to 100.

GET /api/v1/suno/voices/{voiceId} intentionally has no OmnAPI owner restriction. A known public Voice ID may be inspected and used by another user. It uses the read-style Task response: HTTP 200 contains outputResults: { voiceId, voice }; HTTP 202 supplies pollUrl.

Use the Voice in song generation:

Terminal window
curl -X POST https://api.omnapi.com/api/v1/suno/songs \
-H "x-api-key: $OMNAPI_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"mode": "vox",
"voiceId": "voice_public_123",
"lyrics": "[Verse]\nSing this with the reusable voice...",
"tags": "warm acoustic pop"
}'

The voiceId is the complete public Voice reference. Callers do not need to provide any source-clip or provider-specific relationship fields.

Use the Generation’s clips[] for song delivery. It is the single stable place for provisional IDs, playable URLs, candidate errors, and final output selection. Do not inspect raw outputResults or wait for terminal Task resources[] to discover a candidate.

Generation statusProduct phaseMeaning
PENDINGacceptedTask exists; provider acknowledgement may not have arrived
PROCESSINGgeneratingCandidates are being created or enriched
PROCESSINGfinalizingRequired post-processing such as Extend’s automatic Concat is running
COMPLETEDcompletedRequired product output is complete
FAILEDfailedRequired generation or finalization failed
CANCELLEDfailedTask was cancelled; inspect billing for settlement
Clip deliveryStatusClient behavior
submittedProvider accepted the operation but has not queued a usable clip snapshot.
queuedKeep polling the Generation; do not resubmit.
streamingBuffer or preview when playable: true and audioUrl is present.
completePersist the desired candidate; for Extend prefer role: "final".
errorInspect that clip’s errorCode / errorMessage; sibling clips may still succeed.

Use webhooks for long-running production workflows. Polling clients should honor viewUrl and back off. The separate Task remains the billing and execution record.


Immediate HTTP errors use { success: false, error: { code, message, details? } }. Provider failures that occur after task creation appear on the terminal Task and Generation instead.

CodeSurfaceRetryMeaning
VALIDATION_ERRORHTTP 400NoMissing, conflicting, unknown, or unsupported request fields
INVALID_API_KEYHTTP 401NoAPI key is missing, malformed, inactive, or expired
FORBIDDENHTTP 403NoKey lacks the required scope or is not allowed from the caller’s IP
INSUFFICIENT_CREDITSHTTP 402NoBalance was insufficient; no Task was created
NOT_FOUND / TASK_NOT_FOUNDHTTP 404NoProduct, clip, Voice, or Task is unavailable to the caller
RATE_LIMITEDHTTP 429YesRespect Retry-After or use exponential backoff
SUNO_INPUT_INVALIDTerminal TaskNoUnsupported value or resource combination reached the provider workflow
SUNO_RESOURCE_ACCESS_DENIEDTerminal TaskNoReferenced clip or Voice cannot be used for this operation
SUNO_FINALIZATION_FAILEDTerminal TaskYesIntermediate output exists, but required post-processing did not complete
SUNO_LYRICS_PAIR_TEMPORARILY_UNAVAILABLETerminal Lyrics Pair TaskYesBoth requested lyrics candidates were not delivered; the Task fails atomically and is refunded
SUNO_TEMPORARILY_UNAVAILABLETerminal TaskYesCapacity, cooldown, verification, or provider delivery is transient
SUNO_OPERATION_FAILEDTerminal TaskNoOperation failed without a safer public retry classification
SUNO_VOICE_SESSION_EXPIREDHTTP 409NoVerification session is no longer usable; request a new phrase
SUNO_VOICE_VERIFICATION_PHRASE_MISMATCHTerminal Voice TaskNoVerification recording did not contain the assigned complete phrase
SUNO_VOICE_PIPELINE_COMPATIBILITY_FAILEDTerminal Voice TaskYesManaged Voice preparation encountered a retryable compatibility failure

Terminal task descriptors include retryable and refunded. Never infer billing from HTTP status alone. Signed URLs can expire; refresh the task before download. Retained resources can also expose urlExpiresAt, retainedUntil, and assetStatus; copy durable assets to your own storage before retainedUntil. A signed link never advertises an expiry later than the asset retention deadline.

Warnings do not make a successful Task fail.

CodeMeaningSuggested action
SUNO_VOCAL_INTENT_NOT_HONOREDA non-instrumental Simple request completed, but every candidate was instrumentalReview the prompt or use Custom lyrics; another generation is a new paid Task
SUNO_ALTERNATE_PROCESSING_USEDA supported managed fallback produced the requested public outputInspect the delivered format and settlement; no retry is required when output is acceptable

Pass config.webhookUrl on song, derive, lyrics, export, or Voice creation. OmnAPI sends the shared task.* events and retries delivery according to the platform webhook policy. Authenticate the webhook signature before trusting payload fields.

Webhook payloads describe the execution Task. For songs and derivatives, persist generationId from the create receipt and read GET /api/v1/suno/generations/{generationId} after a webhook to obtain current candidate, finalization, and playable-URL state. There is no separate Suno stream connection to maintain.

See Webhook Events for event names, signature verification, delivery order, and retry timing.


  • Do not pass an OmnAPI task ID where a concrete clipId is required. Read the Generation’s clipIds or clips[].clipId first.
  • Do not wait for Task resources[] to expose processing candidates. Poll the Generation’s clips[].
  • Do not send a second Concat request after modern Extend. The final resource is already produced in the same task.
  • Do not send provider-account routing or fallback fields with WAV requests; OmnAPI manages native delivery and eligible rehome automatically.
  • Do not hard-code a song-generation price or apply an old-user discount client-side. Turbo is 25 credits, other published models are 28, and customer pricing can change the receipt. Use creditsRequired, because the server applies the caller’s frozen pricing rule to every paid Suno operation.
  • If a timed-out write used an Idempotency-Key, do not retry it with a new key. Replay the exact request with the original key or poll the returned/recovered task.
  • A terminal Lyrics Pair failure is different from an in-flight timeout: retry it later as a new request and, if the failed request supplied an Idempotency-Key, use a new value.
  • Do not send ids on the modern batch clip read; use clipIds.
  • Do not treat subscriptionOperationsAvailable: true as access to internal Remaster, Infill, Editor, Video, or Opus routes.

For minimal client changes, legacy Suno Cloud clients can use the /api/legacy/* migration routes with the legacy api-key header. x-api-key is also accepted. The formerly published /v1/suno-legacy/* prefix and old root-level paths such as /v1/generate are not mounted. Use /api/legacy/* exactly. Music responses add omnapiTaskId and pollUrl; use those fields for canonical task polling. The legacy taskId field is retained for response compatibility and is not a canonical OmnAPI task UUID.

Legacy suno-cloud endpointNew OmnAPI endpoint
POST /api/legacy/generateCustom/Voice/upload → /api/v1/suno/songs; existing-clip Extend/Cover → /api/v1/suno/clips/{clipId}/derive
POST /api/legacy/generate-gptPOST /api/v1/suno/songs with mode: "simple"
POST /api/legacy/generate/lyricPOST /api/v1/suno/lyrics
POST /api/legacy/concatenateNo independent modern endpoint; modern Extend automatically concatenates
GET /api/legacy/songsGET /api/v1/suno/clips?clipIds=...
GET /api/legacy/songs/lyric-stampGET /api/v1/suno/clips/{clipId}/timeline
GET /api/legacy/infoDashboard balance plus GET /api/v1/usage/export and task settlement fields
POST /api/legacy/uploadCombine the upload with upload-extend or upload-cover; no standalone modern Upload endpoint
POST /api/legacy/stemsPOST /api/v1/suno/clips/{clipId}/export with format: "stems"
POST /api/legacy/generate-wavPOST /api/v1/suno/clips/{clipId}/export with format: "wav"