Create Music
Starts a song and answers 202 at once with the job; poll its polling_url, or pass callback_url to be notified (the same signed webhooks as videos, with music.generation.* events). A full song takes minutes. To wait for a short one, send Prefer: wait=<seconds> (at most 60): if the job finishes in that time the answer is 200 with the finished job, otherwise 202 as usual. GET /v1/music/models lists the models with what each accepts.
One request for every model. The fields below are shared by all music models; each model's entry in GET /v1/music/models says which it honours. A field the model cannot honour, sent with a value that asks for something, is a 400 naming the field (metadata.error_type unsupported_), so a request is never billed for something it did not get. A value that asks for nothing (false, [], "") is accepted. A field this API does not know is ignored and reported in the job's warnings.
Other APIs' names are accepted for the shared fields: tags (prompt) and seconds_total (fal), music_length_ms, force_instrumental, model_id and codec strings such as mp3_44100_128 in output_format (ElevenLabs), is_instrumental and audio_setting (MiniMax). aigc_watermark, enable_ and sync_mode are accepted and ignored.
minimax-music3 (MiniMax-Music3): lyrics are required, and prompt is the style caption. The model was trained on captions under three headings, each field on its own line:
Global Metadata
Basic Attributes: bpm is 92. key is E, and scale is minor. Electric Blues / Blues Rock.
...
Vocal Details
...
Arrangement
...Free prose works too. Lyric section tags on their own lines steer the structure: [Intro], [Verse], [Pre-Chorus], [Chorus], [Post-Chorus], [Bridge], [Instrumental], [Solo], [Outro] (other spellings such as [pre chorus] or [Inst] are rewritten to these). The prompt and lyrics together may come to about 5,000 tokens. duration is the longest the song may be, 30 to 360 seconds (default 300); the song may end sooner, and you pay for the seconds it has. bpm, key and time_signature are hints: they are written into the caption's Basic Attributes line and reported as advisory_control warnings, and the model may not follow them exactly. One song per request; a seed gives the same song for the same request. Output is rendered at 44.1 kHz stereo, the model's native rate, and delivered as response_format (mp3 by default, 256 kbps) at sample_rate (default 44100); any other rate is resampled. Until 2026-10-20 the default was 32000: send sample_rate: 32000 to keep it, which matters most for pcm, raw samples with no header to say their rate.
Expected wait: while a job is pending, queue_position counts the jobs ahead of it for the same model. Once it starts, minimax-music3 renders about 0.7 seconds per second of song: a 3 minute song is ready in about 2 minutes. progress is estimated from these times.
Billing: per second of audio produced at the model's price (pricing_skus in GET /v1/music/models), each output rounded up to a whole second and never more than duration, only when the job completes. Failed and cancelled jobs are not billed.
Timestamps: timestamps: true also times the lyrics once the song is made. Each output of the finished job carries timestamps (when every word and line is sung, as POST /v1/audio/alignments returns them), the timing is billed per second of audio at aligner-1's price and shown in usage.timestamps, and usage.cost includes it. A timing that fails never fails the song: the output has no timestamps, the job has a timestamps_ warning and the timing is not billed.
Guides: Async jobs, Webhooks, Write songs for MiniMax Music 3, Make songs with ACE-Step 1.5
Header parameters
-
Prefer string
wait=<seconds>, at most 60: answer with the finished job if it completes in that time.
Body
application/jsonThe fields every music model shares. Each model's entry in GET /v1/music/models says which it honours; one it cannot honour is a 400 naming it. instrumental, input_references, source_audio, reference_audio, regions, negative_prompt, include, adapters and best_of are reserved for models that will honour them and refused today when they ask for something. language is honoured by models that list languages (ace-step-1.5); source_audio, reference_audio and input_references by models whose tasks take audio (ace-step-1.5 takes a reference on every task and a source on repaint, cover and extend); regions by a task that lists them (ace-step-1.5's repaint); timestamps by models whose entry says timestamps set to true; instrumental by models whose entry says instrumental set to true (ace-step-1.5); and best_of by models whose entry gives best_of a max (ace-step-1.5).
-
model string required
-
prompt string
The style caption (minimax-music3, at most 6,000 characters; ace-step-1.5, 750). Also accepted as
tags. -
lyrics string
The words, with section tags on their own lines (minimax-music3, at most 12,000 characters, required; ace-step-1.5, at most 4,096, and none makes an instrumental, sent to the model as
[Instrumental]). -
instrumental boolean
trueasks for a song without words: the same as leavinglyricsout, sotruewith lyrics is a 400, as it is on a task that works on a song you send (repaint,cover,extend). Not coerced:"true"is a 400. Also accepted asis_instrumentalorforce_instrumental. Models withoutinstrumentalset to true inGET /v1/music/modelsrefuse atruewith a 400 naming the field (minimax-music3). -
duration integer
Seconds. For minimax-music3 the longest the song may be, 30 to 360 (default 300); for ace-step-1.5 the song's exact length, 10 to 600 (default 120). A task whose
lengthissource(repaint, cover) keeps the source's length and refuses it; forextendit is the new total, required and longer than the source, and only the seconds added are billed. Also accepted asseconds_total, ormusic_length_msin milliseconds. -
write boolean
truemakesprompta brief, in your own words, that the API has a writer model (deepseek-v4.1-flash) turn into the song before it renders: a style caption the model follows, lyrics in Verse and Chorus sections whose lines fit the tempo, and the tempo, key and time signature. Abpm,keyortime_signatureyou send is kept and the words are fitted to it. What was written is in the job'swritten; the writer's tokens are billed at its price inusage.write. A brief that cannot be written into a song that meets those rules after one retry fails the job witherror_codewrite_failed, and nothing is billed. Leavelyricsandinstrumentalout; a new song (text2music) only, in a languagewrite.languagesinGET /v1/music/modelslists (enon ace-step-1.5). Withtimestampsorbest_of, the written lyrics are the ones timed. Models withoutwriteinGET /v1/music/modelsrefusetruewith a 400 naming the field (minimax-music3). Not coerced:"true"is a 400.default false -
best_of integer
How many takes, rendered from
seedand the seeds after it, the one song is picked from. The lyrics of each take are aligned byaligner-1and the take whose lines it placed with the most confidence is returned, with every take's seed and score inoutputs[0].. Every take is billed at the model's price, and every alignment atmetadata. candidates aligner-1's, inusage.best_of; a job takes about that many times as long. Needs lyrics the aligner can read in a language it lists, astimestampsdoes (a 400 namingbest_ofotherwise). Up tobest_of.maxinGET /v1/music/models(4 on ace-step-1.5); a model without it refuses the field with a 400.default 1at least 1 -
n integer
How many songs to make, each from its own seed, up to the model's
outputs.max_n(minimax-music3, 1).default 1at least 1 -
seed integer
The same request with the same seed makes the same song. Each output reports the seed it used.
range 0–4294967295 -
response_format string
pcmis raw 16-bit little-endian samples with no header;opusis in Ogg at 48 kHz. Also accepted asoutput_format, including codec strings such asmp3_44100_128, or MiniMax'saudio_setting.format.default mp3mp3wavflacopusaacpcm -
sample_rate integer
Defaults to the model's own (minimax-music3, 44100, its native rate; 32000 until 2026-10-20). Any other rate is resampled. A
pcmfile has no header, so a client that assumed the old 32 kHz plays a default file slow: send 32000 to keep the old rate.8000160002205024000320004410048000 -
bitrate integer
Bits per second for
mp3,aacandopus(default 256000); ignored with a warning for the other formats.320006400096000128000192000256000320000 -
bpm integer
Tempo. Advisory on minimax-music3 (30 to 300), written into the caption; native on ace-step-1.5 (30 to 300).
-
key string
A note with an optional accidental and scale, such as
C major,F# minororEb. Advisory on minimax-music3, native on ace-step-1.5. -
time_signature string
Beats over a note value, such as
4/4,3/4or6/8. Advisory on minimax-music3; native on ace-step-1.5, which takes2/4,3/4,4/4and6/8only. -
task string
What to do, from the model's
tasks. minimax-music3 servestext2music. ace-step-1.5 also servesrepaint(regenerate one region ofsource_audio),cover(re-rendersource_audioin the caption's style, hifi only, withcover_strength0 to 1) andextend(continuesource_audiotoduration).default text2music -
language string
The language the lyrics are sung in, from the model's
languagesinGET /v1/music/models; matched without case and by its primary subtag, sozh-CNiszh. ace-step-1.5 takes 50 codes andunknown, and assumesen, orunknownfor a song without lyrics. A model withoutlanguagesrefuses it. -
timestamps boolean
truealso times the lyrics in the finished song: each output getstimestampswith a start and an end for every word and line, the shapePOST /v1/audio/alignmentsanswers with, made byaligner-1. Needs lyrics with at least one word in the Latin alphabet (an instrumental, or lyrics only in Chinese, Cyrillic or another script, is a 400), and the song's language must be onealigner-1lists (a 400 naming them; ace-step-1.5'slanguage,enunless sent). The timing is billed apart, per second of audio rounded up ataligner-1's price, and appears inusage.timestamps. If it fails the song still completes, the output has notimestampsand the job has atimestamps_warning; that output's timing is not billed. 503 whileunavailable aligner-1is not being served. Models withouttimestamps: trueinGET /v1/music/modelsrefuse atruewith a 400 naming the field.default false -
reference_audio string or object
A recording whose voice and tone the song takes up, on a model whose task takes one (
tasks[].requiresinGET /v1/music/models; ace-step-1.5'stext2music). An https URL, a base64 data URI,{"type":"audio_url","audio_url":"https://..."}, or{"type":"job_for a song from one of your own jobs, kept 7 days. At most 50 MB, wav, mp3, flac, ogg, m4a or aac, 10 to 600 seconds on ace-step-1.5. A URL is fetched when the song renders, and a file it serves that breaks these rules fails the job.output","job_ id":"music_...","index":0} -
source_audio string or object
The song a task works on (ace-step-1.5's
repaint,coverandextend), in the same forms asreference_audio, 10 to 600 seconds and at most 50 MB. A task that takes none refuses it. -
input_references array of any
Audio as a list, each item with its
role(referenceby default, orsource). A role may come once, here or as its own field. -
regions array of objects
The part of the source a task works on,
[{start, end}]in seconds; only a task that listsregionsintaskstakes it, and others refuse it.repainting_startandrepainting_endare accepted as one region. ace-step-1.5'srepainttakes exactly one, which must end inside the source. -
quality string
The quality tier, on a model that has them (its
quality_tiersinGET /v1/music/models); a model without tiers ignores it with anunknown_parameterwarning. ace-step-1.5 hasturbo(the default; alsoauto,low,fast) andhifi(alsohigh,hd), which takes longer and bills 7.5 times the seconds. A task may run on only some tiers (itstiersintasks, the default first); another is a 400. Also accepted underprovider.options. -
callback_url string
An https URL notified on completion, failure, cancellation and expiry. See
GET /v1/webhooks/secret. -
provider object
OpenRouter's provider preferences. The routing fields (
order,only,ignore,sort,allow_fallbacks, ...) are accepted and ignored.optionscarries the model's own settings (each model'sallowed_; minimax-music3 has none) for clients that cannot add top-level fields. From OpenRouter's SDKs usepassthrough_ parameters options.stealth: they keep only the slugs on their closed list and drop any other,vultrincluded, without an error. The first form present wins, the top level before any option; a key the model does not declare is a 400 naming its path.
Responses
Accepted. The job, pending, with its polling_url, queue_position and any warnings.
application/json · music-job-payload
With Prefer: wait, the job finished in time.
application/json · music-job-payload
A field the model cannot honour, a value out of range or a malformed field. The message names the field.
application/json · error-payload
The API key is missing, unknown or not active. Send it as Authorization: Bearer <key>.
application/json · error-payload
Unknown music model
application/json · error-payload
Too many songs for this model from your subscription. At most the model's limit at once may be pending or rendering, and at most its limit a minute may be created (the model's page in the docs gives both). Wait for Retry-After, then retry.
application/json · error-payload
The model has no valid capability spec at the moment and is not served, or timestamps was asked for while aligner-1 is not being served.
application/json · error-payload
curl https://api.vultrinference.com/v1/music \
-H "Authorization: Bearer $VULTR_INFERENCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "minimax-music3",
"prompt": "Global Metadata\nBasic Attributes: bpm is 118. key is F, and scale is minor. Disco Pop / Nu-Disco.\nVocal Details\nBright female lead, close-miked, light doubles on the chorus.\nArrangement\nFour-on-the-floor kick, slap bass, string stabs, filtered synth swells into the chorus.",
"lyrics": "[Verse]\nCity lights are humming low\nEvery window starts to glow\n[Chorus]\nWe keep on running through the night",
"duration": 180,
"response_format": "mp3",
"callback_url": "https://example.com/hooks/music"
}'import os
import requests
response = requests.post(
"https://api.vultrinference.com/v1/music",
headers={"Authorization": f"Bearer {os.environ['VULTR_INFERENCE_API_KEY']}"},
json={
"model": "minimax-music3",
"prompt": "Global Metadata\nBasic Attributes: bpm is 118. key is F, and scale is minor. Disco Pop / Nu-Disco.\nVocal Details\nBright female lead, close-miked, light doubles on the chorus.\nArrangement\nFour-on-the-floor kick, slap bass, string stabs, filtered synth swells into the chorus.",
"lyrics": "[Verse]\nCity lights are humming low\nEvery window starts to glow\n[Chorus]\nWe keep on running through the night",
"duration": 180,
"response_format": "mp3",
"callback_url": "https://example.com/hooks/music",
},
)
print(response.json())const response = await fetch("https://api.vultrinference.com/v1/music", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VULTR_INFERENCE_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"model": "minimax-music3",
"prompt": "Global Metadata\nBasic Attributes: bpm is 118. key is F, and scale is minor. Disco Pop / Nu-Disco.\nVocal Details\nBright female lead, close-miked, light doubles on the chorus.\nArrangement\nFour-on-the-floor kick, slap bass, string stabs, filtered synth swells into the chorus.",
"lyrics": "[Verse]\nCity lights are humming low\nEvery window starts to glow\n[Chorus]\nWe keep on running through the night",
"duration": 180,
"response_format": "mp3",
"callback_url": "https://example.com/hooks/music"
}),
});
console.log(await response.json());{
"id": "music_0123456789abcdef01234567",
"object": "music",
"model": "string",
"task": "string",
"status": "pending",
"progress": 0,
"created_at": 1790000000,
"polling_url": "string",
"warnings": [
{
"code": "string",
"field": "string",
"message": "string"
}
]
}