Skip to main content
POST

Overview

POST /api/v1/music/{action} is the main entry point for Suno music. The path names one of 33 actions. Every action creates one asynchronous task of the suno model: save data.task_id, then poll POST /api/v1/task/status until the task finishes. Each call is billed once; see credits per action. POST /api/v1/task/submit/suno still works and is identical to the generate action.
The response uses the usual submit envelope and adds action:

Rules for every action

  • Strict fields. Each action accepts only the fields listed for it below. Sending a music field that the action does not accept returns HTTP 422 validation_failed, for example music action bpm does not accept version. Omit fields you do not need.
  • An unknown action returns HTTP 404 music_action_not_found.
  • Text limits count Unicode characters. Audio URLs must be public HTTP(S) URLs of at most 2,048 characters.
  • Earlier tasks are referenced only by their Wizzx task_id. See Referencing earlier tasks.
  • Music actions share the submit rate limit. Validation and source-task errors are returned before any credits are reserved.

Shared fields

These fields mean the same thing in every action that accepts them. The action tables below use these shorthands:
  • Model choice: version or custom_model_task_id
  • Style fields: title, style, negative_tags
  • Weights: style_weight, weirdness, audio_weight
  • Mode fields: custom, prompt, gpt_description

Custom and inspiration mode

Some actions switch between custom mode, where you write lyrics and style, and inspiration mode, where Suno works from a description. In inspiration mode, generate rejects title, style, negative_tags, auto_lyrics, persona_task_id, duration, and max_mode. The other actions reject prompt, title, style, negative_tags, auto_lyrics, persona_task_id, duration, max_mode, style_weight, and audio_weight. In custom mode, gpt_description is rejected.

Referencing earlier tasks

Many actions build on a track you already generated:
  • task_id + audio_index select one track. audio_index is the 1-based index of the track in the source task’s result.tracks and defaults to 1.
  • mashup uses task_ids (exactly two tasks) and audio_indexes (two entries, default [1, 1]) instead.
  • custom_model_task_id must point to a finished create-model task, and persona_task_id to a finished persona or create-voice task.
Every referenced task must be your own suno task with status SUCCEEDED. Only actions that produce tracks can be a track source: generate, inspo, sounds, upload, upload-cover, upload-extend, extend, cover, remaster, stems, stems-all, add-vocals, add-instrumental, add-stem, replace-section, remove-section, crop, fade-in, fade-out, adjust-speed, concat, mashup, and sample. Lyrics, style, analysis, persona, model, voice, video, and download results cannot. Some actions need a specific kind of source: Before charging, the gateway also checks that audio_index exists in the source task and that continue_at, end_s, and fade_duration fit the source track’s duration. Any failed check returns HTTP 422 and no credits are reserved.
Tasks that finished before October 15, 2026 have no result object. They can still be used as sources, but the track index and times cannot be checked in advance; an out-of-range value then fails the task and its credits are refunded.

Actions

All actions return their output in the task status result object.

Creation

From an existing track

These actions take task_id (required) and audio_index (optional) unless noted.

Editing

All editing actions take task_id (required) and audio_index (optional) and accept any track as the source. Time ranges are in seconds and must satisfy 0 ≤ start_s < end_s ≤ track duration.

Analysis and export

These actions take task_id (required) and audio_index (optional) and accept any track as the source.

Worked examples

Each step is a separate paid task. Wait until a task is SUCCEEDED before you reference it.

Generate, extend, and join into one song

Step 1. Generate with POST /api/v1/music/generate:
Poll the task and pick a track from result.tracks, for example the one with "index": 2. Step 2. Extend that track from 1:30 with POST /api/v1/music/extend:
Step 3. Join the continuation into a full song with POST /api/v1/music/concat, using the task_id of the extend task:

Add vocals to your own audio

Step 1. Upload the audio with POST /api/v1/music/upload:
Step 2. Add vocals with POST /api/v1/music/add-vocals, using the task_id of the upload task:

Separate stems and download files

Extract one stem from a finished song with POST /api/v1/music/stems:
Use stems-all instead to split the track into every stem. To get WAV and MP3 files of a track, call POST /api/v1/music/download:
The finished task lists the files in result.files, in request order.

Errors

See Error codes for the error format and retry guidance.

Authorizations

Authorization
string
header
required

Wizzx API key. This is not a JWT.

Path Parameters

action
enum<string>
required

Music action. Unknown actions return 404 music_action_not_found.

Available options:
generate,
inspo,
sounds,
lyrics,
upsample-tags,
upload,
upload-cover,
upload-extend,
create-model,
create-voice,
extend,
concat,
cover,
remaster,
add-vocals,
add-instrumental,
add-stem,
mashup,
sample,
persona,
replace-section,
remove-section,
crop,
fade-in,
fade-out,
adjust-speed,
stems,
stems-all,
midi,
aligned-lyrics,
bpm,
music-video,
download

Body

application/json

Request body for POST /api/v1/music/{action}. Each action accepts only its own fields, listed per action in x-wizzx-music-actions; sending a field the action does not accept returns 422. Earlier tasks are referenced by Wizzx task_id only and must be your own SUCCEEDED suno tasks.

prompt
string

Lyrics in custom mode (at most 5000 characters). A description (at most 3000 characters) for generate inspiration mode, the lyrics topic, and the sounds description.

Maximum string length: 5000
gpt_description
string

Song description for inspiration mode (custom=false) on actions other than generate.

Maximum string length: 3000
custom
boolean

Custom (lyrics) mode. generate defaults to false; extend defaults to true; upload-cover requires it; cover, add-vocals, add-instrumental, add-stem, mashup, and sample infer it when omitted (prompt, style, or title means true; gpt_description means false).

instrumental
boolean
default:false

No vocals. Cannot be combined with vocal_gender.

version
enum<string>
default:v6

Case-insensitive. All versions cost the same. Cannot be combined with custom_model_task_id.

Available options:
v6,
v6-wild,
v6-mini
custom_model_task_id
string<uuid>

task_id of your SUCCEEDED create-model task. Replaces version; cannot be combined with version or persona_task_id.

persona_task_id
string<uuid>

task_id of your SUCCEEDED persona or create-voice task. Custom mode only.

title
string

Custom mode only on actions with a mode switch.

Maximum string length: 80
style
string

Style tags. Custom mode only on actions with a mode switch. Required by upsample-tags.

Maximum string length: 1000
negative_tags
string

Styles to avoid. Custom mode only on actions with a mode switch.

Maximum string length: 1000
style_weight
number

How strongly to follow style, 0-1. Custom mode only on actions other than generate.

Required range: 0 <= x <= 1
weirdness
number

How experimental the result is, 0-1.

Required range: 0 <= x <= 1
audio_weight
number

How closely to follow the source audio, 0-1. Custom mode only on actions other than generate.

Required range: 0 <= x <= 1
vocal_gender
enum<string>

Case-insensitive; m and f are accepted. Cannot be combined with instrumental=true.

Available options:
Male,
Female
auto_lyrics
boolean
default:false

Custom mode only.

variety
enum<string>
Available options:
off,
normal,
high,
extra,
max
max_mode
boolean
default:false

Higher quality at double the price. Requires custom mode on actions with a mode switch.

audio_format
enum<string>
Available options:
mp3,
m4a,
wav
duration
integer

Target length in seconds; actual length may differ. Custom mode only on actions with a mode switch. Does not change the price.

Required range: 10 <= x <= 360
task_id
string<uuid>

Source task: one of your SUCCEEDED suno tasks that produced tracks.

audio_index
integer
default:1

1-based result.tracks[].index of the source task.

Required range: 1 <= x <= 20
task_ids
string<uuid>[]

mashup: exactly two source tasks.

Required array length: 2 elements
audio_indexes
integer[]

mashup: track index for each task_ids entry.

Required array length: 2 elements
Required range: 1 <= x <= 20
audio_url
string<uri>

Publicly reachable HTTP(S) audio URL, at most 2048 characters.

Maximum string length: 2048
Pattern: ^https?://
audio_urls
string<uri>[]

inspo: 1-4 reference audio URLs. create-model: 6-24 training audio URLs.

Required array length: 1 - 24 elements

Publicly reachable HTTP(S) audio URL, at most 2048 characters.

Maximum string length: 2048
Pattern: ^https?://
continue_at
number

Seconds into the source audio where the continuation starts. For extend it must be less than the source track duration.

Required range: x >= 1
start_s
number

Section start in seconds.

Required range: x >= 0
end_s
number

Section end in seconds. Greater than start_s and not beyond the source track duration.

Required range: x > 0
fade_duration
number

Fade length in seconds; not longer than the source track.

Required range: x > 0
speed
number
Required range: 0.25 <= x <= 4
keep_pitch
boolean
default:true
stem_type
enum<string>
default:lead_vocal

Case-insensitive.

Available options:
lead_vocal,
drum_kit,
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,
kick,
snare,
risers,
synth_strings,
synth_lead,
woodwinds,
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
infill_lyrics
string

replace-section: lyrics for the replaced section.

Maximum string length: 5000
variation_category
enum<string>
Available options:
subtle,
normal,
high
sound_type
enum<string>
Available options:
one-shot,
loop
bpm
integer
Required range: 1 <= x <= 300
key
enum<string>

Sharp notation; append m for minor.

Available options:
C,
Cm,
C#,
C#m,
D,
Dm,
D#,
D#m,
E,
Em,
F,
Fm,
F#,
F#m,
G,
Gm,
G#,
G#m,
A,
Am,
A#,
A#m,
B,
Bm
lyrics_model
enum<string>
Available options:
classic,
remi
name
string

create-model or persona name.

Maximum string length: 80
description
string

persona description.

Maximum string length: 1000
formats
enum<string>[]

Duplicates are ignored.

Minimum array length: 1
Available options:
mp3,
m4a,
wav

Response

Task accepted

code
enum<integer>
required
Available options:
0
message
string
required
Example:

"success"

data
object
required
request_id
string<uuid>
required