Skip to navigation

MiniMax H3

Generate 4–15 second videos at 768P or 2K from text, one or two frames, or up to 9 images, 3 videos and 3 audio clips as references, priced per second.

  • Asynchronous: the create call returns a task ID; the video arrives when the task succeeds.
  • Four ways in: text only, a first frame, a first and last frame, or reference images, videos and audio.
  • Two resolutions: 768P (the default) and 2K. 480p and 1080p belong to minimax-h3-normal.
  • Billed per second of video at the rate of the chosen resolution. A failed task costs nothing.

minimax-h3 is the original ID of this model and behaves exactly like minimax-h3-fast: the same inputs, resolutions and prices. New integrations can use either.

POST/v1/videos/tasksTry it

Opens this model in the API Explorer. Enter your BeatAPI API key to create a task: the call is real and is billed to your own balance.

Model IDs

Five MiniMax H3 models share this endpoint but not the same inputs. The values below come straight from the gateway contract.

Model IDduration (s)resolutionMax reference imagesMax reference videosMax reference audioChoose it when
minimax-h34–15768p, 2K933You already use the original ID. It has the same inputs and prices as minimax-h3-fast.
minimax-h3-fast4–15768p, 2K933You want 2K output, or reference sets with audio and up to 3 reference videos.
minimax-h3-normal5–15480p, 768p, 1080p41—Price matters most and you can wait longer: it renders more slowly at half the Fast rate for the same resolution, adds 480p and 1080p and a seed, and takes fewer references (no audio).
minimax-h3-max≥ 5480P, 768P———You start from text or one or two frames, want 480P or 768P, and want a seed; it takes no reference inputs and no aspect_ratio.
minimax-h3-max-turbo≥ 5480P, 768P———Same inputs and resolutions as minimax-h3-max at half its list price.

Endpoint and authentication

POST https://api.beatapi.io/v1/videos/tasks

Authorization string Required

Your BeatAPI API key, sent as Bearer <BEATAPI_API_KEY>. Create keys in the Dashboard. Keep keys on your server; never ship them in a browser or mobile app.

Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.

How a request works

1

Create the task

POST the parameters below to the endpoint. A 201 means the task was accepted and its price reserved from your balance; the work runs in the background. Save data.id.

2

Wait for it to finish

Call GET /v1/tasks/{task_id} and wait data.poll_after_seconds between calls (5 s for images, 8 s for videos) until status is succeeded or failed. Or register a webhook for task.succeeded and task.failed; keep polling as the fallback, because a task stopped by the processing timeout sends no event.

3

Save the result

On succeeded, download every data.output.media[].url and store the files you need; BeatAPI does not promise how long result URLs stay available. On failed, read data.error_code and data.error_message: the reserved amount was returned to your balance, and data.retryable says whether sending the same request again can succeed.

Input modes

ModeRequired inputsNotes
Text to videomodel, promptSend no media arrays. aspect_ratio adaptive is refused.
First framemodel, prompt, images (1 link)The video starts from the image; the shape follows the image.
First and last framemodel, prompt, images (2 links)images[0] is the first frame, images[1] the last.
Referencesmodel, prompt, at least one of reference_images, reference_videos, reference_audiosAny mix, except that audio needs at least one reference image or video. Cannot be combined with images.

Request parameters

model string Required

The model to run.

Value: minimax-h3

If the value is wrong

  • Missing: "model" is required
  • An image model sent to this endpoint: "model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint

prompt string Required

What happens in the video: subject, action, camera movement and style. With references, say what each input is for.

Length: 1–5000 characters

  • Length is counted in characters (a CJK character counts as one).
  • Refer to inputs by their position, for example “the first reference image”.

If the value is wrong

  • Missing: "prompt" is required
  • Empty or longer than the limit: "prompt" has an unsupported length

images string[] Optional

A first frame, or a first and a last frame.

Items: 1–2
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • One link: the video starts from this image. Two links: images[0] is the first frame and images[1] the last.
  • With frames, the shape of the video follows the frames: aspect_ratio is not applied.
  • For pictures that guide the video without being frames, use reference_images instead.

If the value is wrong

  • More than two links: "images" accepts at most 2 items
  • Combined with any reference_* field: Cannot combine "images" with reference inputs in one task
  • Not an https:// link: "images[0]" must be a public HTTPS URL

reference_images string[] Optional

Pictures that guide the content, characters, products or style of the video.

Items: 1–9
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Refer to them in the prompt by position.

If the value is wrong

  • More than the maximum: "reference_images" accepts at most 9 items
  • Combined with images: Cannot combine "images" with reference inputs in one task

reference_videos string[] Optional

Videos to take motion, camera work or content from.

Items: 1–3
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • The reference videos together may run at most 15 seconds, at 23.976 to 60 frames per second; see the limits below.
  • The length of a reference video does not change the price.

If the value is wrong

  • More than the maximum: "reference_videos" accepts at most 3 items
  • Together longer than the limit: The reference videos run 20 seconds in total; this model takes at most 15.
  • Frame rate outside the limit: reference_videos[0] runs at 12 frames per second; this model takes 23.976 to 60.

reference_audios string[] Optional

Music, voice or sound to follow.

Items: 1–3
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Audio needs company: send at least one reference image or one reference video with it.
  • Each clip must run 2 to 15 seconds.

If the value is wrong

  • More than the maximum: "reference_audios" accepts at most 3 items
  • Audio without a reference image or video: minimax-h3 audio reference requires at least one reference image or video
  • A clip outside 2 to 15 seconds: reference_audios[0] is 1.5 seconds long; this model takes reference audio of 2 to 15 seconds.

duration integer OptionalDefault: 5

Length of the video in seconds, a whole number.

Default: 5
Range: 4–15

  • If you leave it out, 5 is used.
  • The price follows this value (see Billing).

If the value is wrong

  • Outside the range or not a whole number: "duration" is outside its supported range

aspect_ratio string Optional

Shape of the video as width:height. adaptive lets the model choose from the inputs.

Allowed values: adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16

  • Text to video: leave it out for 16:9, or send a fixed ratio. adaptive is refused because there is nothing to adapt to.
  • First frame or frames: not applied; the video follows the frame shape.
  • References: leave it out for adaptive, or send a fixed ratio.

If the value is wrong

  • A value not in the list: "aspect_ratio" must be one of: [adaptive 21:9 16:9 4:3 1:1 3:4 9:16]
  • adaptive with text to video: MiniMax H3 text mode does not support aspect_ratio=adaptive

resolution string OptionalDefault: 768P

Output resolution. 2K costs more per second than 768P.

Allowed values: 768p, 2K
Default: 768P

  • 768p and 768P mean the same, as do 2K and 2k.
  • 480p, 1080p and 4K are not offered here; for 480p or 1080p use minimax-h3-normal.

If the value is wrong

  • A value not in the list (for example 480p, 1080p or 4K): "resolution" must be one of: [768p 768P 2K 2k]

The gateway also checks these combinations before creating the task:

  • images cannot be combined with reference inputs
  • Only 768P and 2K are available; both tiers accept the full H3 input contract

Input media limits

The gateway reads every input before the task is created and refuses one outside these limits with a 400 bad_request that names the input. Nothing is charged.

MediaLimits checked before the task is created
Imageswidth and height 256–5760 px; aspect ratio (width ÷ height) 0.4–2.5
Videos15 s in total; 23.976–60 FPS
Audioeach 2–15 s
  • The limits apply to images and reference_images (images), reference_videos (videos) and reference_audios (audio).
  • Inputs are checked one by one, in the order images, reference_images, reference_videos, reference_audios. For one input the order is length, sides, aspect ratio, frame rate; the total length of all reference videos is checked last. The message names the input by list and position, counting from 0 like the field errors: images[0] is 200x200 pixels; this model takes images 256 to 5760 pixels on each side.
  • Lengths are measured with a 0.1-second tolerance. Sizes are checked only when the host reports them.
  • A link is refused at create only when its host answers with an HTTP 4xx error or returns an empty file, for example reference_videos[0] could not be downloaded: the URL returned HTTP 404.; other problems with an input surface after submission and fail the task (refunded).
  • Have a local file? Upload it with POST /v1/files and pass the returned data.url.

Fields this model does not accept

Sending one of these is refused before anything is charged, instead of being ignored:

  • seed, generate_audio, watermark, quality, sound and any other field from other video models → field "seed" is not supported by model minimax-h3 (with the field you sent).
  • Any other unknown field → unknown field: <name>.

Request examples

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax-h3",
"prompt": "A slow cinematic push through a misty mountain village at dawn, smoke rising from the chimneys",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "768P"
}'

Text to video

A 5-second 768P landscape clip.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax-h3",
"prompt": "A slow cinematic push through a misty mountain village at dawn, smoke rising from the chimneys",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "768P"
}'

First frame

The video starts from the image and follows its shape.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax-h3",
"prompt": "The performer turns toward the camera as neon light sweeps across the stage",
"images": [
"https://media.beatapi.io/samples/neon-singer.png"
],
"duration": 5,
"resolution": "768P"
}'

First and last frame

The video moves from the first image to the second, in 2K.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax-h3",
"prompt": "The camera moves smoothly from the bottle on the table to the singer on a neon stage in one continuous shot",
"images": [
"https://media.beatapi.io/samples/smart-bottle.png",
"https://media.beatapi.io/samples/neon-singer.png"
],
"duration": 6,
"resolution": "2K"
}'

Image and audio references

A performance that follows a character image and a music clip (the sample clip runs about 12 seconds).

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax-h3",
"prompt": "The singer from the first reference image performs on stage in time with the reference music, warm spotlights, slow orbiting camera",
"reference_images": [
"https://media.beatapi.io/samples/neon-singer.png"
],
"reference_audios": [
"https://media.beatapi.io/samples/neon-singer-preview.mp3"
],
"duration": 8,
"aspect_ratio": "16:9",
"resolution": "768P"
}'

Image and video references

Replace the video link with your own MP4 or MOV of at most 15 seconds, at 23.976 to 60 frames per second.

curl --request POST \
--url https://api.beatapi.io/v1/videos/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "minimax-h3",
"prompt": "A product film: the bottle from the first reference image on a turntable, camera movement like the first reference video",
"reference_images": [
"https://media.beatapi.io/samples/smart-bottle.png"
],
"reference_videos": [
"https://your-cdn.example.com/clips/source.mp4"
],
"duration": 8,
"resolution": "768P"
}'

Responses

Create a task (201)

The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "minimax-h3",
"capability_version": 1,
"media_type": "video",
"model": "minimax-h3",
"status": "queued",
"stage": "queued",
"created_at": 1791993600,
"updated_at": 1791993600,
"completed_at": null,
"poll_after_seconds": 8,
"output": null,
"usage": {
"credits_reserved": 0.2,
"credits_settled": 0,
"credits_refunded": 0,
"credits_charged": 0.2,
"billable_duration_seconds": 5
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}
FieldTypeDescription
data.idstringTask ID: task_ followed by 32 letters and digits. Use it to poll and to match webhook events.
data.objectstringAlways task.
data.task_kindstringimage or video.
data.capability_idstringThe model ID you sent.
data.capability_versionintegerContract version of the model, currently 1.
data.media_typestringimage or video.
data.modelstringThe model ID you sent (same as capability_id).
data.statusstringqueued, processing, succeeded or failed. Only the last two are final.
data.stagestringRepeats status; kept for older clients.
data.created_atintegerWhen the task was created, Unix seconds.
data.updated_atintegerLast change, Unix seconds.
data.completed_atinteger | nullWhen the task finished, Unix seconds; null while it runs.
data.poll_after_secondsintegerWhile running: how long to wait before the next poll (5 for images, 8 for videos).
data.typical_secondsobjectWhile running, when enough recent tasks exist: p50 and p90 completion times in seconds over the last window, from samples tasks.
data.outputobject | nullThe result; null until status is succeeded. See the output fields below.
data.usage.credits_reservednumberUSD held from your balance when the task was created.
data.usage.credits_chargednumberUSD this task costs; 0 on a failed task.
data.usage.credits_settlednumberUSD finally taken; set when the task succeeds, otherwise 0.
data.usage.credits_refundednumberUSD returned to your balance; equals the reservation on a failed task once the refund is recorded.
data.usage.billable_duration_secondsintegerVideo only: the seconds the price is based on. Absent when the model reports no duration.
data.request_idstringRequest ID. Include it when you contact support.
data.error_codestring | nullFailure code; null unless the task failed.
data.error_messagestring | nullWhat went wrong and what to change; null unless the task failed.

Finished task

GET /v1/tasks/{task_id} returns HTTP 200 with status: "succeeded" and the result in data.output.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "minimax-h3",
"capability_version": 1,
"media_type": "video",
"model": "minimax-h3",
"status": "succeeded",
"stage": "succeeded",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": {
"media": [
{
"type": "video",
"url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.mp4",
"mime_type": "video/mp4"
}
],
"r2_url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.mp4"
},
"usage": {
"credits_reserved": 0.2,
"credits_settled": 0.2,
"credits_refunded": 0,
"credits_charged": 0.2,
"billable_duration_seconds": 5
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}

Output fields

FieldTypeDescription
output.mediaobject[]The generated files; one video for this model.
output.media[].typestringAlways video.
output.media[].urlstringHTTPS link to the stored video. Download and keep it; no retention period is promised.
output.media[].mime_typestringThe file type, for example video/mp4.
output.r2_urlstringThe video URL again, for older clients. Read media instead.

Failed task

A failed task is still HTTP 200 on GET /v1/tasks/{task_id}: the failure is in the body. The reservation is returned in full, so nothing is charged.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "video",
"capability_id": "minimax-h3",
"capability_version": 1,
"media_type": "video",
"model": "minimax-h3",
"status": "failed",
"stage": "failed",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": null,
"usage": {
"credits_reserved": 0.2,
"credits_settled": 0,
"credits_refunded": 0.2,
"credits_charged": 0,
"billable_duration_seconds": 5
},
"retryable": true,
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": "processing_failed",
"error_message": "The task failed during processing on our side. Retry; a failed task is refunded."
}
}
FieldTypeDescription
data.error_codestringOne of bad_request and content_policy_violation (change the request) or processing_unavailable, processing_timeout, processing_failed and result_transfer_failed (try again later). See Errors.
data.error_messagestringA sentence that names the problem and the fix.
data.retryablebooleanPresent only on a failed task: true when the same request can succeed if you send it again.
data.usageobjectOnce the refund is recorded (normally at the moment the task fails): credits_charged and credits_settled are 0, and credits_refunded equals credits_reserved.

Complete example

Create a task, wait for it with the server’s polling hint, and print the result URLs. Set BEATAPI_API_KEY in your environment and install requests.

import os
import time
import uuid
import requests
API = "https://api.beatapi.io"
HEADERS = {"Authorization": f"Bearer {os.environ['BEATAPI_API_KEY']}"}
def create_task(body: dict) -> dict:
# One Idempotency-Key per logical request: a retry with the same key cannot create a second task.
headers = {**HEADERS, "Idempotency-Key": str(uuid.uuid4())}
for attempt in range(3):
response = requests.post(f"{API}/v1/videos/tasks", headers=headers, json=body, timeout=60)
if response.status_code in (429, 503) and attempt < 2:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
break
try:
payload = response.json()
except ValueError: # an edge error page is not JSON
response.raise_for_status()
raise
if not response.ok:
error = payload["error"]
raise RuntimeError(f"{response.status_code} {error['code']}: {error['message']} (request_id={error.get('request_id')})")
return payload["data"]
def wait_for_task(task_id: str, timeout_seconds: int = 1800) -> dict:
deadline = time.monotonic() + timeout_seconds
while time.monotonic() < deadline:
response = requests.get(f"{API}/v1/tasks/{task_id}", headers=HEADERS, timeout=30)
if response.status_code == 429 or response.status_code >= 500:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
response.raise_for_status()
task = response.json()["data"]
if task["status"] in ("succeeded", "failed"):
return task
time.sleep(task.get("poll_after_seconds", 5))
raise TimeoutError(f"task {task_id} is still running; keep polling later")
task = create_task({
"model": "minimax-h3",
"prompt": "A slow cinematic push through a misty mountain village at dawn, smoke rising from the chimneys",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "768P"
})
print("created", task["id"])
task = wait_for_task(task["id"])
if task["status"] == "failed":
raise SystemExit(f"{task['error_code']}: {task['error_message']}")
for item in task["output"]["media"]:
print(item["url"])

Billing

  • Billed per second of video: the requested duration times the rate of the chosen resolution, which is about 0.04persecondat768Pand0.04 per second at 768P and 0.06 per second at 2K.
  • The aspect ratio, the number of frames or references, and the length of reference videos do not change the price.
  • The price is reserved when the task is created; usage.billable_duration_seconds on the task shows the seconds billed.
  • A failed task, including one refused by moderation after submission, is refunded in full.

Current list prices, the same as on Pricing. An account with a negotiated discount pays less; data.usage on the task always shows the amount actually charged.

OptionList price (USD)
8 sec · 768P$0.32
8 sec · 2K$0.48

Common errors

Error or symptomCauseFix
400 "resolution" must be one of: [768p 768P 2K 2k]480p, 1080p or 4K: this model offers 768P and 2K.Send 768P or 2K; for 480p or 1080p use minimax-h3-normal.
400 "duration" is outside its supported rangeNot a whole number from 4 to 15, or sent as a string.Send an integer such as 5.
400 Cannot combine "images" with reference inputs in one taskFrames and reference_* in the same request.Use frames or references. For several pictures, put them all in reference_images.
400 MiniMax H3 text mode does not support aspect_ratio=adaptiveadaptive with no image or reference input.Send a fixed ratio such as 16:9, or leave aspect_ratio out.
400 minimax-h3 audio reference requires at least one reference image or videoreference_audios on its own.Add a reference image or video, or drop the audio.
400 The reference videos run 20 seconds in total; this model takes at most 15.The reference clips together are too long.Trim or drop clips.
400 field "seed" is not supported by model minimax-h3A field this model does not accept (seed is only on minimax-h3-normal, minimax-h3-max and minimax-h3-max-turbo).Remove the field.
Task failed with content_policy_violationThe prompt, an input or the result was refused by moderation.Change the prompt or the inputs. Retrying unchanged fails again; nothing is charged.
402 insufficient_creditsThe balance is below the price reserved for the request.Top up, or lower duration or resolution.

HTTP errors at a glance

Errors before a task exists arrive as a non-2xx response, and nothing is charged. Branch on error.code or error.retryable; message names the problem. The full list and retry policy are on Errors.

{
"error": {
"code": "bad_request",
"message": "\"prompt\" is required",
"retryable": false,
"request_id": "req_5f0c2a9e4b7d4e31"
}
}
HTTP statuserror.codeWhat to do
400bad_request, content_policy_violationFix the request; the message names the field. Do not retry unchanged.
401missing_api_key, invalid_api_key (older clients may see unauthorized)Send a valid key as Authorization: Bearer <key>.
402insufficient_creditsTop up, or raise the key’s quota, then send it again.
403forbiddenThe key or account may not use this model (for example, free credit only covers some models). Do not retry unchanged.
404not_foundOn GET /v1/tasks/{task_id}: the task does not exist for this key’s account. Check the ID.
409idempotency_conflictUse a new Idempotency-Key, or wait for the first request with this key to finish.
429rate_limit_exceededWait Retry-After seconds (also error.retry_after_seconds), then retry.
500internal_errorRetry with backoff; contact support with request_id if it continues.
503processing_unavailable, processing_timeout, processing_failed, result_transfer_failedNothing was charged. Retry with exponential backoff.

Authentication

AuthorizationBearer

Send your API key as Authorization: Bearer <BEATAPI_API_KEY>.

Headers

Idempotency-KeystringOptional<=255 characters

Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.

Request

This endpoint expects an object.
modelenumRequired

The model to run.

Value: minimax-h3

If the value is wrong

  • Missing: "model" is required
  • An image model sent to this endpoint: "model" nano-banana-2 is served by POST /v1/images/tasks, not this endpoint
Allowed values:
promptstringRequired1-5000 characters

What happens in the video: subject, action, camera movement and style. With references, say what each input is for.

Length: 1–5000 characters

  • Length is counted in characters (a CJK character counts as one).
  • Refer to inputs by their position, for example “the first reference image”.

If the value is wrong

  • Missing: "prompt" is required
  • Empty or longer than the limit: "prompt" has an unsupported length
aspect_ratioenumOptional

Shape of the video as width:height. adaptive lets the model choose from the inputs.

Allowed values: adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16

  • Text to video: leave it out for 16:9, or send a fixed ratio. adaptive is refused because there is nothing to adapt to.
  • First frame or frames: not applied; the video follows the frame shape.
  • References: leave it out for adaptive, or send a fixed ratio.

If the value is wrong

  • A value not in the list: "aspect_ratio" must be one of: [adaptive 21:9 16:9 4:3 1:1 3:4 9:16]
  • adaptive with text to video: MiniMax H3 text mode does not support aspect_ratio=adaptive
durationintegerOptional4-15Defaults to 5

Length of the video in seconds, a whole number.

Default: 5

Range: 4–15

  • If you leave it out, 5 is used.
  • The price follows this value (see Billing).

If the value is wrong

  • Outside the range or not a whole number: "duration" is outside its supported range
imageslist of stringsOptional

A first frame, or a first and a last frame.

Items: 1–2

Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • One link: the video starts from this image. Two links: images[0] is the first frame and images[1] the last.
  • With frames, the shape of the video follows the frames: aspect_ratio is not applied.
  • For pictures that guide the video without being frames, use reference_images instead.

If the value is wrong

  • More than two links: "images" accepts at most 2 items
  • Combined with any reference_* field: Cannot combine "images" with reference inputs in one task
  • Not an https:// link: "images[0]" must be a public HTTPS URL
reference_audioslist of stringsOptional

Music, voice or sound to follow.

Items: 1–3

Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Audio needs company: send at least one reference image or one reference video with it.
  • Each clip must run 2 to 15 seconds.

If the value is wrong

  • More than the maximum: "reference_audios" accepts at most 3 items
  • Audio without a reference image or video: minimax-h3 audio reference requires at least one reference image or video
  • A clip outside 2 to 15 seconds: reference_audios[0] is 1.5 seconds long; this model takes reference audio of 2 to 15 seconds.
reference_imageslist of stringsOptional

Pictures that guide the content, characters, products or style of the video.

Items: 1–9

Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • Refer to them in the prompt by position.

If the value is wrong

  • More than the maximum: "reference_images" accepts at most 9 items
  • Combined with images: Cannot combine "images" with reference inputs in one task
reference_videoslist of stringsOptional

Videos to take motion, camera work or content from.

Items: 1–3

Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.

  • The reference videos together may run at most 15 seconds, at 23.976 to 60 frames per second; see the limits below.
  • The length of a reference video does not change the price.

If the value is wrong

  • More than the maximum: "reference_videos" accepts at most 3 items
  • Together longer than the limit: The reference videos run 20 seconds in total; this model takes at most 15.
  • Frame rate outside the limit: reference_videos[0] runs at 12 frames per second; this model takes 23.976 to 60.
resolutionenumOptionalDefaults to 768p

Output resolution. 2K costs more per second than 768P.

Allowed values: 768p, 2K

Default: 768p

  • 768p and 768P mean the same, as do 2K and 2k.
  • 480p, 1080p and 4K are not offered here; for 480p or 1080p use minimax-h3-normal.

If the value is wrong

  • A value not in the list (for example 480p, 1080p or 4K): "resolution" must be one of: [768p 768P 2K 2k]
Allowed values:

Response

The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.

Errors

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
403
Forbidden Error
409
Conflict Error
429
Too Many Requests Error
500
Internal Server Error
503
Service Unavailable Error