MiniMax-Hailuo-2.3
MiniMax Hailuo 2.3 creates videos from text or a starting image, with controls for motion and camera direction. Choose six seconds at 768P or 1080P, or ten seconds at 768P, for character performances, stylized scenes and product shots that can be reviewed and edited.
- Ailoot · Video
POST /v1/videos/generationsMiniMax-Hailuo-2.3 - Ailoot Ultra · Video
POST /v1/videosMiniMax-Hailuo-2.3
About the model
This description covers the model’s capabilities. Available in Ailoot inputs, outputs and options are listed for the selected method below.
MiniMax Hailuo 2.3 is a video-generation model with text-to-video and image-to-video modes. It builds on Hailuo 02 with a focus on physical action, visual style, character micro-expressions and response to motion instructions. Supply a written scene to create a shot from scratch, or use a starting image to establish the opening view and describe the movement that follows.
Physical performance is one of the edition’s main areas of improvement. Hailuo 2.3 aims to make body movements more fluid and controlled, including scenes with a moving camera. Plan the important action before adding decorative detail. A character lifting an object, turning towards another person or moving through a room gives the shot a visible event to evaluate. Decide which movement carries the story, then keep the surrounding instructions consistent with it.
Stylization is another focus. The model supports work in anime and illustration as well as styles such as ink-wash painting and game CG. Describe the visual treatment you want, and keep the appearance coherent with the scene. If a starting image already establishes a drawing style, use the text to guide the animation rather than introducing a competing description of the character’s design. Review the whole clip for whether that treatment remains readable during movement.
The model also focuses on facial performance and subtle expression changes. Prepare a character shot around the reaction that matters: noticing an object, becoming curious or responding with a small smile. A close view can make that change easier to assess, while a large sequence of gestures may distract from it. Check the face before, during and after the reaction rather than judging only a representative still frame.
Object motion is useful for product-centred scenes. An original brief might show a small ceramic vase turning in warm side light while the camera gradually approaches it. Identify which properties must remain recognisable, such as the silhouette, rim and surface finish. Review those details through the movement, because a convincing atmosphere alone does not establish a faithful product view.
For text-to-video, the required description can contain up to 2,000 characters. State the subject, action, setting and visual style in a coherent order. Image-to-video requires a starting-frame image, with an optional description of up to 2,000 characters. The image fixes the opening composition, so prepare the subject and framing before requesting motion. Leave visible space where an arm, object or character needs to move.
The starting image accepts JPG, JPEG, PNG or WebP, must be smaller than 20 MB, needs a short edge greater than 300 pixels and must have an aspect ratio between 2:5 and 5:2. It can be supplied as a public image URL or a Base64 data URL. Choose a clear opening picture rather than relying on the animation to repair an obscured face or an already cropped action.
Hailuo 2.3 generates at 24 frames per second. A six-second shot can use 768P or 1080P; a ten-second shot uses 768P. The defaults are six seconds and 768P. Choose the length for the action you want to see: a brief reaction may fit a short shot, while a slower movement needs more room. Read the completed result’s actual width and height when placing the clip in an edit, since a resolution label alone is not the full framing decision.
Camera direction can use bracketed commands. The available controls cover trucking, panning, pushing, pedestal movement, tilting, zooming, shaking, tracking and a static shot. A command such as [Push in] directs the approach; commands grouped inside one bracket act together, while commands placed in order describe a sequence. MiniMax recommends at most three simultaneous commands. Keep the camera movement compatible with the subject’s action so the main event remains easy to follow.
Automatic prompt optimisation is enabled by default and can be disabled for closer control over the supplied wording. Optional fast preprocessing reduces the optimisation time when that optimisation is enabled; it is a separate setting from choosing the Hailuo 2.3 Fast model. Standard Hailuo 2.3 supports both creation modes, while Fast is the distinct image-to-video edition. Choose the edition based on whether the project begins with text alone or an existing frame.
The generation workflow returns an asynchronous task identifier, then reports preparation, queueing, processing, success or failure. On success, the result supplies a file identifier and the actual video dimensions, and the completed video is retrieved for download. Save the clip while its download address is valid. The maker’s current video-download reference gives the returned download URL a one-hour lifetime. For an edited sequence, retain each shot with its prompt and starting image so that the chosen creative direction remains traceable during revision.
Review action, physical continuity, facial or product details, visual style and camera behaviour in the saved clip. Watch the whole shot, then inspect its beginning and end where it will join other material. If the request contains too many competing movements, simplify the main action; if the opening design is unclear, improve the starting image. Select a shot that communicates the intended event, then add narration, titles and transitions in the editing workflow.
Ailoot · Video POST /v1/videos/generations MiniMax-Hailuo-2.3
MiniMax-Hailuo-2.3Overview
MiniMax Hailuo 2.3 creates videos from text or a starting image, with controls for motion and camera direction. Choose six seconds at 768P or 1080P, or ten seconds at 768P, for character performances, stylized scenes and product shots that can be reviewed and edited.
- Accepted inputs
- Text · Images
- Results
- Video
Available in Ailoot · inputs & methods
Ailoot · Video POST /v1/videos/generations
- Input types
text,image- Output types
video- Output format
- mp4
| Field | Type | Requirement | Values & limits | Default |
|---|---|---|---|---|
Fieldmodel | Typestring | RequirementRequired | Values & limits MiniMax-Hailuo-2.3 | Default— |
Fieldprompt | Typestring | RequirementRequired | Values & limits Minimum length: 1 Maximum length: 2,000 Unit: Unicode characters | Default— |
Fieldduration | Typeinteger | RequirementOptional | Values & limits 6, 10 Conditions: 10secondsrequires768P Unit: seconds | Default6 |
Fieldresolution | Typestring | RequirementOptional | Values & limits 768P, 1080P Conditions: 1080Prequires6seconds | Default768P |
Fieldfirst_frame_image | Typehttps_url|data_image_url | RequirementOptional | Values & limits Maximum decoded bytes: 20,971,520 MIME types: image/jpeg, image/png, image/webp Minimum dimension (exclusive): 300 Aspect ratio range: 2:5, 5:2 | Default— |
Fieldprompt_optimizer | Typeboolean | RequirementOptional | Values & limits | Default— |
Fieldfast_pretreatment | Typeboolean | RequirementOptional | Values & limits | Default— |
Input material combinations
Image to video · Required: prompt, first_frame_image
Text to video · Required: prompt
Method parameters and lifecycle
| Parameter | Contract |
|---|---|
Parametermaterial_types | Contracttext, image |
Parameterrequired | Contractnull |
Parameteroptional_controls | Contractnull |
Lifecycle: submit_once_poll_original
GET /v1/videos/{request_id}
GET /v1/videos/generations/{request_id}
GET /v1/videos/{request_id}/content
GET /v1/videos/generations/{request_id}/content
Method shapes and IDs are exact; supplier capability is separate from admission.
Pricing
Ailoot method rates
POST /v1/videos/generations- Output
- $0.28 per 6 s video at 768p
Ailoot reserves an estimated amount before a request. After the result, it settles the final charge from measured usage. Streaming settlement uses the final usage record. How reservation and settlement work →
Reference tariff details
Model-level reference schedules do not change method selection, quotes or charges. Active charges use the selected Ailoot method rates.
MiniMax-Hailuo-2.3
Prices by configuration
| Configuration | Billing conditions | Charge |
|---|---|---|
| ConfigurationMiniMax-Hailuo-2.3 · Default configuration | Billing conditionsDefault configuration | Charge Input · Input $0.00 per call Output · Output $0.60 per call |
MiniMax-Hailuo-2.3
Prices by configuration
| Configuration | Billing conditions | Charge |
|---|---|---|
| ConfigurationMiniMax-Hailuo-2.3 · Default configuration | Billing conditionsDefault configuration | Charge Input · Input $0.00 per call Output · Output $1.20 per call |
Example requests
Ailoot · Video
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
curl https://api.ailoot.ai/v1/videos/generations \
-H "Authorization: Bearer $AILOOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "MiniMax-Hailuo-2.3", "prompt": "A person walks slowly through a quiet garden as the camera tracks from the side.", "duration": 6, "resolution": "768P"}'Receive and save results
Ailoot · Video
mp4
GET /v1/videos/{request_id}GET /v1/videos/generations/{request_id}GET /v1/videos/{request_id}/contentGET /v1/videos/generations/{request_id}/content
Check job status
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_VIDEO_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_VIDEO_ID
video_id=$(python3 -c 'import os, urllib.parse; print(urllib.parse.quote(os.environ["AILOOT_VIDEO_ID"], safe=""))') || exit 1
curl "https://api.ailoot.ai/v1/videos/generations/$video_id" \
-H "Authorization: Bearer $AILOOT_API_KEY"Other content reads
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_VIDEO_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_VIDEO_ID
video_id=$(python3 -c 'import os, urllib.parse; print(urllib.parse.quote(os.environ["AILOOT_VIDEO_ID"], safe=""))') || exit 1
curl "https://api.ailoot.ai/v1/videos/generations/$video_id/content" \
-H "Authorization: Bearer $AILOOT_API_KEY" \
--output video.mp4Keep all completed results
Save every completed video or returned file; retrieve every actual returned asset URL.
Preserve every returned data item/output index. content_url is first only; fetch every actual content path/asset. GETcontentwithoutindex isnotalloutputs.
If the original response needs checking
Read existing original job; never resubmit unknown send.
Response fields
| Field | Type |
|---|---|
Fieldid | Typestring |
Fieldobject | Typestring |
Fieldmodel | Typestring |
Fieldstatus | Typestring |
Fieldcontent_url | Typesigned URL |
Fielddata[] | Typesigned URL |
Fieldusage | Typeobject |
Fieldresult_pending_check | Typeboolean |
Errors and next steps
| Response | Condition | Next step |
|---|---|---|
Response400 · invalid_request_error | ConditionInvalid required fields, material representation or parameter value | Next stepCorrect the indicated fields before a new creation request. |
Response409 · video_not_ready | ConditionOriginal result content is not yet available | Next stepPoll the original returned ID and respect Retry-After. |
Responseserver_error | ConditionThe returned response says the operation or result requires a check | Next stepKeep the original returned operation/task ID, request headers and response; continue supported reads of that original operation. Do not resubmit the creation request. |
Aliases
Model aliases
Ailoot MiniMax-Hailuo-2.3
Ailoot Ultra MiniMax-Hailuo-2.3
Method path aliases
/v1/videos/generations, /videos, /videos/generations
Related caller IDs
Ailoot Ultra · Video POST /v1/videos MiniMax-Hailuo-2.3
MiniMax-Hailuo-2.3Overview
MiniMax Hailuo 2.3 creates videos from text or a starting image, with controls for motion and camera direction. Choose six seconds at 768P or 1080P, or ten seconds at 768P, for character performances, stylized scenes and product shots that can be reviewed and edited.
- Accepted inputs
- Text
- Results
- Video
Available in Ailoot · inputs & methods
Ailoot Ultra · Video POST /v1/videos
- Input types
text- Output types
video- Output format
- mp4
- Output count
- Up to 1 output
| Field | Type | Requirement | Values & limits | Default |
|---|---|---|---|---|
Fieldmodel | Typestring | RequirementRequired | Values & limits MiniMax-Hailuo-2.3 | Default— |
Fieldprompt | Typestring | RequirementRequired | Values & limits Minimum length: 1 Maximum length: 2,000 Conditions: For 768P: at most 2000 Unicode code points. For 1080P: fewer than 200 Unicode code points (maximum 199). The prompt must contain non-whitespace text. Unit: Unicode characters | Default— |
Fieldduration | Typeinteger | RequirementRequired | Values & limits 6 Unit: seconds | Default— |
Fieldresolution | Typestring | RequirementRequired | Values & limits 768P, 1080P | Default— |
Input material combinations
Text to video · Required: prompt
Method parameters and lifecycle
| Parameter | Contract |
|---|---|
Parametercontent_type | Contractapplication/json |
Parameterrequired | Contractmodel, prompt, duration, resolution |
Parameterother_options | Contractfalse |
Parameterduration | Contract6 |
Parameterresolution | Contract768P, 1080P |
Parameterprompt_max_characters | Contract2000 |
Parametermaterial_types | Contracttext |
Parameterprompt_max_characters_by_resolution | Contract{"768P":2000,"1080P":199} |
Method aliases: /v1/videos/generations, /videos, /videos/generations
Lifecycle: submit_once_poll_original
GET /v1/videos/{request_id}
GET /v1/videos/generations/{request_id}
GET /v1/videos/{request_id}/content
GET /v1/videos/generations/{request_id}/content
Create once and save returned ID.
Poll original status; retain every completed asset and duration.
Pricing
Tariff references do not add request options. Supported parameters are listed for the selected method.
- Fast mode
- Not specified When fast mode is selected
- Flex mode
- Not specified When flex mode is selected
- Maximum reasoning effort
- Not specified When maximum reasoning effort uses the default adjustment
Ailoot rates
Prices by configuration
Match each charge to the conditions shown. Use one rate for each set of alternative configurations.
| Configuration | Rate schedule | Nominal clip duration, seconds | Resolution | Billing unit | Charge |
|---|---|---|---|---|---|
| ConfigurationBase token rates | Rate scheduleBase rate | Nominal clip duration, seconds— | Resolution— | Billing unit— | Charge Input · Input tokens — / 1K tokens Output · Output tokens — / 1K tokens Input · Cache read — / 1K tokens Input · Cache write — / 1K tokens Input · Cache write, 1 hour — / 1K tokens |
| ConfigurationUltra | Rate schedule— | Nominal clip duration, seconds6 | Resolution1080P | Billing unitper nominal 6s output clip | Charge Output · nominal 6s output clip $1.2 per nominal 6s output clip |
| ConfigurationUltra | Rate schedule— | Nominal clip duration, seconds6 | Resolution768P | Billing unitper nominal 6s output clip | Charge Output · nominal 6s output clip $0.6 per nominal 6s output clip |
Ailoot reserves an estimated amount before a request. After the result, it settles the final charge from measured usage. Streaming settlement uses the final usage record. How reservation and settlement work →
Reference tariff details
Model-level reference schedules do not change method selection, quotes or charges. Active charges use the selected Ailoot method rates.
MiniMax-Hailuo-2.3
Prices by configuration
| Configuration | Billing conditions | Charge |
|---|---|---|
| ConfigurationMiniMax-Hailuo-2.3 · Default configuration | Billing conditionsDefault configuration | Charge Input · Input $0.00 per call Output · Output $0.60 per call |
MiniMax-Hailuo-2.3
Prices by configuration
| Configuration | Billing conditions | Charge |
|---|---|---|
| ConfigurationMiniMax-Hailuo-2.3 · Default configuration | Billing conditionsDefault configuration | Charge Input · Input $0.00 per call Output · Output $1.20 per call |
Example requests
Ailoot Ultra · Video
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "MiniMax-Hailuo-2.3", "prompt": "A cat in a spacesuit walking on the Moon", "duration": 6, "resolution": "768P"}')
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "MiniMax-Hailuo-2.3", "prompt": "A cat in a spacesuit walking on the Moon", "duration": 6, "resolution": "1080P"}')
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/videos \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
Receive and save results
Ailoot Ultra · Video
mp4
GET /v1/videos/{request_id}GET /v1/videos/generations/{request_id}GET /v1/videos/{request_id}/contentGET /v1/videos/generations/{request_id}/content
Check job status
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/$operation_id" \
-H "Authorization: Bearer $AILOOT_API_KEY" -o status.json
python3 - <<'PY_STATUS'
import json
from pathlib import Path
r=json.loads(Path("status.json").read_text())
print(json.dumps(r))
if r.get("status")=="completed":
for x in r.get("data",[]):print(x)
PY_STATUS
Save all completed assets
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_STATUS_FILE:?Set the actual completed status JSON file}"
export AILOOT_STATUS_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
from urllib.parse import urlsplit,urljoin
f=Path(os.environ["AILOOT_STATUS_FILE"])
if not f.is_file():raise SystemExit("Choose the actual completed status file")
r=json.loads(f.read_text())
if r.get("status")!="completed" or not isinstance(r.get("data"),list) or not r["data"]:raise SystemExit("Wait for a completed status with asset paths")
urls=[]
for x in r["data"]:
if not isinstance(x,str) or "\n" in x or "\r" in x:raise SystemExit("Invalid asset path")
u=urljoin("https://api.ailoot.ai",x)
z=urlsplit(u)
if z.scheme!="https" or z.netloc!="api.ailoot.ai" or z.username or z.password:raise SystemExit("Use the actual Ailoot asset paths from status")
urls.append(u)
Path("asset-urls.txt").write_text("\n".join(urls)+"\n")
PY_REQUEST
index=0
while IFS= read -r asset_url; do
curl --fail-with-body --silent --show-error "$asset_url" \
-H "Authorization: Bearer $AILOOT_API_KEY" -o "video-${index}.mp4"
index=$((index + 1))
done < asset-urls.txt
Other content reads
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_OPERATION_ID:?Set the actual Ailoot operation ID returned by creation}"
export AILOOT_OPERATION_ID
operation_id=$(python3 -c 'import os,urllib.parse;print(urllib.parse.quote(os.environ["AILOOT_OPERATION_ID"],safe=""))')
curl --fail-with-body --silent --show-error "https://api.ailoot.ai/v1/videos/$operation_id/content" \
-H "Authorization: Bearer $AILOOT_API_KEY" -o video.mp4
Keep all completed results
Save every completed video or returned file; retrieve every actual returned asset URL.
Completed data[] contains all owned signed content URLs. Fetch each returned URL, or use the content endpoint with index set to an actual output index. A failed original job may return charge_pending_check; check that original job rather than creating it again.
If the original response needs checking
Read existing original job; never resubmit unknown send.
Maximum outputs: 1.
Response fields
| Field | Type |
|---|---|
Fieldid | Typestring |
Fieldobject | Typestring |
Fieldmodel | Typestring |
Fieldstatus | Typestring |
Fielddata[] | Typesigned content URL |
Fieldcharge_pending_check | Typeboolean |
Fielderror.code | Typestring |
Fielderror.message | Typestring |
Fieldrequested_nominal_duration_seconds | Typeinteger |
Fieldmeasured_duration_seconds | Typenumber |
Fieldwidth | Typeinteger |
Fieldheight | Typeinteger |
Errors and next steps
| Response | Condition | Next step |
|---|---|---|
Response400 · invalid_request_error | ConditionInvalid required fields, material representation or parameter value | Next stepCorrect the indicated fields before a new creation request. |
Response409 · video_not_ready | ConditionOriginal result content is not yet available | Next stepPoll the original returned ID and respect Retry-After. |
Responseserver_error | ConditionThe returned response says the operation or result requires a check | Next stepKeep the original returned operation/task ID, request headers and response; continue supported reads of that original operation. Do not resubmit the creation request. |
Aliases
Model aliases
Ailoot MiniMax-Hailuo-2.3
Ailoot Ultra MiniMax-Hailuo-2.3
Method path aliases
/v1/videos/generations, /videos, /videos/generations
Related caller IDs
FAQ · MiniMax-Hailuo-2.3
- What inputs and results are available?
POST /v1/videos/generations·MiniMax-Hailuo-2.3:text,image→videoPOST /v1/videos·MiniMax-Hailuo-2.3:text→video- Which fields does the request use?
POST /v1/videos/generations·MiniMax-Hailuo-2.3:model,prompt,duration,resolution,first_frame_image,prompt_optimizer,fast_pretreatmentPOST /v1/videos·MiniMax-Hailuo-2.3:model,prompt,duration,resolution- What limits apply?
POST /v1/videos/generations·MiniMax-Hailuo-2.3:prompt.maximum_length:2000POST /v1/videos·MiniMax-Hailuo-2.3:prompt.maximum_length:2000