Minimax H3 Max API, Minimax Music 3.0 API (Free), Minimax Speech 2.8 API (HD & Turbo), Minimax Voice Design API, Minimax Hailuo API: Pricing and Documentation
by MiniMax
MiniMax offers a comprehensive suite of AI generation capabilities spanning video, image, and audio creation through their Hailuo technology. Through Pixazo's 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 10% Extra Credit on Your First Payment (up to $500)
No strings attached — add funds and get a 10% bonus (up to $500) instantly
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/text-to-videoMiniMax H3 Max API Documentation (Text to Video)
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 Max API (Text to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/text-to-video HTTP/1.1
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Content-Type: application/json
{
"prompt": "a lone lighthouse beam sweeping across fog at dusk",
"duration": 5,
"resolution": "768P",
"aspect_ratio": "16:9",
"prompt_expansion_mode": "balanced"
}import requests
resp = requests.post(
"https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/text-to-video",
headers={
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"prompt": "a lone lighthouse beam sweeping across fog at dusk",
"duration": 5,
"resolution": "768P",
"aspect_ratio": "16:9",
"prompt_expansion_mode": "balanced"
},
)
job = resp.json()
print(job["request_id"])const resp = await fetch("https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/text-to-video", {
method: "POST",
headers: {
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "a lone lighthouse beam sweeping across fog at dusk",
"duration": 5,
"resolution": "768P",
"aspect_ratio": "16:9",
"prompt_expansion_mode": "balanced"
}),
});
const job = await resp.json();
console.log(job.request_id);curl -X POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/text-to-video \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "a lone lighthouse beam sweeping across fog at dusk", "duration": 5, "resolution": "768P", "aspect_ratio": "16:9", "prompt_expansion_mode": "balanced"}'Output
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, supply a callback URL and Pixazo will POST the result to it as soon as the request reaches a terminal state.
| Header | Type | Required | Description |
|---|---|---|---|
| X-Webhook-URL | string | No | HTTPS endpoint that receives the callback. Supplying it enables webhook delivery. |
| X-Webhook-Mode | string | No | terminal (default) delivers once on COMPLETED or FAILED. sync also delivers intermediate status changes. |
Example: enable webhook
curl -X POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/text-to-video \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "X-Webhook-URL: https://your-server.example.com/hooks/video" \
-H "X-Webhook-Mode: terminal" \
-d '{"prompt": "a lone lighthouse beam sweeping across fog at dusk", "prompt_expansion_mode": "balanced"}'Callback Payload
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max",
"error": null,
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4",
"media_type": "video/mp4"
},
"created_at": "2026-08-27T09:42:17.774Z",
"completed_at": "2026-08-27T09:45:02.118Z"
}Failure callback shape
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max",
"error": "Generation failed upstream",
"output": null
}Delivery semantics
terminalfires exactly once, on COMPLETED or FAILED.syncalso fires on intermediate transitions such as QUEUED → PROCESSING.- Deliveries are idempotent on
request_id— de-duplicate on it, as a callback may be retried. - Respond
200within a few seconds; slow endpoints are treated as failed deliveries. - HTTPS is required.
Request Parameters - MiniMax H3 Max API (Text to Video)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Any text, up to 50,000 characters | Description of the video to generate. |
duration | No | integer | 5 | 5 – 15 | Length of the finished video in seconds. Billed per second. |
resolution | No | string | 768P | 480P, 768P, 1080P | Output resolution. Determines the per-second price — 480P generates at a lower cost per second than 768P, and 1080P at a higher cost per second than 768P. 480P and 768P are native generation resolutions; 1080P is produced by latent refinement from a native 768P source. See the pricing table for current rates. |
aspect_ratio | No | string | 16:9 | 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Frame shape of the output video. |
prompt_expansion_mode | Yes | string | balanced | disabled, balanced, quality | How much the prompt is rewritten before generation. disabled uses your wording verbatim; balanced adds about a second; quality spends up to ~30s building a richer prompt. |
enable_safety_checker | No | boolean | true | true, false | Runs the content safety check over the generated video. |
seed | No | integer | — (random) | Any integer | Reusing a seed gives a fixed starting point for comparing two runs of the same brief. The prompt is rewritten before generation, so a repeated seed is a reference point rather than a guarantee of an identical video. |
Example Request
{
"prompt": "a lone lighthouse beam sweeping across fog at dusk",
"prompt_expansion_mode": "balanced"
}Response
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Value | Required |
|---|---|---|
| Ocp-Apim-Subscription-Key | YOUR_API_KEY | Yes |
| Content-Type | application/json | Yes |
| X-Webhook-URL | https://your-server.example.com/hooks/video | No |
| X-Webhook-Mode | terminal | sync | No |
Response Handling
| Code | Meaning | What to do |
|---|---|---|
| 202 | Accepted and queued | Read request_id and poll the status endpoint. |
| 400 | Invalid request body or parameter value | Check the parameter table above; the message names the offending field. |
| 401 | Missing or invalid subscription key | Check the Ocp-Apim-Subscription-Key header. |
| 402 | Insufficient wallet balance | Top up. The message names the resolved price for this request. |
| 403 | Key not subscribed to this product | Subscribe the key to the API product. |
| 429 | Rate limit exceeded | Back off and retry; the limit is 50 calls per 60 seconds. |
| 500 | Server error | Retry once; if it persists, contact support with the request_id. |
Error Responses
Insufficient balance (402)
{
"error": "Insufficient balance",
"required": 0.4,
"available": 0.12,
"currency": "USD"
}Invalid parameter (400)
{
"error": "Invalid value for 'duration': must be between 5 and 15"
}Failure after acceptance
A request that was accepted can still fail during generation. That is reported through the status endpoint or the webhook, with status set to ERROR:
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max",
"error": "Generation failed upstream",
"output": null
}Retrieving Results
Poll the status endpoint with the request_id returned by the submit call.
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}cURL Example
curl https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY"Response (Completed)
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max",
"error": null,
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4",
"media_type": "video/mp4"
},
"created_at": "2026-08-27T09:42:17.774Z",
"completed_at": "2026-08-27T09:45:02.118Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Identifier for this request. Use it to poll and to de-duplicate webhooks. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED or ERROR. |
| model_id | string | Always minimax-hailuo-h3-max. |
| error | string | null | Failure reason, null while the request is healthy. |
| output.media_url | string | URL of the finished MP4, re-hosted by Pixazo. |
| output.media_type | string | Always video/mp4. |
| created_at | string | ISO-8601 timestamp of submission. |
| completed_at | string | ISO-8601 timestamp of the terminal transition. |
| polling_url | string | Fully-formed status URL for this request. |
Status Values
| Status | Terminal | Meaning |
|---|---|---|
| QUEUED | No | Accepted and waiting for a generation slot. |
| PROCESSING | No | Generation is running. |
| COMPLETED | Yes | Finished. output.media_url holds the video. |
| FAILED | Yes | Generation failed. Not billed. |
| ERROR | Yes | The request could not be processed. Not billed. |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
-> FAILED
-> ERRORTypical Workflow
- POST the request body to
https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/text-to-video. - Read
request_idfrom the 202 response. - Poll
https://gateway.pixazo.ai/v2/requests/status/{request_id}every few seconds, or wait for the webhook. - On COMPLETED, download
output.media_url.
MiniMax H3 Max API Pricing — Per-Second Rates
768P is the API default. 480P generates at a lower cost per second; 1080P is a higher-cost tier, refined from a native 768P render.
| Resolution | Price (USD) |
|---|---|
| 768P | $0.08/sec |
| 480P | $0.05/sec |
| 1080P | $0.16/sec |
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/image-to-videoMiniMax H3 Max API Documentation (Image to Video)
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 Max API (Image to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/image-to-video HTTP/1.1
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Content-Type: application/json
{
"prompt": "the camera slowly pushes in as rain begins to fall",
"image_url": "https://your-cdn.example.com/first-frame.jpg",
"duration": 5,
"resolution": "768P",
"prompt_expansion_mode": "balanced"
}import requests
resp = requests.post(
"https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/image-to-video",
headers={
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"prompt": "the camera slowly pushes in as rain begins to fall",
"image_url": "https://your-cdn.example.com/first-frame.jpg",
"duration": 5,
"resolution": "768P",
"prompt_expansion_mode": "balanced"
},
)
job = resp.json()
print(job["request_id"])const resp = await fetch("https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/image-to-video", {
method: "POST",
headers: {
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "the camera slowly pushes in as rain begins to fall",
"image_url": "https://your-cdn.example.com/first-frame.jpg",
"duration": 5,
"resolution": "768P",
"prompt_expansion_mode": "balanced"
}),
});
const job = await resp.json();
console.log(job.request_id);curl -X POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/image-to-video \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "the camera slowly pushes in as rain begins to fall", "image_url": "https://your-cdn.example.com/first-frame.jpg", "duration": 5, "resolution": "768P", "prompt_expansion_mode": "balanced"}'Output
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, supply a callback URL and Pixazo will POST the result to it as soon as the request reaches a terminal state.
| Header | Type | Required | Description |
|---|---|---|---|
| X-Webhook-URL | string | No | HTTPS endpoint that receives the callback. Supplying it enables webhook delivery. |
| X-Webhook-Mode | string | No | terminal (default) delivers once on COMPLETED or FAILED. sync also delivers intermediate status changes. |
Example: enable webhook
curl -X POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/image-to-video \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "X-Webhook-URL: https://your-server.example.com/hooks/video" \
-H "X-Webhook-Mode: terminal" \
-d '{"prompt": "the camera slowly pushes in", "image_url": "https://your-cdn.example.com/first-frame.jpg", "prompt_expansion_mode": "balanced"}'Callback Payload
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max",
"error": null,
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4",
"media_type": "video/mp4"
},
"created_at": "2026-08-27T09:42:17.774Z",
"completed_at": "2026-08-27T09:45:02.118Z"
}Failure callback shape
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max",
"error": "Generation failed upstream",
"output": null
}Delivery semantics
terminalfires exactly once, on COMPLETED or FAILED.syncalso fires on intermediate transitions such as QUEUED → PROCESSING.- Deliveries are idempotent on
request_id— de-duplicate on it, as a callback may be retried. - Respond
200within a few seconds; slow endpoints are treated as failed deliveries. - HTTPS is required.
Request Parameters - MiniMax H3 Max API (Image to Video)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Any text, up to 50,000 characters | Description of the video to generate. |
image_url | Yes | string | — | Public https URL of an image | First frame of the video. The output aspect ratio follows this image, so there is no aspect_ratio parameter on this operation. |
end_image_url | No | string | — (none) | Public https URL of an image | Optional last frame. Supply it to generate a first-to-last keyframe transition. |
duration | No | integer | 5 | 5 – 15 | Length of the finished video in seconds. Billed per second. |
resolution | No | string | 768P | 480P, 768P, 1080P | Output resolution. Determines the per-second price — 480P generates at a lower cost per second than 768P, and 1080P at a higher cost per second than 768P. 480P and 768P are native generation resolutions; 1080P is produced by latent refinement from a native 768P source. See the pricing table for current rates. |
prompt_expansion_mode | Yes | string | balanced | disabled, balanced, quality | How much the prompt is rewritten before generation. disabled uses your wording verbatim; balanced adds about a second; quality spends up to ~30s building a richer prompt. |
enable_safety_checker | No | boolean | true | true, false | Runs the content safety check over the generated video. |
seed | No | integer | — (random) | Any integer | Reusing a seed gives a fixed starting point for comparing two runs of the same brief. The prompt is rewritten before generation, so a repeated seed is a reference point rather than a guarantee of an identical video. |
Example Request
{
"prompt": "the camera slowly pushes in",
"image_url": "https://your-cdn.example.com/first-frame.jpg",
"prompt_expansion_mode": "balanced"
}Response
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Value | Required |
|---|---|---|
| Ocp-Apim-Subscription-Key | YOUR_API_KEY | Yes |
| Content-Type | application/json | Yes |
| X-Webhook-URL | https://your-server.example.com/hooks/video | No |
| X-Webhook-Mode | terminal | sync | No |
Response Handling
| Code | Meaning | What to do |
|---|---|---|
| 202 | Accepted and queued | Read request_id and poll the status endpoint. |
| 400 | Invalid request body or parameter value | Check the parameter table above; the message names the offending field. |
| 401 | Missing or invalid subscription key | Check the Ocp-Apim-Subscription-Key header. |
| 402 | Insufficient wallet balance | Top up. The message names the resolved price for this request. |
| 403 | Key not subscribed to this product | Subscribe the key to the API product. |
| 429 | Rate limit exceeded | Back off and retry; the limit is 50 calls per 60 seconds. |
| 500 | Server error | Retry once; if it persists, contact support with the request_id. |
Error Responses
Insufficient balance (402)
{
"error": "Insufficient balance",
"required": 0.4,
"available": 0.12,
"currency": "USD"
}Invalid parameter (400)
{
"error": "Invalid value for 'duration': must be between 5 and 15"
}Failure after acceptance
A request that was accepted can still fail during generation. That is reported through the status endpoint or the webhook, with status set to ERROR:
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max",
"error": "Generation failed upstream",
"output": null
}Retrieving Results
Poll the status endpoint with the request_id returned by the submit call.
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}cURL Example
curl https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY"Response (Completed)
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max",
"error": null,
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4",
"media_type": "video/mp4"
},
"created_at": "2026-08-27T09:42:17.774Z",
"completed_at": "2026-08-27T09:45:02.118Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Identifier for this request. Use it to poll and to de-duplicate webhooks. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED or ERROR. |
| model_id | string | Always minimax-hailuo-h3-max. |
| error | string | null | Failure reason, null while the request is healthy. |
| output.media_url | string | URL of the finished MP4, re-hosted by Pixazo. |
| output.media_type | string | Always video/mp4. |
| created_at | string | ISO-8601 timestamp of submission. |
| completed_at | string | ISO-8601 timestamp of the terminal transition. |
| polling_url | string | Fully-formed status URL for this request. |
Status Values
| Status | Terminal | Meaning |
|---|---|---|
| QUEUED | No | Accepted and waiting for a generation slot. |
| PROCESSING | No | Generation is running. |
| COMPLETED | Yes | Finished. output.media_url holds the video. |
| FAILED | Yes | Generation failed. Not billed. |
| ERROR | Yes | The request could not be processed. Not billed. |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
-> FAILED
-> ERRORTypical Workflow
- POST the request body to
https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/image-to-video. - Read
request_idfrom the 202 response. - Poll
https://gateway.pixazo.ai/v2/requests/status/{request_id}every few seconds, or wait for the webhook. - On COMPLETED, download
output.media_url.
MiniMax H3 Max API Pricing — Per-Second Rates
768P is the API default. 480P generates at a lower cost per second; 1080P is a higher-cost tier, refined from a native 768P render.
| Resolution | Price (USD) |
|---|---|
| 768P | $0.08/sec |
| 480P | $0.05/sec |
| 1080P | $0.16/sec |
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/reference-to-videoMiniMax H3 Max API Documentation (Reference to Video)
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 Max API (Reference to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/reference-to-video HTTP/1.1
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Content-Type: application/json
{
"prompt": "the camera slowly pushes in as rain begins to fall",
"reference_image_urls": ["https://your-cdn.example.com/subject.jpg"],
"duration": 5,
"resolution": "768P",
"prompt_expansion_mode": "balanced"
}import requests
resp = requests.post(
"https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/reference-to-video",
headers={
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"prompt": "the camera slowly pushes in as rain begins to fall",
"reference_image_urls": ["https://your-cdn.example.com/subject.jpg"],
"duration": 5,
"resolution": "768P",
"prompt_expansion_mode": "balanced"
},
)
job = resp.json()
print(job["request_id"])const resp = await fetch("https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/reference-to-video", {
method: "POST",
headers: {
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "the camera slowly pushes in as rain begins to fall",
"reference_image_urls": ["https://your-cdn.example.com/subject.jpg"],
"duration": 5,
"resolution": "768P",
"prompt_expansion_mode": "balanced"
}),
});
const job = await resp.json();
console.log(job.request_id);curl -X POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/reference-to-video \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "the camera slowly pushes in as rain begins to fall", "reference_image_urls": ["https://your-cdn.example.com/subject.jpg"], "duration": 5, "resolution": "768P", "prompt_expansion_mode": "balanced"}'Output
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, supply a callback URL and Pixazo will POST the result to it as soon as the request reaches a terminal state.
| Header | Type | Required | Description |
|---|---|---|---|
| X-Webhook-URL | string | No | HTTPS endpoint that receives the callback. Supplying it enables webhook delivery. |
| X-Webhook-Mode | string | No | terminal (default) delivers once on COMPLETED or FAILED. sync also delivers intermediate status changes. |
Example: enable webhook
curl -X POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/reference-to-video \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "X-Webhook-URL: https://your-server.example.com/hooks/video" \
-H "X-Webhook-Mode: terminal" \
-d '{"prompt": "the camera slowly pushes in", "reference_image_urls": ["https://your-cdn.example.com/subject.jpg"], "prompt_expansion_mode": "balanced"}'Callback Payload
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max",
"error": null,
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4",
"media_type": "video/mp4"
},
"created_at": "2026-08-27T09:42:17.774Z",
"completed_at": "2026-08-27T09:45:02.118Z"
}Failure callback shape
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max",
"error": "Generation failed upstream",
"output": null
}Delivery semantics
terminalfires exactly once, on COMPLETED or FAILED.syncalso fires on intermediate transitions such as QUEUED → PROCESSING.- Deliveries are idempotent on
request_id— de-duplicate on it, as a callback may be retried. - Respond
200within a few seconds; slow endpoints are treated as failed deliveries. - HTTPS is required.
Request Parameters - MiniMax H3 Max API (Reference to Video)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Any text, up to 50,000 characters | Description of the video to generate. |
reference_image_urls | No | array of string | — (none) | Up to 4 public https image URLs | Subject or style reference images, and the only kind of reference this operation accepts. Refer to them in the prompt as Image 1, Image 2, and so on. At most four are accepted. |
aspect_ratio | No | string | adaptive | adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Aspect ratio of the generated video. adaptive is the default for this operation; the other values request a fixed frame shape. |
duration | No | integer | 5 | 5 – 15 | Length of the finished video in seconds. Billed per second. |
resolution | No | string | 768P | 480P, 768P, 1080P | Output resolution. Determines the per-second price — 480P generates at a lower cost per second than 768P, and 1080P at a higher cost per second than 768P. 480P and 768P are native generation resolutions; 1080P is produced by latent refinement from a native 768P source. See the pricing table for current rates. |
prompt_expansion_mode | Yes | string | balanced | disabled, balanced, quality | How much the prompt is rewritten before generation. disabled uses your wording verbatim; balanced adds about a second; quality spends up to ~30s building a richer prompt. |
enable_safety_checker | No | boolean | true | true, false | Runs the content safety check over the generated video. |
seed | No | integer | — (random) | Any integer | Reusing a seed gives a fixed starting point for comparing two runs of the same brief. The prompt is rewritten before generation, so a repeated seed is a reference point rather than a guarantee of an identical video. |
Example Request
{
"prompt": "the camera slowly pushes in",
"reference_image_urls": ["https://your-cdn.example.com/subject.jpg"],
"prompt_expansion_mode": "balanced"
}Response
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Value | Required |
|---|---|---|
| Ocp-Apim-Subscription-Key | YOUR_API_KEY | Yes |
| Content-Type | application/json | Yes |
| X-Webhook-URL | https://your-server.example.com/hooks/video | No |
| X-Webhook-Mode | terminal | sync | No |
Response Handling
| Code | Meaning | What to do |
|---|---|---|
| 202 | Accepted and queued | Read request_id and poll the status endpoint. |
| 400 | Invalid request body or parameter value | Check the parameter table above; the message names the offending field. |
| 401 | Missing or invalid subscription key | Check the Ocp-Apim-Subscription-Key header. |
| 402 | Insufficient wallet balance | Top up. The message names the resolved price for this request. |
| 403 | Key not subscribed to this product | Subscribe the key to the API product. |
| 429 | Rate limit exceeded | Back off and retry; the limit is 50 calls per 60 seconds. |
| 500 | Server error | Retry once; if it persists, contact support with the request_id. |
Error Responses
Insufficient balance (402)
{
"error": "Insufficient balance",
"required": 0.4,
"available": 0.12,
"currency": "USD"
}Invalid parameter (400)
{
"error": "Invalid value for 'duration': must be between 5 and 15"
}Failure after acceptance
A request that was accepted can still fail during generation. That is reported through the status endpoint or the webhook, with status set to ERROR:
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max",
"error": "Generation failed upstream",
"output": null
}Retrieving Results
Poll the status endpoint with the request_id returned by the submit call.
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}cURL Example
curl https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY"Response (Completed)
{
"request_id": "minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max",
"error": null,
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4",
"media_type": "video/mp4"
},
"created_at": "2026-08-27T09:42:17.774Z",
"completed_at": "2026-08-27T09:45:02.118Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Identifier for this request. Use it to poll and to de-duplicate webhooks. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED or ERROR. |
| model_id | string | Always minimax-hailuo-h3-max. |
| error | string | null | Failure reason, null while the request is healthy. |
| output.media_url | string | URL of the finished MP4, re-hosted by Pixazo. |
| output.media_type | string | Always video/mp4. |
| created_at | string | ISO-8601 timestamp of submission. |
| completed_at | string | ISO-8601 timestamp of the terminal transition. |
| polling_url | string | Fully-formed status URL for this request. |
Status Values
| Status | Terminal | Meaning |
|---|---|---|
| QUEUED | No | Accepted and waiting for a generation slot. |
| PROCESSING | No | Generation is running. |
| COMPLETED | Yes | Finished. output.media_url holds the video. |
| FAILED | Yes | Generation failed. Not billed. |
| ERROR | Yes | The request could not be processed. Not billed. |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
-> FAILED
-> ERRORTypical Workflow
- POST the request body to
https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/reference-to-video. - Read
request_idfrom the 202 response. - Poll
https://gateway.pixazo.ai/v2/requests/status/{request_id}every few seconds, or wait for the webhook. - On COMPLETED, download
output.media_url.
MiniMax H3 Max API Pricing — Per-Second Rates
768P is the API default. 480P generates at a lower cost per second; 1080P is a higher-cost tier, refined from a native 768P render. Reference to Video is priced above the other capabilities because the provider also bills the reference images you supply as input.
| Resolution | Price (USD) |
|---|---|
| 768P | $0.12/sec |
| 480P | $0.09/sec |
| 1080P | $0.20/sec |
Animate a still image so that its subject speaks or sings in sync with an audio track. Supply the image and the audio as public URLs; the model returns an MP4 with the audio as its soundtrack. The video is exactly as long as the audio (at least 5 seconds, at most 15 — longer audio is clipped to its first 15 seconds). Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED.
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-lip-sync/v1/image-to-videoMiniMax H3 Max API Documentation (Audio to Video (Ref Audio + Ref Image to Video) - Lipsync)
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 Max API (Audio to Video (Ref Audio + Ref Image to Video) - Lipsync)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-lip-sync/v1/image-to-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-frame.jpg",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-6s.mp3",
"resolution": "768P"
}import requests
url = "https://gateway.pixazo.ai/minimax-hailuo-h3-max-lip-sync/v1/image-to-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-frame.jpg",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-6s.mp3",
"resolution": "768P"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/minimax-hailuo-h3-max-lip-sync/v1/image-to-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-frame.jpg",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-6s.mp3",
"resolution": "768P"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/minimax-hailuo-h3-max-lip-sync/v1/image-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-frame.jpg", "audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-6s.mp3", "resolution": "768P"}'Output
{
"request_id": "minimax-hailuo-h3-max-lip-sync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-lip-sync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| 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-hailuo-h3-max-lip-sync/v1/image-to-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-frame.jpg", "audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-6s.mp3", "resolution": "768P"}'Callback Payload (success)
{
"request_id": "minimax-hailuo-h3-max-lip-sync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-lip-sync",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max-lip-sync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-09-18T10:40:08.748Z",
"completed_at": "2026-09-18T10:43:36.118Z"
}Failure callback shape
{
"request_id": "minimax-hailuo-h3-max-lip-sync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max-lip-sync",
"error": "Description of the failure",
"output": null
}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 - MiniMax H3 Max API (Audio to Video (Ref Audio + Ref Image to Video) - Lipsync)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
image_url | Yes | string | — | Public http(s) URL of an image; aspect ratio 0.4–2.5 | The image to animate. Its aspect ratio (width ÷ height) must be between 0.4 and 2.5; the output uses the supported aspect ratio nearest the image. |
audio_url | Yes | string | — | Public http(s) URL of an audio file, at least 5 seconds long | The audio to synchronise the mouth movements to. Audio over 15 seconds is clipped to its first 15 seconds, so the video is at most 15 seconds long. The audio becomes the video's soundtrack. |
resolution | No | string | 768P | 480P, 768P, 1080P, 2K | Output resolution. Uses the supported aspect ratio nearest the image. Selects the per-second rate — see the pricing panel on this page. |
enable_transcription | No | boolean | true | true, false | Transcribe the supplied audio to guide lip synchronisation. When false, the mouth is synchronised to the audio without a transcript. |
enable_safety_checker | No | boolean | true | true, false | Enables the content safety checks. A request flagged by them fails after acceptance (see Response Handling). |
seed | No | integer | — (random) | 0–2147483647 | Random seed. Repeating a request with the same seed and inputs gives a more consistent result, but exact reproducibility is not guaranteed. |
image_urlandaudio_urlare the only required fields. Both must be public http(s) URLs that stay reachable until the request has been processed.- There is no
durationparameter. The length of the video follows the audio: at least 5 seconds, and at most 15 — audio over 15 seconds is clipped to its first 15 seconds. - The model is fixed by the URL. Do not send a
model_idin the body.
Input requirements
Image
- A public http(s) URL. The image is fetched when the request is processed, so the URL must stay reachable until then.
- The aspect ratio (width ÷ height) must be between 0.4 and 2.5 — from a tall 2:5 portrait to a wide 5:2 panorama. Images outside that range are rejected after acceptance.
- The output uses the supported aspect ratio nearest the image, at the chosen
resolution.
Audio
- A public http(s) URL to an audio file, at least 5 seconds long. Shorter audio is rejected after acceptance.
- Audio over 15 seconds is clipped to its first 15 seconds, so the video is never longer than 15 seconds. Trim the audio yourself if a different 15 seconds is wanted.
- The (clipped) audio becomes the soundtrack of the returned MP4.
Example Request
{
"image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/lipsync/talking-head-frame.jpg",
"audio_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-6s.mp3",
"resolution": "768P"
}Example Response
{
"request_id": "minimax-hailuo-h3-max-lip-sync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-lip-sync_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). |
| X-Webhook-Mode | No | terminal (default) or sync. |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid parameters — a required field is missing, a value has the wrong type, or resolution is not one of the allowed values. Rejected before any hold is placed on your balance; violations names each offending field. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs (the message names the amount). |
| 403 | Key not subscribed to this product. |
| 429 | Too many requests — back off and retry. |
| 500 | Internal server error — retry once; if it persists, contact support with the request_id. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. Checks that need the files themselves — whether the URLs can be fetched, the audio length, the image aspect ratio, the safety check — run after the request is accepted and are reported through the status endpoint as status: "ERROR", with a message in error saying what to fix. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing image_url or audio_url | synchronous 400 |
resolution not one of 480P, 768P, 1080P, 2K | synchronous 400 |
image_url or audio_url not a string, enable_transcription or enable_safety_checker not a boolean, or seed not an integer | synchronous 400 |
image_url or audio_url not a public http(s) URL, not downloadable, or not an image / audio file | status: "ERROR" |
| Audio shorter than 5 seconds | status: "ERROR" |
| Image aspect ratio outside 0.4–2.5 | status: "ERROR" |
| Input or output flagged by the safety checker | status: "ERROR" |
Error Responses
Invalid parameter (400)
Returned when you submit, before any hold is placed. violations lists every problem found, one entry per field.
{
"error": "Invalid request parameters",
"message": "'audio_url' is required",
"violations": [
"'audio_url' is required"
]
}Failure after acceptance
A request that was accepted can still fail — an input URL that cannot be fetched, audio under 5 seconds, an image whose aspect ratio is outside 0.4–2.5, or content flagged by the safety checker. That is reported through the status endpoint or the webhook, with status set to ERROR. Failed requests are not billed.
{
"request_id": "minimax-hailuo-h3-max-lip-sync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max-lip-sync",
"error": "Description of the failure",
"output": null
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED (or FAILED/ERROR), then download the video from output.media_url.
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}cURL Example
curl 'https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-lip-sync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "minimax-hailuo-h3-max-lip-sync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-lip-sync",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max-lip-sync_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-09-18T10:40:08.748Z",
"completed_at": "2026-09-18T10:43:36.118Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Unique request identifier. Use it to poll and to de-duplicate webhooks. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED, or ERROR. |
| model_id | string | The model that handled the request — minimax-hailuo-h3-max-lip-sync for this endpoint. |
| error | string | null | Failure reason; null while the request is healthy. |
| output.media_url | array of strings | URL of the finished video, an MP4 with the audio as its soundtrack, re-hosted by Pixazo. |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| polling_url | string | Fully-formed status URL for this request (submit response). |
Status Values & Flow
| Status | Terminal | Meaning |
|---|---|---|
| QUEUED | No | Accepted and waiting for a generation slot. |
| PROCESSING | No | Generation is running. |
| COMPLETED | Yes | Finished. output.media_url holds the video. |
| FAILED | Yes | Generation failed. Not billed. |
| ERROR | Yes | The request could not be processed. Not billed. |
QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).
Typical workflow
- POST the request body to
https://gateway.pixazo.ai/minimax-hailuo-h3-max-lip-sync/v1/image-to-video. - Read
request_idfrom the 202 response. - Poll
https://gateway.pixazo.ai/v2/requests/status/{request_id}every few seconds, or wait for the webhook. - On COMPLETED, download
output.media_url.
How billing is measured
Billing is measured on the length of the generated video, in seconds, at the rate for the resolution you chose — not on how long generation takes, and not on the length of the audio you upload beyond the 15 seconds that are used. Because the length is not known until the video exists, a hold covering the 15-second maximum at your resolution is placed when the request is submitted; it is reduced to the real cost once the video has been measured, and released in full if the request fails.
The current rate for each resolution is shown in the pricing panel on this page.
MiniMax H3 Max API Pricing — Per-Second Rates
768P is the API default. 480P generates at a lower cost per second; 1080P and 2K are higher-cost tiers. Billed per second of generated video — the clip length follows the audio you supply (5 seconds minimum, clipped to the first 15 seconds).
| Resolution | Price (USD) |
|---|---|
| 768P | $0.08/sec |
| 480P | $0.05/sec |
| 1080P | $0.16/sec |
| 2K | $0.32/sec |
Continue a video with MiniMax H3 Max: send your video and a prompt describing what happens next, and the model adds new footage that carries on from the end of your video. You choose the length of the new footage (duration, 0.71 to 15 seconds) and the resolution (resolution, 480P up to 2K). Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url.
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/extend-videoMiniMax H3 Max API Documentation (Video to Video (Video Extension))
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 Max API (Video to Video (Video Extension))
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/extend-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "He finishes his sentence, smiles and gives a small wave to the camera.",
"duration": 5,
"resolution": "768P"
}import requests
url = "https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/extend-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "He finishes his sentence, smiles and gives a small wave to the camera.",
"duration": 5,
"resolution": "768P"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/extend-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "He finishes his sentence, smiles and gives a small wave to the camera.",
"duration": 5,
"resolution": "768P"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/extend-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4", "prompt": "He finishes his sentence, smiles and gives a small wave to the camera.", "duration": 5, "resolution": "768P"}'Output
{
"request_id": "minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| 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-hailuo-h3-max-edit/v1/extend-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4", "prompt": "He finishes his sentence, smiles and gives a small wave to the camera.", "duration": 5, "resolution": "768P"}'Callback Payload (success)
{
"request_id": "minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-edit",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-12T10:04:54.387Z",
"completed_at": "2026-10-12 10:06:21"
}Failure callback shape
{
"request_id": "minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max-edit",
"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 every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - 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 |
|---|---|---|---|---|---|
video_url | Yes | string | — | One video: a publicly reachable https URL (recommended) | The video to continue. Use an MP4 file between 1.625 and 60 seconds long, with a width-to-height ratio between 0.4 and 2.5. |
prompt | Yes | string | — | Non-empty text, up to 50000 characters | What happens next: describe the continuation, not your video. |
duration | No | number | 5 | 0.71–15 | Length of the new footage in seconds (fractions allowed). Billing is per requested second. |
resolution | No | string | "768P" | 480P, 768P, 1080P, 2K | Output resolution, written exactly as listed (capital P). Higher resolutions cost more per second. |
aspect_ratio | No | string | "auto" | auto, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Frame shape of the result: auto follows your video; any other value crops the video to that shape. It does not change the amount billed. |
output | No | string | "extended" | extended, continuation | extended returns your video and the new footage as one video; continuation returns a clip that starts with a 1.625-second repeat of the end of your video, then the new footage. It does not change the amount billed. |
seed | No | integer | Random | 0–2147483647 | Seed for the random generator; leave it out for a random seed. It does not change the amount billed. |
enable_prompt_expansion | No | boolean | true | true, false | Let the model elaborate your prompt before generating; set it to false to use the prompt as written. It does not change the amount billed. |
enable_safety_checker | No | boolean | true | true, false | Content safety screening of your video and the prompt, on by default. It does not change the amount billed. |
Good to know
- Each request returns one video.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per video. - Set the length of the new footage with
duration, in seconds from 0.71 to 15 (5 when you leave it out);seconds,num_frames,frames_per_secondandmusic_length_msare rejected. - Set the resolution with
resolution:480P,768P,1080Por2K, written exactly as listed (768P when you leave it out). - Send every field at the top level of the JSON body, with the text in
prompt;parameters,contentandtextare rejected. - Send your video as one URL in
video_url;video,videosandvideo_uriare rejected. - Extend Video takes no images and has no timing or color settings:
image_url,image_urls,image,start_time,resume_time,color_matchandreference_image_urlsare rejected (they belong to the Insert Video operation). - This API takes no reference audio or reference videos:
reference_audio_urls,reference_video_urlsandaudio_urlare rejected. - Use the JSON types shown:
durationis a number (5, not"5"),seedis a whole number, and the switches aretrueorfalse, not strings. - Omit a field instead of sending
null. - Results are always returned as a URL in
output.media_url;sync_modeandstreamare rejected. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_url,webhook_modeandcallback_urlin the JSON body are rejected.
Length and Resolution
Set duration to the length of the new footage in seconds, from 0.71 to 15 (fractions are allowed); 5 applies when you leave it out. Set resolution to one of the values below, written exactly as listed; 768P applies when you leave it out. Billing is per second of the requested duration at the rate for the requested resolution. Only the new footage is billed: the length of your video does not change the amount.
| resolution | Note |
|---|---|
480P | The lowest cost per second |
768P | The default |
1080P | — |
2K | The highest cost per second |
Example: 8 seconds of new footage at 1080P
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "The camera slowly pulls back to show the whole room as he keeps talking.",
"duration": 8,
"resolution": "1080P"
}Source Video
- Send one video in
video_urlas a publicly reachablehttpsURL (recommended). Use an MP4 file between 1.625 and 60 seconds long, with a width-to-height ratio between 0.4 and 2.5. - The video is downloaded when you submit: a URL that cannot be downloaded, or a very large file, may be refused at once with a
400, with nothing charged. - Describe what happens next in
prompt(required, up to 50000 characters): the continuation, not your video. output:extended(the default) returns your video and the new footage as one video;continuationreturns a clip that starts with a 1.625-second repeat of the end of your video, then the new footage. Withoutputleft asextended, the returned video is your video followed by the new footage.aspect_ratio:auto(the default) follows your video; any other value crops the video to that shape.
Example: return only the new footage (continuation)
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "He looks to the side, then back at the camera and smiles.",
"duration": 5,
"resolution": "480P",
"output": "continuation"
}Audio
This API takes no reference audio: reference_audio_urls and audio_url are rejected. When your video has sound, the extended video has sound too.
Example Request
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "He finishes his sentence, smiles and gives a small wave to the camera.",
"duration": 5,
"resolution": "768P"
}Example Response
{
"request_id": "minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-edit_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). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is out of range or is not one of the allowed values, a field this operation does not accept was sent, or an input could not be downloaded. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. An input that cannot be downloaded is also refused at submit with a 400, and its hold is released at once: nothing is charged. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty video_url, or video_url not a string | synchronous 400 |
Missing or empty prompt, or prompt not a string, or longer than 50000 characters | synchronous 400 |
A video_url that cannot be downloaded when you submit, or a very large file (the hold is released at once: nothing is charged) | synchronous 400 |
resolution not one of the allowed values (written exactly as listed) | synchronous 400 |
aspect_ratio not one of the allowed values (written exactly as listed) | synchronous 400 |
output not one of the allowed values (written exactly as listed) | synchronous 400 |
enable_prompt_expansion or enable_safety_checker not true or false — for example the string "true" | synchronous 400 |
duration not a number from 0.71 to 15 — for example the string "5" | synchronous 400 |
seed not a whole number from 0 to 2147483647 — for example -1, 2147483648 or the string "0" | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one video per request) | synchronous 400 |
seconds, num_frames, frames_per_second, music_length_ms (set the length of the new footage with duration, in seconds) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body, the text in prompt) | synchronous 400 |
video, videos, video_uri (send your video as one URL in video_url) | synchronous 400 |
image_url, image_urls, image, start_time, resume_time, color_match, reference_image_urls (Insert Video settings: Extend Video takes no images, timing or color settings) | synchronous 400 |
reference_audio_urls, reference_video_urls, audio_url (this API takes no reference audio or reference videos) | synchronous 400 |
sync_mode, stream (results are always returned as a URL in output.media_url) | synchronous 400 |
webhook_url, webhook_mode, callback_url in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
| A video the model cannot use, for example a file that is not a video, one shorter than 1.625 seconds or longer than 60 seconds, or one whose width-to-height ratio is outside 0.4 to 2.5 | status: "ERROR" |
| A prompt or video the model refuses, for example under its content policy | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing prompt (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' is required",
"violations": [
"'prompt' is required"
]
}A resolution in the wrong case (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'resolution' must be one of: \"480P\", \"768P\", \"1080P\", \"2K\" (got \"768p\")",
"violations": [
"'resolution' must be one of: \"480P\", \"768P\", \"1080P\", \"2K\" (got \"768p\")"
]
}A value out of range (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be <= 15 (got 16)",
"violations": [
"'duration' must be <= 15 (got 16)"
]
}A number sent as a string (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be number (got string)",
"violations": [
"'duration' must be number (got string)"
]
}An Insert Video setting sent to Extend Video (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'color_match' must be one of: (got true); 'color_match' is not accepted by extend-video. It is an insert-video setting.",
"violations": [
"'color_match' must be one of: (got true)",
"'color_match' is not accepted by extend-video. It is an insert-video setting."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the video from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-edit",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-12T10:04:54.387Z",
"completed_at": "2026-10-12 10:06:21"
}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 — minimax-hailuo-h3-max-edit for this endpoint. |
| output.media_url | array of strings | URL of the video (one MP4 file per request). |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/extend-video. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the video fromoutput.media_url.
How Billing Is Measured
Billing is measured per second of the requested duration, at the rate for the requested resolution: the amount is the per-second rate for resolution (768P when you leave it out) times duration (5 seconds when you leave it out). Only the new footage is billed: the length of your video does not change the amount. Higher resolutions cost more per second. The prompt, seed, aspect ratio, output mode, prompt expansion and safety setting do not change the amount. The amount is placed as a hold when the request is submitted and released in full if the request fails. The current rate is shown in the pricing panel on this page.
MiniMax H3 Max API Pricing — Per-Second Rates
768P is the API default. 480P generates at a lower cost per second; 1080P and 2K are higher-cost tiers. Billed per second of new footage — the duration you request (0.71 to 15 seconds); the length of your source video does not change the price.
| Resolution | Price (USD) |
|---|---|
| 768P | $0.08/sec |
| 480P | $0.05/sec |
| 1080P | $0.16/sec |
| 2K | $0.32/sec |
Insert a new scene into a video with MiniMax H3 Max: send your video, the time where the new scene starts (start_time) and the time where your video picks up again (resume_time), and guide the scene with a prompt and up to 4 reference images. You choose the length of the new scene (duration, 5 to 13 seconds) and the resolution (resolution, 480p or 768p). Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url.
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/insert-videoMiniMax H3 Max API Documentation (Video to Video (Scene Insertion))
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 Max API (Video to Video (Scene Insertion))
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/insert-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "A close-up of the potted plant beside him as soft light moves across its leaves.",
"start_time": 2,
"resume_time": 3,
"duration": 5,
"resolution": "768p"
}import requests
url = "https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/insert-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "A close-up of the potted plant beside him as soft light moves across its leaves.",
"start_time": 2,
"resume_time": 3,
"duration": 5,
"resolution": "768p"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/insert-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "A close-up of the potted plant beside him as soft light moves across its leaves.",
"start_time": 2,
"resume_time": 3,
"duration": 5,
"resolution": "768p"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/insert-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4", "prompt": "A close-up of the potted plant beside him as soft light moves across its leaves.", "start_time": 2, "resume_time": 3, "duration": 5, "resolution": "768p"}'Output
{
"request_id": "minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| 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-hailuo-h3-max-edit/v1/insert-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4", "prompt": "A close-up of the potted plant beside him as soft light moves across its leaves.", "start_time": 2, "resume_time": 3, "duration": 5, "resolution": "768p"}'Callback Payload (success)
{
"request_id": "minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-edit",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-12T10:04:54.387Z",
"completed_at": "2026-10-12 10:06:21"
}Failure callback shape
{
"request_id": "minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max-edit",
"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 every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - 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 |
|---|---|---|---|---|---|
video_url | Yes | string | — | One video: a publicly reachable https URL (recommended) | The video to add a scene to, as an MP4 file. start_time and resume_time are positions in this video. |
start_time | Yes | number | — | 1.625–60 | Where the new scene begins, in seconds from the start of your video. |
resume_time | Yes | number | — | 1.63–60 | Where your video picks up again after the new scene, in seconds from the start of your video. |
prompt | No | string | Empty | Text, up to 50000 characters | What the new scene shows. Optional: you can also guide the scene with reference images. |
reference_image_urls | No | array | — | Up to 4 images: https URLs (recommended) or data URIs | Images that guide the new scene (PNG, JPEG, JPG or WebP). Together they may hold at most 4096 image tokens (see References below). |
duration | No | number | 5 | 5–13 | Length of the new scene in seconds (fractions allowed). Billing is per requested second. |
resolution | No | string | "768p" | 480p, 768p | Output resolution, written exactly as listed (lower-case p). Higher resolutions cost more per second. |
color_match | No | boolean | true | true, false | Match the colors of the new scene to your video. It does not change the amount billed. |
seed | No | integer | Random | 0–2147483647 | Seed for the random generator; leave it out for a random seed. It does not change the amount billed. |
enable_prompt_expansion | No | boolean | true | true, false | Let the model elaborate your prompt before generating; set it to false to use the prompt as written. It does not change the amount billed. |
Good to know
- Each request returns one video.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per video. - Set the length of the new scene with
duration, in seconds from 5 to 13 (5 when you leave it out);seconds,num_frames,frames_per_secondandmusic_length_msare rejected. - Set the resolution with
resolution:480por768p, written exactly as listed (768p when you leave it out). - Send every field at the top level of the JSON body, with the text in
prompt;parameters,contentandtextare rejected. - Send your video as one URL in
video_url;video,videosandvideo_uriare rejected. - Send up to 4 guide images in
reference_image_urls;image_url,image_urlsandimageare rejected. - Insert Video has no aspect-ratio, output-mode or safety setting:
aspect_ratio,outputandenable_safety_checkerare rejected. - This API takes no reference audio or reference videos:
reference_audio_urls,reference_video_urlsandaudio_urlare rejected. - Use the JSON types shown:
duration,start_timeandresume_timeare numbers (5, not"5"),seedis a whole number, and the switches aretrueorfalse, not strings. - Omit a field instead of sending
null. - Results are always returned as a URL in
output.media_url;sync_modeandstreamare rejected. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_url,webhook_modeandcallback_urlin the JSON body are rejected.
Length and Resolution
Set duration to the length of the new scene in seconds, from 5 to 13 (fractions are allowed); 5 applies when you leave it out. Set resolution to one of the values below, written exactly as listed; 768p applies when you leave it out. Billing is per second of the requested duration at the rate for the requested resolution. Only the new scene is billed, not the whole returned video.
| resolution | Note |
|---|---|
480p | The lower cost per second |
768p | The default |
Example: an 8-second scene at 480p
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "The view drifts across the framed pictures on the wall.",
"start_time": 4,
"resume_time": 6.5,
"duration": 8,
"resolution": "480p"
}Source Video and Timing
- Send one video in
video_urlas a publicly reachablehttpsURL (recommended), as an MP4 file. It is downloaded when you submit: a URL that cannot be downloaded, or a very large file, may be refused at once with a400, with nothing charged. start_timeis where the new scene begins andresume_timeis where your video picks up again, both in seconds from the start of your video (start_timefrom 1.625 to 60,resume_timefrom 1.63 to 60). The returned video is the whole video: your footage up tostart_time, then the new scene, then your footage fromresume_timeto the end.- Describe the new scene in
prompt(optional, up to 50000 characters), and optionally add guide images (see References). color_match(on by default) matches the colors of the new scene to your video.
Example: replace the part between 5.5 and 8 seconds
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "A close-up of the potted plant beside him as soft light moves across its leaves.",
"start_time": 5.5,
"resume_time": 8,
"duration": 5,
"resolution": "768p"
}References
- Send up to 4 images in
reference_image_urls, as non-empty URL strings: publicly reachablehttpsURLs are recommended; data URIs are accepted. Use PNG, JPEG, JPG or WebP images. - Together the images may hold at most 4096 image tokens. Each image counts its width × height / 1,024 tokens, so an image of 1,024 by 1,024 pixels counts 1,024 tokens: four of those fit, and so does one image of 2,048 by 2,048 pixels. A request over the budget is refused at once with a
400, with nothing charged. - Every image is downloaded when you submit: an image that cannot be downloaded is refused at once with a
400, with nothing charged.
Example: guide the scene with a reference image
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "A cutaway to the subject of the reference image, who turns toward the camera and smiles.",
"reference_image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
],
"start_time": 2,
"resume_time": 3,
"duration": 5,
"resolution": "768p"
}4 images over the token budget (synchronous 400)
For example, 4 images of 853 by 1,280 pixels count about 4,265 tokens together:
{
"error": "Invalid request parameters",
"message": "'reference_image_urls' totals about 4265 image tokens, over the 4096 allowed. Tokens are (width x height) / 1024 per image, so send smaller reference images or fewer of them.",
"violations": [
"'reference_image_urls' totals about 4265 image tokens, over the 4096 allowed. Tokens are (width x height) / 1024 per image, so send smaller reference images or fewer of them."
]
}Audio
This API takes no reference audio or reference videos: reference_audio_urls, reference_video_urls and audio_url are rejected. When your video has sound, the returned video has sound too.
Example Request
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-17s.mp4",
"prompt": "A close-up of the potted plant beside him as soft light moves across its leaves.",
"start_time": 2,
"resume_time": 3,
"duration": 5,
"resolution": "768p"
}Example Response
{
"request_id": "minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-edit_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). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is out of range or is not one of the allowed values, a field this operation does not accept was sent, or an input could not be downloaded. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. An input that cannot be downloaded is also refused at submit with a 400, and its hold is released at once: nothing is charged. Reference images over the image-token budget are refused with a 400 before any hold is placed. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty video_url, or video_url not a string | synchronous 400 |
Missing start_time, or start_time not a number from 1.625 to 60 — for example the string "2" | synchronous 400 |
Missing resume_time, or resume_time not a number from 1.63 to 60 — for example the string "2" | synchronous 400 |
A video_url or reference_image_urls entry that cannot be downloaded when you submit, or a very large file (the hold is released at once: nothing is charged) | synchronous 400 |
prompt not a string, or longer than 50000 characters | synchronous 400 |
reference_image_urls not a list, or more than 4 items | synchronous 400 |
reference_image_urls images that together hold more than 4096 image tokens (each image counts its width × height / 1,024) | synchronous 400 |
resolution not one of the allowed values (written exactly as listed) | synchronous 400 |
enable_prompt_expansion or color_match not true or false — for example the string "true" | synchronous 400 |
duration not a number from 5 to 13 — for example the string "5" | synchronous 400 |
seed not a whole number from 0 to 2147483647 — for example -1, 2147483648 or the string "0" | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one video per request) | synchronous 400 |
seconds, num_frames, frames_per_second, music_length_ms (set the length of the new scene with duration, in seconds) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body, the text in prompt) | synchronous 400 |
video, videos, video_uri (send your video as one URL in video_url) | synchronous 400 |
image_url, image_urls, image (send guide images in reference_image_urls) | synchronous 400 |
aspect_ratio, output, enable_safety_checker (Extend Video settings: not offered on Insert Video) | synchronous 400 |
reference_audio_urls, reference_video_urls, audio_url (this API takes no reference audio or reference videos) | synchronous 400 |
sync_mode, stream (results are always returned as a URL in output.media_url) | synchronous 400 |
webhook_url, webhook_mode, callback_url in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
| A video or timing the model cannot use, for example a file that is not a video | status: "ERROR" |
| A prompt, video or reference image the model refuses, for example under its content policy | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing start_time (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'start_time' is required",
"violations": [
"'start_time' is required"
]
}A resolution this operation does not offer (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'resolution' must be one of: \"480p\", \"768p\" (got \"1080p\")",
"violations": [
"'resolution' must be one of: \"480p\", \"768p\" (got \"1080p\")"
]
}A value out of range (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be >= 5 (got 4)",
"violations": [
"'duration' must be >= 5 (got 4)"
]
}More than 4 reference images (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'reference_image_urls' must have at most 4 items (got 5)",
"violations": [
"'reference_image_urls' must have at most 4 items (got 5)"
]
}An Extend Video setting sent to Insert Video (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'aspect_ratio' must be one of: (got \"16:9\"); 'aspect_ratio' is not accepted by insert-video: the scene keeps the source video's frame.",
"violations": [
"'aspect_ratio' must be one of: (got \"16:9\")",
"'aspect_ratio' is not accepted by insert-video: the scene keeps the source video's frame."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the video from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "minimax-hailuo-h3-max-edit_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-edit",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-12T10:04:54.387Z",
"completed_at": "2026-10-12 10:06:21"
}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 — minimax-hailuo-h3-max-edit for this endpoint. |
| output.media_url | array of strings | URL of the video (one MP4 file per request). |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/insert-video. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the video fromoutput.media_url.
How Billing Is Measured
Billing is measured per second of the requested duration, at the rate for the requested resolution: the amount is the per-second rate for resolution (768p when you leave it out) times duration (5 seconds when you leave it out). Only the new scene is billed, not the whole returned video. Higher resolutions cost more per second. The prompt, reference images, timing, seed, prompt expansion and color matching do not change the amount. The amount is placed as a hold when the request is submitted and released in full if the request fails. The current rate is shown in the pricing panel on this page.
MiniMax H3 Max API Pricing — Per-Second Rates
768p is the API default. 480p generates at a lower cost per second. Billed per second of the new scene — the duration you request (5 to 13 seconds), not the length of the returned video.
| Resolution | Price (USD) |
|---|---|
| 768p | $0.06/sec |
| 480p | $0.05/sec |
Relight a video with MiniMax H3 Max: send your video and an image of a sphere lit the way you want your video lit, and the model relights your video to match. You choose the resolution (resolution, 480P up to 2K) and the frame shape (aspect_ratio). There is no duration to set: billing follows the length of the returned video. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url.
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/relight-videoMiniMax H3 Max API Documentation (Video to Video (Relighting))
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 Max API (Video to Video (Relighting))
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/relight-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/lighting-sphere.png",
"resolution": "768P"
}import requests
url = "https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/relight-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/lighting-sphere.png",
"resolution": "768P"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/relight-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/lighting-sphere.png",
"resolution": "768P"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/relight-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4", "reference_image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/lighting-sphere.png", "resolution": "768P"}'Output
{
"request_id": "minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| 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-hailuo-h3-max-v2v/v1/relight-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4", "reference_image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/lighting-sphere.png", "resolution": "768P"}'Callback Payload (success)
{
"request_id": "minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-v2v",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-12T10:04:54.387Z",
"completed_at": "2026-10-12 10:06:21"
}Failure callback shape
{
"request_id": "minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max-v2v",
"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 every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - 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 |
|---|---|---|---|---|---|
video_url | Yes | string | — | One video: a publicly reachable https URL (recommended) | The video to relight, from about 2.33 to 15 seconds long. It is measured when you submit (see How Billing Is Measured). |
reference_image_url | Yes | string | — | One image: a publicly reachable https URL (recommended) | The lighting reference: an image of a sphere lit the way you want your video lit. |
resolution | No | string | "768P" | 480P, 768P, 1080P, 2K | Output resolution, written exactly as listed (capital P). Higher resolutions cost more per second. |
aspect_ratio | No | string | "16:9" | adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Frame shape of the result, written exactly as listed; 16:9 applies when you leave it out, whatever the shape of your video. It does not change the amount billed. |
seed | No | integer | Random | 0–2147483647 | Seed for the random generator; leave it out for a random seed. It does not change the amount billed. |
enable_safety_checker | No | boolean | true | true, false | Content safety screening, on by default; set it to false to turn it off. It does not change the amount billed. |
Good to know
- Each request returns one video.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per video. - There is no duration to set:
duration,seconds,num_frames,frames_per_secondandmusic_length_msare rejected. Billing follows the length of the returned video (see How Billing Is Measured). - Set the resolution with
resolution:480P,768P,1080Por2K, written exactly as listed (768P when you leave it out). - Send every field at the top level of the JSON body;
parameters,contentandtextare rejected. - Send your video as one URL in
video_url;video,videosandvideo_uriare rejected. - Send the lighting image as one URL in
reference_image_url;image_url,image_urlsandimageare rejected. - Relight Video takes no prompt and no photos of people:
prompt,reference_image_urlsandenhance_realismare rejected (they belong to the Recast Video operation). - This API takes no reference audio or reference videos:
reference_audio_urls,reference_video_urlsandaudio_urlare rejected. - Use the JSON types shown:
seedis a whole number, and the switches aretrueorfalse, not strings. - Omit a field instead of sending
null. - Results are always returned as a URL in
output.media_url;sync_modeandstreamare rejected. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_url,webhook_modeandcallback_urlin the JSON body are rejected.
Resolution and Length
Set resolution to one of the values below, written exactly as listed; 768P applies when you leave it out. There is no duration to set: you are billed per second of the returned video, at the rate for the requested resolution (see How Billing Is Measured).
| resolution | Note |
|---|---|
480P | The lowest cost per second |
768P | The default |
1080P | — |
2K | The highest cost per second |
Example: relight at 1080P
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/lighting-sphere.png",
"resolution": "1080P"
}Source Video and Lighting
- Send one video in
video_urlas a publicly reachablehttpsURL (recommended), from about 2.33 to 15 seconds long. It is downloaded and measured when you submit: a URL that cannot be downloaded, or a very large file, may be refused at once with a400, and a video longer than 30 seconds is refused at once with a400, with nothing charged. Before relighting, your video is trimmed at the end by up to about 0.7 seconds to fit the model's frame pattern, and the returned video is as long as the trimmed video. - Send the lighting in
reference_image_url: an image of a sphere lit the way you want your video lit, for example a warm light from the upper left and a cool fill from the right. aspect_ratiosets the frame shape of the result;16:9applies when you leave it out, whatever the shape of your video.
Example: a square result at 480P
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/lighting-sphere.png",
"resolution": "480P",
"aspect_ratio": "1:1"
}A video longer than 30 seconds (synchronous 400)
{
"error": "Input too long",
"message": "The source media is 40s. This API accepts inputs up to 30s — split it into shorter segments.",
"max_input_seconds": 30,
"input_seconds": 40
}Example Request
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/lighting-sphere.png",
"resolution": "768P"
}Example Response
{
"request_id": "minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-v2v_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). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is out of range or is not one of the allowed values, a field this operation does not accept was sent, or an input could not be downloaded. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. An input that cannot be downloaded is also refused at submit with a 400, and its hold is released at once: nothing is charged. A source video longer than 30 seconds is refused with a 400 before any hold is placed. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty video_url, or video_url not a string | synchronous 400 |
Missing or empty reference_image_url, or reference_image_url not a string | synchronous 400 |
A video_url or reference_image_url that cannot be downloaded when you submit, or a very large file (the hold is released at once: nothing is charged) | synchronous 400 |
A video_url longer than 30 seconds (refused before any hold: nothing is charged) | synchronous 400 |
resolution not one of the allowed values (written exactly as listed) | synchronous 400 |
aspect_ratio not one of the allowed values (written exactly as listed) | synchronous 400 |
enable_safety_checker not true or false — for example the string "true" | synchronous 400 |
seed not a whole number from 0 to 2147483647 — for example -1, 2147483648 or the string "0" | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one video per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, music_length_ms (there is no duration to set: billing follows the length of the returned video) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body) | synchronous 400 |
video, videos, video_uri (send your video as one URL in video_url) | synchronous 400 |
image_url, image_urls, image (send the lighting image in reference_image_url) | synchronous 400 |
prompt, reference_image_urls, enhance_realism (Recast Video settings: not offered on Relight Video) | synchronous 400 |
reference_audio_urls, reference_video_urls, audio_url (this API takes no reference audio or reference videos) | synchronous 400 |
sync_mode, stream (results are always returned as a URL in output.media_url) | synchronous 400 |
webhook_url, webhook_mode, callback_url in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
| A video the model cannot use, for example a file that is not a video, or one longer than 15 seconds or shorter than about 2.33 seconds | status: "ERROR" |
| A video or lighting image the model refuses, for example under its content policy | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing reference_image_url (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'reference_image_url' is required",
"violations": [
"'reference_image_url' is required"
]
}A resolution in the wrong case (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'resolution' must be one of: \"480P\", \"768P\", \"1080P\", \"2K\" (got \"768p\")",
"violations": [
"'resolution' must be one of: \"480P\", \"768P\", \"1080P\", \"2K\" (got \"768p\")"
]
}A duration sent (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'duration' must be one of: (got 5); 'duration' is not accepted. The length comes from your source video: there is nothing to set.",
"violations": [
"'duration' must be one of: (got 5)",
"'duration' is not accepted. The length comes from your source video: there is nothing to set."
]
}A seed sent as a string (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'seed' must be integer (got string)",
"violations": [
"'seed' must be integer (got string)"
]
}A Recast Video setting sent to Relight Video (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'prompt' must be one of: (got \"Warm evening light\"); 'prompt' is not accepted by relight-video: the lighting comes from 'reference_image_url'.",
"violations": [
"'prompt' must be one of: (got \"Warm evening light\")",
"'prompt' is not accepted by relight-video: the lighting comes from 'reference_image_url'."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the video from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-v2v",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-12T10:04:54.387Z",
"completed_at": "2026-10-12 10:06:21"
}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 — minimax-hailuo-h3-max-v2v for this endpoint. |
| output.media_url | array of strings | URL of the video (one MP4 file per request). |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/relight-video. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the video fromoutput.media_url.
How Billing Is Measured
Billing is measured per second of the returned video, at the rate for the requested resolution (resolution, 768P when you leave it out). There is no duration to set. When you submit, your video is measured and a hold is placed for its length in whole seconds, rounded up; when the result is delivered, the amount settles to the length of the returned video, counted the same way and never more than the hold. If your video cannot be measured, the hold covers 30 seconds and the amount still settles to the returned video. Higher resolutions cost more per second. The lighting image, frame shape, seed and safety setting do not change the amount. The hold is released in full if the request fails. The current rate is shown in the pricing panel on this page.
MiniMax H3 Max API Pricing — Per-Second Rates
768P is the API default. 480P generates at a lower cost per second; 1080P and 2K are higher-cost tiers. Billed per second of generated video — the length of your source video (up to 15 seconds).
| Resolution | Price (USD) |
|---|---|
| 768P | $0.08/sec |
| 480P | $0.05/sec |
| 1080P | $0.16/sec |
| 2K | $0.32/sec |
Recast the people in a video with MiniMax H3 Max: send your video and one photo per new person (up to 4), and the model replaces the people in your video with the people in the photos. Optionally say who becomes whom in prompt. You choose the resolution (resolution, 768P or 1080P). There is no duration to set: billing follows the length of the returned video. Asynchronous: submit returns a request_id; poll the status endpoint until the request is COMPLETED, then download the video from output.media_url.
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/recast-videoMiniMax H3 Max API Documentation (Video to Video (Character Replacement))
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 Max API (Video to Video (Character Replacement))
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/recast-video
Content-Type: application/json
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
],
"prompt": "The man in the video becomes the woman in the photo.",
"resolution": "1080P"
}import requests
url = "https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/recast-video"
headers = {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
}
data = {
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
],
"prompt": "The man in the video becomes the woman in the photo.",
"resolution": "1080P"
}
resp = requests.post(url, json=data, headers=headers)
print(resp.json())const res = await fetch("https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/recast-video", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Ocp-Apim-Subscription-Key": "YOUR_SUBSCRIPTION_KEY"
},
body: JSON.stringify({
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
],
"prompt": "The man in the video becomes the woman in the photo.",
"resolution": "1080P"
})
});
console.log(await res.json());curl -X POST 'https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/recast-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4", "reference_image_urls": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"], "prompt": "The man in the video becomes the woman in the photo.", "resolution": "1080P"}'Output
{
"request_id": "minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, you can receive a Webhook callback when the request reaches a terminal state. Provide a Webhook URL via header on the submit request.
| 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-hailuo-h3-max-v2v/v1/recast-video' \
-H 'Content-Type: application/json' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY' \
-H 'X-Webhook-URL: https://your-server.com/webhook' \
--data-raw '{"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4", "reference_image_urls": ["https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"], "prompt": "The man in the video becomes the woman in the photo.", "resolution": "1080P"}'Callback Payload (success)
{
"request_id": "minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-v2v",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-12T10:04:54.387Z",
"completed_at": "2026-10-12 10:06:21"
}Failure callback shape
{
"request_id": "minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max-v2v",
"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 every poll while the request is processing (status
PROCESSING), plus the final COMPLETED/ERROR callback. - 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 |
|---|---|---|---|---|---|
video_url | Yes | string | — | One video: a publicly reachable https URL (recommended) | The video whose people you want to replace, 5 to 30 seconds long, with no single shot longer than 15 seconds. It is measured when you submit (see How Billing Is Measured). |
reference_image_urls | Yes | array | — | 1–4 images: publicly reachable https URLs (recommended) | One photo per new person, always as a list. By default the people in the photos replace the main people in your video from left to right. |
prompt | No | string | Empty | Text, up to 2000 characters | Optional: who becomes whom, or what else to keep or change. |
resolution | No | string | "1080P" | 768P, 1080P | Output resolution, written exactly as listed (capital P). Higher resolutions cost more per second. |
seed | No | integer | Random | 0–2147483647 | Seed for the random generator; leave it out for a random seed. It does not change the amount billed. |
enhance_realism | No | boolean | false | true, false | Set it to true to ask for more natural skin and better blending of the new people into the scene. It does not change the amount billed. |
enable_safety_checker | No | boolean | true | true, false | Content safety screening, on by default; set it to false to ask for relaxed screening. It does not change the amount billed. |
Good to know
- Each request returns one video.
batch_size,num_images,number_of_images,nandcountare rejected — send one request per video. - There is no duration to set:
duration,seconds,num_frames,frames_per_secondandmusic_length_msare rejected. Billing follows the length of the returned video (see How Billing Is Measured). - Set the resolution with
resolution:768Por1080P, written exactly as listed (1080P when you leave it out). - Send every field at the top level of the JSON body;
parameters,contentandtextare rejected. - Send your video as one URL in
video_url;video,videosandvideo_uriare rejected. - Send the photos in
reference_image_urls, as a list even for one photo;image_url,image_urlsandimageare rejected. - Recast Video has no frame-shape or lighting setting:
aspect_ratioandreference_image_urlare rejected (they belong to the Relight Video operation). - This API takes no reference audio or reference videos:
reference_audio_urls,reference_video_urlsandaudio_urlare rejected. - Use the JSON types shown:
seedis a whole number, and the switches aretrueorfalse, not strings. - Omit a field instead of sending
null. - Results are always returned as a URL in
output.media_url;sync_modeandstreamare rejected. - Webhooks are set with the
X-Webhook-URL/X-Webhook-Modeheaders;webhook_url,webhook_modeandcallback_urlin the JSON body are rejected.
Resolution and Length
Set resolution to one of the values below, written exactly as listed; 1080P applies when you leave it out. There is no duration to set: you are billed per second of the returned video, at the rate for the requested resolution (see How Billing Is Measured).
| resolution | Note |
|---|---|
768P | The lower cost per second |
1080P | The default |
Example: recast at 768P
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
],
"resolution": "768P"
}Source Video and People
- Send one video in
video_urlas a publicly reachablehttpsURL (recommended), 5 to 30 seconds long, with no single shot longer than 15 seconds. It is downloaded and measured when you submit: a URL that cannot be downloaded, or a very large file, may be refused at once with a400, and a video longer than 30 seconds is refused at once with a400, with nothing charged. The returned video is as long as your video. - Send one photo per new person in
reference_image_urls(1 to 4 photos, always as a list). By default the people in the photos replace the main people in your video from left to right. - Optionally say who becomes whom, or what else to keep or change, in
prompt(up to 2000 characters). enhance_realism(off by default) asks for more natural skin and better blending of the new people into the scene.
Example: say who becomes whom, with enhance_realism
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
],
"prompt": "The man in the video becomes the woman in the photo; keep his clothes and the room as they are.",
"enhance_realism": true,
"resolution": "1080P"
}A video longer than 30 seconds (synchronous 400)
{
"error": "Input too long",
"message": "The source media is 40s. This API accepts inputs up to 30s — split it into shorter segments.",
"max_input_seconds": 30,
"input_seconds": 40
}Example Request
{
"video_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/video/input-5s.mp4",
"reference_image_urls": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
],
"prompt": "The man in the video becomes the woman in the photo.",
"resolution": "1080P"
}Example Response
{
"request_id": "minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-v2v_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). |
| X-Webhook-Mode | No | terminal (default) or sync (see Webhook section). |
Response Handling
| Status Code | Meaning |
|---|---|
| 202 | Accepted — request queued; returns request_id and polling_url. |
| 400 | Invalid request — a required field is missing, a value has the wrong type, is out of range or is not one of the allowed values, a field this operation does not accept was sent, or an input could not be downloaded. The message says what to fix. |
| 401 | Unauthorized — missing or invalid subscription key. |
| 402 | Insufficient balance for the hold this request needs. |
| 429 | Too many requests. |
| 500 | Internal server error. |
Parameter problems are caught when you submit and returned as a 400, before any hold is placed on your balance. An input that cannot be downloaded is also refused at submit with a 400, and its hold is released at once: nothing is charged. A source video longer than 30 seconds is refused with a 400 before any hold is placed. Problems that need the model to run are reported through the status endpoint as status: "ERROR", with a message in error saying what went wrong. Failed requests are not billed — the hold is released in full.
| Condition | How it surfaces |
|---|---|
| Missing or invalid subscription key | synchronous 401 |
| Balance too low for the hold | synchronous 402 |
Missing or empty video_url, or video_url not a string | synchronous 400 |
Missing or empty reference_image_urls, or reference_image_urls not a list or more than 4 items | synchronous 400 |
A video_url or reference_image_urls entry that cannot be downloaded when you submit, or a very large file (the hold is released at once: nothing is charged) | synchronous 400 |
A video_url longer than 30 seconds (refused before any hold: nothing is charged) | synchronous 400 |
prompt not a string, or longer than 2000 characters | synchronous 400 |
resolution not one of the allowed values (written exactly as listed) | synchronous 400 |
enable_safety_checker or enhance_realism not true or false — for example the string "true" | synchronous 400 |
seed not a whole number from 0 to 2147483647 — for example -1, 2147483648 or the string "0" | synchronous 400 |
batch_size, num_images, number_of_images, n, count (one video per request) | synchronous 400 |
duration, seconds, num_frames, frames_per_second, music_length_ms (there is no duration to set: billing follows the length of the returned video) | synchronous 400 |
parameters, content, text (send the fields at the top level of the JSON body) | synchronous 400 |
video, videos, video_uri (send your video as one URL in video_url) | synchronous 400 |
image_url, image_urls, image (send the photos in reference_image_urls) | synchronous 400 |
aspect_ratio, reference_image_url (Relight Video settings: not offered on Recast Video) | synchronous 400 |
reference_audio_urls, reference_video_urls, audio_url (this API takes no reference audio or reference videos) | synchronous 400 |
sync_mode, stream (results are always returned as a URL in output.media_url) | synchronous 400 |
webhook_url, webhook_mode, callback_url in the JSON body (use the X-Webhook-URL / X-Webhook-Mode headers) | synchronous 400 |
| A video the model cannot use, for example a file that is not a video, one shorter than 5 seconds, or one with a single shot longer than 15 seconds | status: "ERROR" |
| A video or photo the model refuses, for example under its content policy | status: "ERROR" |
Example error responses
A refused request returns error, a message that joins every problem found, and the same problems one by one in violations.
Missing reference_image_urls (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'reference_image_urls' is required",
"violations": [
"'reference_image_urls' is required"
]
}A resolution this operation does not offer (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'resolution' must be one of: \"768P\", \"1080P\" (got \"480P\")",
"violations": [
"'resolution' must be one of: \"768P\", \"1080P\" (got \"480P\")"
]
}More than 4 photos (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'reference_image_urls' must have at most 4 items (got 5)",
"violations": [
"'reference_image_urls' must have at most 4 items (got 5)"
]
}One photo sent as a string instead of a list (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'reference_image_urls' must be array (got string)",
"violations": [
"'reference_image_urls' must be array (got string)"
]
}A Relight Video setting sent to Recast Video (synchronous 400)
{
"error": "Invalid request parameters",
"message": "'aspect_ratio' must be one of: (got \"16:9\"); 'aspect_ratio' is not accepted by recast-video. Remove the field from the request.",
"violations": [
"'aspect_ratio' must be one of: (got \"16:9\")",
"'aspect_ratio' is not accepted by recast-video. Remove the field from the request."
]
}Retrieving Results
Poll the status endpoint with the request_id from the submit response until status is COMPLETED or ERROR, then download the video from output.media_url. Treat any status other than QUEUED, PROCESSING or COMPLETED as a failure.
Endpoint
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}
Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEYcURL example
curl 'https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' \
-H 'Ocp-Apim-Subscription-Key: YOUR_SUBSCRIPTION_KEY'Completed response
{
"request_id": "minimax-hailuo-h3-max-v2v_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-v2v",
"error": null,
"output": {
"media_url": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/{request_id}/output.mp4"
],
"media_type": "video/mp4"
},
"created_at": "2026-10-12T10:04:54.387Z",
"completed_at": "2026-10-12 10:06:21"
}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 — minimax-hailuo-h3-max-v2v for this endpoint. |
| output.media_url | array of strings | URL of the video (one MP4 file per request). |
| output.media_type | string | video/mp4. |
| created_at | string | Request creation timestamp. |
| completed_at | string | Completion timestamp. |
| error | string | Error message when status is ERROR. |
| polling_url | string | Status URL for this request (submit response only). |
Status Values & Flow
QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).
Typical workflow
- Send the request to
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/recast-video. - Save the
request_idfrom the202response. - Poll
GET /v2/requests/status/{request_id}every 10 seconds or so, or use a Webhook instead. - When
statusisCOMPLETED, download the video fromoutput.media_url.
How Billing Is Measured
Billing is measured per second of the returned video, at the rate for the requested resolution (resolution, 1080P when you leave it out). There is no duration to set. When you submit, your video is measured and a hold is placed for its length in whole seconds, rounded up; when the result is delivered, the amount settles to the length of the returned video, counted the same way and never more than the hold. If your video cannot be measured, the hold covers 30 seconds and the amount still settles to the returned video. Higher resolutions cost more per second. The number of photos, the prompt, the seed, the realism setting and the safety setting do not change the amount. The hold is released in full if the request fails. The current rate is shown in the pricing panel on this page.
MiniMax H3 Max API Pricing — Per-Second Rates
1080P is the API default; 768P costs less per second. Billed per second of output video — the length of your source video (5 to 30 seconds); reference photos carry no extra charge.
| Resolution | Price (USD) |
|---|---|
| 1080P | $0.45/sec |
| 768P | $0.30/sec |
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/text-to-videoMiniMax H3 Max Turbo API Documentation (Text to Video)
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 Max Turbo API (Text to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/text-to-video HTTP/1.1
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Content-Type: application/json
{
"prompt": "a lone lighthouse beam sweeping across fog at dusk",
"duration": 5,
"resolution": "768P",
"aspect_ratio": "16:9",
"prompt_expansion_mode": "balanced"
}import requests
resp = requests.post(
"https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/text-to-video",
headers={
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"prompt": "a lone lighthouse beam sweeping across fog at dusk",
"duration": 5,
"resolution": "768P",
"aspect_ratio": "16:9",
"prompt_expansion_mode": "balanced"
},
)
job = resp.json()
print(job["request_id"])const resp = await fetch("https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/text-to-video", {
method: "POST",
headers: {
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "a lone lighthouse beam sweeping across fog at dusk",
"duration": 5,
"resolution": "768P",
"aspect_ratio": "16:9",
"prompt_expansion_mode": "balanced"
}),
});
const job = await resp.json();
console.log(job.request_id);curl -X POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/text-to-video \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "a lone lighthouse beam sweeping across fog at dusk", "duration": 5, "resolution": "768P", "aspect_ratio": "16:9", "prompt_expansion_mode": "balanced"}'Output
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, supply a callback URL and Pixazo will POST the result to it as soon as the request reaches a terminal state.
| Header | Type | Required | Description |
|---|---|---|---|
| X-Webhook-URL | string | No | HTTPS endpoint that receives the callback. Supplying it enables webhook delivery. |
| X-Webhook-Mode | string | No | terminal (default) delivers once on COMPLETED or FAILED. sync also delivers intermediate status changes. |
Example: enable webhook
curl -X POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/text-to-video \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "X-Webhook-URL: https://your-server.example.com/hooks/video" \
-H "X-Webhook-Mode: terminal" \
-d '{"prompt": "a lone lighthouse beam sweeping across fog at dusk", "prompt_expansion_mode": "balanced"}'Callback Payload
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-turbo",
"error": null,
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4",
"media_type": "video/mp4"
},
"created_at": "2026-08-27T09:42:17.774Z",
"completed_at": "2026-08-27T09:45:02.118Z"
}Failure callback shape
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max-turbo",
"error": "Generation failed upstream",
"output": null
}Delivery semantics
terminalfires exactly once, on COMPLETED or FAILED.syncalso fires on intermediate transitions such as QUEUED → PROCESSING.- Deliveries are idempotent on
request_id— de-duplicate on it, as a callback may be retried. - Respond
200within a few seconds; slow endpoints are treated as failed deliveries. - HTTPS is required.
Request Parameters - MiniMax H3 Max Turbo API (Text to Video)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Any text, up to 50,000 characters | Description of the video to generate. |
duration | No | integer | 5 | 5 – 15 | Length of the finished video in seconds. Billed per second. |
resolution | No | string | 768P | 480P, 768P, 1080P | Output resolution. Determines the per-second price — 480P generates at a lower cost per second than 768P, and 1080P at a higher cost per second than 768P. 480P and 768P are native generation resolutions; 1080P is produced by latent refinement from a native 768P source. See the pricing table for current rates. |
aspect_ratio | No | string | 16:9 | 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | Frame shape of the output video. |
prompt_expansion_mode | Yes | string | balanced | disabled, balanced, quality | How much the prompt is rewritten before generation. disabled uses your wording verbatim; balanced adds about a second; quality spends up to ~30s building a richer prompt. |
enable_safety_checker | No | boolean | true | true, false | Runs the content safety check over the generated video. |
seed | No | integer | — (random) | Any integer | Reusing a seed gives a fixed starting point for comparing two runs of the same brief. The prompt is rewritten before generation, so a repeated seed is a reference point rather than a guarantee of an identical video. |
Example Request
{
"prompt": "a lone lighthouse beam sweeping across fog at dusk",
"prompt_expansion_mode": "balanced"
}Response
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Value | Required |
|---|---|---|
| Ocp-Apim-Subscription-Key | YOUR_API_KEY | Yes |
| Content-Type | application/json | Yes |
| X-Webhook-URL | https://your-server.example.com/hooks/video | No |
| X-Webhook-Mode | terminal | sync | No |
Response Handling
| Code | Meaning | What to do |
|---|---|---|
| 202 | Accepted and queued | Read request_id and poll the status endpoint. |
| 400 | Invalid request body or parameter value | Check the parameter table above; the message names the offending field. |
| 401 | Missing or invalid subscription key | Check the Ocp-Apim-Subscription-Key header. |
| 402 | Insufficient wallet balance | Top up. The message names the resolved price for this request. |
| 403 | Key not subscribed to this product | Subscribe the key to the API product. |
| 429 | Rate limit exceeded | Back off and retry; the limit is 50 calls per 60 seconds. |
| 500 | Server error | Retry once; if it persists, contact support with the request_id. |
Error Responses
Insufficient balance (402)
{
"error": "Insufficient balance",
"required": 0.4,
"available": 0.12,
"currency": "USD"
}Invalid parameter (400)
{
"error": "Invalid value for 'duration': must be between 5 and 15"
}Failure after acceptance
A request that was accepted can still fail during generation. That is reported through the status endpoint or the webhook, with status set to ERROR:
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max-turbo",
"error": "Generation failed upstream",
"output": null
}Retrieving Results
Poll the status endpoint with the request_id returned by the submit call.
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}cURL Example
curl https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY"Response (Completed)
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-turbo",
"error": null,
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4",
"media_type": "video/mp4"
},
"created_at": "2026-08-27T09:42:17.774Z",
"completed_at": "2026-08-27T09:45:02.118Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Identifier for this request. Use it to poll and to de-duplicate webhooks. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED or ERROR. |
| model_id | string | Always minimax-hailuo-h3-max-turbo. |
| error | string | null | Failure reason, null while the request is healthy. |
| output.media_url | string | URL of the finished MP4, re-hosted by Pixazo. |
| output.media_type | string | Always video/mp4. |
| created_at | string | ISO-8601 timestamp of submission. |
| completed_at | string | ISO-8601 timestamp of the terminal transition. |
| polling_url | string | Fully-formed status URL for this request. |
Status Values
| Status | Terminal | Meaning |
|---|---|---|
| QUEUED | No | Accepted and waiting for a generation slot. |
| PROCESSING | No | Generation is running. |
| COMPLETED | Yes | Finished. output.media_url holds the video. |
| FAILED | Yes | Generation failed. Not billed. |
| ERROR | Yes | The request could not be processed. Not billed. |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
-> FAILED
-> ERRORTypical Workflow
- POST the request body to
https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/text-to-video. - Read
request_idfrom the 202 response. - Poll
https://gateway.pixazo.ai/v2/requests/status/{request_id}every few seconds, or wait for the webhook. - On COMPLETED, download
output.media_url.
MiniMax H3 Max Turbo API Pricing — Per-Second Rates
768P is the API default. 480P generates at a lower cost per second; 1080P is a higher-cost tier, refined from a native 768P render.
| Resolution | Price (USD) |
|---|---|
| 768P | $0.04/sec |
| 480P | $0.025/sec |
| 1080P | $0.08/sec |
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/image-to-videoMiniMax H3 Max Turbo API Documentation (Image to Video)
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 Max Turbo API (Image to Video)
Request Code
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/image-to-video HTTP/1.1
Ocp-Apim-Subscription-Key: YOUR_API_KEY
Content-Type: application/json
{
"prompt": "the camera slowly pushes in as rain begins to fall",
"image_url": "https://your-cdn.example.com/first-frame.jpg",
"duration": 5,
"resolution": "768P",
"prompt_expansion_mode": "balanced"
}import requests
resp = requests.post(
"https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/image-to-video",
headers={
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"prompt": "the camera slowly pushes in as rain begins to fall",
"image_url": "https://your-cdn.example.com/first-frame.jpg",
"duration": 5,
"resolution": "768P",
"prompt_expansion_mode": "balanced"
},
)
job = resp.json()
print(job["request_id"])const resp = await fetch("https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/image-to-video", {
method: "POST",
headers: {
"Ocp-Apim-Subscription-Key": "YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "the camera slowly pushes in as rain begins to fall",
"image_url": "https://your-cdn.example.com/first-frame.jpg",
"duration": 5,
"resolution": "768P",
"prompt_expansion_mode": "balanced"
}),
});
const job = await resp.json();
console.log(job.request_id);curl -X POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/image-to-video \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "the camera slowly pushes in as rain begins to fall", "image_url": "https://your-cdn.example.com/first-frame.jpg", "duration": 5, "resolution": "768P", "prompt_expansion_mode": "balanced"}'Output
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Webhook (Optional)
Instead of polling, supply a callback URL and Pixazo will POST the result to it as soon as the request reaches a terminal state.
| Header | Type | Required | Description |
|---|---|---|---|
| X-Webhook-URL | string | No | HTTPS endpoint that receives the callback. Supplying it enables webhook delivery. |
| X-Webhook-Mode | string | No | terminal (default) delivers once on COMPLETED or FAILED. sync also delivers intermediate status changes. |
Example: enable webhook
curl -X POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/image-to-video \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "X-Webhook-URL: https://your-server.example.com/hooks/video" \
-H "X-Webhook-Mode: terminal" \
-d '{"prompt": "the camera slowly pushes in", "image_url": "https://your-cdn.example.com/first-frame.jpg", "prompt_expansion_mode": "balanced"}'Callback Payload
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-turbo",
"error": null,
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4",
"media_type": "video/mp4"
},
"created_at": "2026-08-27T09:42:17.774Z",
"completed_at": "2026-08-27T09:45:02.118Z"
}Failure callback shape
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max-turbo",
"error": "Generation failed upstream",
"output": null
}Delivery semantics
terminalfires exactly once, on COMPLETED or FAILED.syncalso fires on intermediate transitions such as QUEUED → PROCESSING.- Deliveries are idempotent on
request_id— de-duplicate on it, as a callback may be retried. - Respond
200within a few seconds; slow endpoints are treated as failed deliveries. - HTTPS is required.
Request Parameters - MiniMax H3 Max Turbo API (Image to Video)
| Parameter | Required | Type | Default | Allowed values / range | Description |
|---|---|---|---|---|---|
prompt | Yes | string | — | Any text, up to 50,000 characters | Description of the video to generate. |
image_url | Yes | string | — | Public https URL of an image | First frame of the video. The output aspect ratio follows this image, so there is no aspect_ratio parameter on this operation. |
end_image_url | No | string | — (none) | Public https URL of an image | Optional last frame. Supply it to generate a first-to-last keyframe transition. |
duration | No | integer | 5 | 5 – 15 | Length of the finished video in seconds. Billed per second. |
resolution | No | string | 768P | 480P, 768P, 1080P | Output resolution. Determines the per-second price — 480P generates at a lower cost per second than 768P, and 1080P at a higher cost per second than 768P. 480P and 768P are native generation resolutions; 1080P is produced by latent refinement from a native 768P source. See the pricing table for current rates. |
prompt_expansion_mode | Yes | string | balanced | disabled, balanced, quality | How much the prompt is rewritten before generation. disabled uses your wording verbatim; balanced adds about a second; quality spends up to ~30s building a richer prompt. |
enable_safety_checker | No | boolean | true | true, false | Runs the content safety check over the generated video. |
seed | No | integer | — (random) | Any integer | Reusing a seed gives a fixed starting point for comparing two runs of the same brief. The prompt is rewritten before generation, so a repeated seed is a reference point rather than a guarantee of an identical video. |
Example Request
{
"prompt": "the camera slowly pushes in",
"image_url": "https://your-cdn.example.com/first-frame.jpg",
"prompt_expansion_mode": "balanced"
}Response
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "QUEUED",
"polling_url": "https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}Request Headers
| Header | Value | Required |
|---|---|---|
| Ocp-Apim-Subscription-Key | YOUR_API_KEY | Yes |
| Content-Type | application/json | Yes |
| X-Webhook-URL | https://your-server.example.com/hooks/video | No |
| X-Webhook-Mode | terminal | sync | No |
Response Handling
| Code | Meaning | What to do |
|---|---|---|
| 202 | Accepted and queued | Read request_id and poll the status endpoint. |
| 400 | Invalid request body or parameter value | Check the parameter table above; the message names the offending field. |
| 401 | Missing or invalid subscription key | Check the Ocp-Apim-Subscription-Key header. |
| 402 | Insufficient wallet balance | Top up. The message names the resolved price for this request. |
| 403 | Key not subscribed to this product | Subscribe the key to the API product. |
| 429 | Rate limit exceeded | Back off and retry; the limit is 50 calls per 60 seconds. |
| 500 | Server error | Retry once; if it persists, contact support with the request_id. |
Error Responses
Insufficient balance (402)
{
"error": "Insufficient balance",
"required": 0.4,
"available": 0.12,
"currency": "USD"
}Invalid parameter (400)
{
"error": "Invalid value for 'duration': must be between 5 and 15"
}Failure after acceptance
A request that was accepted can still fail during generation. That is reported through the status endpoint or the webhook, with status set to ERROR:
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "ERROR",
"model_id": "minimax-hailuo-h3-max-turbo",
"error": "Generation failed upstream",
"output": null
}Retrieving Results
Poll the status endpoint with the request_id returned by the submit call.
GET https://gateway.pixazo.ai/v2/requests/status/{request_id}cURL Example
curl https://gateway.pixazo.ai/v2/requests/status/minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
-H "Ocp-Apim-Subscription-Key: YOUR_API_KEY"Response (Completed)
{
"request_id": "minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "COMPLETED",
"model_id": "minimax-hailuo-h3-max-turbo",
"error": null,
"output": {
"media_url": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/v1/minimax-hailuo-h3-max-turbo_019dxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/output.mp4",
"media_type": "video/mp4"
},
"created_at": "2026-08-27T09:42:17.774Z",
"completed_at": "2026-08-27T09:45:02.118Z"
}Response Fields
| Field | Type | Description |
|---|---|---|
| request_id | string | Identifier for this request. Use it to poll and to de-duplicate webhooks. |
| status | string | QUEUED, PROCESSING, COMPLETED, FAILED or ERROR. |
| model_id | string | Always minimax-hailuo-h3-max-turbo. |
| error | string | null | Failure reason, null while the request is healthy. |
| output.media_url | string | URL of the finished MP4, re-hosted by Pixazo. |
| output.media_type | string | Always video/mp4. |
| created_at | string | ISO-8601 timestamp of submission. |
| completed_at | string | ISO-8601 timestamp of the terminal transition. |
| polling_url | string | Fully-formed status URL for this request. |
Status Values
| Status | Terminal | Meaning |
|---|---|---|
| QUEUED | No | Accepted and waiting for a generation slot. |
| PROCESSING | No | Generation is running. |
| COMPLETED | Yes | Finished. output.media_url holds the video. |
| FAILED | Yes | Generation failed. Not billed. |
| ERROR | Yes | The request could not be processed. Not billed. |
Status Flow
QUEUED -> PROCESSING -> COMPLETED
-> FAILED
-> ERRORTypical Workflow
- POST the request body to
https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/image-to-video. - Read
request_idfrom the 202 response. - Poll
https://gateway.pixazo.ai/v2/requests/status/{request_id}every few seconds, or wait for the webhook. - On COMPLETED, download
output.media_url.
MiniMax H3 Max Turbo API Pricing — Per-Second Rates
768P is the API default. 480P generates at a lower cost per second; 1080P is a higher-cost tier, refined from a native 768P render.
| Resolution | Price (USD) |
|---|---|
| 768P | $0.04/sec |
| 480P | $0.025/sec |
| 1080P | $0.08/sec |
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
minimax-music-3-0) instead — same request and response shape.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 — Per-Second Rates
2K is the API default. 768P generates at a lower cost per second.
| Resolution | Price (USD) |
|---|---|
| 2K | $0.13/sec |
| 768P | $0.08/sec |
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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.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 — Per-Second Rates
2K is the API default. 768P generates at a lower cost per second.
| Resolution | Price (USD) |
|---|---|
| 2K | $0.13/sec |
| 768P | $0.08/sec |
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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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 — Per-Second Rates
2K is the API default. 768P generates at a lower cost per second.
| Resolution | Price (USD) |
|---|---|
| 2K | $0.13/sec |
| 768P | $0.08/sec |
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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"last_frame_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"last_frame_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"last_frame_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"last_frame_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"last_frame_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png",
"last_frame_image": "https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f2.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 — Per-Second Rates
2K is the API default. 768P generates at a lower cost per second.
| Resolution | Price (USD) |
|---|---|
| 2K | $0.13/sec |
| 768P | $0.08/sec |
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://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
]
}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://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
]
},
)
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://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
]
}),
}
);
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://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
]
}'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://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg"
]
}'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://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/images/input.jpg",
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/f1.png"
],
"reference_audios": [
"https://pub-582b7213209642b9b995c96c95a30381.r2.dev/doc-assets/audio/speech-17s.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 — Per-Second Rates
2K is the API default. 768P generates at a lower cost per second.
| Resolution | Price (USD) |
|---|---|
| 2K | $0.13/sec |
| 768P | $0.08/sec |
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 API HD 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 API Turbo 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.