Seedance 2.5 Now Live | Try in Video Generator →

minimax/

MiniMax Music 3.0 generates complete songs from text prompts and lyrics, including vocals and instrumentals, with instrumental-only mode, auto lyrics generation, structure tags for song arrangement, and configurable audio quality. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.

text-to-audio
Input

Idle

$0.15per run·~66 / $10

ExamplesView all

Cinematic pop song with an emotional female lead vocal, intimate verses building into a powerful soaring chorus, warm piano, atmospheric synth pads, deep drums, subtle strings, dramatic dynamics, bittersweet but hopeful mood, polished modern production.

Related Models

README

MiniMax Music 3.0

MiniMax Music 3.0 generates complete songs with vocals and instrumentals from a text prompt and lyrics. Describe the genre, mood, instruments, tempo, and production style, and the model creates a full track with support for structure tags, instrumental-only mode, auto lyrics generation, and configurable audio quality up to 256kbps / 44.1kHz.

Why Choose This?

  • Complete song generation
    Generate a full song with vocals and instrumental arrangement from a prompt and lyrics.

  • Structure tag support
    Use tags like [Verse], [Chorus], and [Bridge] to guide song structure and arrangement.

  • Auto lyrics generation
    Leave the lyrics input empty to let the model generate lyrics automatically from the prompt.

  • Instrumental mode
    Enable is_instrumental to generate a backing track without vocals.

  • Configurable audio quality
    Choose bitrate and sample rate settings up to 256000 bitrate and 44100 sample rate.

  • Wide genre support
    Generate pop, rock, folk, electronic, orchestral, lo-fi, cinematic, and other music styles from prompt instructions.

Parameters

ParameterRequiredDescription
promptYesMusic style description, including genre, mood, instruments, tempo, vocal style, and production direction. Maximum length: 2000 characters.
lyricsYesSong lyrics with optional structure tags. Length: 10–3000 characters. Pass an empty value for auto-generated lyrics.
bitrateNoAudio bitrate: 32000, 60000, 64000, 128000, or 256000. Default: 256000.
sample_rateNoAudio sample rate: 16000, 24000, 32000, or 44100. Default: 44100.
is_instrumentalNoGenerate instrumental music without vocals. Default: false.

Lyrics Structure Tags

Use structure tags in the lyrics to guide arrangement and song sections:

[Intro], [Verse], [Pre Chorus], [Chorus], [Post Chorus], [Interlude], [Bridge], [Outro], [Hook], [Build Up], [Break], [Transition], [Inst], [Solo]

How to Use

  1. Write your prompt — Describe the genre, mood, instruments, tempo, vocal style, and production direction.
  2. Enter lyrics — Add lyrics with optional structure tags such as [Verse] and [Chorus]. Leave lyrics empty for auto-generation.
  3. Choose audio quality optional — Set bitrate and sample_rate when you need a specific delivery format.
  4. Enable instrumental mode optional — Use is_instrumental when you want a backing track without vocals.
  5. Submit — Generate the song and retrieve the audio output.

Pricing

OutputCost
One generated song$0.15

Best Use Cases

  • Songwriting and demos — Turn lyrics and a style description into a complete demo track.
  • Content creation — Generate original songs or background music for videos, podcasts, and social media.
  • Music production — Use instrumental mode to create backing tracks for further production.
  • Custom soundtracks — Create original music for games, ads, short films, and branded content.
  • Creative exploration — Test different genres, moods, arrangements, and vocal styles from the same concept.

Pro Tips

  • Be specific in the prompt: include genre, tempo, instruments, vocal style, mood, and production cues.
  • Use structure tags to guide verse, chorus, bridge, intro, outro, and instrumental sections.
  • Leave lyrics empty when you want quick auto-generated lyric ideas.
  • Use is_instrumental for backing tracks, music beds, or soundtrack-style output.
  • Use higher bitrate and sample rate settings when you need higher-quality delivery.
  • Keep lyrics structured and readable for better vocal phrasing and arrangement.

Related Models

Note:This website uses AI models provided by third parties. Documentation prices are for reference and may be outdated. The Generate button shows an estimate; the final task charge prevails.

Music 3.0 API — Quick start

Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/minimax/music-3.0 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 3.0 below.

HTTP example
set -euo pipefail

: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"

REQUEST_BODY=$(cat <<'JSON'
{
    "prompt": "A cinematic shot of a city at sunset, soft golden light",
    "lyrics": "example",
    "bitrate": 256000,
    "sample_rate": 44100,
    "is_instrumental": false
}
JSON
)

# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
  -X POST "https://api.wavespeed.ai/api/v3/minimax/music-3.0" \
  -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=$(printf '%s' "$TASK" | jq -r '.urls.get // empty')
if [ -z "$RESULT_URL" ]; then
  RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
fi

# 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) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
    created|processing) sleep 2 ;;
    *) printf 'Unexpected status: %s
' "$STATUS" >&2; exit 1 ;;
  esac
done
Node.js example
const submitUrl = "https://api.wavespeed.ai/api/v3/minimax/music-3.0";
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({
        "prompt": "A cinematic shot of a city at sunset, soft golden light",
        "lyrics": "example",
        "bitrate": 256000,
        "sample_rate": 44100,
        "is_instrumental": false
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
  `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"].includes(result.status)) throw new Error(JSON.stringify(result));
  if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
  await new Promise(resolve => setTimeout(resolve, 2000));
}
Python example
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 = {
    "prompt": "A cinematic shot of a city at sunset, soft golden light",
    "lyrics": "example",
    "bitrate": 256000,
    "sample_rate": 44100,
    "is_instrumental": False
}

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-3.0", 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 = task.get("urls", {}).get("get") or 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"}:
        raise RuntimeError(result)
    if status not in {"created", "processing"}:
        raise RuntimeError(f"Unexpected status: {status}")
    time.sleep(2)

Music 3.0 API — Frequently asked questions

What is the Music 3.0 API?

Music 3.0 is a MiniMax model for audio generation, exposed as a REST API on WaveSpeedAI. MiniMax Music 3.0 generates complete songs from text prompts and lyrics, including vocals and instrumentals, with instrumental-only mode, auto lyrics generation, structure tags for song arrangement, and configurable audio quality. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.

How do I call the Music 3.0 API?

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-3.0.

How much does Music 3.0 cost per run?

Music 3.0 starts at $0.15 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.

What inputs does Music 3.0 accept?

Key inputs: `prompt`, `bitrate`, `is_instrumental`, `lyrics`, `sample_rate`. 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-3.0.

How do I get started with the Music 3.0 API?

Sign up for a free WaveSpeedAI account to claim starter credits, copy your API key from /accesskey, then call the endpoint shown in the API tab of the playground. The playground also auto-generates a code sample in Python, JavaScript, or cURL for the parameters you've set.

Can I use Music 3.0 outputs commercially?

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.

MiniMax Music 3.0 Text-to-Music API on WaveSpeedAI