Skip to content

Suno Song Creation and Derivation

Product overview · Task model

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 100optionalOutput title hint.
instrumentalbooleangenerationDo not send string values such as "false".
modelenumallchirp-goose, chirp-hawk-wild or chirp-hawk; omitted model retains the chirp-fenix pricing identity and executes on chirp-hawk. Documented legacy aliases remain accepted. Vox uses the current model list and checks the required account permission.
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.

Requested controls are preserved while OmnAPI waits for compatible generation capacity. If an accepted task is still processing, continue waiting for that task; do not submit duplicates. When a task fails, follow its public retryable field. A temporary capacity failure can be retried later; unsupported control combinations may require different input. Changing an OmnAPI subscription tier is not a remedy for an unsupported generation control.

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": "bright city pop about a late train home",
"instrumental": false
}'
Expand the complete JSON example
{
"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-hawk",
"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: $REQUEST_KEY" \
-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 100 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.