Minimax H3 API, Minimax Speech 2.8 API (HD & Turbo), Minimax Music 3.0 API, Minimax Voice Design API, Minimax Hailuo API: Pricing and Documentation
by MiniMax
Minimax H3 API, developers can access all MiniMax modalities including text-to-video, image generation, voice synthesis, and music creation. The API provides a unified interface for multimodal content generation, ideal for applications requiring diverse media outputs.

Models Version
Get $5 Free Credit on First Payment
No strings attached — add funds and get $5 bonus instantly
Generate a complete song — vocals, lyrics and arrangement — from a text prompt. Up to five minutes, 44.1kHz stereo. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the audio.
POST https://gateway.pixazo.ai/minimax-music-3-0/v1/text-to-musicMiniMax Music 3.0 API Documentation (Text to Music)
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax Music 3.0 API (Text to Music)
Request Code
POST https://gateway.pixazo.ai/minimax-music-3-0/v1/text-to-music
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop",
"lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes",
"format": "mp3",
"sample_rate": 44100,
"bitrate": 256000
}import requests
url = "https://gateway.pixazo.ai/minimax-music-3-0/v1/text-to-music"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop",
"lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes",
"format": "mp3",
"sample_rate": 44100,
"bitrate": 256000
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/minimax-music-3-0/v1/text-to-music", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop",
"lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes",
"format": "mp3",
"sample_rate": 44100,
"bitrate": 256000
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/minimax-music-3-0/v1/text-to-music' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop", "lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes", "format": "mp3", "sample_rate": 44100, "bitrate": 256000}'Output
{
"request_id": "minimax-music-3-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-music-3-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. A track takes a couple of minutes to render, so a webhook is usually the better fit.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/minimax-music-3-0/v1/text-to-music' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop", "lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes", "format": "mp3", "sample_rate": 44100, "bitrate": 256000}'Callback Payload (success)
{
"request_id": "minimax-music-3-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-music-3-0",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/audio.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-08-06T09:14:16.102Z",
"completed_at": "2026-08-06T09:16:01.870Z"
}Failure callback shape
{
"request_id": "minimax-music-3-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-music-3-0",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | 1–2,000 characters | Describes the music: genre, mood, instrumentation, setting. e.g. Indie folk, melancholic, introspective, solitary walk, coffee shop. |
lyrics | Conditional | string | — | 1–3,500 characters | The words to sing. Required unless is_instrumental or lyrics_optimizer is true. Supports structure tags on their own line — [verse], [chorus], [bridge] — which shape the arrangement. |
is_instrumental | No | boolean | false | true, false | Generate music with no vocals. Omit lyrics when this is on. |
lyrics_optimizer | No | boolean | false | true, false | Let the model write the lyrics from your prompt instead of supplying them yourself. |
format | No | string | mp3 | mp3, wav | Container for the generated track. |
sample_rate | No | integer | 44100 | 16000, 24000, 32000, 44100 | Output sample rate in Hz. |
bitrate | No | integer | 256000 | 32000, 64000, 128000, 256000 | Output bitrate in bits per second. |
Notes
The paid tier. Higher throughput, suited to production traffic.
Lyrics, or let the model write them
Exactly one of three things must be true: you supply lyrics, you set lyrics_optimizer to have them written for you, or you set is_instrumental for a track with no vocals. Sending none of the three is rejected.
Instrumental — no vocals, no lyrics needed
{
"prompt": "Warm lo-fi jazz, rainy afternoon, mellow keys, no vocals",
"is_instrumental": true,
"format": "mp3"
}Let the model write the lyrics from your prompt
{
"prompt": "Upbeat synthwave about a late night drive through neon streets",
"lyrics_optimizer": true,
"format": "mp3"
}Structure tags
Inside lyrics, tags on their own line mark sections and shape the arrangement:
[verse]\nStreetlights flicker, the night breeze sighs\n[chorus]\nPushing the wooden door, the aroma spreads\n[bridge]\nA stranger gazes from the cornerExample Request
{
"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop",
"lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes",
"format": "mp3",
"sample_rate": 44100,
"bitrate": 256000
}Example Response
{
"request_id": "minimax-music-3-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-music-3-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — a missing or out-of-range parameter. The message names the field. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or ERROR), then download output.media_url. A track typically takes one to three minutes.
curl 'https://gateway.pixazo.ai/v2/requests/status/minimax-music-3-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "minimax-music-3-0_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-music-3-0",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/audio.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-08-06T09:14:16.102Z",
"completed_at": "2026-08-06T09:16:01.870Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | array | URL of the generated track. |
| output.media_type | string | MIME type of the audio — audio/mpeg for mp3. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Pricing
Billed at $0.15 per generated track, a flat price regardless of the length of the song — a five-minute track costs the same as a one-minute one.
| Request | Cost per track |
|---|---|
| Any track, up to 5 minutes | $0.15 |
Failed requests are not billed.
MiniMax Music 3.0 API Pricing
Generate a complete song — vocals, lyrics and arrangement — from a text prompt. Up to five minutes, 44.1kHz stereo. Free to call. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the audio.
POST https://gateway.pixazo.ai/minimax-music-3-0-fast/v1/text-to-musicMiniMax Music 3.0 Fast (Free) API Documentation (Text to Music)
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax Music 3.0 Fast (Free) API (Text to Music)
Request Code
POST https://gateway.pixazo.ai/minimax-music-3-0-fast/v1/text-to-music
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop",
"lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes",
"format": "mp3",
"sample_rate": 44100,
"bitrate": 256000
}import requests
url = "https://gateway.pixazo.ai/minimax-music-3-0-fast/v1/text-to-music"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop",
"lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes",
"format": "mp3",
"sample_rate": 44100,
"bitrate": 256000
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/minimax-music-3-0-fast/v1/text-to-music", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop",
"lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes",
"format": "mp3",
"sample_rate": 44100,
"bitrate": 256000
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/minimax-music-3-0-fast/v1/text-to-music' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop", "lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes", "format": "mp3", "sample_rate": 44100, "bitrate": 256000}'Output
{
"request_id": "minimax-music-3-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-music-3-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. A track takes a couple of minutes to render, so a webhook is usually the better fit.
| Header | Required | Description |
|---|---|---|
| X-Webhook-URL | To enable | HTTPS URL to receive the Webhook callback. |
| X-Webhook-Mode | No | terminal (default, one callback on COMPLETED/ERROR) or sync (per-poll callbacks). |
Example: enable Webhook
curl -X POST 'https://gateway.pixazo.ai/minimax-music-3-0-fast/v1/text-to-music' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop", "lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes", "format": "mp3", "sample_rate": 44100, "bitrate": 256000}'Callback Payload (success)
{
"request_id": "minimax-music-3-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-music-3-0-fast",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/audio.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-08-06T09:14:16.102Z",
"completed_at": "2026-08-06T09:16:01.870Z"
}Failure callback shape
{
"request_id": "minimax-music-3-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-music-3-0-fast",
"error": "Description of the failure"
}Delivery semantics
- terminal mode: one Webhook callback when the request is COMPLETED or ERROR.
- sync mode: a Webhook callback on each status change.
- Callbacks are idempotent on
request_id— de-duplicate on it. - Respond
200within a few seconds; the Webhook endpoint must be HTTPS.
Request Parameters
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | 1–2,000 characters | Describes the music: genre, mood, instrumentation, setting. e.g. Indie folk, melancholic, introspective, solitary walk, coffee shop. |
lyrics | Conditional | string | — | 1–3,500 characters | The words to sing. Required unless is_instrumental or lyrics_optimizer is true. Supports structure tags on their own line — [verse], [chorus], [bridge] — which shape the arrangement. |
is_instrumental | No | boolean | false | true, false | Generate music with no vocals. Omit lyrics when this is on. |
lyrics_optimizer | No | boolean | false | true, false | Let the model write the lyrics from your prompt instead of supplying them yourself. |
format | No | string | mp3 | mp3, wav | Container for the generated track. |
sample_rate | No | integer | 44100 | 16000, 24000, 32000, 44100 | Output sample rate in Hz. |
bitrate | No | integer | 256000 | 32000, 64000, 128000, 256000 | Output bitrate in bits per second. |
Notes
A free tier with lower throughput, intended for trials and low-volume use. It is rate limited upstream and shared across all callers, so it is not suited to production or bulk generation — use minimax-music-3-0 for that.
Lyrics, or let the model write them
Exactly one of three things must be true: you supply lyrics, you set lyrics_optimizer to have them written for you, or you set is_instrumental for a track with no vocals. Sending none of the three is rejected.
Instrumental — no vocals, no lyrics needed
{
"prompt": "Warm lo-fi jazz, rainy afternoon, mellow keys, no vocals",
"is_instrumental": true,
"format": "mp3"
}Let the model write the lyrics from your prompt
{
"prompt": "Upbeat synthwave about a late night drive through neon streets",
"lyrics_optimizer": true,
"format": "mp3"
}Structure tags
Inside lyrics, tags on their own line mark sections and shape the arrangement:
[verse]\nStreetlights flicker, the night breeze sighs\n[chorus]\nPushing the wooden door, the aroma spreads\n[bridge]\nA stranger gazes from the cornerExample Request
{
"prompt": "Indie folk, melancholic, introspective, longing, solitary walk, coffee shop",
"lyrics": "[verse]\nStreetlights flicker, the night breeze sighs\nShadows stretch as I walk alone\n[chorus]\nPushing the wooden door, the aroma spreads\nIn a familiar corner, a stranger gazes",
"format": "mp3",
"sample_rate": 44100,
"bitrate": 256000
}Example Response
{
"request_id": "minimax-music-3-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-music-3-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
| Content-Type | Yes | application/json |
| Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
| X-Webhook-URL | No | Enable Webhook callbacks (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Bad request — a missing or out-of-range parameter. The message names the field. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or ERROR), then download output.media_url. A track typically takes one to three minutes.
curl 'https://gateway.pixazo.ai/v2/requests/status/minimax-music-3-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "minimax-music-3-0-fast_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-music-3-0-fast",
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/audio.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-08-06T09:14:16.102Z",
"completed_at": "2026-08-06T09:16:01.870Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. |
| status | string | QUEUED, PROCESSING, COMPLETED or ERROR. |
| model_id | string | The model that handled the request. |
| output.media_url | array | URL of the generated track. |
| output.media_type | string | MIME type of the audio — audio/mpeg for mp3. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Pricing
Free. There is no charge for this tier. It is rate limited upstream and that limit is shared across all callers, so requests may be rejected under load — use minimax-music-3-0 for production traffic.
| Request | Cost per track |
|---|---|
| Any track, up to 5 minutes | $0.00 |
Failed requests are not billed.
MiniMax Music 3.0 Fast (Free) API Pricing
MiniMax H3 API Documentation (Text to Video)
MiniMax H3 is MiniMax's multimodal video model, producing native 2K (2560 × 1440) video at 24 fps. Generate a 2K video from a written description alone.
What you get back: a link to a finished MP4 you can download.
How it works, in 3 steps:
- Send your request to the URL below, including your API key.
- You immediately get back a
request_idand a status link. The video is generated in the background, which takes a few minutes. - Open the status link every few seconds until it reads
COMPLETED, then download your video from the link it returns. Prefer not to poll? Add a webhook (see the Webhook section) and we will notify your server the moment it is ready.
Pricing: $0.13 per second of output — a 5 second clip costs $0.65, so duration is the main lever on price.
POST https://gateway.pixazo.ai/minimax-hailuo-h3/v2/text-to-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax H3 API (Text to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3/v2/text-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A lone lighthouse on a cliff at dusk, the beam sweeping through heavy fog as waves break below. Slow push-in. Audio: wind, surf, a distant foghorn."
}import requests
response = requests.post(
"https://gateway.pixazo.ai/minimax-hailuo-h3/v2/text-to-video",
headers={
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
},
json={
"prompt": "A lone lighthouse on a cliff at dusk, the beam sweeping through heavy fog as waves break below. Slow push-in. Audio: wind, surf, a distant foghorn."
},
)
data = response.json()
print(data["request_id"])const response = await fetch(
"https://gateway.pixazo.ai/minimax-hailuo-h3/v2/text-to-video",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
},
body: JSON.stringify({
"prompt": "A lone lighthouse on a cliff at dusk, the beam sweeping through heavy fog as waves break below. Slow push-in. Audio: wind, surf, a distant foghorn."
}),
}
);
const data = await response.json();
console.log(data.request_id);curl -X POST "https://gateway.pixazo.ai/minimax-hailuo-h3/v2/text-to-video" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-d '{
"prompt": "A lone lighthouse on a cliff at dusk, the beam sweeping through heavy fog as waves break below. Slow push-in. Audio: wind, surf, a distant foghorn."
}'Output
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Rather than polling, you can have Pixazo POST the result to your own server. Add the webhook headers to your submit request and we will call you when the job reaches a terminal state.
| Header | Type | Required | Description |
|---|---|---|---|
X-Webhook-URL | string | Yes, to enable the webhook | HTTPS endpoint that receives the callback. |
X-Webhook-Mode | string | No | terminal (default) fires once on COMPLETED or ERROR. sync also fires on intermediate transitions. |
Example: enable the webhook
curl -X POST "https://gateway.pixazo.ai/minimax-hailuo-h3/v2/text-to-video" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-H "X-Webhook-URL: https://your-server.example.com/hooks/pixazo" \
-H "X-Webhook-Mode: terminal" \
-d '{
"prompt": "A lone lighthouse on a cliff at dusk, the beam sweeping through heavy fog as waves break below. Slow push-in. Audio: wind, surf, a distant foghorn."
}'Callback payload
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-31T10:18:51.900Z",
"completed_at": "2026-07-31T10:22:49.000Z"
}Failure callback
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3",
"error": "Description of the error",
"output": null
}Delivery semantics
terminalmode sends exactly one webhook, when the job finishes or fails.syncmode also sends a webhook on intermediate status changes.- Deliveries are idempotent on
request_id— deduplicate on it, since a webhook can be retried. - Respond
200within a few seconds; slow responses are treated as failures and retried. - The webhook URL must be HTTPS.
Request Parameters - MiniMax H3 API (Text to Video)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Up to 7000 characters | What the video should show. Camera moves, lighting and an Audio: clause all influence the result. Required for every mode, including the image and reference ones. |
duration | No | integer | 5 | 4 – 15 | Length of the video in whole seconds. Billing is per second, so this sets the price directly. |
ratio | No | string | 16:9 | 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Aspect ratio of the output. adaptive is not accepted for text to video — with no input media there is nothing to adapt to, so pick a concrete ratio. |
resolution | No | string | 2K | 2K | Output resolution. MiniMax-H3 currently produces 2K (2560 × 1440) only. |
Example Request
{
"prompt": "A lone lighthouse on a cliff at dusk, the beam sweeping through heavy fog as waves break below. Slow push-in. Audio: wind, surf, a distant foghorn.",
"duration": 8,
"ratio": "16:9",
"resolution": "2K"
}Response
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
Content-Type | Yes | Must be application/json. |
Cache-Control | No | Recommended: no-cache. |
X-Webhook-URL | No | Enables webhook delivery of the result. |
X-Webhook-Mode | No | terminal or sync. |
Response Handling
| Code | Meaning | What to do |
|---|---|---|
202 | Accepted and queued. | Read request_id and start polling. |
400 | Invalid request body. | Read the error message and correct the parameter it names. |
401 | Missing or invalid subscription key. | Check the Ocp-Apim-Subscription-Key header. |
402 | Insufficient balance. | Top up your wallet and retry. |
403 | Not permitted for this subscription. | Check your plan covers this model. |
429 | Rate limit exceeded. | Back off and retry. |
500 | Server error. | Retry; if it persists, contact support. |
Error Responses
Submit-time errors come back on the POST itself:
{
"error": "Insufficient Balance"
}{
"error": "Model not found"
}Errors raised while the video is generating are reported on the status endpoint (and via webhook, if configured) with status set to ERROR. A job that fails this way is not charged — the reserved amount is released back to your wallet.
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3",
"error": "Description of the error",
"output": null
}Retrieving Results
Poll the universal status endpoint to check progress and retrieve the finished video.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEYcURL Example
curl "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY"Response (Completed)
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-31T10:18:51.900Z",
"completed_at": "2026-07-31T10:22:49.000Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
request_id | string | Identifier for this job. Use it to poll, and to deduplicate webhooks. |
status | string | One of QUEUED, PROCESSING, COMPLETED, FAILED, ERROR. |
model_id | string | Always minimax-hailuo-h3 for this API. |
error | string or null | Failure reason; null while healthy. |
output.media_url | array of string | Links to the generated MP4 file(s). |
output.media_type | string | video/mp4. |
created_at | string | When the job was accepted (ISO 8601). |
completed_at | string | When the job reached a terminal state (ISO 8601). |
polling_url | string | Returned on submit; the status URL for this job. |
Status Values
| Status | Meaning |
|---|---|
QUEUED | Accepted and waiting to start. |
PROCESSING | The video is being generated. |
COMPLETED | Finished. output.media_url holds the video. |
FAILED | The job could not be completed. |
ERROR | The model reported an error. Not charged. |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
\-> FAILED / ERRORTypical Workflow
- POST your request and read
request_idfrom the 202 response. - Wait roughly 30 seconds, then GET
https://gateway.pixazo.ai/v2/requests/status/{request_id}. - Keep polling every 15 to 30 seconds while the status is QUEUED or PROCESSING. A 5 second clip typically finishes in 3 to 6 minutes.
- On COMPLETED, download the file from
output.media_url[0]. - On FAILED or ERROR, read
error. Nothing is charged for a failed generation.
MiniMax H3 API Pricing
MiniMax H3 API Documentation (Image to Video)
MiniMax H3 is MiniMax's multimodal video model, producing native 2K (2560 × 1440) video at 24 fps. Bring a still image to life. The image you supply becomes the opening frame and the model animates forward from it.
What you get back: a link to a finished MP4 you can download.
How it works, in 3 steps:
- Send your request to the URL below, including your API key.
- You immediately get back a
request_idand a status link. The video is generated in the background, which takes a few minutes. - Open the status link every few seconds until it reads
COMPLETED, then download your video from the link it returns. Prefer not to poll? Add a webhook (see the Webhook section) and we will notify your server the moment it is ready.
Pricing: $0.13 per second of output — a 5 second clip costs $0.65, so duration is the main lever on price.
POST https://gateway.pixazo.ai/minimax-hailuo-h3/v2/image-to-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax H3 API (Image to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3/v2/image-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Pull focus to the people in the background and let steam rise from the bowl.",
"first_frame_image": "https://example.com/opening-frame.png"
}import requests
response = requests.post(
"https://gateway.pixazo.ai/minimax-hailuo-h3/v2/image-to-video",
headers={
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
},
json={
"prompt": "Pull focus to the people in the background and let steam rise from the bowl.",
"first_frame_image": "https://example.com/opening-frame.png"
},
)
data = response.json()
print(data["request_id"])const response = await fetch(
"https://gateway.pixazo.ai/minimax-hailuo-h3/v2/image-to-video",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
},
body: JSON.stringify({
"prompt": "Pull focus to the people in the background and let steam rise from the bowl.",
"first_frame_image": "https://example.com/opening-frame.png"
}),
}
);
const data = await response.json();
console.log(data.request_id);curl -X POST "https://gateway.pixazo.ai/minimax-hailuo-h3/v2/image-to-video" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-d '{
"prompt": "Pull focus to the people in the background and let steam rise from the bowl.",
"first_frame_image": "https://example.com/opening-frame.png"
}'Output
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Rather than polling, you can have Pixazo POST the result to your own server. Add the webhook headers to your submit request and we will call you when the job reaches a terminal state.
| Header | Type | Required | Description |
|---|---|---|---|
X-Webhook-URL | string | Yes, to enable the webhook | HTTPS endpoint that receives the callback. |
X-Webhook-Mode | string | No | terminal (default) fires once on COMPLETED or ERROR. sync also fires on intermediate transitions. |
Example: enable the webhook
curl -X POST "https://gateway.pixazo.ai/minimax-hailuo-h3/v2/image-to-video" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-H "X-Webhook-URL: https://your-server.example.com/hooks/pixazo" \
-H "X-Webhook-Mode: terminal" \
-d '{
"prompt": "Pull focus to the people in the background and let steam rise from the bowl.",
"first_frame_image": "https://example.com/opening-frame.png"
}'Callback payload
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-31T10:18:51.900Z",
"completed_at": "2026-07-31T10:22:49.000Z"
}Failure callback
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3",
"error": "Description of the error",
"output": null
}Delivery semantics
terminalmode sends exactly one webhook, when the job finishes or fails.syncmode also sends a webhook on intermediate status changes.- Deliveries are idempotent on
request_id— deduplicate on it, since a webhook can be retried. - Respond
200within a few seconds; slow responses are treated as failures and retried. - The webhook URL must be HTTPS.
Request Parameters - MiniMax H3 API (Image to Video)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Up to 7000 characters | What the video should show. Camera moves, lighting and an Audio: clause all influence the result. Required for every mode, including the image and reference ones. |
first_frame_image | Yes | string | — | Image URL or base64 data URI | The opening frame. JPG, JPEG, PNG, WEBP, HEIC or HEIF; up to 30 MB; 256 – 5760 px per side; aspect ratio between 0.4 and 2.5. |
duration | No | integer | 5 | 4 – 15 | Length of the video in whole seconds. Billing is per second, so this sets the price directly. |
ratio | No | string | adaptive | adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Aspect ratio of the output. adaptive follows the input media. |
resolution | No | string | 2K | 2K | Output resolution. MiniMax-H3 currently produces 2K (2560 × 1440) only. |
Example Request
{
"prompt": "Pull focus to the people in the background and let steam rise from the bowl.",
"first_frame_image": "https://example.com/opening-frame.png",
"duration": 6,
"ratio": "adaptive",
"resolution": "2K"
}Response
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
Content-Type | Yes | Must be application/json. |
Cache-Control | No | Recommended: no-cache. |
X-Webhook-URL | No | Enables webhook delivery of the result. |
X-Webhook-Mode | No | terminal or sync. |
Response Handling
| Code | Meaning | What to do |
|---|---|---|
202 | Accepted and queued. | Read request_id and start polling. |
400 | Invalid request body. | Read the error message and correct the parameter it names. |
401 | Missing or invalid subscription key. | Check the Ocp-Apim-Subscription-Key header. |
402 | Insufficient balance. | Top up your wallet and retry. |
403 | Not permitted for this subscription. | Check your plan covers this model. |
429 | Rate limit exceeded. | Back off and retry. |
500 | Server error. | Retry; if it persists, contact support. |
Error Responses
Submit-time errors come back on the POST itself:
{
"error": "Insufficient Balance"
}{
"error": "Model not found"
}Errors raised while the video is generating are reported on the status endpoint (and via webhook, if configured) with status set to ERROR. A job that fails this way is not charged — the reserved amount is released back to your wallet.
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3",
"error": "Description of the error",
"output": null
}Retrieving Results
Poll the universal status endpoint to check progress and retrieve the finished video.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEYcURL Example
curl "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY"Response (Completed)
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-31T10:18:51.900Z",
"completed_at": "2026-07-31T10:22:49.000Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
request_id | string | Identifier for this job. Use it to poll, and to deduplicate webhooks. |
status | string | One of QUEUED, PROCESSING, COMPLETED, FAILED, ERROR. |
model_id | string | Always minimax-hailuo-h3 for this API. |
error | string or null | Failure reason; null while healthy. |
output.media_url | array of string | Links to the generated MP4 file(s). |
output.media_type | string | video/mp4. |
created_at | string | When the job was accepted (ISO 8601). |
completed_at | string | When the job reached a terminal state (ISO 8601). |
polling_url | string | Returned on submit; the status URL for this job. |
Status Values
| Status | Meaning |
|---|---|
QUEUED | Accepted and waiting to start. |
PROCESSING | The video is being generated. |
COMPLETED | Finished. output.media_url holds the video. |
FAILED | The job could not be completed. |
ERROR | The model reported an error. Not charged. |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
\-> FAILED / ERRORTypical Workflow
- POST your request and read
request_idfrom the 202 response. - Wait roughly 30 seconds, then GET
https://gateway.pixazo.ai/v2/requests/status/{request_id}. - Keep polling every 15 to 30 seconds while the status is QUEUED or PROCESSING. A 5 second clip typically finishes in 3 to 6 minutes.
- On COMPLETED, download the file from
output.media_url[0]. - On FAILED or ERROR, read
error. Nothing is charged for a failed generation.
MiniMax H3 API Pricing
MiniMax H3 API Documentation (Last Frame to Video)
MiniMax H3 is MiniMax's multimodal video model, producing native 2K (2560 × 1440) video at 24 fps. Generate a video that ends on the image you supply. The model invents everything leading up to it.
What you get back: a link to a finished MP4 you can download.
How it works, in 3 steps:
- Send your request to the URL below, including your API key.
- You immediately get back a
request_idand a status link. The video is generated in the background, which takes a few minutes. - Open the status link every few seconds until it reads
COMPLETED, then download your video from the link it returns. Prefer not to poll? Add a webhook (see the Webhook section) and we will notify your server the moment it is ready.
Pricing: $0.13 per second of output — a 5 second clip costs $0.65, so duration is the main lever on price.
POST https://gateway.pixazo.ai/minimax-hailuo-h3/v2/last-frame-to-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax H3 API (Last Frame to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3/v2/last-frame-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "The camera drifts through the empty street as the storm clears, settling on this view.",
"last_frame_image": "https://example.com/opening-frame.png"
}import requests
response = requests.post(
"https://gateway.pixazo.ai/minimax-hailuo-h3/v2/last-frame-to-video",
headers={
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
},
json={
"prompt": "The camera drifts through the empty street as the storm clears, settling on this view.",
"last_frame_image": "https://example.com/opening-frame.png"
},
)
data = response.json()
print(data["request_id"])const response = await fetch(
"https://gateway.pixazo.ai/minimax-hailuo-h3/v2/last-frame-to-video",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
},
body: JSON.stringify({
"prompt": "The camera drifts through the empty street as the storm clears, settling on this view.",
"last_frame_image": "https://example.com/opening-frame.png"
}),
}
);
const data = await response.json();
console.log(data.request_id);curl -X POST "https://gateway.pixazo.ai/minimax-hailuo-h3/v2/last-frame-to-video" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-d '{
"prompt": "The camera drifts through the empty street as the storm clears, settling on this view.",
"last_frame_image": "https://example.com/opening-frame.png"
}'Output
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Rather than polling, you can have Pixazo POST the result to your own server. Add the webhook headers to your submit request and we will call you when the job reaches a terminal state.
| Header | Type | Required | Description |
|---|---|---|---|
X-Webhook-URL | string | Yes, to enable the webhook | HTTPS endpoint that receives the callback. |
X-Webhook-Mode | string | No | terminal (default) fires once on COMPLETED or ERROR. sync also fires on intermediate transitions. |
Example: enable the webhook
curl -X POST "https://gateway.pixazo.ai/minimax-hailuo-h3/v2/last-frame-to-video" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-H "X-Webhook-URL: https://your-server.example.com/hooks/pixazo" \
-H "X-Webhook-Mode: terminal" \
-d '{
"prompt": "The camera drifts through the empty street as the storm clears, settling on this view.",
"last_frame_image": "https://example.com/opening-frame.png"
}'Callback payload
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-31T10:18:51.900Z",
"completed_at": "2026-07-31T10:22:49.000Z"
}Failure callback
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3",
"error": "Description of the error",
"output": null
}Delivery semantics
terminalmode sends exactly one webhook, when the job finishes or fails.syncmode also sends a webhook on intermediate status changes.- Deliveries are idempotent on
request_id— deduplicate on it, since a webhook can be retried. - Respond
200within a few seconds; slow responses are treated as failures and retried. - The webhook URL must be HTTPS.
Request Parameters - MiniMax H3 API (Last Frame to Video)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Up to 7000 characters | What the video should show. Camera moves, lighting and an Audio: clause all influence the result. Required for every mode, including the image and reference ones. |
last_frame_image | Yes | string | — | Image URL or base64 data URI | The closing frame. JPG, JPEG, PNG, WEBP, HEIC or HEIF; up to 30 MB; 256 – 5760 px per side; aspect ratio between 0.4 and 2.5. |
duration | No | integer | 5 | 4 – 15 | Length of the video in whole seconds. Billing is per second, so this sets the price directly. |
ratio | No | string | adaptive | adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Aspect ratio of the output. adaptive follows the input media. |
resolution | No | string | 2K | 2K | Output resolution. MiniMax-H3 currently produces 2K (2560 × 1440) only. |
Example Request
{
"prompt": "The camera drifts through the empty street as the storm clears, settling on this view.",
"last_frame_image": "https://example.com/opening-frame.png",
"duration": 6,
"ratio": "adaptive",
"resolution": "2K"
}Response
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
Content-Type | Yes | Must be application/json. |
Cache-Control | No | Recommended: no-cache. |
X-Webhook-URL | No | Enables webhook delivery of the result. |
X-Webhook-Mode | No | terminal or sync. |
Response Handling
| Code | Meaning | What to do |
|---|---|---|
202 | Accepted and queued. | Read request_id and start polling. |
400 | Invalid request body. | Read the error message and correct the parameter it names. |
401 | Missing or invalid subscription key. | Check the Ocp-Apim-Subscription-Key header. |
402 | Insufficient balance. | Top up your wallet and retry. |
403 | Not permitted for this subscription. | Check your plan covers this model. |
429 | Rate limit exceeded. | Back off and retry. |
500 | Server error. | Retry; if it persists, contact support. |
Error Responses
Submit-time errors come back on the POST itself:
{
"error": "Insufficient Balance"
}{
"error": "Model not found"
}Errors raised while the video is generating are reported on the status endpoint (and via webhook, if configured) with status set to ERROR. A job that fails this way is not charged — the reserved amount is released back to your wallet.
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3",
"error": "Description of the error",
"output": null
}Retrieving Results
Poll the universal status endpoint to check progress and retrieve the finished video.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEYcURL Example
curl "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY"Response (Completed)
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-31T10:18:51.900Z",
"completed_at": "2026-07-31T10:22:49.000Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
request_id | string | Identifier for this job. Use it to poll, and to deduplicate webhooks. |
status | string | One of QUEUED, PROCESSING, COMPLETED, FAILED, ERROR. |
model_id | string | Always minimax-hailuo-h3 for this API. |
error | string or null | Failure reason; null while healthy. |
output.media_url | array of string | Links to the generated MP4 file(s). |
output.media_type | string | video/mp4. |
created_at | string | When the job was accepted (ISO 8601). |
completed_at | string | When the job reached a terminal state (ISO 8601). |
polling_url | string | Returned on submit; the status URL for this job. |
Status Values
| Status | Meaning |
|---|---|
QUEUED | Accepted and waiting to start. |
PROCESSING | The video is being generated. |
COMPLETED | Finished. output.media_url holds the video. |
FAILED | The job could not be completed. |
ERROR | The model reported an error. Not charged. |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
\-> FAILED / ERRORTypical Workflow
- POST your request and read
request_idfrom the 202 response. - Wait roughly 30 seconds, then GET
https://gateway.pixazo.ai/v2/requests/status/{request_id}. - Keep polling every 15 to 30 seconds while the status is QUEUED or PROCESSING. A 5 second clip typically finishes in 3 to 6 minutes.
- On COMPLETED, download the file from
output.media_url[0]. - On FAILED or ERROR, read
error. Nothing is charged for a failed generation.
MiniMax H3 API Pricing
MiniMax H3 API Documentation (Start and End Frame to Video)
MiniMax H3 is MiniMax's multimodal video model, producing native 2K (2560 × 1440) video at 24 fps. Interpolate between two stills. The first image opens the video, the second closes it, and the model generates the journey between them.
What you get back: a link to a finished MP4 you can download.
How it works, in 3 steps:
- Send your request to the URL below, including your API key.
- You immediately get back a
request_idand a status link. The video is generated in the background, which takes a few minutes. - Open the status link every few seconds until it reads
COMPLETED, then download your video from the link it returns. Prefer not to poll? Add a webhook (see the Webhook section) and we will notify your server the moment it is ready.
Pricing: $0.13 per second of output — a 5 second clip costs $0.65, so duration is the main lever on price.
POST https://gateway.pixazo.ai/minimax-hailuo-h3/v2/start-end-to-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax H3 API (Start and End Frame to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3/v2/start-end-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A slow dolly forward through the doorway as the light shifts from morning to dusk.",
"first_frame_image": "https://example.com/opening-frame.png",
"last_frame_image": "https://example.com/closing-frame.png"
}import requests
response = requests.post(
"https://gateway.pixazo.ai/minimax-hailuo-h3/v2/start-end-to-video",
headers={
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
},
json={
"prompt": "A slow dolly forward through the doorway as the light shifts from morning to dusk.",
"first_frame_image": "https://example.com/opening-frame.png",
"last_frame_image": "https://example.com/closing-frame.png"
},
)
data = response.json()
print(data["request_id"])const response = await fetch(
"https://gateway.pixazo.ai/minimax-hailuo-h3/v2/start-end-to-video",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
},
body: JSON.stringify({
"prompt": "A slow dolly forward through the doorway as the light shifts from morning to dusk.",
"first_frame_image": "https://example.com/opening-frame.png",
"last_frame_image": "https://example.com/closing-frame.png"
}),
}
);
const data = await response.json();
console.log(data.request_id);curl -X POST "https://gateway.pixazo.ai/minimax-hailuo-h3/v2/start-end-to-video" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-d '{
"prompt": "A slow dolly forward through the doorway as the light shifts from morning to dusk.",
"first_frame_image": "https://example.com/opening-frame.png",
"last_frame_image": "https://example.com/closing-frame.png"
}'Output
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Rather than polling, you can have Pixazo POST the result to your own server. Add the webhook headers to your submit request and we will call you when the job reaches a terminal state.
| Header | Type | Required | Description |
|---|---|---|---|
X-Webhook-URL | string | Yes, to enable the webhook | HTTPS endpoint that receives the callback. |
X-Webhook-Mode | string | No | terminal (default) fires once on COMPLETED or ERROR. sync also fires on intermediate transitions. |
Example: enable the webhook
curl -X POST "https://gateway.pixazo.ai/minimax-hailuo-h3/v2/start-end-to-video" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-H "X-Webhook-URL: https://your-server.example.com/hooks/pixazo" \
-H "X-Webhook-Mode: terminal" \
-d '{
"prompt": "A slow dolly forward through the doorway as the light shifts from morning to dusk.",
"first_frame_image": "https://example.com/opening-frame.png",
"last_frame_image": "https://example.com/closing-frame.png"
}'Callback payload
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-31T10:18:51.900Z",
"completed_at": "2026-07-31T10:22:49.000Z"
}Failure callback
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3",
"error": "Description of the error",
"output": null
}Delivery semantics
terminalmode sends exactly one webhook, when the job finishes or fails.syncmode also sends a webhook on intermediate status changes.- Deliveries are idempotent on
request_id— deduplicate on it, since a webhook can be retried. - Respond
200within a few seconds; slow responses are treated as failures and retried. - The webhook URL must be HTTPS.
Request Parameters - MiniMax H3 API (Start and End Frame to Video)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Up to 7000 characters | What the video should show. Camera moves, lighting and an Audio: clause all influence the result. Required for every mode, including the image and reference ones. |
first_frame_image | Yes | string | — | Image URL or base64 data URI | The opening frame. JPG, JPEG, PNG, WEBP, HEIC or HEIF; up to 30 MB; 256 – 5760 px per side; aspect ratio between 0.4 and 2.5. |
last_frame_image | Yes | string | — | Image URL or base64 data URI | The closing frame. Same formats and limits as first_frame_image. |
duration | No | integer | 5 | 4 – 15 | Length of the video in whole seconds. Billing is per second, so this sets the price directly. |
ratio | No | string | adaptive | adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Aspect ratio of the output. adaptive follows the input media. |
resolution | No | string | 2K | 2K | Output resolution. MiniMax-H3 currently produces 2K (2560 × 1440) only. |
Example Request
{
"prompt": "A slow dolly forward through the doorway as the light shifts from morning to dusk.",
"first_frame_image": "https://example.com/opening-frame.png",
"last_frame_image": "https://example.com/closing-frame.png",
"duration": 10,
"ratio": "16:9",
"resolution": "2K"
}Response
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
Content-Type | Yes | Must be application/json. |
Cache-Control | No | Recommended: no-cache. |
X-Webhook-URL | No | Enables webhook delivery of the result. |
X-Webhook-Mode | No | terminal or sync. |
Response Handling
| Code | Meaning | What to do |
|---|---|---|
202 | Accepted and queued. | Read request_id and start polling. |
400 | Invalid request body. | Read the error message and correct the parameter it names. |
401 | Missing or invalid subscription key. | Check the Ocp-Apim-Subscription-Key header. |
402 | Insufficient balance. | Top up your wallet and retry. |
403 | Not permitted for this subscription. | Check your plan covers this model. |
429 | Rate limit exceeded. | Back off and retry. |
500 | Server error. | Retry; if it persists, contact support. |
Error Responses
Submit-time errors come back on the POST itself:
{
"error": "Insufficient Balance"
}{
"error": "Model not found"
}Errors raised while the video is generating are reported on the status endpoint (and via webhook, if configured) with status set to ERROR. A job that fails this way is not charged — the reserved amount is released back to your wallet.
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3",
"error": "Description of the error",
"output": null
}Retrieving Results
Poll the universal status endpoint to check progress and retrieve the finished video.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEYcURL Example
curl "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY"Response (Completed)
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-31T10:18:51.900Z",
"completed_at": "2026-07-31T10:22:49.000Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
request_id | string | Identifier for this job. Use it to poll, and to deduplicate webhooks. |
status | string | One of QUEUED, PROCESSING, COMPLETED, FAILED, ERROR. |
model_id | string | Always minimax-hailuo-h3 for this API. |
error | string or null | Failure reason; null while healthy. |
output.media_url | array of string | Links to the generated MP4 file(s). |
output.media_type | string | video/mp4. |
created_at | string | When the job was accepted (ISO 8601). |
completed_at | string | When the job reached a terminal state (ISO 8601). |
polling_url | string | Returned on submit; the status URL for this job. |
Status Values
| Status | Meaning |
|---|---|
QUEUED | Accepted and waiting to start. |
PROCESSING | The video is being generated. |
COMPLETED | Finished. output.media_url holds the video. |
FAILED | The job could not be completed. |
ERROR | The model reported an error. Not charged. |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
\-> FAILED / ERRORTypical Workflow
- POST your request and read
request_idfrom the 202 response. - Wait roughly 30 seconds, then GET
https://gateway.pixazo.ai/v2/requests/status/{request_id}. - Keep polling every 15 to 30 seconds while the status is QUEUED or PROCESSING. A 5 second clip typically finishes in 3 to 6 minutes.
- On COMPLETED, download the file from
output.media_url[0]. - On FAILED or ERROR, read
error. Nothing is charged for a failed generation.
MiniMax H3 API Pricing
MiniMax H3 API Documentation (Reference to Video)
MiniMax H3 is MiniMax's multimodal video model, producing native 2K (2560 × 1440) video at 24 fps. Carry a subject, a motion style or a voice across into a new video. Supply reference images, video clips, audio clips, or any mix of them.
What you get back: a link to a finished MP4 you can download.
How it works, in 3 steps:
- Send your request to the URL below, including your API key.
- You immediately get back a
request_idand a status link. The video is generated in the background, which takes a few minutes. - Open the status link every few seconds until it reads
COMPLETED, then download your video from the link it returns. Prefer not to poll? Add a webhook (see the Webhook section) and we will notify your server the moment it is ready.
Pricing: $0.13 per second of output — a 5 second clip costs $0.65, so duration is the main lever on price.
POST https://gateway.pixazo.ai/minimax-hailuo-h3/v2/reference-to-videoAuthentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax H3 API (Reference to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3/v2/reference-to-video
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "The same character walks through a rainy street at night, neon reflections underfoot.",
"reference_images": [
"https://example.com/opening-frame.png"
]
}import requests
response = requests.post(
"https://gateway.pixazo.ai/minimax-hailuo-h3/v2/reference-to-video",
headers={
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
},
json={
"prompt": "The same character walks through a rainy street at night, neon reflections underfoot.",
"reference_images": [
"https://example.com/opening-frame.png"
]
},
)
data = response.json()
print(data["request_id"])const response = await fetch(
"https://gateway.pixazo.ai/minimax-hailuo-h3/v2/reference-to-video",
{
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY",
},
body: JSON.stringify({
"prompt": "The same character walks through a rainy street at night, neon reflections underfoot.",
"reference_images": [
"https://example.com/opening-frame.png"
]
}),
}
);
const data = await response.json();
console.log(data.request_id);curl -X POST "https://gateway.pixazo.ai/minimax-hailuo-h3/v2/reference-to-video" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-d '{
"prompt": "The same character walks through a rainy street at night, neon reflections underfoot.",
"reference_images": [
"https://example.com/opening-frame.png"
]
}'Output
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Rather than polling, you can have Pixazo POST the result to your own server. Add the webhook headers to your submit request and we will call you when the job reaches a terminal state.
| Header | Type | Required | Description |
|---|---|---|---|
X-Webhook-URL | string | Yes, to enable the webhook | HTTPS endpoint that receives the callback. |
X-Webhook-Mode | string | No | terminal (default) fires once on COMPLETED or ERROR. sync also fires on intermediate transitions. |
Example: enable the webhook
curl -X POST "https://gateway.pixazo.ai/minimax-hailuo-h3/v2/reference-to-video" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
-H "X-Webhook-URL: https://your-server.example.com/hooks/pixazo" \
-H "X-Webhook-Mode: terminal" \
-d '{
"prompt": "The same character walks through a rainy street at night, neon reflections underfoot.",
"reference_images": [
"https://example.com/opening-frame.png"
]
}'Callback payload
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-31T10:18:51.900Z",
"completed_at": "2026-07-31T10:22:49.000Z"
}Failure callback
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3",
"error": "Description of the error",
"output": null
}Delivery semantics
terminalmode sends exactly one webhook, when the job finishes or fails.syncmode also sends a webhook on intermediate status changes.- Deliveries are idempotent on
request_id— deduplicate on it, since a webhook can be retried. - Respond
200within a few seconds; slow responses are treated as failures and retried. - The webhook URL must be HTTPS.
Request Parameters - MiniMax H3 API (Reference to Video)
Note: At least one of reference_images or reference_videos is required, and no more than 12 reference files in total. Reference generation and frame images are mutually exclusive — do not send first_frame_image or last_frame_image here; use the Image to Video operations for those.
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Up to 7000 characters | What the video should show. Camera moves, lighting and an Audio: clause all influence the result. Required for every mode, including the image and reference ones. |
reference_images | Conditional | array of string | — | Up to 9 items | Images that lock in a character, subject or style. Up to 30 MB each. |
reference_videos | Conditional | array of string | — | Up to 3 items | Clips that supply motion or style. MP4 or MOV, H.264 or H.265 with AAC or MP3 audio; up to 50 MB each; 2 – 15 s each and 15 s in total. |
reference_audios | Conditional | array of string | — | Up to 3 items | Clips that supply voice timbre for lip-synced speech. WAV or MP3; up to 15 MB each; 2 – 15 s each and 15 s in total. Audio on its own is not enough — pair it with a reference image or video. |
duration | No | integer | 5 | 4 – 15 | Length of the video in whole seconds. Billing is per second, so this sets the price directly. |
ratio | No | string | adaptive | adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Aspect ratio of the output. adaptive follows the input media. |
resolution | No | string | 2K | 2K | Output resolution. MiniMax-H3 currently produces 2K (2560 × 1440) only. |
Example Request
{
"prompt": "The same character walks through a rainy street at night, neon reflections underfoot. Voice timbre follows the reference audio.",
"reference_images": [
"https://example.com/opening-frame.png",
"https://example.com/closing-frame.png"
],
"reference_audios": [
"https://example.com/voice.mp3"
],
"duration": 8,
"ratio": "adaptive",
"resolution": "2K"
}Response
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Required | Description |
|---|---|---|
Ocp-Apim-Subscription-Key | Yes | Your API subscription key. |
Content-Type | Yes | Must be application/json. |
Cache-Control | No | Recommended: no-cache. |
X-Webhook-URL | No | Enables webhook delivery of the result. |
X-Webhook-Mode | No | terminal or sync. |
Response Handling
| Code | Meaning | What to do |
|---|---|---|
202 | Accepted and queued. | Read request_id and start polling. |
400 | Invalid request body. | Read the error message and correct the parameter it names. |
401 | Missing or invalid subscription key. | Check the Ocp-Apim-Subscription-Key header. |
402 | Insufficient balance. | Top up your wallet and retry. |
403 | Not permitted for this subscription. | Check your plan covers this model. |
429 | Rate limit exceeded. | Back off and retry. |
500 | Server error. | Retry; if it persists, contact support. |
Error Responses
Submit-time errors come back on the POST itself:
{
"error": "Insufficient Balance"
}{
"error": "Model not found"
}Errors raised while the video is generating are reported on the status endpoint (and via webhook, if configured) with status set to ERROR. A job that fails this way is not charged — the reserved amount is released back to your wallet.
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3",
"error": "Description of the error",
"output": null
}Retrieving Results
Poll the universal status endpoint to check progress and retrieve the finished video.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEYcURL Example
curl "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY"Response (Completed)
{
"request_id": "minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-07-31T10:18:51.900Z",
"completed_at": "2026-07-31T10:22:49.000Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
request_id | string | Identifier for this job. Use it to poll, and to deduplicate webhooks. |
status | string | One of QUEUED, PROCESSING, COMPLETED, FAILED, ERROR. |
model_id | string | Always minimax-hailuo-h3 for this API. |
error | string or null | Failure reason; null while healthy. |
output.media_url | array of string | Links to the generated MP4 file(s). |
output.media_type | string | video/mp4. |
created_at | string | When the job was accepted (ISO 8601). |
completed_at | string | When the job reached a terminal state (ISO 8601). |
polling_url | string | Returned on submit; the status URL for this job. |
Status Values
| Status | Meaning |
|---|---|
QUEUED | Accepted and waiting to start. |
PROCESSING | The video is being generated. |
COMPLETED | Finished. output.media_url holds the video. |
FAILED | The job could not be completed. |
ERROR | The model reported an error. Not charged. |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
\-> FAILED / ERRORTypical Workflow
- POST your request and read
request_idfrom the 202 response. - Wait roughly 30 seconds, then GET
https://gateway.pixazo.ai/v2/requests/status/{request_id}. - Keep polling every 15 to 30 seconds while the status is QUEUED or PROCESSING. A 5 second clip typically finishes in 3 to 6 minutes.
- On COMPLETED, download the file from
output.media_url[0]. - On FAILED or ERROR, read
error. Nothing is charged for a failed generation.
MiniMax H3 API Pricing
MiniMax Speech 2.8 API HD Documentation (Text to Speech)
https://gateway.pixazo.ai/minimax-speech-2-8-hd/v1/minimax-speech-2-8-hd-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax Speech 2.8 API HD (Text to Speech)
Request Code
POST /minimax-speech-2-8-hd-request HTTP/1.1
Host: gateway.pixazo.ai
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "The research findings indicate a significant correlation between sleep quality and cognitive performance in adults over fifty.",
"output_format": "hex"
}
import requests
url = "https://gateway.pixazo.ai/minimax-speech-2-8-hd/v1/minimax-speech-2-8-hd-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "The research findings indicate a significant correlation between sleep quality and cognitive performance in adults over fifty.",
"output_format": "hex"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
fetch("https://gateway.pixazo.ai/minimax-speech-2-8-hd/v1/minimax-speech-2-8-hd-request", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
prompt: "The research findings indicate a significant correlation between sleep quality and cognitive performance in adults over fifty.",
output_format: "hex"
})
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
curl -X POST "https://gateway.pixazo.ai/minimax-speech-2-8-hd/v1/minimax-speech-2-8-hd-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "The research findings indicate a significant correlation between sleep quality and cognitive performance in adults over fifty.",
"output_format": "hex"
}'
Output
{
"request_id": "minimax-speech-2-8-hd_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "/v2/requests/status/minimax-speech-2-8-hd_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "minimax-speech-2-8-hd_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-speech-2-8-hd",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-speech-2-8-hd_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.wav"
],
"media_type": "audio/wav"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "minimax-speech-2-8-hd_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-speech-2-8-hd",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - MiniMax Speech 2.8 API HD (Text to Speech)
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Yes | — | Text to convert to speech. Must be valid UTF-8. Use <#x#> for pauses (x = 0.01-99.99 seconds). Supports interjection tags such as (laughs), (sighs), (coughs), (clears throat), (gasps), (sniffs), (groans), (yawns). |
| voice_setting | object | No | — | Voice configuration. Nested fields: voice_id (string, default "Wise_Woman"); speed (float, 0.5-2.0, default 1); vol (float, 0-10, default 1); pitch (integer, -12 to 12, default 0); emotion (one of happy, sad, angry, fearful, disgusted, surprised, neutral); english_normalization (boolean) - improves number reading, with a slight latency increase. |
| audio_setting | object | No | — | Audio output configuration. Nested fields: sample_rate (one of 8000, 16000, 22050, 24000, 32000, 44100; default 32000); bitrate (one of 32000, 64000, 128000, 256000; default 128000); format (one of mp3, pcm, flac; default mp3); channel (1 = mono, 2 = stereo; default 1). |
| language_boost | string | No | — | Enhance recognition of a specific language or dialect. One of: Chinese, Chinese,Yue, English, Arabic, Russian, Spanish, French, Portuguese, German, Turkish, Dutch, Ukrainian, Vietnamese, Indonesian, Japanese, Italian, Korean, Thai, Polish, Romanian, Greek, Czech, Finnish, Hindi, Bulgarian, Danish, Hebrew, Malay, Slovak, Swedish, Croatian, Hungarian, Norwegian, Slovenian, Catalan, Nynorsk, Afrikaans, auto. |
| output_format | string | No | hex | Format of the returned audio content (non-streaming only). Allowed: "hex" (hex-encoded audio, default) or "url" (hosted file URL). |
| pronunciation_dict | object | No | — | Custom pronunciation dictionary. Nested field: tone_list (array of strings) - replacements in the format ['text/(pronunciation)', ...]. |
| normalization_setting | object | No | — | Loudness normalization settings. Nested fields: enabled (boolean, default true); target_loudness (float, default -18 LUFS); target_range (float, default 8 LU); target_peak (float, default -0.5 dBTP). |
| voice_modify | object | No | — | Voice modification. Nested fields: pitch (integer, -100 to 100); intensity (integer, -100 to 100); timbre (integer, -100 to 100). |
Minimum Request
{
"prompt": "The research findings indicate a significant correlation between sleep quality and cognitive performance in adults over fifty.",
"output_format": "hex"
}
Full Request (all options)
{
"prompt": "The research findings indicate a significant correlation between sleep quality and cognitive performance in adults over fifty.",
"output_format": "hex"
}
Response
{
"request_id": "minimax-speech-2-8-hd_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "/v2/requests/status/minimax-speech-2-8-hd_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for MiniMax Speech 2.8 HD generate request.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'minimax-speech-2-8-hd' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "minimax-speech-2-8-hd_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-speech-2-8-hd",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET /v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"/v2/requests/status/minimax-speech-2-8-hd_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "minimax-speech-2-8-hd_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-speech-2-8-hd",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-speech-2-8-hd_019dxxxx-xxxx/output.ext"
],
"media_type": "application/octet-stream"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
MiniMax Speech 2.8 HD API Pricing
MiniMax Speech 2.8 API Turbo Documentation (Text to Speech)
https://gateway.pixazo.ai/minimax-speech-2-8-turbo/v1/minimax-speech-2-8-turbo-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax Speech 2.8 API Turbo (Text to Speech)
Request Code
POST https://gateway.pixazo.ai/minimax-speech-2-8-turbo/v1/minimax-speech-2-8-turbo-request
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Good morning everyone and welcome to the annual technology summit. We have an exciting lineup of speakers for you today.",
"output_format": "hex",
"voice_setting": {
"voice_id": "Wise_Woman",
"speed": 1,
"vol": 1
}
}
import requests
url = "https://gateway.pixazo.ai/minimax-speech-2-8-turbo/v1/minimax-speech-2-8-turbo-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Good morning everyone and welcome to the annual technology summit. We have an exciting lineup of speakers for you today.",
"output_format": "hex",
"voice_setting": {
"voice_id": "Wise_Woman",
"speed": 1,
"vol": 1
}
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/minimax-speech-2-8-turbo/v1/minimax-speech-2-8-turbo-request';
const data = {
prompt: "Good morning everyone and welcome to the annual technology summit. We have an exciting lineup of speakers for you today.",
output_format: "hex",
voice_setting: {
voice_id: "Wise_Woman",
speed: 1,
vol: 1
}
};
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/minimax-speech-2-8-turbo/v1/minimax-speech-2-8-turbo-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "Good morning everyone and welcome to the annual technology summit. We have an exciting lineup of speakers for you today.",
"output_format": "hex",
"voice_setting": {
"voice_id": "Wise_Woman",
"speed": 1,
"vol": 1
}
}'
Output
{
"request_id": "minimax-speech-2-8-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-speech-2-8-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "minimax-speech-2-8-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-speech-2-8-turbo",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-speech-2-8-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.wav"
],
"media_type": "audio/wav"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "minimax-speech-2-8-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-speech-2-8-turbo",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - MiniMax Speech 2.8 API Turbo (Text to Speech)
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Yes | — | The text to be converted into speech. Must be a valid string containing natural language. |
| output_format | string | Yes | — | Output format of the generated audio. Currently supports only "hex" (hexadecimal representation of audio bytes). |
| voice_setting.voice_id | string | Yes | — | Identifier of the voice to use. Example: "Wise_Woman". Available voices are defined by the service. |
| voice_setting.speed | number | No | 1 | Speed multiplier for speech generation. Values range from 0.5 (half speed) to 2.0 (double speed). |
| voice_setting.vol | number | No | 1 | Volume multiplier for speech output. Values range from 0.0 (muted) to 2.0 (double volume). |
Minimum Request
{
"prompt": "Good morning everyone and welcome to the annual technology summit. We have an exciting lineup of speakers for you today.",
"output_format": "hex",
"voice_setting": {
"voice_id": "Wise_Woman"
}
}
Full Request (all options)
{
"prompt": "Good morning everyone and welcome to the annual technology summit. We have an exciting lineup of speakers for you today.",
"output_format": "hex",
"voice_setting": {
"voice_id": "Wise_Woman",
"speed": 1,
"vol": 1
}
}
Response
{
"request_id": "minimax-speech-2-8-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-speech-2-8-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for MiniMax Speech 2.8 Turbo generate request.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'minimax-speech-2-8-turbo' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "minimax-speech-2-8-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-speech-2-8-turbo",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/minimax-speech-2-8-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "minimax-speech-2-8-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-speech-2-8-turbo",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-speech-2-8-turbo_019dxxxx-xxxx/output.ext"
],
"media_type": "application/octet-stream"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
MiniMax Speech 2.8 Turbo API Pricing
MiniMax Voice Design v1 API Documentation (Text to Speech)
https://gateway.pixazo.ai/minimax-voice-design-api-363/v1/minimax-voice-design-api-request
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax Voice Design v1 API (Text to Speech)
Request Code
POST /minimax-voice-design-api-request HTTP/1.1
Host: gateway.pixazo.ai
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Bubbly and excitable female pop star interviewee, youthful, slightly breathless, and very enthusiastic",
"preview_text": "Oh my gosh, hi. It iss like so amazing to be here. This new endpoint just dropped on pixazo and the results have been like totally incredible. Use it now, It is gonna be like epic!"
}
import requests
url = "https://gateway.pixazo.ai/minimax-voice-design-api-363/v1/minimax-voice-design-api-request"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Bubbly and excitable female pop star interviewee, youthful, slightly breathless, and very enthusiastic",
"preview_text": "Oh my gosh, hi. It iss like so amazing to be here. This new endpoint just dropped on pixazo and the results have been like totally incredible. Use it now, It is gonna be like epic!"
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/minimax-voice-design-api-363/v1/minimax-voice-design-api-request';
const data = {
prompt: "Bubbly and excitable female pop star interviewee, youthful, slightly breathless, and very enthusiastic",
preview_text: "Oh my gosh, hi. It iss like so amazing to be here. This new endpoint just dropped on pixazo and the results have been like totally incredible. Use it now, It is gonna be like epic!"
};
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/minimax-voice-design-api-363/v1/minimax-voice-design-api-request" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "Bubbly and excitable female pop star interviewee, youthful, slightly breathless, and very enthusiastic",
"preview_text": "OOh my gosh, hi. It iss like so amazing to be here. This new endpoint just dropped on pixazo and the results have been like totally incredible. Use it now, It is gonna be like epic!"
}'
Output
{
"request_id": "minimax-voice-design-api-363_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "/v2/requests/status/minimax-voice-design-api-363_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "minimax-voice-design-api-363_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-voice-design-api-363",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-voice-design-api-363_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.wav"
],
"media_type": "audio/wav"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "minimax-voice-design-api-363_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-voice-design-api-363",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - MiniMax Voice Design v1 API (Text to Speech)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | Up to 2000 characters | A natural language description of the desired voice personality, tone, and characteristics (e.g., age, gender, emotion, style). This defines the unique vocal identity to be synthesized. |
| preview_text | Yes | string | — | Up to 500 characters | The sample text that will be spoken by the generated voice. Must be a natural, expressive phrase that demonstrates the intended vocal style. |
Minimum Request
{
"prompt": "Bubbly and excitable female pop star interviewee, youthful, slightly breathless, and very enthusiastic",
"preview_text": "Oh my gosh, hi. It's like so amazing to be here."
}
Full Request (all options)
{
"prompt": "Bubbly and excitable female pop star interviewee, youthful, slightly breathless, and very enthusiastic",
"preview_text": "Oh my gosh, hi. It iss like so amazing to be here. This new endpoint just dropped on pixazo and the results have been like totally incredible. Use it now, It is gonna be like epic!"
}
Response
{
"request_id": "minimax-voice-design-api-363_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "/v2/requests/status/minimax-voice-design-api-363_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | Your API subscription key |
Response Handling
Common status codes for MiniMax Voice Design API generate request.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 403 | Forbidden |
| 404 | Not Found |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'minimax-voice-design-api-363' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "minimax-voice-design-api-363_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-voice-design-api-363",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET /v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"/v2/requests/status/minimax-voice-design-api-363_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "minimax-voice-design-api-363_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-voice-design-api-363",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-voice-design-api-363_019dxxxx-xxxx/output.ext"
],
"media_type": "application/octet-stream"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
MiniMax Voice Design v1 API Pricing
MiniMax Hailuo 2.3 API Documentation (Image to Video)
https://gateway.pixazo.ai/minimax-hailuo-ai/v1/imageToVideo
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax Hailuo 2.3 API (Image to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-ai/v1/imageToVideo
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "Man walked into winter cave with polar bear",
"first_frame_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/manwithbear.jpg",
"duration": 6,
"resolution": "768P",
"prompt_optimizer": true,
"fast_pretreatment": false,
"aigc_watermark": false
}
import requests
url = "https://gateway.pixazo.ai/minimax-hailuo-ai/v1/imageToVideo"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "Man walked into winter cave with polar bear",
"first_frame_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/manwithbear.jpg",
"duration": 6,
"resolution": "768P",
"prompt_optimizer": true,
"fast_pretreatment": false,
"aigc_watermark": false
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = "https://gateway.pixazo.ai/minimax-hailuo-ai/v1/imageToVideo";
const headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
};
const data = {
"prompt": "Man walked into winter cave with polar bear",
"first_frame_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/manwithbear.jpg",
"duration": 6,
"resolution": "768P",
"prompt_optimizer": true,
"fast_pretreatment": false,
"aigc_watermark": false
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error("Error:", error));
curl -v -X POST "https://gateway.pixazo.ai/minimax-hailuo-ai/v1/imageToVideo" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "Man walked into winter cave with polar bear",
"first_frame_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/manwithbear.jpg",
"duration": 6,
"resolution": "768P",
"prompt_optimizer": true,
"fast_pretreatment": false,
"aigc_watermark": false
}'
Output
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-ai",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-ai",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - MiniMax Hailuo 2.3 API (Image to Video)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | No | string | — | — | Optional text description of the video, up to 2000 characters. Supports 15+ camera-movement instructions using [command] syntax (e.g. [Truck left], [Pan right], [Push in]) for precise camera control. |
| first_frame_image | Yes | string | — | — | Image URL to use as the starting frame. Supports public URLs or Base64 encoded Data URLs. Image requirements: JPG/JPEG/PNG/WebP, <20MB, short side >300px, aspect ratio 2:5 to 5:2. |
| prompt_optimizer | No | boolean | true | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. |
| fast_pretreatment | No | boolean | false | true, false | Reduces prompt-optimization time when prompt_optimizer is enabled. Supported by MiniMax-Hailuo-2.3. |
| duration | No | integer | 6 | 6, 10 | Video length in seconds. 768P supports 6 or 10 seconds; 1080P supports 6 seconds only. |
| resolution | No | string | 768P | 768P, 1080P | Output video resolution. 768P supports 6- or 10-second videos; 1080P supports 6-second videos only. |
| callback_url | No | string | — | — | URL to receive task status update notifications. |
| aigc_watermark | No | boolean | false | true, false | Default: false. Whether to add AIGC watermark to the generated video. |
Content Item Types & Limits
| Type | Max | Format / Size | Description |
|---|---|---|---|
| image | 1 | JPG, PNG, WEBP · < 20 MB | First-frame image; short side > 300px. |
Example Request
{
"prompt": "Man walked into winter cave with polar bear",
"first_frame_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/manwithbear.jpg",
"duration": 6,
"resolution": "768P",
"prompt_optimizer": true,
"fast_pretreatment": false,
"aigc_watermark": false
}
Response
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'minimax-hailuo-ai' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-ai",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-ai",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-ai_019dxxxx-xxxx/output.ext"
],
"media_type": "application/octet-stream"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
MiniMax Hailuo 2.3 API Pricing
| Resolution | Duration | Price (USD) |
|---|---|---|
| All Resolution | 6s | $0.35 |
| All Resolution | 10s | $0.60 |
MiniMax Hailuo 2.3 API Documentation (Text to Video)
https://gateway.pixazo.ai/minimax-hailuo-ai/v1/generate
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax Hailuo 2.3 API (Text to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-ai/v1/generate
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "A high-energy scene of a large, muscular bear leaping gracefully into a fast-flowing river to catch a fish. The video starts with the bear crouching by the riverbank, then transitions to it leaping mid-air, with water splashing dramatically around it. The camera follows the bear's movement, capturing the intensity and speed of the jump. The bear's paws extend toward the fish, which is darting through the clear water, as the background shows a lush, green forest and distant mountains. The scene is full of natural sounds — the rush of water, splashes, and the bear's powerful movement. Light filters through the trees, creating a dramatic, cinematic atmosphere.",
"duration": 6,
"resolution": "768P",
"prompt_optimizer": true,
"fast_pretreatment": false,
"aigc_watermark": false
}
import requests
url = "https://gateway.pixazo.ai/minimax-hailuo-ai/v1/generate"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "A high-energy scene of a large, muscular bear leaping gracefully into a fast-flowing river to catch a fish. The video starts with the bear crouching by the riverbank, then transitions to it leaping mid-air, with water splashing dramatically around it. The camera follows the bear's movement, capturing the intensity and speed of the jump. The bear's paws extend toward the fish, which is darting through the clear water, as the background shows a lush, green forest and distant mountains. The scene is full of natural sounds — the rush of water, splashes, and the bear's powerful movement. Light filters through the trees, creating a dramatic, cinematic atmosphere.",
"duration": 6,
"resolution": "768P",
"prompt_optimizer": True,
"fast_pretreatment": False,
"aigc_watermark": False
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/minimax-hailuo-ai/v1/generate';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
prompt: 'A high-energy scene of a large, muscular bear leaping gracefully into a fast-flowing river to catch a fish. The video starts with the bear crouching by the riverbank, then transitions to it leaping mid-air, with water splashing dramatically around it. The camera follows the bear\'s movement, capturing the intensity and speed of the jump. The bear\'s paws extend toward the fish, which is darting through the clear water, as the background shows a lush, green forest and distant mountains. The scene is full of natural sounds — the rush of water, splashes, and the bear\'s powerful movement. Light filters through the trees, creating a dramatic, cinematic atmosphere.',
duration: 6,
resolution: '768P',
prompt_optimizer: true,
fast_pretreatment: false,
aigc_watermark: false
};
fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -v -X POST "https://gateway.pixazo.ai/minimax-hailuo-ai/v1/generate" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "A high-energy scene of a large, muscular bear leaping gracefully into a fast-flowing river to catch a fish. The video starts with the bear crouching by the riverbank, then transitions to it leaping mid-air, with water splashing dramatically around it. The camera follows the bear\'s movement, capturing the intensity and speed of the jump. The bear\'s paws extend toward the fish, which is darting through the clear water, as the background shows a lush, green forest and distant mountains. The scene is full of natural sounds — the rush of water, splashes, and the bear\'s powerful movement. Light filters through the trees, creating a dramatic, cinematic atmosphere.",
"duration": 6,
"resolution": "768P",
"prompt_optimizer": true,
"fast_pretreatment": false,
"aigc_watermark": false
}'
Output
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-ai",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-ai",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - MiniMax Hailuo 2.3 API (Text to Video)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | — | Text description of the video, up to 2000 characters. Supports 15+ camera-movement instructions using [command] syntax (e.g. [Truck left], [Pan right], [Push in]) for precise camera control. |
| duration | No | integer | 6 | 6, 10 | Video length in seconds. 768P supports 6 or 10 seconds; 1080P supports 6 seconds only. |
| resolution | No | string | 768P | 768P, 1080P | Output video resolution. 768P supports 6- or 10-second videos; 1080P supports 6-second videos only. |
| prompt_optimizer | No | boolean | true | true, false | Automatically rewrites and enriches your prompt with extra detail before generation to improve results. Set to false for more precise control. |
| fast_pretreatment | No | boolean | false | true, false | Reduces prompt-optimization time when prompt_optimizer is enabled. Supported by MiniMax-Hailuo-2.3. |
| callback_url | No | string | — | — | URL to receive callback notifications when video is ready. |
| aigc_watermark | No | boolean | false | true, false | Whether to add an AIGC watermark to the generated video. |
Example Request
{
"prompt": "A high-energy scene of a large, muscular bear leaping gracefully into a fast-flowing river to catch a fish. The video starts with the bear crouching by the riverbank, then transitions to it leaping mid-air, with water splashing dramatically around it. The camera follows the bear's movement, capturing the intensity and speed of the jump. The bear's paws extend toward the fish, which is darting through the clear water, as the background shows a lush, green forest and distant mountains. The scene is full of natural sounds — the rush of water, splashes, and the bear's powerful movement. Light filters through the trees, creating a dramatic, cinematic atmosphere.",
"duration": 6,
"resolution": "768P",
"prompt_optimizer": true,
"fast_pretreatment": false,
"aigc_watermark": false
}
Response
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance."
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'minimax-hailuo-ai' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-ai",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "minimax-hailuo-ai_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-ai",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-ai_019dxxxx-xxxx/output.ext"
],
"media_type": "application/octet-stream"
},
"created_at": "2026-03-31T10:00:00.000Z",
"updated_at": "2026-03-31T10:00:15.000Z",
"completed_at": "2026-03-31T10:00:15.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type of the output |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
MiniMax Hailuo 2.3 API Pricing
| Resolution | Duration | Price (USD) |
|---|---|---|
| All Resolution | 6s | $0.35 |
| All Resolution | 10s | $0.60 |
MiniMax Music 2.6 API Documentation (Text to Music)
https://gateway.pixazo.ai/minimax-music-generation-2-6/v1/generate
Authentication
All requests require an API key passed via header.
| Header | Type | Required | Description |
|---|---|---|---|
| Ocp-Apim-Subscription-Key | string | Yes | Your API subscription key |
MiniMax Music 2.6 API (Text to Music)
Request Code
POST https://gateway.pixazo.ai/minimax-music-generation-2-6/v1/generate
Content-Type: application/json
Cache-Control: no-cache
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"prompt": "calm lo-fi hip hop with mellow piano",
"is_instrumental": true
}
import requests
url = "https://gateway.pixazo.ai/minimax-music-generation-2-6/v1/generate"
headers = {
"Content-Type": "application/json",
"Cache-Control": "no-cache",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"prompt": "calm lo-fi hip hop with mellow piano",
"is_instrumental": True
}
response = requests.post(url, json=data, headers=headers)
print(response.json())
const url = 'https://gateway.pixazo.ai/minimax-music-generation-2-6/v1/generate';
const headers = {
'Content-Type': 'application/json',
'Cache-Control': 'no-cache',
'Ocp-Apim-Subscription-Key': 'YOUR_SUBSCRIPTION_KEY'
};
const data = {
prompt: 'calm lo-fi hip hop with mellow piano',
is_instrumental: true
};
fetch(url, {
method: 'POST',
headers: headers,
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
curl -X POST "https://gateway.pixazo.ai/minimax-music-generation-2-6/v1/generate" \
-H "Content-Type: application/json" \
-H "Cache-Control: no-cache" \
-H "Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY" \
--data-raw '{
"prompt": "calm lo-fi hip hop with mellow piano",
"is_instrumental": true
}'
Output
{
"request_id": "minimax-music-generation-2-6_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-music-generation-2-6_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Webhook (Optional)
Add the X-Webhook-URL header to your submit request to receive a POST callback when the job completes — no polling required.
Using curl? These are HTTP request headers — pass each with -H, e.g. -H "X-Webhook-URL: https://your-server.com/webhook/callback". Do not paste them as bare lines, and end every line of a multi-line command with \.
Webhook Headers
| Header | Required | Default | Description |
|---|---|---|---|
X-Webhook-URL | Yes (to enable) | — | HTTPS endpoint on your server that will receive the POST callback. Must respond 2xx within a few seconds (process async if needed). |
X-Webhook-Mode | No | terminal | terminal — fires once at the final status (COMPLETED/FAILED/ERROR). sync — fires on every poll cycle plus the terminal event, and caps the queue’s polling delay at 15s for tighter progress updates. |
Example: enable webhook
X-Webhook-URL: https://your-server.com/webhook/callback
X-Webhook-Mode: terminal
Callback Payload
Your endpoint receives a POST application/json with the same shape as the GET /v2/requests/status/{request_id} response. Example terminal callback (mode terminal):
{
"request_id": "minimax-music-generation-2-6_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-music-generation-2-6",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-music-generation-2-6_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-05-22T13:17:32.110Z",
"updated_at": "2026-05-22 13:19:23",
"completed_at": "2026-05-22 13:19:23"
}
Failure callback shape
{
"request_id": "minimax-music-generation-2-6_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-music-generation-2-6",
"error": "Description of the error",
"output": null,
"created_at": "...",
"updated_at": "...",
"completed_at": "..."
}
Delivery semantics
- terminal mode (default) — exactly one
POSTwhen the request reaches a terminal status. No callback duringPROCESSING. - sync mode —
POSTon every status poll (with delay capped at ~15s) plus a finalPOSTat terminal status. Use when you want progress updates. - Idempotency — use
request_idas your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates. - Response — respond
200 OKwithin a few seconds. The queue does not block on slow handlers, but persistent failures may stop further deliveries. - HTTPS required — plain
http://URLs are rejected.
Request Parameters - MiniMax Music 2.6 API (Text to Music)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
| prompt | Yes | string | — | 10–2000 characters | Description of the desired music style, mood, genre, and scenario. Drives the composition. |
| lyrics | No | string | — | Up to 3500 characters | Song lyrics for vocal tracks. Use \n to separate lines, with optional structure tags such as [Intro], [Verse], [Chorus], [Bridge], [Outro]. Required for vocal output unless lyrics_optimizer is enabled; ignored when is_instrumental is true. |
| sample_rate | No | integer | 44100 | 16000, 24000, 32000, 44100 | Audio sample rate in Hz. Higher = higher fidelity, larger files. |
| bitrate | No | integer | 256000 | 32000, 64000, 128000, 256000 | Audio bitrate in bits/sec. Higher = better quality, larger files. |
| format | No | string | mp3 | mp3, wav, pcm | Output audio container/codec. |
| lyrics_optimizer | No | boolean | false | true, false | When true and lyrics is empty, the model auto-generates lyrics from the prompt. Ignored if lyrics is provided. |
| is_instrumental | No | boolean | false | true, false | When true, generates instrumental music (no vocals) and lyrics is ignored. |
Example Request
{
"prompt": "Upbeat synthwave with retro arcade vibes, 120 BPM, layered analog synths",
"lyrics": "[Verse 1]\nNeon lights are calling out\nDigital dreams without a doubt\n[Chorus]\nWe are alive in the night\nDancing in electric light",
"sample_rate": 44100,
"bitrate": 256000,
"format": "mp3",
"lyrics_optimizer": false,
"is_instrumental": false
}
Response
{
"request_id": "minimax-music-generation-2-6_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-music-generation-2-6_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
Request Headers
| Header | Value |
|---|---|
| Content-Type | application/json |
| Cache-Control | no-cache |
| Ocp-Apim-Subscription-Key | YOUR_SUBSCRIPTION_KEY |
Response Handling
Common status codes.
| Code | Meaning |
|---|---|
| 202 | Accepted — Request queued |
| 400 | Bad Request |
| 401 | Unauthorized |
| 402 | Insufficient Balance |
| 403 | Forbidden |
| 429 | Too Many Requests |
| 500 | Internal Server Error |
Error Responses
Queue system errors and model validation errors.
Queue System Errors
// 402 — Insufficient balance
{
"error": "Insufficient Balance",
"message": "Your wallet does not have enough balance. Required: $0.08"
}
// 400 — Model not found
{
"error": "Model not found",
"message": "Model 'minimax-music-generation-2-6' not found or is disabled"
}
Error via Status/Webhook
{
"request_id": "minimax-music-generation-2-6_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-music-generation-2-6",
"error": "Description of the error",
"output": null
}
Retrieving Results
Poll the universal status endpoint to check progress and retrieve results.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_API_KEY
cURL Example
curl -H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
"https://gateway.pixazo.ai/v2/requests/status/minimax-music-generation-2-6_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Response (Completed)
{
"request_id": "minimax-music-generation-2-6_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-music-generation-2-6",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-music-generation-2-6_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp3"
],
"media_type": "audio/mpeg"
},
"created_at": "2026-04-04T06:15:23.699Z",
"updated_at": "2026-04-04T06:16:20.000Z",
"completed_at": "2026-04-04T06:16:20.000Z"
}
Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR |
| model_id | string | Model that processed the request |
| error | string|null | Error message if failed |
| output.media_url | array | URLs to generated media (R2 CDN) |
| output.media_type | string | MIME type (audio/mpeg) |
| created_at | string | When request was created |
| completed_at | string|null | When request completed |
| polling_url | string | Status URL (initial response only) |
Status Values
| Status | Description |
|---|---|
| QUEUED | Request accepted, waiting to be processed |
| PROCESSING | Being processed by the model |
| COMPLETED | Done — output contains the result |
| FAILED | Failed — check error field |
| ERROR | System error — not charged |
Status Flow
QUEUED → PROCESSING → COMPLETED
→ FAILED
→ ERROR
Typical Workflow
- Send a generate request to the API endpoint
- Save the
request_idfrom the response - Poll every 5-10 seconds:
GET /v2/requests/status/{request_id} - When
statusis"COMPLETED", download fromoutput.media_url
Tip: Use X-Webhook-URL header to get a callback instead of polling.
MiniMax Music 2.6 API Pricing
⚡ Performance
Live usage measured on Pixazo's gateway, split by model version. Generation time is how long a generation takes end-to-end (lower is better). Success rate is the percent of generations that complete (higher is better).
〰 Uptime
Percent of generations that succeeded over the selected period, per model version.