Suno API documentation overview

Updated 2026-09-18 · Suno-API team

Register with an email address and you can create an API key. A generation call costs ¥0.6, returns 2 songs, and covers MP3/WAV downloads, cover songs, Extend, stems and voice cloning. Base URL: https://www.suno-api.io.

This page lists the models that are currently available, every generation and editing endpoint, how billing works and the recommended order to read everything in. If you are integrating for the first time, read it top to bottom; the 401/403/429 troubleshooting entries are here too.

Quick answers

How do I get an API key? Register with an email address, open the console, go to token management and create a token. No phone number and no bank card required.

What does a call cost? A generation call costs ¥0.6 and returns 2 songs. Status queries, WAV, timestamped lyrics and prompt suggestions are free.

Which models are supported? suno-v6 (default), suno-v6-wild and suno-v6-mini. v5.5 and older standard generation models are retired; existing work is unaffected.

What is the base URL? https://www.suno-api.io, with the header Authorization: Bearer YOUR_API_KEY.

Models currently available

The customer-facing models for standard song generation are suno-v6, suno-v6-wild and suno-v6-mini. When model is omitted, suno-v6 is used.

The standard models suno-v2, suno-v3, suno-v3-5, suno-v4, suno-v4-5, suno-v4-5-all, suno-v4-5-plus, suno-v5 and suno-v5-5 are retired. Historical tasks may still show those names; that is historical data, not a sign that the model can be used for new requests. Stems are the exception — see Stems (vocal/accompaniment separation) API.

Authentication

Every public API-key endpoint uses the same headers:

Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

Base URL:

https://www.suno-api.io

General parameter conventions

Text field limits

Exceeding a text limit returns HTTP 400 directly: nothing is generated, nothing is pre-charged and no task record is created. Counting is by Unicode character (one Chinese character counts as 1) and leading/trailing spaces count too.

Field (including the compatible aliases documented per endpoint) Limit
prompt / lyrics / description / theme / gpt_description_prompt 3000 characters
style_tags / tags / style / original_tags 1000 characters
negative_tags 1000 characters
song_title / title 100 characters

The message names the offending field and reports the measured length, so those two numbers are all you need to trim it:

{
  "error": {
    "message": "style_tags must not exceed 1000 characters; received 2772",
    "type": "invalid_request_error"
  }
}

Applies to: /api/music/create, /api/music/create/custom, /api/music/extend, /api/music/upload-cover, /api/music/generate-from-source, /api/music/add-instrumental, /api/music/add-vocal, /api/music/add-stem, /api/music/mashup, /api/music/sample, /api/music/inspo, /api/music/crop, /api/music/remove-section, /api/music/fade, /api/music/reverse, /api/music/speed, /api/music/replace-section, /api/music/generate-with-voice.

One exception: the description field of POST /api/music/sounds is capped at 100 characters, because the sound-effect path uses the platform's shorter limit.

Asynchronous generation and audio addresses

Music generation endpoints work asynchronously by default. When the first response carries status of pending, submitted or processing, an empty audio_url, video_url or cover_url is normal and does not mean the task failed. Save the real song_id (or the client_request_id the endpoint returned) and poll the matching query endpoint; only read and download an audio address once the status is complete.

⚠️ Audio addresses expire after 7 days — transfer your files in time

audio_url, wav_url, video_url and the addresses returned by the download endpoints are served from the platform's object storage and expire after 7 days by default (the files are recycled; an old address returns 404 / fails to download).

  • Within those 7 days, move the files into your own storage (your own object storage, a CDN or a server disk). Do not treat our addresses as long-lived links.
  • An expired address does not require regenerating the song and costs nothing extra: call the song query API (or the media download API) again to get a fresh valid address for that song.

Wait times and timeout settings

Generation endpoints are synchronous: the order is only accepted and handed to the platform for generation when the response arrives. Before that, the service has to schedule an account and pass the required safety check, and there is no intermediate response — no other endpoint can see the order either. So the only reliable evidence that "something was generated" is the response itself, not anything you observe while waiting.

Measured wait times (production /api/music/create family, 2026-09-18 to 2026-09-20)

Percentile Wait
p50 about 1.2–1.6 s
p75 about 2–6 s
p90 about 42–49 s
p95 about 48–76 s
p99 about 109–160 s
longest about 230 s

Integration requirements

  1. Set the client timeout to 300 seconds or more. Clients that default to 30, 60 or 120 seconds will disconnect while waiting.
  2. No response does not mean nothing was generated. On a timeout or dropped connection the order may already be accepted and generating.
  3. Do not retry immediately after a timeout: a duplicate submission creates a second order and charges again.
  4. If the connection dropped, list your songs with GET /api/music/songs (newest first) a little later — accepted orders appear normally. Only resubmit once you have confirmed the order is really absent.
  5. When reporting a problem, include the X-Oneapi-Request-Id response header so the single request can be located directly.

Prefer not to hold a long connection? Use accept-receipt mode. POST /api/music/create and POST /api/music/create/custom support an optional accept receipt: add "accept_mode": "async" to the body (or the header X-Accept-Mode: async) and the endpoint returns 202 immediately with a receipt number while generation continues in the background; poll GET /api/music/requests/{request_id} for progress. A client with only a few tens of seconds of timeout then cannot misread "no response" as "nothing generated", and cannot double-charge through retries. See "Accept-receipt mode" in the Simple mode generation API.

For reference: python requests uses timeout=300, urllib uses urlopen(..., timeout=300), Node uses req.setTimeout(300000), curl uses --max-time 300.

Recommended endpoint list

Capability Method Path Billing note Docs
Account balance GET /api/user/balance Free View
Simple mode generation POST /api/music/create Paid, currently ¥0.6 per call by default View
Custom mode generation POST /api/music/create/custom Paid; supports vocal gender, style influence and weirdness View
Speech generation POST /api/music/speech Paid, currently ¥0.6 per call by default; optional background music View
Accept-receipt progress GET /api/music/requests/{request_id} Free; used with accept_mode=async View
Sound effects POST /api/music/sounds Paid, currently ¥0.6 per call by default View
Lyrics generation POST /api/lyrics/generate Free within the quota (10/min, 300/day), then ¥0.1 per call View
Voice profile creation (recommended) POST /api/music/voice-profile/create Free (enhanced=true bills at the enhanced-upload price) View
Voice cover (recommended) POST /api/music/voice-profile/cover ¥1.2 per call; ¥2.4 with Max Mode View
Voice list / detail / delete (recommended) GET/POST /api/music/voice-profile/list, /{voice_id}, /delete Free View
Voice clone (legacy chain, not recommended) POST /api/voice/clone/validate Free View
Query a voice clone task GET /api/voice/clone/tasks/:voice_task_id Free View
Regenerate the verification text POST /api/voice/clone/tasks/:voice_task_id/regenerate Free View
Submit the verification audio and create the voice POST /api/voice/clone/tasks/:voice_task_id/generate Billed by the voice clone rules View
Check whether a cloned voice is usable POST /api/voice/clone/tasks/:voice_task_id/check Free View
Delete a cloned voice DELETE /api/voice/clone/voices/:voice_task_id Free View
Generate with a chosen voice POST /api/music/generate-with-voice Paid, ¥1.2 per call; ¥2.4 with Max Mode View
Query generation results for a chosen voice GET /api/music/generate-with-voice/results Free View
Style boost POST /api/music/boost-style Free within the quota (10/min, 300/day), then ¥0.1 per call View
Prompt suggestions POST /api/prompts/suggestions Free within the quota (10/min, 300/day), then ¥0.1 per call View
Upload source audio POST /api/music/upload-source Free View
Submit an enhanced upload POST /api/music/enhanced-upload Paid, ¥10 per call View
List enhanced-upload tasks GET /api/music/enhanced-upload Free View
Query one enhanced-upload task GET /api/music/enhanced-upload/:id Free View
Cancel an enhanced-upload task POST /api/music/enhanced-upload/:id/cancel Free; only cancellable stages refund View
Upload-and-cover POST /api/music/upload-cover Paid, currently ¥0.6 per call by default; for large audio prefer the two-step upload-source + generate-from-source View
Cover from a source clip POST /api/music/generate-from-source Paid, currently ¥0.6 per call by default View
Extend POST /api/music/extend Paid, currently ¥0.6 per call by default View
Replace section POST /api/music/replace-section Paid, currently ¥0.6 per call by default View
Get Full Song POST /api/music/concat Paid, fixed ¥0.05 per call View
Remaster POST /api/music/remaster Paid, currently ¥0.6 per call by default View
Add instrumental POST /api/music/add-instrumental Paid, billed by the requested model View
Add vocal POST /api/music/add-vocal Paid, billed by the requested model View
Add stem POST /api/music/add-stem Paid, billed by the requested model View
Mashup POST /api/music/mashup Paid, billed by the requested model View
Sample POST /api/music/sample Paid, billed by the requested model View
Inspo POST /api/music/inspo Paid, billed by the requested model View
Crop POST /api/music/crop Paid, billed by the requested model View
Remove section POST /api/music/remove-section Paid, billed by the requested model View
Fade in/out POST /api/music/fade Paid, billed by the requested model View
Reverse POST /api/music/reverse Paid, billed by the requested model View
Speed POST /api/music/speed Paid, billed by the requested model View
Stems (vocal/accompaniment separation) POST /api/music/separate Paid; two ¥0.6 per call by default, twelve ¥3.0 View
Vocal removal POST /api/music/vocal-removal Free View
Stem delete POST /api/music/stem-delete Free View
WAV generation/retrieval POST /api/music/wav Free View
MIDI retrieval POST /api/music/download-file (kind=midi) Free View
Media address / preview stream POST /api/music/download-url, /api/music/generation-stream-url Free View
Song file download POST /api/music/download-file Free View
Song bundle download POST /api/music/download-all Free View
Stable download address GET /api/music/download Free View
Free2 download POST /api/music/free2 Paid, ¥0.2 per successful song View
Query a specific song's status POST /api/music/query Free View
Account song history GET /api/music/songs Free View
Song generation parameters GET /api/music/songs/:song_id Free View
Timestamped lyrics POST /api/lyrics/timeline Free View
Licence eligibility and identity GET /api/music/authorization/context Free View
Bind licence identity POST /api/music/authorization/identity Free; cannot be changed once confirmed View
List licensable songs GET /api/music/authorization/songs Free; identity binding required View
Issue a commercial licence POST /api/music/authorization/certificates Free; eligibility required View
Licence history GET /api/music/authorization/certificates Free View
Licence detail GET /api/music/authorization/certificates/:id Free View
Download the licence PDF GET /api/music/authorization/certificates/:id/download Free View

/api/voice/clone/* and /api/music/generate-with-voice are the early voice-clone chain and are not recommended for new integrations; use the 【Recommended】 Voice profile API instead.

Advanced parameters: Max Mode and Variety

Generation endpoints support these two optional parameters (omitting them keeps the previous behaviour and price):

Parameter Type Range Notes
max_mode boolean true / false Uses more compute to improve consistency across the whole song; this request is billed at 2× the price
variety integer 0-4 Degree of stylistic variation: 0=Off, 1=Normal, 2=High, 3=Extra, 4=Max. Omit it to use the model's default tier (the v6 family defaults to 1); no extra charge

These parameters are supported by: POST /api/music/create, POST /api/music/create/custom, POST /api/music/extend, POST /api/music/upload-cover, POST /api/music/generate-from-source, POST /api/music/add-instrumental, POST /api/music/add-vocal, POST /api/music/add-stem, POST /api/music/mashup, POST /api/music/sample, POST /api/music/inspo, POST /api/music/replace-section, POST /api/music/voice-profile/cover, POST /api/music/speech.

Common song response fields

Generation, cover, extend, separation and query endpoints usually return an array of songs with these fields:

Field Type Notes
song_id string Song or task ID
song_title string Song title
status string Status such as pending, completed, failed
audio_url string Audio address, returned once generation completes
video_url string Video address, may be empty
cover_url string Cover image address
lyrics string Lyrics text
style_tags string Style tags
duration number Audio duration in seconds
created_at string Creation time
model_version string Model version
generation_type string Generation type
error_message string Failure reason

Four steps to integrate (minimal working example)

Work through these four steps and you have your first song; each step's full field list is on the matching page in the recommended endpoint list.

# 1) Submit a generation: ¥0.6, returns 2 songs
curl -X POST https://www.suno-api.io/api/music/create \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"description": "bright Mandarin pop, piano intro, warm female vocal", "model": "suno-v6"}'

# 2) Poll the task until status is completed (every 3-5 seconds is a good interval)
curl -X POST https://www.suno-api.io/api/music/query \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"song_id": "the song_id returned in step 1"}'

# 3) Get a media address: read endpoints are free; song / wav / video / cover / midi are available
curl -X POST https://www.suno-api.io/api/music/download-url \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"song_id": "the same song_id", "kind": "song"}'

When something goes wrong: 401 / 402 / 403 / 429 are covered in the error reference; timeouts and duplicate charges in "Wait times and timeout settings" above; per-endpoint detail in the recommended endpoint list below.

Recommendations

About this documentation

This page was reorganised around the capabilities the Create UI actually exposes, and new integrations should read it first. The older API documentation is still available in the "Legacy API documentation (compatible)" section for callers who want to keep using it.

NextAccount balance query API

Get an API key

Create an API key in the console after signing up. ¥0.6 per run returns 2 tracks, downloads are unlimited, and no phone number is required.

Get API key Back to overview