curl --request POST \
--url https://api.mage.space/v1/minimax_music/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "Acoustic pop, 96 BPM, C major, warm and intimate, building into the chorus. Soft female lead, close and breathy, light harmonies in the chorus. Fingerpicked guitar and soft piano; brushed drums and upright bass enter in the chorus.",
"duration": "120",
"lyrics": "[verse]\nMorning light filtering through the pine\nEvery quiet street is yours and mine\n[chorus]\nSoftly the world begins to breathe"
}
'import Mage from '@mage-space/sdk';
const mage = new Mage(); // reads MAGE_API_KEY
const request = await mage.run('minimax_music', {
prompt: 'Acoustic pop, 96 BPM, C major, warm and intimate, building into the chorus. Soft female lead, close and breathy, light harmonies in the chorus. Fingerpicked guitar and soft piano; brushed drums and upright bass enter in the chorus.',
duration: '120',
lyrics: '[verse]\nMorning light filtering through the pine\nEvery quiet street is yours and mine\n[chorus]\nSoftly the world begins to breathe',
});
console.log(request.result.url);from mage_space import Mage
mage = Mage() # reads MAGE_API_KEY
request = mage.run("minimax_music", {
"prompt": "Acoustic pop, 96 BPM, C major, warm and intimate, building into the chorus. Soft female lead, close and breathy, light harmonies in the chorus. Fingerpicked guitar and soft piano; brushed drums and upright bass enter in the chorus.",
"duration": "120",
"lyrics": "[verse]\nMorning light filtering through the pine\nEvery quiet street is yours and mine\n[chorus]\nSoftly the world begins to breathe",
})
print(request["result"]["url"])const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: 'Acoustic pop, 96 BPM, C major, warm and intimate, building into the chorus. Soft female lead, close and breathy, light harmonies in the chorus. Fingerpicked guitar and soft piano; brushed drums and upright bass enter in the chorus.',
duration: '120',
lyrics: '[verse]\nMorning light filtering through the pine\nEvery quiet street is yours and mine\n[chorus]\nSoftly the world begins to breathe'
})
};
fetch('https://api.mage.space/v1/minimax_music/generate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff",
"status": "in_progress",
"architecture": "minimax_music",
"model_id": "minimax-music-3",
"created_at": "2026-09-17T14:52:48.000Z",
"updated_at": "2026-09-17T14:52:49.000Z",
"billing": {
"mode": "gems",
"gems_charged": 125
},
"result": null,
"error": null,
"status_url": "https://api.mage.space/v1/requests/d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff/status",
"cancel_url": "https://api.mage.space/v1/requests/d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff/cancel"
}{
"error": {
"code": "invalid_config",
"message": "`resolution` must be one of: 768P, 2K."
}
}{
"error": {
"code": "unauthorized",
"message": "The API key is invalid or has been revoked."
}
}{
"error": {
"code": "insufficient_gems",
"message": "This generation costs 40 gems and the account balance is too low.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff",
"gems_required": 40
}
}{
"error": {
"code": "content_blocked",
"message": "The request was blocked by Mage's content policy.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "architecture_retired",
"message": "This architecture has been retired.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "too_many_requests",
"message": "At most 20 generations may be in flight at once for this account; 20 are running now."
}
}{
"error": {
"code": "content_blocked",
"message": "The request was blocked by an external content restriction.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "internal_error",
"message": "Something went wrong on our side. Retry, and contact support if it persists."
}
}MiniMax Music 3
Generate audio with MiniMax Music 3 through the Mage API: the fields of POST /v1/minimax_music/generate, its options by model, the rules it enforces, and its gem price.
curl --request POST \
--url https://api.mage.space/v1/minimax_music/generate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"prompt": "Acoustic pop, 96 BPM, C major, warm and intimate, building into the chorus. Soft female lead, close and breathy, light harmonies in the chorus. Fingerpicked guitar and soft piano; brushed drums and upright bass enter in the chorus.",
"duration": "120",
"lyrics": "[verse]\nMorning light filtering through the pine\nEvery quiet street is yours and mine\n[chorus]\nSoftly the world begins to breathe"
}
'import Mage from '@mage-space/sdk';
const mage = new Mage(); // reads MAGE_API_KEY
const request = await mage.run('minimax_music', {
prompt: 'Acoustic pop, 96 BPM, C major, warm and intimate, building into the chorus. Soft female lead, close and breathy, light harmonies in the chorus. Fingerpicked guitar and soft piano; brushed drums and upright bass enter in the chorus.',
duration: '120',
lyrics: '[verse]\nMorning light filtering through the pine\nEvery quiet street is yours and mine\n[chorus]\nSoftly the world begins to breathe',
});
console.log(request.result.url);from mage_space import Mage
mage = Mage() # reads MAGE_API_KEY
request = mage.run("minimax_music", {
"prompt": "Acoustic pop, 96 BPM, C major, warm and intimate, building into the chorus. Soft female lead, close and breathy, light harmonies in the chorus. Fingerpicked guitar and soft piano; brushed drums and upright bass enter in the chorus.",
"duration": "120",
"lyrics": "[verse]\nMorning light filtering through the pine\nEvery quiet street is yours and mine\n[chorus]\nSoftly the world begins to breathe",
})
print(request["result"]["url"])const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
prompt: 'Acoustic pop, 96 BPM, C major, warm and intimate, building into the chorus. Soft female lead, close and breathy, light harmonies in the chorus. Fingerpicked guitar and soft piano; brushed drums and upright bass enter in the chorus.',
duration: '120',
lyrics: '[verse]\nMorning light filtering through the pine\nEvery quiet street is yours and mine\n[chorus]\nSoftly the world begins to breathe'
})
};
fetch('https://api.mage.space/v1/minimax_music/generate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff",
"status": "in_progress",
"architecture": "minimax_music",
"model_id": "minimax-music-3",
"created_at": "2026-09-17T14:52:48.000Z",
"updated_at": "2026-09-17T14:52:49.000Z",
"billing": {
"mode": "gems",
"gems_charged": 125
},
"result": null,
"error": null,
"status_url": "https://api.mage.space/v1/requests/d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff/status",
"cancel_url": "https://api.mage.space/v1/requests/d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff/cancel"
}{
"error": {
"code": "invalid_config",
"message": "`resolution` must be one of: 768P, 2K."
}
}{
"error": {
"code": "unauthorized",
"message": "The API key is invalid or has been revoked."
}
}{
"error": {
"code": "insufficient_gems",
"message": "This generation costs 40 gems and the account balance is too low.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff",
"gems_required": 40
}
}{
"error": {
"code": "content_blocked",
"message": "The request was blocked by Mage's content policy.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "architecture_retired",
"message": "This architecture has been retired.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "too_many_requests",
"message": "At most 20 generations may be in flight at once for this account; 20 are running now."
}
}{
"error": {
"code": "content_blocked",
"message": "The request was blocked by an external content restriction.",
"request_id": "d7e6c0f3-6699-4f6c-bb45-2ad7fd9158ff"
}
}{
"error": {
"code": "internal_error",
"message": "Something went wrong on our side. Retry, and contact support if it persists."
}
}lyrics and the sound in the prompt.
| Detail | |
|---|---|
| Type | Audio |
| Models | minimax-music-3 (MiniMax Music 3, default) |
| Image inputs | None |
| Video inputs | None |
| Gems | 125 at the default settings |
| Model page | MiniMax Music 3 |
Mentions
This model takes no@handle mentions: saved characters, references, and audio references are not available on it. See Characters and references.
Rules
A request that breaks one of these is refused with400 invalid_config before any gems are charged.
- The prompt describes the music, at most 4000 characters: genre, tempo and key, mood and how it builds, the vocalist (name the voice, or the song may come out instrumental), and the instruments.
lyricsholds the words to sing, at most 6000 characters. Put each section tag ([intro], [verse], [pre-chorus], [chorus], [bridge], [outro]) on its own line: words on a tag’s line are dropped.- Leave
lyricsempty, or setinstrumentalto true, for an instrumental. durationis the longest the song may run, and the price; the model ends the song when its lyrics and arrangement are done, often sooner.
billing.gems_charged, and the balance at GET /v1/account.Authorizations
Create a key in API → API Keys: select Create API key, name it in the popup, then select Create key. Copy the one-time key and send it as Authorization: Bearer mage_sk_…. Keys are for server-side code only.
Headers
A key of your choosing, 1 to 255 characters, scoped to your API key. A retried submit with the same key returns the original request with 200 instead of charging again. The key identifies the first submission made with it; later bodies are not compared. A refusal recorded under the key (its envelope carries request_id) replays the same way, so a new attempt needs a new key.
1 - 255Body
A partial config for MiniMax Music 3.
Response
The request was accepted; poll status_url for the result. A retried submit whose Idempotency-Key was used before answers 200 with the same shape, the original request, and charges nothing.

