MiniMax Music v1.5 turns text prompts into high-quality, diverse music (Text-to-Audio) using advanced AI for versatile tracks. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Idle
$0.03per run·~33 / $1
[verse]Radio static, hadn't smiled in a while. A forgotten song came on, and blew away my care.[chorus]That one song changed it all. The hope a simple melody can bring. Lifts you up and makes you strong, three minutes where you belong.
[verse]The bourbon burns, a trail of fire. Each sip, a memory of desire. The neon hums a low, sad tune beneath this cold, uncaring moon.[chorus]Oh, these barroom blues, a heavy chain. Each link forged in your pouring rain. The smoky haze can't hide my pain, just your ghost whispering my name.
[verse]The clock on the wall stands still. Time's a poison I'm forced to spill. Every shadow dances with grace, just to mock the sorrow on my face.[chorus]Oh, these barroom blues, a lonely ache for a love that was a mistake. The fading afternoon light plays the final verse of our sad tune.
[verse]The smell of stale beer and regret, a tangled web I can't forget. The old piano's missing a key, just like the missing part of me.[chorus]Oh, these barroom blues, a swirling storm, trying to keep my shattered pieces warm. Every song's a nail in the coffin lid for the love I foolishly hid.
[verse]Bass is kicking, lights are low. Got my friends here, ready to go. Feel the energy in the air tonight, everything is shining so bright.[chorus]Oh, we're dancing 'til the sun comes up. Pour the good times in my cup. Worries fade and disappear, 'cause the best night of the year is here.
[verse]Woke up this morning, felt the call. To leave the concrete, stand up tall. With a backpack and a faded map, I won't ever look back.[chorus]Oh, the mountains sing a song for me. Underneath the canopy. Every river bend and soaring hawk shows me how to really talk, to really be.
[verse]No alarm clock, sun is high. Just watching all the clouds drift by. The coffee's brewing, slow and sweet. Got no plans and no one to meet.[chorus]Oh, this quiet and this easy pace, a simple smile upon my face. The world can rush, the world can spin. But today I'm just soaking it all in.
minimax/music-v1.5 is an end-to-end music generator that creates catchy songs from short style cues and structured lyrics. Provide a lyrics_prompt for mood/genre guidance and a prompt with sectioned lyrics, and the model returns a complete track with vocals and instrumental backing.
| Parameter | Required | Description |
|---|---|---|
| lyrics_prompt | Yes | Short style tags and mood descriptors. |
| prompt | Yes | Your lyrics with explicit section markers (max 600 characters). |
[intro], [verse], [pre-chorus], [chorus], [post-chorus], [bridge], [outro], [build]
[verse] Radio static, hadn't smiled in a while. A forgotten song came on, and blew away my care.
[chorus] That one song changed it all. The hope a simple melody can bring. Lifts you up and makes you strong, three minutes where you belong.
| Output | Price |
|---|---|
| Per song | $0.03 |
Pop / Feel-Good
lyrics_prompt: pop, upbeat, catchy, summer, feel-good
prompt: [intro] Sun on my face, wheels on the road. [verse] Left all my worries in the rearview mirror, chasing the light as the skyline gets nearer. [pre-chorus] Heart on the beat, road under my feet. [chorus] We're wide awake tonight—sing it out, lights are in our eyes. Every mile feels right—turn it up, let the world go by.
Indie Folk / Intimate
lyrics_prompt: indie folk, acoustic, warm, reflective
prompt: [verse] Coffee steam and open windows, morning writes across the floor. [chorus] If home is where the quiet grows, I'll find it in your voice once more.
EDM / Festival
lyrics_prompt: EDM, energetic, anthemic, festival drop
prompt: [verse] Hands up, heartbeat running wild, neon rivers in the night. [build] Count it down—4, 3, 2— [chorus] We break like thunder, we're lightning undercover; let the sky remember our names tonight!
Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/minimax/music-v1.5 with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Music v1.5 below.
set -euo pipefail
: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"
REQUEST_BODY=$(cat <<'JSON'
{
"lyrics_prompt": "blues, melancholic, raw, lonely bar, heartbreak.",
"prompt": "A cinematic shot of a city at sunset, soft golden light"
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/minimax/music-v1.5" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WAVESPEED_API_KEY" \
-d "$REQUEST_BODY")
TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
-H "Authorization: Bearer $WAVESPEED_API_KEY")
RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
case "$STATUS" in
completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
failed|cancelled|timeout|deleted) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneconst submitUrl = "https://api.wavespeed.ai/api/v3/minimax/music-v1.5";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');
async function requestJson(url, options = {}) {
const response = await fetch(url, options);
if (!response.ok) throw new Error(await response.text());
return response.json();
}
// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
method: "POST",
headers: {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"lyrics_prompt": "blues, melancholic, raw, lonely bar, heartbreak.",
"prompt": "A cinematic shot of a city at sunset, soft golden light"
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = `https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;
// 2. Poll until the prediction finishes.
while (true) {
const resultBody = await requestJson(resultUrl, {
headers: { "Authorization": `Bearer ${apiKey}` },
});
const result = resultBody.data ?? resultBody;
if (result.status === "completed") {
console.log(result.outputs);
break;
}
if (["failed", "cancelled", "timeout", "deleted"].includes(result.status)) throw new Error(JSON.stringify(result));
await new Promise(resolve => setTimeout(resolve, 2000));
}import json
import os
import time
from urllib.request import Request, urlopen
api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
"lyrics_prompt": "blues, melancholic, raw, lonely bar, heartbreak.",
"prompt": "A cinematic shot of a city at sunset, soft golden light"
}
def request_json(url, data=None):
request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
with urlopen(request) as response:
return json.load(response)
# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/minimax/music-v1.5", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
raise RuntimeError("Submission response did not contain a prediction id")
result_url = f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"
# 2. Poll until the prediction finishes.
while True:
result_body = request_json(result_url)
result = result_body.get("data", result_body)
status = result.get("status")
if status == "completed":
print(result.get("outputs", []))
break
if status in {"failed", "cancelled", "timeout", "deleted"}:
raise RuntimeError(result)
time.sleep(2)Music v1.5 is a MiniMax model for audio generation, exposed as a REST API on WaveSpeedAI. MiniMax Music v1.5 turns text prompts into high-quality, diverse music (Text-to-Audio) using advanced AI for versatile tracks. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.
POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/minimax/minimax-music-v1.5.
Music v1.5 starts at $0.030 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.
Key inputs: `prompt`, `lyrics_prompt`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/minimax/minimax-music-v1.5.
Median end-to-end generation time on WaveSpeedAI is around 85 seconds per request, based on recent successful runs. Queue time varies with global demand; live status is visible in the prediction record.
Commercial usage rights depend on the model's license, set by its provider (MiniMax). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.