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.

Get API Key
MiniMax AI API

Models Version

WELCOME BONUS

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

Claim Your Bonus →
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/text-to-video

MiniMax H3 Max API Documentation (Text to Video)

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderTypeRequiredDescription
X-Webhook-URLstringNoHTTPS endpoint that receives the callback. Supplying it enables webhook delivery.
X-Webhook-ModestringNoterminal (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

  • terminal fires exactly once, on COMPLETED or FAILED.
  • sync also 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 200 within a few seconds; slow endpoints are treated as failed deliveries.
  • HTTPS is required.

Request Parameters - MiniMax H3 Max API (Text to Video)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Any text, up to 50,000 charactersDescription of the video to generate.
durationNointeger55 – 15Length of the finished video in seconds. Billed per second.
resolutionNostring768P480P, 768P, 1080POutput 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_ratioNostring16:921:9, 16:9, 4:3, 1:1, 3:4, 9:16Frame shape of the output video.
prompt_expansion_modeYesstringbalanceddisabled, balanced, qualityHow 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_checkerNobooleantruetrue, falseRuns the content safety check over the generated video.
seedNointeger— (random)Any integerReusing 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

HeaderValueRequired
Ocp-Apim-Subscription-KeyYOUR_API_KEYYes
Content-Typeapplication/jsonYes
X-Webhook-URLhttps://your-server.example.com/hooks/videoNo
X-Webhook-Modeterminal | syncNo

Response Handling

CodeMeaningWhat to do
202Accepted and queuedRead request_id and poll the status endpoint.
400Invalid request body or parameter valueCheck the parameter table above; the message names the offending field.
401Missing or invalid subscription keyCheck the Ocp-Apim-Subscription-Key header.
402Insufficient wallet balanceTop up. The message names the resolved price for this request.
403Key not subscribed to this productSubscribe the key to the API product.
429Rate limit exceededBack off and retry; the limit is 50 calls per 60 seconds.
500Server errorRetry 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

FieldTypeDescription
request_idstringIdentifier for this request. Use it to poll and to de-duplicate webhooks.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED or ERROR.
model_idstringAlways minimax-hailuo-h3-max.
errorstring | nullFailure reason, null while the request is healthy.
output.media_urlstringURL of the finished MP4, re-hosted by Pixazo.
output.media_typestringAlways video/mp4.
created_atstringISO-8601 timestamp of submission.
completed_atstringISO-8601 timestamp of the terminal transition.
polling_urlstringFully-formed status URL for this request.

Status Values

StatusTerminalMeaning
QUEUEDNoAccepted and waiting for a generation slot.
PROCESSINGNoGeneration is running.
COMPLETEDYesFinished. output.media_url holds the video.
FAILEDYesGeneration failed. Not billed.
ERRORYesThe request could not be processed. Not billed.

Status Flow

QUEUED -> PROCESSING -> COMPLETED
                     -> FAILED
                     -> ERROR

Typical Workflow

  1. POST the request body to https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/text-to-video.
  2. Read request_id from the 202 response.
  3. Poll https://gateway.pixazo.ai/v2/requests/status/{request_id} every few seconds, or wait for the webhook.
  4. 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.

ResolutionPrice (USD)
768P$0.08/sec
480P$0.05/sec
1080P$0.16/sec
Image to Video
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/image-to-video

MiniMax H3 Max API Documentation (Image to Video)

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderTypeRequiredDescription
X-Webhook-URLstringNoHTTPS endpoint that receives the callback. Supplying it enables webhook delivery.
X-Webhook-ModestringNoterminal (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

  • terminal fires exactly once, on COMPLETED or FAILED.
  • sync also 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 200 within a few seconds; slow endpoints are treated as failed deliveries.
  • HTTPS is required.

Request Parameters - MiniMax H3 Max API (Image to Video)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Any text, up to 50,000 charactersDescription of the video to generate.
image_urlYesstring—Public https URL of an imageFirst frame of the video. The output aspect ratio follows this image, so there is no aspect_ratio parameter on this operation.
end_image_urlNostring— (none)Public https URL of an imageOptional last frame. Supply it to generate a first-to-last keyframe transition.
durationNointeger55 – 15Length of the finished video in seconds. Billed per second.
resolutionNostring768P480P, 768P, 1080POutput 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_modeYesstringbalanceddisabled, balanced, qualityHow 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_checkerNobooleantruetrue, falseRuns the content safety check over the generated video.
seedNointeger— (random)Any integerReusing 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

HeaderValueRequired
Ocp-Apim-Subscription-KeyYOUR_API_KEYYes
Content-Typeapplication/jsonYes
X-Webhook-URLhttps://your-server.example.com/hooks/videoNo
X-Webhook-Modeterminal | syncNo

Response Handling

CodeMeaningWhat to do
202Accepted and queuedRead request_id and poll the status endpoint.
400Invalid request body or parameter valueCheck the parameter table above; the message names the offending field.
401Missing or invalid subscription keyCheck the Ocp-Apim-Subscription-Key header.
402Insufficient wallet balanceTop up. The message names the resolved price for this request.
403Key not subscribed to this productSubscribe the key to the API product.
429Rate limit exceededBack off and retry; the limit is 50 calls per 60 seconds.
500Server errorRetry 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

FieldTypeDescription
request_idstringIdentifier for this request. Use it to poll and to de-duplicate webhooks.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED or ERROR.
model_idstringAlways minimax-hailuo-h3-max.
errorstring | nullFailure reason, null while the request is healthy.
output.media_urlstringURL of the finished MP4, re-hosted by Pixazo.
output.media_typestringAlways video/mp4.
created_atstringISO-8601 timestamp of submission.
completed_atstringISO-8601 timestamp of the terminal transition.
polling_urlstringFully-formed status URL for this request.

Status Values

StatusTerminalMeaning
QUEUEDNoAccepted and waiting for a generation slot.
PROCESSINGNoGeneration is running.
COMPLETEDYesFinished. output.media_url holds the video.
FAILEDYesGeneration failed. Not billed.
ERRORYesThe request could not be processed. Not billed.

Status Flow

QUEUED -> PROCESSING -> COMPLETED
                     -> FAILED
                     -> ERROR

Typical Workflow

  1. POST the request body to https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/image-to-video.
  2. Read request_id from the 202 response.
  3. Poll https://gateway.pixazo.ai/v2/requests/status/{request_id} every few seconds, or wait for the webhook.
  4. 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.

ResolutionPrice (USD)
768P$0.08/sec
480P$0.05/sec
1080P$0.16/sec
Reference to Video
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/reference-to-video

MiniMax H3 Max API Documentation (Reference to Video)

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderTypeRequiredDescription
X-Webhook-URLstringNoHTTPS endpoint that receives the callback. Supplying it enables webhook delivery.
X-Webhook-ModestringNoterminal (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

  • terminal fires exactly once, on COMPLETED or FAILED.
  • sync also 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 200 within a few seconds; slow endpoints are treated as failed deliveries.
  • HTTPS is required.

Request Parameters - MiniMax H3 Max API (Reference to Video)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Any text, up to 50,000 charactersDescription of the video to generate.
reference_image_urlsNoarray of string— (none)Up to 4 public https image URLsSubject 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_ratioNostringadaptiveadaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16Aspect ratio of the generated video. adaptive is the default for this operation; the other values request a fixed frame shape.
durationNointeger55 – 15Length of the finished video in seconds. Billed per second.
resolutionNostring768P480P, 768P, 1080POutput 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_modeYesstringbalanceddisabled, balanced, qualityHow 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_checkerNobooleantruetrue, falseRuns the content safety check over the generated video.
seedNointeger— (random)Any integerReusing 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

HeaderValueRequired
Ocp-Apim-Subscription-KeyYOUR_API_KEYYes
Content-Typeapplication/jsonYes
X-Webhook-URLhttps://your-server.example.com/hooks/videoNo
X-Webhook-Modeterminal | syncNo

Response Handling

CodeMeaningWhat to do
202Accepted and queuedRead request_id and poll the status endpoint.
400Invalid request body or parameter valueCheck the parameter table above; the message names the offending field.
401Missing or invalid subscription keyCheck the Ocp-Apim-Subscription-Key header.
402Insufficient wallet balanceTop up. The message names the resolved price for this request.
403Key not subscribed to this productSubscribe the key to the API product.
429Rate limit exceededBack off and retry; the limit is 50 calls per 60 seconds.
500Server errorRetry 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

FieldTypeDescription
request_idstringIdentifier for this request. Use it to poll and to de-duplicate webhooks.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED or ERROR.
model_idstringAlways minimax-hailuo-h3-max.
errorstring | nullFailure reason, null while the request is healthy.
output.media_urlstringURL of the finished MP4, re-hosted by Pixazo.
output.media_typestringAlways video/mp4.
created_atstringISO-8601 timestamp of submission.
completed_atstringISO-8601 timestamp of the terminal transition.
polling_urlstringFully-formed status URL for this request.

Status Values

StatusTerminalMeaning
QUEUEDNoAccepted and waiting for a generation slot.
PROCESSINGNoGeneration is running.
COMPLETEDYesFinished. output.media_url holds the video.
FAILEDYesGeneration failed. Not billed.
ERRORYesThe request could not be processed. Not billed.

Status Flow

QUEUED -> PROCESSING -> COMPLETED
                     -> FAILED
                     -> ERROR

Typical Workflow

  1. POST the request body to https://gateway.pixazo.ai/minimax-hailuo-h3-max/v1/reference-to-video.
  2. Read request_id from the 202 response.
  3. Poll https://gateway.pixazo.ai/v2/requests/status/{request_id} every few seconds, or wait for the webhook.
  4. 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.

ResolutionPrice (USD)
768P$0.12/sec
480P$0.09/sec
1080P$0.20/sec
Audio to Video (Ref Audio + Ref Image to Video) - Lipsync

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-video

MiniMax H3 Max API Documentation (Audio to Video (Ref Audio + Ref Image to Video) - Lipsync)

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within 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)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
image_urlYesstring—Public http(s) URL of an image; aspect ratio 0.4–2.5The 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_urlYesstring—Public http(s) URL of an audio file, at least 5 seconds longThe 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.
resolutionNostring768P480P, 768P, 1080P, 2KOutput resolution. Uses the supported aspect ratio nearest the image. Selects the per-second rate — see the pricing panel on this page.
enable_transcriptionNobooleantruetrue, falseTranscribe the supplied audio to guide lip synchronisation. When false, the mouth is synchronised to the audio without a transcript.
enable_safety_checkerNobooleantruetrue, falseEnables the content safety checks. A request flagged by them fails after acceptance (see Response Handling).
seedNointeger— (random)0–2147483647Random seed. Repeating a request with the same seed and inputs gives a more consistent result, but exact reproducibility is not guaranteed.
  • image_url and audio_url are the only required fields. Both must be public http(s) URLs that stay reachable until the request has been processed.
  • There is no duration parameter. 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_id in 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).
X-Webhook-ModeNoterminal (default) or sync.

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs (the message names the amount).
403Key not subscribed to this product.
429Too many requests — back off and retry.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing image_url or audio_urlsynchronous 400
resolution not one of 480P, 768P, 1080P, 2Ksynchronous 400
image_url or audio_url not a string, enable_transcription or enable_safety_checker not a boolean, or seed not an integersynchronous 400
image_url or audio_url not a public http(s) URL, not downloadable, or not an image / audio filestatus: "ERROR"
Audio shorter than 5 secondsstatus: "ERROR"
Image aspect ratio outside 0.4–2.5status: "ERROR"
Input or output flagged by the safety checkerstatus: "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

FieldTypeDescription
request_idstringUnique request identifier. Use it to poll and to de-duplicate webhooks.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR.
model_idstringThe model that handled the request — minimax-hailuo-h3-max-lip-sync for this endpoint.
errorstring | nullFailure reason; null while the request is healthy.
output.media_urlarray of stringsURL of the finished video, an MP4 with the audio as its soundtrack, re-hosted by Pixazo.
output.media_typestringvideo/mp4.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
polling_urlstringFully-formed status URL for this request (submit response).

Status Values & Flow

StatusTerminalMeaning
QUEUEDNoAccepted and waiting for a generation slot.
PROCESSINGNoGeneration is running.
COMPLETEDYesFinished. output.media_url holds the video.
FAILEDYesGeneration failed. Not billed.
ERRORYesThe request could not be processed. Not billed.

QUEUED → PROCESSING → COMPLETED (success) or FAILED/ERROR (failure).

Typical workflow

  1. POST the request body to https://gateway.pixazo.ai/minimax-hailuo-h3-max-lip-sync/v1/image-to-video.
  2. Read request_id from the 202 response.
  3. Poll https://gateway.pixazo.ai/v2/requests/status/{request_id} every few seconds, or wait for the webhook.
  4. 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).

ResolutionPrice (USD)
768P$0.08/sec
480P$0.05/sec
1080P$0.16/sec
2K$0.32/sec
Video to Video (Video Extension)

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-video

MiniMax H3 Max API Documentation (Video to Video (Video Extension))

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
video_urlYesstring—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.
promptYesstring—Non-empty text, up to 50000 charactersWhat happens next: describe the continuation, not your video.
durationNonumber50.71–15Length of the new footage in seconds (fractions allowed). Billing is per requested second.
resolutionNostring"768P"480P, 768P, 1080P, 2KOutput resolution, written exactly as listed (capital P). Higher resolutions cost more per second.
aspect_ratioNostring"auto"auto, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16Frame shape of the result: auto follows your video; any other value crops the video to that shape. It does not change the amount billed.
outputNostring"extended"extended, continuationextended 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.
seedNointegerRandom0–2147483647Seed for the random generator; leave it out for a random seed. It does not change the amount billed.
enable_prompt_expansionNobooleantruetrue, falseLet 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_checkerNobooleantruetrue, falseContent 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, n and count are 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_second and music_length_ms are rejected.
  • Set the resolution with resolution: 480P, 768P, 1080P or 2K, 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, content and text are rejected.
  • Send your video as one URL in video_url; video, videos and video_uri are rejected.
  • Extend Video takes no images and has no timing or color settings: image_url, image_urls, image, start_time, resume_time, color_match and reference_image_urls are rejected (they belong to the Insert Video operation).
  • This API takes no reference audio or reference videos: reference_audio_urls, reference_video_urls and audio_url are rejected.
  • Use the JSON types shown: duration is a number (5, not "5"), seed is a whole number, and the switches are true or false, not strings.
  • Omit a field instead of sending null.
  • Results are always returned as a URL in output.media_url; sync_mode and stream are rejected.
  • Webhooks are set with the X-Webhook-URL / X-Webhook-Mode headers; webhook_url, webhook_mode and callback_url in 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.

resolutionNote
480PThe lowest cost per second
768PThe default
1080P—
2KThe 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_url as a publicly reachable https URL (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; continuation returns a clip that starts with a 1.625-second repeat of the end of your video, then the new footage. With output left as extended, 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).
X-Webhook-ModeNoterminal (default) or sync (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty video_url, or video_url not a stringsynchronous 400
Missing or empty prompt, or prompt not a string, or longer than 50000 characterssynchronous 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.5status: "ERROR"
A prompt or video the model refuses, for example under its content policystatus: "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_KEY

cURL 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — minimax-hailuo-h3-max-edit for this endpoint.
output.media_urlarray of stringsURL of the video (one MP4 file per request).
output.media_typestringvideo/mp4.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.
polling_urlstringStatus URL for this request (submit response only).

Status Values & Flow

QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).

Typical workflow

  1. Send the request to POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/extend-video.
  2. Save the request_id from the 202 response.
  3. Poll GET /v2/requests/status/{request_id} every 10 seconds or so, or use a Webhook instead.
  4. When status is COMPLETED, download the video from output.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.

ResolutionPrice (USD)
768P$0.08/sec
480P$0.05/sec
1080P$0.16/sec
2K$0.32/sec
Video to Video (Scene Insertion)

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-video

MiniMax H3 Max API Documentation (Video to Video (Scene Insertion))

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
video_urlYesstring—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_timeYesnumber—1.625–60Where the new scene begins, in seconds from the start of your video.
resume_timeYesnumber—1.63–60Where your video picks up again after the new scene, in seconds from the start of your video.
promptNostringEmptyText, up to 50000 charactersWhat the new scene shows. Optional: you can also guide the scene with reference images.
reference_image_urlsNoarray—Up to 4 images: https URLs (recommended) or data URIsImages that guide the new scene (PNG, JPEG, JPG or WebP). Together they may hold at most 4096 image tokens (see References below).
durationNonumber55–13Length of the new scene in seconds (fractions allowed). Billing is per requested second.
resolutionNostring"768p"480p, 768pOutput resolution, written exactly as listed (lower-case p). Higher resolutions cost more per second.
color_matchNobooleantruetrue, falseMatch the colors of the new scene to your video. It does not change the amount billed.
seedNointegerRandom0–2147483647Seed for the random generator; leave it out for a random seed. It does not change the amount billed.
enable_prompt_expansionNobooleantruetrue, falseLet 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, n and count are 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_second and music_length_ms are rejected.
  • Set the resolution with resolution: 480p or 768p, 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, content and text are rejected.
  • Send your video as one URL in video_url; video, videos and video_uri are rejected.
  • Send up to 4 guide images in reference_image_urls; image_url, image_urls and image are rejected.
  • Insert Video has no aspect-ratio, output-mode or safety setting: aspect_ratio, output and enable_safety_checker are rejected.
  • This API takes no reference audio or reference videos: reference_audio_urls, reference_video_urls and audio_url are rejected.
  • Use the JSON types shown: duration, start_time and resume_time are numbers (5, not "5"), seed is a whole number, and the switches are true or false, not strings.
  • Omit a field instead of sending null.
  • Results are always returned as a URL in output.media_url; sync_mode and stream are rejected.
  • Webhooks are set with the X-Webhook-URL / X-Webhook-Mode headers; webhook_url, webhook_mode and callback_url in 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.

resolutionNote
480pThe lower cost per second
768pThe 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_url as a publicly reachable https URL (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 a 400, with nothing charged.
  • start_time is where the new scene begins and resume_time is where your video picks up again, both in seconds from the start of your video (start_time from 1.625 to 60, resume_time from 1.63 to 60). The returned video is the whole video: your footage up to start_time, then the new scene, then your footage from resume_time to 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 reachable https URLs 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).
X-Webhook-ModeNoterminal (default) or sync (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty video_url, or video_url not a stringsynchronous 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 characterssynchronous 400
reference_image_urls not a list, or more than 4 itemssynchronous 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 videostatus: "ERROR"
A prompt, video or reference image the model refuses, for example under its content policystatus: "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_KEY

cURL 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — minimax-hailuo-h3-max-edit for this endpoint.
output.media_urlarray of stringsURL of the video (one MP4 file per request).
output.media_typestringvideo/mp4.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.
polling_urlstringStatus URL for this request (submit response only).

Status Values & Flow

QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).

Typical workflow

  1. Send the request to POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-edit/v1/insert-video.
  2. Save the request_id from the 202 response.
  3. Poll GET /v2/requests/status/{request_id} every 10 seconds or so, or use a Webhook instead.
  4. When status is COMPLETED, download the video from output.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.

ResolutionPrice (USD)
768p$0.06/sec
480p$0.05/sec
Video to Video (Relighting)

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-video

MiniMax H3 Max API Documentation (Video to Video (Relighting))

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
video_urlYesstring—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_urlYesstring—One image: a publicly reachable https URL (recommended)The lighting reference: an image of a sphere lit the way you want your video lit.
resolutionNostring"768P"480P, 768P, 1080P, 2KOutput resolution, written exactly as listed (capital P). Higher resolutions cost more per second.
aspect_ratioNostring"16:9"adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16Frame 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.
seedNointegerRandom0–2147483647Seed for the random generator; leave it out for a random seed. It does not change the amount billed.
enable_safety_checkerNobooleantruetrue, falseContent 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, n and count are rejected — send one request per video.
  • There is no duration to set: duration, seconds, num_frames, frames_per_second and music_length_ms are rejected. Billing follows the length of the returned video (see How Billing Is Measured).
  • Set the resolution with resolution: 480P, 768P, 1080P or 2K, written exactly as listed (768P when you leave it out).
  • Send every field at the top level of the JSON body; parameters, content and text are rejected.
  • Send your video as one URL in video_url; video, videos and video_uri are rejected.
  • Send the lighting image as one URL in reference_image_url; image_url, image_urls and image are rejected.
  • Relight Video takes no prompt and no photos of people: prompt, reference_image_urls and enhance_realism are rejected (they belong to the Recast Video operation).
  • This API takes no reference audio or reference videos: reference_audio_urls, reference_video_urls and audio_url are rejected.
  • Use the JSON types shown: seed is a whole number, and the switches are true or false, not strings.
  • Omit a field instead of sending null.
  • Results are always returned as a URL in output.media_url; sync_mode and stream are rejected.
  • Webhooks are set with the X-Webhook-URL / X-Webhook-Mode headers; webhook_url, webhook_mode and callback_url in 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).

resolutionNote
480PThe lowest cost per second
768PThe default
1080P—
2KThe 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_url as a publicly reachable https URL (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 a 400, and a video longer than 30 seconds is refused at once with a 400, 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_ratio sets the frame shape of the result; 16:9 applies 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).
X-Webhook-ModeNoterminal (default) or sync (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty video_url, or video_url not a stringsynchronous 400
Missing or empty reference_image_url, or reference_image_url not a stringsynchronous 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 secondsstatus: "ERROR"
A video or lighting image the model refuses, for example under its content policystatus: "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_KEY

cURL 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — minimax-hailuo-h3-max-v2v for this endpoint.
output.media_urlarray of stringsURL of the video (one MP4 file per request).
output.media_typestringvideo/mp4.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.
polling_urlstringStatus URL for this request (submit response only).

Status Values & Flow

QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).

Typical workflow

  1. Send the request to POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/relight-video.
  2. Save the request_id from the 202 response.
  3. Poll GET /v2/requests/status/{request_id} every 10 seconds or so, or use a Webhook instead.
  4. When status is COMPLETED, download the video from output.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).

ResolutionPrice (USD)
768P$0.08/sec
480P$0.05/sec
1080P$0.16/sec
2K$0.32/sec
Video to Video (Character Replacement)

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-video

MiniMax H3 Max API Documentation (Video to Video (Character Replacement))

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
video_urlYesstring—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_urlsYesarray—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.
promptNostringEmptyText, up to 2000 charactersOptional: who becomes whom, or what else to keep or change.
resolutionNostring"1080P"768P, 1080POutput resolution, written exactly as listed (capital P). Higher resolutions cost more per second.
seedNointegerRandom0–2147483647Seed for the random generator; leave it out for a random seed. It does not change the amount billed.
enhance_realismNobooleanfalsetrue, falseSet 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_checkerNobooleantruetrue, falseContent 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, n and count are rejected — send one request per video.
  • There is no duration to set: duration, seconds, num_frames, frames_per_second and music_length_ms are rejected. Billing follows the length of the returned video (see How Billing Is Measured).
  • Set the resolution with resolution: 768P or 1080P, written exactly as listed (1080P when you leave it out).
  • Send every field at the top level of the JSON body; parameters, content and text are rejected.
  • Send your video as one URL in video_url; video, videos and video_uri are rejected.
  • Send the photos in reference_image_urls, as a list even for one photo; image_url, image_urls and image are rejected.
  • Recast Video has no frame-shape or lighting setting: aspect_ratio and reference_image_url are rejected (they belong to the Relight Video operation).
  • This API takes no reference audio or reference videos: reference_audio_urls, reference_video_urls and audio_url are rejected.
  • Use the JSON types shown: seed is a whole number, and the switches are true or false, not strings.
  • Omit a field instead of sending null.
  • Results are always returned as a URL in output.media_url; sync_mode and stream are rejected.
  • Webhooks are set with the X-Webhook-URL / X-Webhook-Mode headers; webhook_url, webhook_mode and callback_url in 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).

resolutionNote
768PThe lower cost per second
1080PThe 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_url as a publicly reachable https URL (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 a 400, and a video longer than 30 seconds is refused at once with a 400, 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).
X-Webhook-ModeNoterminal (default) or sync (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Invalid 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.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance for the hold this request needs.
429Too many requests.
500Internal 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.

ConditionHow it surfaces
Missing or invalid subscription keysynchronous 401
Balance too low for the holdsynchronous 402
Missing or empty video_url, or video_url not a stringsynchronous 400
Missing or empty reference_image_urls, or reference_image_urls not a list or more than 4 itemssynchronous 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 characterssynchronous 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 secondsstatus: "ERROR"
A video or photo the model refuses, for example under its content policystatus: "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_KEY

cURL 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request — minimax-hailuo-h3-max-v2v for this endpoint.
output.media_urlarray of stringsURL of the video (one MP4 file per request).
output.media_typestringvideo/mp4.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError message when status is ERROR.
polling_urlstringStatus URL for this request (submit response only).

Status Values & Flow

QUEUED → PROCESSING → COMPLETED (success) or ERROR (failure).

Typical workflow

  1. Send the request to POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-v2v/v1/recast-video.
  2. Save the request_id from the 202 response.
  3. Poll GET /v2/requests/status/{request_id} every 10 seconds or so, or use a Webhook instead.
  4. When status is COMPLETED, download the video from output.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.

ResolutionPrice (USD)
1080P$0.45/sec
768P$0.30/sec
2. MiniMax H3 Max Turbo API
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/text-to-video

MiniMax H3 Max Turbo API Documentation (Text to Video)

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderTypeRequiredDescription
X-Webhook-URLstringNoHTTPS endpoint that receives the callback. Supplying it enables webhook delivery.
X-Webhook-ModestringNoterminal (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

  • terminal fires exactly once, on COMPLETED or FAILED.
  • sync also 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 200 within a few seconds; slow endpoints are treated as failed deliveries.
  • HTTPS is required.

Request Parameters - MiniMax H3 Max Turbo API (Text to Video)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Any text, up to 50,000 charactersDescription of the video to generate.
durationNointeger55 – 15Length of the finished video in seconds. Billed per second.
resolutionNostring768P480P, 768P, 1080POutput 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_ratioNostring16:921:9, 16:9, 4:3, 1:1, 3:4, 9:16Frame shape of the output video.
prompt_expansion_modeYesstringbalanceddisabled, balanced, qualityHow 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_checkerNobooleantruetrue, falseRuns the content safety check over the generated video.
seedNointeger— (random)Any integerReusing 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

HeaderValueRequired
Ocp-Apim-Subscription-KeyYOUR_API_KEYYes
Content-Typeapplication/jsonYes
X-Webhook-URLhttps://your-server.example.com/hooks/videoNo
X-Webhook-Modeterminal | syncNo

Response Handling

CodeMeaningWhat to do
202Accepted and queuedRead request_id and poll the status endpoint.
400Invalid request body or parameter valueCheck the parameter table above; the message names the offending field.
401Missing or invalid subscription keyCheck the Ocp-Apim-Subscription-Key header.
402Insufficient wallet balanceTop up. The message names the resolved price for this request.
403Key not subscribed to this productSubscribe the key to the API product.
429Rate limit exceededBack off and retry; the limit is 50 calls per 60 seconds.
500Server errorRetry 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

FieldTypeDescription
request_idstringIdentifier for this request. Use it to poll and to de-duplicate webhooks.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED or ERROR.
model_idstringAlways minimax-hailuo-h3-max-turbo.
errorstring | nullFailure reason, null while the request is healthy.
output.media_urlstringURL of the finished MP4, re-hosted by Pixazo.
output.media_typestringAlways video/mp4.
created_atstringISO-8601 timestamp of submission.
completed_atstringISO-8601 timestamp of the terminal transition.
polling_urlstringFully-formed status URL for this request.

Status Values

StatusTerminalMeaning
QUEUEDNoAccepted and waiting for a generation slot.
PROCESSINGNoGeneration is running.
COMPLETEDYesFinished. output.media_url holds the video.
FAILEDYesGeneration failed. Not billed.
ERRORYesThe request could not be processed. Not billed.

Status Flow

QUEUED -> PROCESSING -> COMPLETED
                     -> FAILED
                     -> ERROR

Typical Workflow

  1. POST the request body to https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/text-to-video.
  2. Read request_id from the 202 response.
  3. Poll https://gateway.pixazo.ai/v2/requests/status/{request_id} every few seconds, or wait for the webhook.
  4. 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.

ResolutionPrice (USD)
768P$0.04/sec
480P$0.025/sec
1080P$0.08/sec
Image to Video
POST https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/image-to-video

MiniMax H3 Max Turbo API Documentation (Image to Video)

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderTypeRequiredDescription
X-Webhook-URLstringNoHTTPS endpoint that receives the callback. Supplying it enables webhook delivery.
X-Webhook-ModestringNoterminal (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

  • terminal fires exactly once, on COMPLETED or FAILED.
  • sync also 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 200 within a few seconds; slow endpoints are treated as failed deliveries.
  • HTTPS is required.

Request Parameters - MiniMax H3 Max Turbo API (Image to Video)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Any text, up to 50,000 charactersDescription of the video to generate.
image_urlYesstring—Public https URL of an imageFirst frame of the video. The output aspect ratio follows this image, so there is no aspect_ratio parameter on this operation.
end_image_urlNostring— (none)Public https URL of an imageOptional last frame. Supply it to generate a first-to-last keyframe transition.
durationNointeger55 – 15Length of the finished video in seconds. Billed per second.
resolutionNostring768P480P, 768P, 1080POutput 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_modeYesstringbalanceddisabled, balanced, qualityHow 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_checkerNobooleantruetrue, falseRuns the content safety check over the generated video.
seedNointeger— (random)Any integerReusing 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

HeaderValueRequired
Ocp-Apim-Subscription-KeyYOUR_API_KEYYes
Content-Typeapplication/jsonYes
X-Webhook-URLhttps://your-server.example.com/hooks/videoNo
X-Webhook-Modeterminal | syncNo

Response Handling

CodeMeaningWhat to do
202Accepted and queuedRead request_id and poll the status endpoint.
400Invalid request body or parameter valueCheck the parameter table above; the message names the offending field.
401Missing or invalid subscription keyCheck the Ocp-Apim-Subscription-Key header.
402Insufficient wallet balanceTop up. The message names the resolved price for this request.
403Key not subscribed to this productSubscribe the key to the API product.
429Rate limit exceededBack off and retry; the limit is 50 calls per 60 seconds.
500Server errorRetry 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

FieldTypeDescription
request_idstringIdentifier for this request. Use it to poll and to de-duplicate webhooks.
statusstringQUEUED, PROCESSING, COMPLETED, FAILED or ERROR.
model_idstringAlways minimax-hailuo-h3-max-turbo.
errorstring | nullFailure reason, null while the request is healthy.
output.media_urlstringURL of the finished MP4, re-hosted by Pixazo.
output.media_typestringAlways video/mp4.
created_atstringISO-8601 timestamp of submission.
completed_atstringISO-8601 timestamp of the terminal transition.
polling_urlstringFully-formed status URL for this request.

Status Values

StatusTerminalMeaning
QUEUEDNoAccepted and waiting for a generation slot.
PROCESSINGNoGeneration is running.
COMPLETEDYesFinished. output.media_url holds the video.
FAILEDYesGeneration failed. Not billed.
ERRORYesThe request could not be processed. Not billed.

Status Flow

QUEUED -> PROCESSING -> COMPLETED
                     -> FAILED
                     -> ERROR

Typical Workflow

  1. POST the request body to https://gateway.pixazo.ai/minimax-hailuo-h3-max-turbo/v1/image-to-video.
  2. Read request_id from the 202 response.
  3. Poll https://gateway.pixazo.ai/v2/requests/status/{request_id} every few seconds, or wait for the webhook.
  4. 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.

ResolutionPrice (USD)
768P$0.04/sec
480P$0.025/sec
1080P$0.08/sec
3. MiniMax Music 3.0

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-music

MiniMax Music 3.0 API Documentation (Text to Music)

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—1–2,000 charactersDescribes the music: genre, mood, instrumentation, setting. e.g. Indie folk, melancholic, introspective, solitary walk, coffee shop.
lyricsConditionalstring—1–3,500 charactersThe 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_instrumentalNobooleanfalsetrue, falseGenerate music with no vocals. Omit lyrics when this is on.
lyrics_optimizerNobooleanfalsetrue, falseLet the model write the lyrics from your prompt instead of supplying them yourself.
formatNostringmp3mp3, wavContainer for the generated track.
sample_rateNointeger4410016000, 24000, 32000, 44100Output sample rate in Hz.
bitrateNointeger25600032000, 64000, 128000, 256000Output 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 corner

Example 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Bad request — a missing or out-of-range parameter. The message names the field.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance.
429Too many requests.
500Internal 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request.
output.media_urlarrayURL of the generated track.
output.media_typestringMIME type of the audio — audio/mpeg for mp3.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError 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.

RequestCost per track
Any track, up to 5 minutes$0.15

Failed requests are not billed.

MiniMax Music 3.0 API Pricing

Your request will cost $0.15 per song generation.
4. MiniMax Music 3.0 Fast (Free)
⚠️ This API was retired on 7 September 2026
MiniMax Music 3.0 Fast (Free) is no longer available and requests to it will fail. Use MiniMax Music 3.0 (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-music

MiniMax Music 3.0 Fast (Free) API Documentation (Text to Music)

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderRequiredDescription
X-Webhook-URLTo enableHTTPS URL to receive the Webhook callback.
X-Webhook-ModeNoterminal (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 200 within a few seconds; the Webhook endpoint must be HTTPS.

Request Parameters

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—1–2,000 charactersDescribes the music: genre, mood, instrumentation, setting. e.g. Indie folk, melancholic, introspective, solitary walk, coffee shop.
lyricsConditionalstring—1–3,500 charactersThe 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_instrumentalNobooleanfalsetrue, falseGenerate music with no vocals. Omit lyrics when this is on.
lyrics_optimizerNobooleanfalsetrue, falseLet the model write the lyrics from your prompt instead of supplying them yourself.
formatNostringmp3mp3, wavContainer for the generated track.
sample_rateNointeger4410016000, 24000, 32000, 44100Output sample rate in Hz.
bitrateNointeger25600032000, 64000, 128000, 256000Output 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 corner

Example 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

HeaderRequiredDescription
Content-TypeYesapplication/json
Ocp-Apim-Subscription-KeyYesYour API subscription key.
X-Webhook-URLNoEnable Webhook callbacks (see Webhook section).

Response Handling

Status CodeMeaning
202Accepted — request queued; returns request_id and polling_url.
400Bad request — a missing or out-of-range parameter. The message names the field.
401Unauthorized — missing or invalid subscription key.
402Insufficient balance.
429Too many requests.
500Internal 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

FieldTypeDescription
request_idstringUnique request identifier.
statusstringQUEUED, PROCESSING, COMPLETED or ERROR.
model_idstringThe model that handled the request.
output.media_urlarrayURL of the generated track.
output.media_typestringMIME type of the audio — audio/mpeg for mp3.
created_atstringRequest creation timestamp.
completed_atstringCompletion timestamp.
errorstringError 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.

RequestCost per track
Any track, up to 5 minutes$0.00

Failed requests are not billed.

MiniMax Music 3.0 Fast (Free) API Pricing

Your request is Free
5. MiniMax H3 API

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:

  1. Send your request to the URL below, including your API key.
  2. You immediately get back a request_id and a status link. The video is generated in the background, which takes a few minutes.
  3. 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-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderTypeRequiredDescription
X-Webhook-URLstringYes, to enable the webhookHTTPS endpoint that receives the callback.
X-Webhook-ModestringNoterminal (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

  • terminal mode sends exactly one webhook, when the job finishes or fails.
  • sync mode also sends a webhook on intermediate status changes.
  • Deliveries are idempotent on request_id — deduplicate on it, since a webhook can be retried.
  • Respond 200 within 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)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Up to 7000 charactersWhat 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.
durationNointeger54 – 15Length of the video in whole seconds. Billing is per second, so this sets the price directly.
ratioNostring16:921:9, 16:9, 4:3, 1:1, 3:4, 9:16Aspect 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.
resolutionNostring2K2KOutput 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

HeaderRequiredDescription
Ocp-Apim-Subscription-KeyYesYour API subscription key.
Content-TypeYesMust be application/json.
Cache-ControlNoRecommended: no-cache.
X-Webhook-URLNoEnables webhook delivery of the result.
X-Webhook-ModeNoterminal or sync.

Response Handling

CodeMeaningWhat to do
202Accepted and queued.Read request_id and start polling.
400Invalid request body.Read the error message and correct the parameter it names.
401Missing or invalid subscription key.Check the Ocp-Apim-Subscription-Key header.
402Insufficient balance.Top up your wallet and retry.
403Not permitted for this subscription.Check your plan covers this model.
429Rate limit exceeded.Back off and retry.
500Server 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_KEY

cURL 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

FieldTypeDescription
request_idstringIdentifier for this job. Use it to poll, and to deduplicate webhooks.
statusstringOne of QUEUED, PROCESSING, COMPLETED, FAILED, ERROR.
model_idstringAlways minimax-hailuo-h3 for this API.
errorstring or nullFailure reason; null while healthy.
output.media_urlarray of stringLinks to the generated MP4 file(s).
output.media_typestringvideo/mp4.
created_atstringWhen the job was accepted (ISO 8601).
completed_atstringWhen the job reached a terminal state (ISO 8601).
polling_urlstringReturned on submit; the status URL for this job.

Status Values

StatusMeaning
QUEUEDAccepted and waiting to start.
PROCESSINGThe video is being generated.
COMPLETEDFinished. output.media_url holds the video.
FAILEDThe job could not be completed.
ERRORThe model reported an error. Not charged.

Status Flow

QUEUED  ->  PROCESSING  ->  COMPLETED
                     \->  FAILED / ERROR

Typical Workflow

  1. POST your request and read request_id from the 202 response.
  2. Wait roughly 30 seconds, then GET https://gateway.pixazo.ai/v2/requests/status/{request_id}.
  3. 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.
  4. On COMPLETED, download the file from output.media_url[0].
  5. 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.

ResolutionPrice (USD)
2K$0.13/sec
768P$0.08/sec
Image to Video

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:

  1. Send your request to the URL below, including your API key.
  2. You immediately get back a request_id and a status link. The video is generated in the background, which takes a few minutes.
  3. 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-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderTypeRequiredDescription
X-Webhook-URLstringYes, to enable the webhookHTTPS endpoint that receives the callback.
X-Webhook-ModestringNoterminal (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

  • terminal mode sends exactly one webhook, when the job finishes or fails.
  • sync mode also sends a webhook on intermediate status changes.
  • Deliveries are idempotent on request_id — deduplicate on it, since a webhook can be retried.
  • Respond 200 within 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)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Up to 7000 charactersWhat 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_imageYesstring—Image URL or base64 data URIThe 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.
durationNointeger54 – 15Length of the video in whole seconds. Billing is per second, so this sets the price directly.
ratioNostringadaptiveadaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16Aspect ratio of the output. adaptive follows the input media.
resolutionNostring2K2KOutput 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

HeaderRequiredDescription
Ocp-Apim-Subscription-KeyYesYour API subscription key.
Content-TypeYesMust be application/json.
Cache-ControlNoRecommended: no-cache.
X-Webhook-URLNoEnables webhook delivery of the result.
X-Webhook-ModeNoterminal or sync.

Response Handling

CodeMeaningWhat to do
202Accepted and queued.Read request_id and start polling.
400Invalid request body.Read the error message and correct the parameter it names.
401Missing or invalid subscription key.Check the Ocp-Apim-Subscription-Key header.
402Insufficient balance.Top up your wallet and retry.
403Not permitted for this subscription.Check your plan covers this model.
429Rate limit exceeded.Back off and retry.
500Server 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_KEY

cURL 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

FieldTypeDescription
request_idstringIdentifier for this job. Use it to poll, and to deduplicate webhooks.
statusstringOne of QUEUED, PROCESSING, COMPLETED, FAILED, ERROR.
model_idstringAlways minimax-hailuo-h3 for this API.
errorstring or nullFailure reason; null while healthy.
output.media_urlarray of stringLinks to the generated MP4 file(s).
output.media_typestringvideo/mp4.
created_atstringWhen the job was accepted (ISO 8601).
completed_atstringWhen the job reached a terminal state (ISO 8601).
polling_urlstringReturned on submit; the status URL for this job.

Status Values

StatusMeaning
QUEUEDAccepted and waiting to start.
PROCESSINGThe video is being generated.
COMPLETEDFinished. output.media_url holds the video.
FAILEDThe job could not be completed.
ERRORThe model reported an error. Not charged.

Status Flow

QUEUED  ->  PROCESSING  ->  COMPLETED
                     \->  FAILED / ERROR

Typical Workflow

  1. POST your request and read request_id from the 202 response.
  2. Wait roughly 30 seconds, then GET https://gateway.pixazo.ai/v2/requests/status/{request_id}.
  3. 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.
  4. On COMPLETED, download the file from output.media_url[0].
  5. 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.

ResolutionPrice (USD)
2K$0.13/sec
768P$0.08/sec
Last Frame to Video

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:

  1. Send your request to the URL below, including your API key.
  2. You immediately get back a request_id and a status link. The video is generated in the background, which takes a few minutes.
  3. 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-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderTypeRequiredDescription
X-Webhook-URLstringYes, to enable the webhookHTTPS endpoint that receives the callback.
X-Webhook-ModestringNoterminal (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

  • terminal mode sends exactly one webhook, when the job finishes or fails.
  • sync mode also sends a webhook on intermediate status changes.
  • Deliveries are idempotent on request_id — deduplicate on it, since a webhook can be retried.
  • Respond 200 within 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)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Up to 7000 charactersWhat 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_imageYesstring—Image URL or base64 data URIThe 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.
durationNointeger54 – 15Length of the video in whole seconds. Billing is per second, so this sets the price directly.
ratioNostringadaptiveadaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16Aspect ratio of the output. adaptive follows the input media.
resolutionNostring2K2KOutput 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

HeaderRequiredDescription
Ocp-Apim-Subscription-KeyYesYour API subscription key.
Content-TypeYesMust be application/json.
Cache-ControlNoRecommended: no-cache.
X-Webhook-URLNoEnables webhook delivery of the result.
X-Webhook-ModeNoterminal or sync.

Response Handling

CodeMeaningWhat to do
202Accepted and queued.Read request_id and start polling.
400Invalid request body.Read the error message and correct the parameter it names.
401Missing or invalid subscription key.Check the Ocp-Apim-Subscription-Key header.
402Insufficient balance.Top up your wallet and retry.
403Not permitted for this subscription.Check your plan covers this model.
429Rate limit exceeded.Back off and retry.
500Server 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_KEY

cURL 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

FieldTypeDescription
request_idstringIdentifier for this job. Use it to poll, and to deduplicate webhooks.
statusstringOne of QUEUED, PROCESSING, COMPLETED, FAILED, ERROR.
model_idstringAlways minimax-hailuo-h3 for this API.
errorstring or nullFailure reason; null while healthy.
output.media_urlarray of stringLinks to the generated MP4 file(s).
output.media_typestringvideo/mp4.
created_atstringWhen the job was accepted (ISO 8601).
completed_atstringWhen the job reached a terminal state (ISO 8601).
polling_urlstringReturned on submit; the status URL for this job.

Status Values

StatusMeaning
QUEUEDAccepted and waiting to start.
PROCESSINGThe video is being generated.
COMPLETEDFinished. output.media_url holds the video.
FAILEDThe job could not be completed.
ERRORThe model reported an error. Not charged.

Status Flow

QUEUED  ->  PROCESSING  ->  COMPLETED
                     \->  FAILED / ERROR

Typical Workflow

  1. POST your request and read request_id from the 202 response.
  2. Wait roughly 30 seconds, then GET https://gateway.pixazo.ai/v2/requests/status/{request_id}.
  3. 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.
  4. On COMPLETED, download the file from output.media_url[0].
  5. 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.

ResolutionPrice (USD)
2K$0.13/sec
768P$0.08/sec
Start and End Frame to Video

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:

  1. Send your request to the URL below, including your API key.
  2. You immediately get back a request_id and a status link. The video is generated in the background, which takes a few minutes.
  3. 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-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderTypeRequiredDescription
X-Webhook-URLstringYes, to enable the webhookHTTPS endpoint that receives the callback.
X-Webhook-ModestringNoterminal (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

  • terminal mode sends exactly one webhook, when the job finishes or fails.
  • sync mode also sends a webhook on intermediate status changes.
  • Deliveries are idempotent on request_id — deduplicate on it, since a webhook can be retried.
  • Respond 200 within 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)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Up to 7000 charactersWhat 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_imageYesstring—Image URL or base64 data URIThe 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_imageYesstring—Image URL or base64 data URIThe closing frame. Same formats and limits as first_frame_image.
durationNointeger54 – 15Length of the video in whole seconds. Billing is per second, so this sets the price directly.
ratioNostringadaptiveadaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16Aspect ratio of the output. adaptive follows the input media.
resolutionNostring2K2KOutput 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

HeaderRequiredDescription
Ocp-Apim-Subscription-KeyYesYour API subscription key.
Content-TypeYesMust be application/json.
Cache-ControlNoRecommended: no-cache.
X-Webhook-URLNoEnables webhook delivery of the result.
X-Webhook-ModeNoterminal or sync.

Response Handling

CodeMeaningWhat to do
202Accepted and queued.Read request_id and start polling.
400Invalid request body.Read the error message and correct the parameter it names.
401Missing or invalid subscription key.Check the Ocp-Apim-Subscription-Key header.
402Insufficient balance.Top up your wallet and retry.
403Not permitted for this subscription.Check your plan covers this model.
429Rate limit exceeded.Back off and retry.
500Server 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_KEY

cURL 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

FieldTypeDescription
request_idstringIdentifier for this job. Use it to poll, and to deduplicate webhooks.
statusstringOne of QUEUED, PROCESSING, COMPLETED, FAILED, ERROR.
model_idstringAlways minimax-hailuo-h3 for this API.
errorstring or nullFailure reason; null while healthy.
output.media_urlarray of stringLinks to the generated MP4 file(s).
output.media_typestringvideo/mp4.
created_atstringWhen the job was accepted (ISO 8601).
completed_atstringWhen the job reached a terminal state (ISO 8601).
polling_urlstringReturned on submit; the status URL for this job.

Status Values

StatusMeaning
QUEUEDAccepted and waiting to start.
PROCESSINGThe video is being generated.
COMPLETEDFinished. output.media_url holds the video.
FAILEDThe job could not be completed.
ERRORThe model reported an error. Not charged.

Status Flow

QUEUED  ->  PROCESSING  ->  COMPLETED
                     \->  FAILED / ERROR

Typical Workflow

  1. POST your request and read request_id from the 202 response.
  2. Wait roughly 30 seconds, then GET https://gateway.pixazo.ai/v2/requests/status/{request_id}.
  3. 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.
  4. On COMPLETED, download the file from output.media_url[0].
  5. 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.

ResolutionPrice (USD)
2K$0.13/sec
768P$0.08/sec
Reference to Video

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:

  1. Send your request to the URL below, including your API key.
  2. You immediately get back a request_id and a status link. The video is generated in the background, which takes a few minutes.
  3. 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-video

Authentication

All requests require an API key passed via header.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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.

HeaderTypeRequiredDescription
X-Webhook-URLstringYes, to enable the webhookHTTPS endpoint that receives the callback.
X-Webhook-ModestringNoterminal (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

  • terminal mode sends exactly one webhook, when the job finishes or fails.
  • sync mode also sends a webhook on intermediate status changes.
  • Deliveries are idempotent on request_id — deduplicate on it, since a webhook can be retried.
  • Respond 200 within 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.

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Up to 7000 charactersWhat 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_imagesConditionalarray of string—Up to 9 itemsImages that lock in a character, subject or style. Up to 30 MB each.
reference_videosConditionalarray of string—Up to 3 itemsClips 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_audiosConditionalarray of string—Up to 3 itemsClips 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.
durationNointeger54 – 15Length of the video in whole seconds. Billing is per second, so this sets the price directly.
ratioNostringadaptiveadaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16Aspect ratio of the output. adaptive follows the input media.
resolutionNostring2K2KOutput 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

HeaderRequiredDescription
Ocp-Apim-Subscription-KeyYesYour API subscription key.
Content-TypeYesMust be application/json.
Cache-ControlNoRecommended: no-cache.
X-Webhook-URLNoEnables webhook delivery of the result.
X-Webhook-ModeNoterminal or sync.

Response Handling

CodeMeaningWhat to do
202Accepted and queued.Read request_id and start polling.
400Invalid request body.Read the error message and correct the parameter it names.
401Missing or invalid subscription key.Check the Ocp-Apim-Subscription-Key header.
402Insufficient balance.Top up your wallet and retry.
403Not permitted for this subscription.Check your plan covers this model.
429Rate limit exceeded.Back off and retry.
500Server 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_KEY

cURL 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

FieldTypeDescription
request_idstringIdentifier for this job. Use it to poll, and to deduplicate webhooks.
statusstringOne of QUEUED, PROCESSING, COMPLETED, FAILED, ERROR.
model_idstringAlways minimax-hailuo-h3 for this API.
errorstring or nullFailure reason; null while healthy.
output.media_urlarray of stringLinks to the generated MP4 file(s).
output.media_typestringvideo/mp4.
created_atstringWhen the job was accepted (ISO 8601).
completed_atstringWhen the job reached a terminal state (ISO 8601).
polling_urlstringReturned on submit; the status URL for this job.

Status Values

StatusMeaning
QUEUEDAccepted and waiting to start.
PROCESSINGThe video is being generated.
COMPLETEDFinished. output.media_url holds the video.
FAILEDThe job could not be completed.
ERRORThe model reported an error. Not charged.

Status Flow

QUEUED  ->  PROCESSING  ->  COMPLETED
                     \->  FAILED / ERROR

Typical Workflow

  1. POST your request and read request_id from the 202 response.
  2. Wait roughly 30 seconds, then GET https://gateway.pixazo.ai/v2/requests/status/{request_id}.
  3. 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.
  4. On COMPLETED, download the file from output.media_url[0].
  5. 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.

ResolutionPrice (USD)
2K$0.13/sec
768P$0.08/sec
6. MiniMax Speech 2.8 API HD

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

HeaderRequiredDefaultDescription
X-Webhook-URLYes (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-ModeNoterminalterminal — 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 POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync mode — POST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within 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
Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
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

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

MiniMax Speech 2.8 API HD Pricing

Your request will cost $0.05 per 1,000 characters.
7. MiniMax Speech 2.8 API Turbo

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

HeaderRequiredDefaultDescription
X-Webhook-URLYes (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-ModeNoterminalterminal — 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 POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync mode — POST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within 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
Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
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

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

MiniMax Speech 2.8 API Turbo Pricing

Your request will cost $0.06 per 1,000 characters.
about $0.06 per 1,000 characters, the fast tier of Speech 2.8
equivalent to $60 per 1M characters
8. MiniMax Voice Design v1 API

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

HeaderRequiredDefaultDescription
X-Webhook-URLYes (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-ModeNoterminalterminal — 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 POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync mode — POST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within 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)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—Up to 2000 charactersA 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_textYesstring—Up to 500 charactersThe 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
Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
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

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

MiniMax Voice Design v1 API Pricing

Your request will cost $0.03 per 1,000 characters.
9. MiniMax Hailuo 2.3 API

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

HeaderRequiredDefaultDescription
X-Webhook-URLYes (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-ModeNoterminalterminal — 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 POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync mode — POST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within 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)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptNostring——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_imageYesstring——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_optimizerNobooleantruetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results.
fast_pretreatmentNobooleanfalsetrue, falseReduces prompt-optimization time when prompt_optimizer is enabled. Supported by MiniMax-Hailuo-2.3.
durationNointeger66, 10Video length in seconds. 768P supports 6 or 10 seconds; 1080P supports 6 seconds only.
resolutionNostring768P768P, 1080POutput video resolution. 768P supports 6- or 10-second videos; 1080P supports 6-second videos only.
callback_urlNostring——URL to receive task status update notifications.
aigc_watermarkNobooleanfalsetrue, falseDefault: false. Whether to add AIGC watermark to the generated video.

Content Item Types & Limits

TypeMaxFormat / SizeDescription
image1JPG, PNG, WEBP · < 20 MBFirst-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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal 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

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

MiniMax Hailuo 2.3 API Pricing

ResolutionDurationPrice (USD)
All Resolution6s$0.35
All Resolution10s$0.60
Text to Video

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

HeaderRequiredDefaultDescription
X-Webhook-URLYes (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-ModeNoterminalterminal — 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 POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync mode — POST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within 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)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring——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.
durationNointeger66, 10Video length in seconds. 768P supports 6 or 10 seconds; 1080P supports 6 seconds only.
resolutionNostring768P768P, 1080POutput video resolution. 768P supports 6- or 10-second videos; 1080P supports 6-second videos only.
prompt_optimizerNobooleantruetrue, falseAutomatically rewrites and enriches your prompt with extra detail before generation to improve results. Set to false for more precise control.
fast_pretreatmentNobooleanfalsetrue, falseReduces prompt-optimization time when prompt_optimizer is enabled. Supported by MiniMax-Hailuo-2.3.
callback_urlNostring——URL to receive callback notifications when video is ready.
aigc_watermarkNobooleanfalsetrue, falseWhether 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal 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

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type of the output
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

MiniMax Hailuo 2.3 API Pricing

ResolutionDurationPrice (USD)
All Resolution6s$0.35
All Resolution10s$0.60
10. MiniMax Music 2.6 API

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.

HeaderTypeRequiredDescription
Ocp-Apim-Subscription-KeystringYesYour 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

HeaderRequiredDefaultDescription
X-Webhook-URLYes (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-ModeNoterminalterminal — 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 POST when the request reaches a terminal status. No callback during PROCESSING.
  • sync mode — POST on every status poll (with delay capped at ~15s) plus a final POST at terminal status. Use when you want progress updates.
  • Idempotency — use request_id as your idempotency key. Network retries can deliver the same callback more than once; your handler must tolerate duplicates.
  • Response — respond 200 OK within 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)

ParameterRequiredTypeDefaultAllowed values / rangeDescription
promptYesstring—10–2000 charactersDescription of the desired music style, mood, genre, and scenario. Drives the composition.
lyricsNostring—Up to 3500 charactersSong 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_rateNointeger4410016000, 24000, 32000, 44100Audio sample rate in Hz. Higher = higher fidelity, larger files.
bitrateNointeger25600032000, 64000, 128000, 256000Audio bitrate in bits/sec. Higher = better quality, larger files.
formatNostringmp3mp3, wav, pcmOutput audio container/codec.
lyrics_optimizerNobooleanfalsetrue, falseWhen true and lyrics is empty, the model auto-generates lyrics from the prompt. Ignored if lyrics is provided.
is_instrumentalNobooleanfalsetrue, falseWhen 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-Typeapplication/json
Cache-Controlno-cache
Ocp-Apim-Subscription-KeyYOUR_SUBSCRIPTION_KEY

Response Handling

Common status codes.

CodeMeaning
202Accepted — Request queued
Bad Request
401Unauthorized
402Insufficient Balance
403Forbidden
Too Many Requests
500Internal 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

FieldTypeDescription
request_idstringUnique request identifier
statusstringQUEUED, PROCESSING, COMPLETED, FAILED, or ERROR
model_idstringModel that processed the request
errorstring|nullError message if failed
output.media_urlarrayURLs to generated media (R2 CDN)
output.media_typestringMIME type (audio/mpeg)
created_atstringWhen request was created
completed_atstring|nullWhen request completed
polling_urlstringStatus URL (initial response only)

Status Values

StatusDescription
QUEUEDRequest accepted, waiting to be processed
PROCESSINGBeing processed by the model
COMPLETEDDone — output contains the result
FAILEDFailed — check error field
ERRORSystem error — not charged

Status Flow

QUEUED → PROCESSING → COMPLETED
                    → FAILED
                    → ERROR

Typical Workflow

  1. Send a generate request to the API endpoint
  2. Save the request_id from the response
  3. Poll every 5-10 seconds: GET /v2/requests/status/{request_id}
  4. When status is "COMPLETED", download from output.media_url

Tip: Use X-Webhook-URL header to get a callback instead of polling.

MiniMax Music 2.6 API Pricing

Your request will cost $0.15 per song generation.

⚡ 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).

Show data for the last
Generations
35,400last 30d
~1,180 per day
Success rate
97.7%
of completed generations
Generation time
117.2savg
p95 2.5min
Requests
Sep 14max 2,900Oct 13
MiniMax H3 Max TurboAvg 620/day
MiniMax H3 MaxAvg 513/day
MiniMax H3Avg 20/day
MiniMax Music 3.0Avg 13/day
OtherAvg 13/day
Generation Time
Sep 14max 9.2minOct 13
MiniMax H3 Max TurboAvg 113.0s
MiniMax H3 MaxAvg 116.1s
MiniMax H3Avg 4.3min
MiniMax Music 3.0Avg 4.1min
OtherAvg 2.5min
Error Rate
Sep 14max 100.0%Oct 13
MiniMax H3 Max TurboAvg 0.0%
MiniMax H3 MaxAvg 2.0%
MiniMax H3Avg 50.0%
MiniMax Music 3.0Avg 25.0%
OtherAvg 0.0%

〰 Uptime

Percent of generations that succeeded over the selected period, per model version.

Avg. Success Rate (30d)
97.74%
across all generations of this model family
Uptime
Sep 14max 100%Oct 13
MiniMax H3 Max TurboAvg 100.00%
MiniMax H3 MaxAvg 98.04%
MiniMax H3Avg 50.00%
MiniMax Music 3.0Avg 75.00%
OtherAvg 100.00%