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.
Supported generation models
Section titled “Supported generation models”The model field on song-generation and derive requests accepts exactly one
of the six identifiers below. Default when omitted: chirp-fenix.
model value | Suno generation family | Credits per generation | Public Voice mode |
|---|---|---|---|
chirp-auk-turbo | v4.5-all / Full | 25 | No |
chirp-v4 | v4 | 28 | No |
chirp-auk | v4.5 | 28 | No |
chirp-bluejay | v4.5+ | 28 | No |
chirp-crow | v5 | 28 | Yes |
chirp-fenix | v5.5; default | 28 | Yes |
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.
Commercial Boundaries
Section titled “Commercial Boundaries”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:
| Capability | Public status | Reason |
|---|---|---|
| Cover | Public through action: "cover" | Stable source-bound contract and billing |
| Extend + Concat | Public as one action: "extend" task | The complete song is one product; a separate Concat would permit duplicate work and charging |
| Remaster / Infill / Editor actions | Internal | Provider contracts and finalization semantics are not stable enough for a durable public API |
| Video / Opus exports | Internal | Not part of the supported retained-audio delivery contract |
| Standalone upload | Not public | Upload is exposed only inside atomic Upload + Extend/Cover workflows |
Endpoints
Section titled “Endpoints”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.
| Method | Path | Function | Description |
|---|---|---|---|
| GET | /api/v1/suno/availability | Availability | Read advisory delivery health and advanced-operation availability |
| POST | /api/v1/suno/songs | Song creation | Create from a prompt, custom lyrics, public Voice, or managed upload workflow |
| POST | /api/v1/suno/lyrics | Lyrics | Generate one or two lyrics candidates without creating a song |
| GET | /api/v1/suno/generations | Generation tracking | List the caller’s song-product history with cursor pagination |
| GET | /api/v1/suno/generations/{generationId} | Generation tracking | Read candidate states, early playable URLs, finalization, and billing |
| GET | /api/v1/suno/clips | Clip reads | Batch-read external clip IDs with ordered partial-result reporting |
| GET | /api/v1/suno/clips/{clipId} | Clip reads | Read one external clip directly without creating a Task |
| POST | /api/v1/suno/clips/{clipId}/derive | Clip derivation | Extend with automatic Concat or Cover an existing clip |
| POST | /api/v1/suno/clips/{clipId}/export | Audio export | Export native/managed WAV or retained stems |
| GET | /api/v1/suno/clips/{clipId}/timeline | Music metadata | Read aligned lyric words, lines, and waveform timing |
| GET | /api/v1/suno/clips/{clipId}/audio-analysis | Music metadata | Read typed beat, key, downbeat, and waveform analysis |
| GET | /api/v1/suno/styles/recommend | Music metadata | Get style recommendations with an optional exclusion list |
| GET | /api/v1/suno/voices/verification-phrase | Voice workflow | Obtain a phrase task for recording verification |
| POST | /api/v1/suno/voices | Voice workflow | Create a reusable public Voice from verified recordings |
| POST | /api/v1/suno/voices/from-clip | Voice workflow | Create a reusable public Voice from a completed clip owned by the caller |
| GET | /api/v1/suno/voices | Voice workflow | List completed public Voices created by the caller |
| GET | /api/v1/suno/voices/{voiceId} | Voice workflow | Inspect a known public Voice that can be reused for generation |
The shared Task API completes the asynchronous workflow:
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/tasks/{taskId} | Read execution, billing, terminal error, and retained resources |
| POST | /api/v1/tasks/{taskId}/cancel | Request safe cancellation; refund eligibility depends on provider submission state |
Response contracts
Section titled “Response contracts”Suno uses a small set of consistent response shapes:
| Endpoint family | Success response | How to continue |
|---|---|---|
| Song and derive writes | Generation receipt with taskId, generationId, clipIds, pollUrl, and viewUrl | Poll viewUrl for candidates; poll pollUrl for execution and billing |
| Lyrics, export, and Voice creation | Task create receipt with taskId, links, pricing, and product | Poll links.task; consume retained resources after completion |
| Generation reads | SunoGeneration or { items, nextCursor, hasMore } | Continue with the opaque cursor; never derive cursor values |
| Clip detail and batch reads | Direct SunoClip or { items, missingClipIds, errors } | No Task is created and no credits are charged |
| Timeline, analysis, styles, verification phrase, and Voice detail | Read-style Task response | 200 is ready; 202 means poll the returned pollUrl |
| Availability | Advisory health object | Respect 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.
IDs and polling
Section titled “IDs and polling”| ID | Meaning | Use it with |
|---|---|---|
taskId | OmnAPI execution and billing ID | /api/v1/tasks/{taskId}, cancellation, webhooks |
generationId | Suno product ID; currently equal to taskId | /api/v1/suno/generations/{generationId} |
clipId | External Suno clip ID; the legacy mid | Clip 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.
Pricing
Section titled “Pricing”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.
| Operation | Credits |
|---|---|
Song generation with chirp-auk-turbo, including Upload + Extend/Cover | 25 |
Song generation with chirp-v4, chirp-auk, chirp-bluejay, chirp-crow, or chirp-fenix | 28 |
| Song generation with a public Voice | 28; Vox accepts only chirp-crow or chirp-fenix |
| Existing-clip Extend (automatic Concat included) | 28 |
| Existing-clip Cover | 28 |
| WAV managed delivery | 3 |
| Lyrics generation, including paired candidates | 0 |
| Clip detail, batch clip query, audio analysis, style recommendation, Voice reads | 0 |
| Aligned lyrics timeline | 1; 0 for the legacy Suno 55,000 plan |
| Owned completed clip → reusable public Voice | 5 |
| Verified recordings → reusable public Voice | 66 |
Stems twelve / full | 140 |
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.
Create songs
Section titled “Create songs”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.
Choose a song mode
Section titled “Choose a song mode”| Mode | Purpose | Required fields |
|---|---|---|
simple | Prompt-only generation | prompt |
custom | Lyrics + style generation | lyrics or prompt |
vox | Generate with a reusable public Voice | voiceId and generation text |
upload-extend | Upload customer audio and continue it | audio.url; generation fields are optional |
upload-cover | Upload customer audio and reinterpret it | audio.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.
Request fields
Section titled “Request fields”| Field | Type | Applies to | Notes |
|---|---|---|---|
mode | string | all | Required discriminator; unsupported modes are rejected. |
prompt | string, max 5,000 | all | Required by simple; can provide generation direction in other modes. |
lyrics | string, max 5,000 | custom, vox | custom requires lyrics or prompt. |
tags / negativeTags | string, max 1,000 | non-simple creative modes | Positive and excluded style hints. |
title | string, max 200 | optional | Output title hint. |
instrumental | boolean | generation | Do not send string values such as "false". |
model | enum | all | chirp-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. |
voiceId | string | vox | Public reusable Voice ID. |
audio.url | HTTPS URL | upload modes | Must be publicly retrievable and owned/licensed by the caller. |
audio.extensionType | enum | upload modes | mp3, wav, m4a, flac, or ogg. |
continueAt | number ≥ 0 | upload-extend | Continuation point in seconds. |
continuedAlignedPrompt | string, max 5,000 | upload-extend | Optional aligned continuation context. |
config | object | all | Shared priority, webhook, tags, and metadata. See Task Model. |
Generation controls
Section titled “Generation controls”| Field | Type | Notes |
|---|---|---|
controlSliders.style_weight | number 0–1 | How strongly the style hint biases the model. Higher = stricter adherence to tags / style. |
controlSliders.audio_weight | number 0–1 | How strongly a supported managed-audio workflow follows the source audio. |
controlSliders.weirdness_constraint | number 0–1 | Diversity 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.
Examples
Section titled “Examples”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 }'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": "custom", "lyrics": "[Verse]\nNeon rain on the station floor...", "tags": "city pop, warm bass, female vocal", "title": "Late Train" }'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": "upload-extend", "audio": { "url": "https://example.com/source.wav", "extensionType": "wav" }, "continueAt": 60, "prompt": "continue into a larger final chorus", "title": "Extended Demo" }'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": "upload-cover", "audio": { "url": "https://example.com/source.mp3", "extensionType": "mp3" }, "prompt": "reinterpret this as warm acoustic pop", "tags": "acoustic pop, intimate vocal" }'Generation receipt
Section titled “Generation receipt”{ "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.
| Field | Meaning |
|---|---|
taskId | Execution, billing, cancellation, and webhook identity |
generationId | Stable song-product identity; currently equal to taskId |
clipIds | External Suno candidate IDs already acknowledged when available |
pollUrl | Canonical Task read for execution and settlement |
viewUrl | Canonical Generation read for candidate and playback state |
deliveryStatus | Aggregate candidate state; nullable before provider acknowledgement |
pricing | Frozen standard or customer-adjusted quote used for this task; see customer pricing and settlement rounding |
product | Normalized product descriptor used across OmnAPI create responses |
warningCodes | Non-fatal delivery or intent warnings; empty when none |
estimatedCompletionTime | Best-effort RFC 3339 estimate, not a delivery guarantee |
Choose root creation or derivation
Section titled “Choose root creation or derivation”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.
Derive an existing clip
Section titled “Derive an existing clip”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.
Supported actions
Section titled “Supported actions”Only two existing-clip actions are public:
action | Result | Standard credits |
|---|---|---|
extend | Continuation candidates plus an automatically concatenated complete song | 28 |
cover | A reinterpretation of the source clip | 28 |
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.
Request rules
Section titled “Request rules”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.
| Field | Type | Applies to | Limits and meaning |
|---|---|---|---|
action | "extend" | "cover" | both | Required operation discriminator. |
prompt | string | both | Optional creative instruction; max 5000 chars. |
tags | string | both | Optional style tags; max 1000 chars. |
negativeTags | string | both | Optional exclusions; max 1000 chars. |
title | string | both | Optional title; max 200 chars. |
isInstrumental | boolean | both | Optional instrumental intent. |
isRemix | boolean | both | Optional remix intent. |
continueAt | number | Extend | Continuation timestamp in seconds, minimum 0. Values beyond the source duration continue from the clip end. |
continuedAlignedPrompt | string | Extend | Optional aligned continuation prompt; max 5000 chars. |
controlSliders.style_weight | number | both | Optional style weight from 0 to 1. |
controlSliders.audio_weight | number | both | Optional source-audio weight from 0 to 1. |
controlSliders.weirdness_constraint | number | both | Optional creative-variation constraint from 0 to 1. |
model | enum | both | One of the six values in Supported generation models. |
config | object | both | Standard task config: priority, tags, metadata, webhookUrl. |
Response and automatic finalization
Section titled “Response and automatic finalization”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.
Follow a song Generation
Section titled “Follow a song Generation”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.
Read one Generation
Section titled “Read one Generation”GET /api/v1/suno/generations/{generationId} is the canonical song product
view. It is available before completion and exposes every candidate
independently:
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}| Field | Meaning |
|---|---|
version | Monotonic product snapshot version |
status | Shared Task status: PENDING, PROCESSING, COMPLETED, FAILED, or CANCELLED |
phase | Product phase: accepted, generating, finalizing, completed, or failed |
progress | Best-effort 0..100 progress indicator |
deliveryStatus | Aggregate clip delivery state; nullable before acknowledgement |
clips[] | Every independently queryable candidate and automatic final resource |
finalClipId / finalUrl | Selected final output when one exists |
billing | Required, charged, refunded, settlement, and frozen pricing data |
retryable / refundable | Client retry guidance and failure-refund eligibility |
warningCodes | Non-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".
List Generation history
Section titled “List Generation history”GET /api/v1/suno/generations?limit=20&cursor=... lists the current user’s
Generation history. Its cursor is opaque.
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.
Export audio
Section titled “Export audio”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.
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" }'| Field | Type | Required | Notes |
|---|---|---|---|
format | "stems" | yes | Selects separated-track export. Use "wav" instead for WAV export. |
stemsMode | "twelve" | "extract" | — | Default twelve. |
stemName | enum | for extract | Exactly one of the 98 names below. Do not send it with twelve or wav. |
config | object | — | Standard task config: priority, tags, metadata, webhookUrl. |
stemsMode | Output | Credits |
|---|---|---|
twelve | Full separated-track set; default | 140 |
extract | Isolate/remove one named stem; requires one of the 98 allowed stemName values | 56 |
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:
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, DidgeridooValues 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 response
Section titled “Export response”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.
Generate lyrics
Section titled “Generate lyrics”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.
| Field | Type | Notes |
|---|---|---|
prompt | string, max 3,000 | Required subject, story, mood, or structural direction |
candidates | integer literal 1 or 2 | Omit or send 1 for one result; 2 requests paired candidates for the same operation price. Strings and 0 are invalid. |
lyricsModel | string, max 100 | Single-candidate requests use the stable default workflow; when candidates is 2, the only accepted value is default |
source | string, max 100 | With candidates: 2, an optional caller label retained with the Task for audit; it is not a model selector |
config | object | Priority, webhook URL, tags, and metadata |
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.
Read clips and music metadata
Section titled “Read clips and music metadata”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.
Read clip detail and batches
Section titled “Read clip detail and batches”| API | When to use it | Billing |
|---|---|---|
GET /api/v1/suno/clips/{clipId} | Read one known external clip ID | Free direct read; no Task |
GET /api/v1/suno/clips?clipIds=a,b,c | Resolve several external clip IDs in caller order | Free direct read; no Task |
curl https://api.omnapi.com/api/v1/suno/clips/clip_123 \ -H "x-api-key: $OMNAPI_KEY"curl "https://api.omnapi.com/api/v1/suno/clips?clipIds=clip_a,clip_b" \ -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:
| Field | Meaning |
|---|---|
modelCode | Canonical OmnAPI model selected for an owned generation; null for a direct clip with no local task |
providerModelName | Exact model name reported for the clip |
majorModelVersion | Exact major model version reported for the clip |
model | Compatibility 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.
Read aligned lyrics
Section titled “Read aligned lyrics”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[]withword,start,end, and optional confidence;lines[]with line timing, optional section, and nestedwords[];waveform_datafor time-aligned visualization.
curl https://api.omnapi.com/api/v1/suno/clips/clip_123/timeline \ -H "x-api-key: $OMNAPI_KEY"Read audio analysis
Section titled “Read audio analysis”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 }.
curl https://api.omnapi.com/api/v1/suno/clips/clip_123/audio-analysis \ -H "x-api-key: $OMNAPI_KEY"Recommend styles
Section titled “Recommend styles”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 }.
curl "https://api.omnapi.com/api/v1/suno/styles/recommend?exclude=metal,opera" \ -H "x-api-key: $OMNAPI_KEY"Handle bounded read tasks
Section titled “Handle bounded read tasks”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.
Check availability and resource access
Section titled “Check availability and resource access”Read delivery health
Section titled “Read delivery health”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.
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.
Respect resource access
Section titled “Respect resource access”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.
Create and reuse Voices
Section titled “Create and reuse Voices”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".
Create a Voice from an owned clip
Section titled “Create a Voice from an owned clip”The minimum request needs only the clip ID:
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.
Create a Voice from verified recordings
Section titled “Create a Voice from verified recordings”1. Obtain the verification phrase
Section titled “1. Obtain the verification phrase”Request the phrase before recording the verification audio:
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.
2. Record two inputs
Section titled “2. Record two inputs”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.
3. Create the public Voice
Section titled “3. Create the public Voice”| Field | Type | Notes |
|---|---|---|
verificationPhraseTaskId | string | Required Task ID returned by the verification-phrase request |
voiceAudioUrl | HTTPS URL | Required clean singing recording |
verificationAudioUrl | HTTPS URL | Required phrase-reading recording from the same person |
voiceExtensionType / verificationExtensionType | enum | Optional mp3, wav, m4a, flac, or ogg hints |
name | string, max 100 | Optional public display name |
description | string, max 2,000 | Optional public description |
imageUrl | HTTPS URL | Optional public image for the Voice |
config | object | Priority, webhook URL, tags, and metadata |
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.
List, inspect, and use Voices
Section titled “List, inspect, and use Voices”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.
curl "https://api.omnapi.com/api/v1/suno/voices?page=1&pageSize=20" \ -H "x-api-key: $OMNAPI_KEY"curl https://api.omnapi.com/api/v1/suno/voices/voice_public_123 \ -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:
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.
Lifecycle states
Section titled “Lifecycle states”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 status | Product phase | Meaning |
|---|---|---|
PENDING | accepted | Task exists; provider acknowledgement may not have arrived |
PROCESSING | generating | Candidates are being created or enriched |
PROCESSING | finalizing | Required post-processing such as Extend’s automatic Concat is running |
COMPLETED | completed | Required product output is complete |
FAILED | failed | Required generation or finalization failed |
CANCELLED | failed | Task was cancelled; inspect billing for settlement |
Clip deliveryStatus | Client behavior |
|---|---|
submitted | Provider accepted the operation but has not queued a usable clip snapshot. |
queued | Keep polling the Generation; do not resubmit. |
streaming | Buffer or preview when playable: true and audioUrl is present. |
complete | Persist the desired candidate; for Extend prefer role: "final". |
error | Inspect 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.
Error codes
Section titled “Error codes”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.
| Code | Surface | Retry | Meaning |
|---|---|---|---|
VALIDATION_ERROR | HTTP 400 | No | Missing, conflicting, unknown, or unsupported request fields |
INVALID_API_KEY | HTTP 401 | No | API key is missing, malformed, inactive, or expired |
FORBIDDEN | HTTP 403 | No | Key lacks the required scope or is not allowed from the caller’s IP |
INSUFFICIENT_CREDITS | HTTP 402 | No | Balance was insufficient; no Task was created |
NOT_FOUND / TASK_NOT_FOUND | HTTP 404 | No | Product, clip, Voice, or Task is unavailable to the caller |
RATE_LIMITED | HTTP 429 | Yes | Respect Retry-After or use exponential backoff |
SUNO_INPUT_INVALID | Terminal Task | No | Unsupported value or resource combination reached the provider workflow |
SUNO_RESOURCE_ACCESS_DENIED | Terminal Task | No | Referenced clip or Voice cannot be used for this operation |
SUNO_FINALIZATION_FAILED | Terminal Task | Yes | Intermediate output exists, but required post-processing did not complete |
SUNO_LYRICS_PAIR_TEMPORARILY_UNAVAILABLE | Terminal Lyrics Pair Task | Yes | Both requested lyrics candidates were not delivered; the Task fails atomically and is refunded |
SUNO_TEMPORARILY_UNAVAILABLE | Terminal Task | Yes | Capacity, cooldown, verification, or provider delivery is transient |
SUNO_OPERATION_FAILED | Terminal Task | No | Operation failed without a safer public retry classification |
SUNO_VOICE_SESSION_EXPIRED | HTTP 409 | No | Verification session is no longer usable; request a new phrase |
SUNO_VOICE_VERIFICATION_PHRASE_MISMATCH | Terminal Voice Task | No | Verification recording did not contain the assigned complete phrase |
SUNO_VOICE_PIPELINE_COMPATIBILITY_FAILED | Terminal Voice Task | Yes | Managed 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.
Warning codes
Section titled “Warning codes”Warnings do not make a successful Task fail.
| Code | Meaning | Suggested action |
|---|---|---|
SUNO_VOCAL_INTENT_NOT_HONORED | A non-instrumental Simple request completed, but every candidate was instrumental | Review the prompt or use Custom lyrics; another generation is a new paid Task |
SUNO_ALTERNATE_PROCESSING_USED | A supported managed fallback produced the requested public output | Inspect the delivered format and settlement; no retry is required when output is acceptable |
Webhooks
Section titled “Webhooks”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.
Common pitfalls
Section titled “Common pitfalls”- Do not pass an OmnAPI task ID where a concrete
clipIdis required. Read the Generation’sclipIdsorclips[].clipIdfirst. - Do not wait for Task
resources[]to expose processing candidates. Poll the Generation’sclips[]. - 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
idson the modern batch clip read; useclipIds. - Do not treat
subscriptionOperationsAvailable: trueas access to internal Remaster, Infill, Editor, Video, or Opus routes.
Legacy migration map
Section titled “Legacy migration map”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 endpoint | New OmnAPI endpoint |
|---|---|
POST /api/legacy/generate | Custom/Voice/upload → /api/v1/suno/songs; existing-clip Extend/Cover → /api/v1/suno/clips/{clipId}/derive |
POST /api/legacy/generate-gpt | POST /api/v1/suno/songs with mode: "simple" |
POST /api/legacy/generate/lyric | POST /api/v1/suno/lyrics |
POST /api/legacy/concatenate | No independent modern endpoint; modern Extend automatically concatenates |
GET /api/legacy/songs | GET /api/v1/suno/clips?clipIds=... |
GET /api/legacy/songs/lyric-stamp | GET /api/v1/suno/clips/{clipId}/timeline |
GET /api/legacy/info | Dashboard balance plus GET /api/v1/usage/export and task settlement fields |
POST /api/legacy/upload | Combine the upload with upload-extend or upload-cover; no standalone modern Upload endpoint |
POST /api/legacy/stems | POST /api/v1/suno/clips/{clipId}/export with format: "stems" |
POST /api/legacy/generate-wav | POST /api/v1/suno/clips/{clipId}/export with format: "wav" |
See also
Section titled “See also”- Suno API Quickstart — generate, poll, Extend, WAV, and stems
- Interactive API Reference — generated request and response schemas
- The Task Model — execution lifecycle, polling, cancellation, and config
- Webhook Events — signatures, event payloads, and retries
- Credits & Billing — customer pricing and refund semantics
- Errors — shared HTTP and Task error catalog
- Suno Cloud migration guide — legacy routes and rollout checklist