models

Hailuo 2.3 Fast

Markdown · JSON

Hailuo 2.3 Fast

MiniMax Hailuo 2.3 Fast animates a first-frame image from a short motion prompt. Choose this image-to-video profile for a product shot, character pose or storyboard still.

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 Fast is the named Fast profile for image-to-video generation. Start with a composed first-frame image and describe how the subject or camera should move. A product still, character pose or storyboard frame gives the shot a concrete visual starting point.

Prepare the image and motion brief

Provide a square PNG or JPEG image through an HTTPS URL, with each side between 300 and 4,096 pixels. The downloaded image file must be no larger than 20,000,000 bytes. Keep the prompt between 1 and 199 characters, focused on one visible action and the movement that matters to the shot.

Follow the clip to completion

This profile is configured for one 768 × 768 MP4 clip with a nominal duration of six seconds. Submit the request once, save the returned ID and follow that original request until it completes. Download the returned video and retain its reported dimensions and measured duration with the result. If the creation outcome is uncertain, continue checking the original request rather than creating it again.

Ailoot Ultra · Video POST /v1/videos MiniMax-Hailuo-2.3-Fast

MiniMax-Hailuo-2.3-Fast

MiniMax /MiniMax-Hailuo-2.3-Fast

Overview

MiniMax Hailuo 2.3 Fast animates a first-frame image from a short motion prompt. Choose this image-to-video profile for a product shot, character pose or storyboard still.

Accepted inputs
Text · Images
Results
Video

Available in Ailoot · inputs & methods

Ailoot Ultra · Video POST /v1/videos
Input types
text, image
Output types
video
Output format
mp4
Output count
Up to 1 output
FieldTypeRequirementValues & limitsDefault
FieldmodelTypestringRequirementRequiredValues & limits
MiniMax-Hailuo-2.3-Fast
Default—
FieldpromptTypestringRequirementRequiredValues & limits
Minimum length: 1
Maximum length: 199
Unit: Unicode characters
Default—
FielddurationTypeintegerRequirementRequiredValues & limits
6
Unit: seconds
Default—
FieldresolutionTypestringRequirementRequiredValues & limits
768P
Default—
Fieldfirst_frame_imageTypehttps_urlRequirementRequiredValues & limits
Maximum file bytes: 20,000,000
MIME types: image/png, image/jpeg
Minimum dimension: 300
Maximum dimension: 4,096
Square only: Yes
Default—
Input material combinations

Image to video · Required: prompt, first_frame_image

Method parameters and lifecycle
ParameterContract
Parametercontent_typeContractapplication/json
ParameterrequiredContractmodel, prompt, duration, resolution, first_frame_image
Parameterother_optionsContractfalse
ParameterdurationContract6
ParameterresolutionContract768P
Parameterprompt_max_charactersContract199
Parameterfirst_frame_imageContract{"type":"https_url","format":["png","jpeg"],"dimensions":"square 300..4096 pixels","full_image_validation_before_send":true,"maximum_file_bytes":20000000}
Parametermaterial_typesContracttext, image
Parameteradditional_propertiesContractfalse

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.

ConfigurationRate scheduleNominal clip duration, secondsResolutionBilling unitCharge
ConfigurationBase token ratesRate scheduleBase rateNominal 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
ConfigurationUltraRate schedule—Nominal clip duration, seconds6Resolution768PBilling unitper nominal 6s output clipCharge
Output · nominal 6s output clip $0.4 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-Fast

Prices by configuration

ConfigurationBilling conditionsCharge
ConfigurationMiniMax-Hailuo-2.3-Fast · Default configurationBilling conditionsDefault configurationCharge
Input · Input $0.00 per call
Output · Output $0.40 per call
MiniMax-Hailuo-2.3-Fast

Prices by configuration

ConfigurationBilling conditionsCharge
ConfigurationMiniMax-Hailuo-2.3-Fast · Default configurationBilling conditionsDefault configurationCharge
Input · Input $0.00 per call
Output · Output $0.80 per call

Example requests

Ailoot Ultra · Video

curl · exact retained creation
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_URL:?Set the actual HTTPS first-frame image URL}"
export AILOOT_IMAGE_URL
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "MiniMax-Hailuo-2.3-Fast", "prompt": "A cat in a spacesuit walking on the Moon", "duration": 6, "resolution": "768P"}')
from urllib.parse import urlsplit
u=os.environ["AILOOT_IMAGE_URL"]
z=urlsplit(u)
if z.scheme!="https" or not z.netloc or z.username or z.password:raise SystemExit("Choose the actual HTTPS first-frame image URL")
p["first_frame_image"]=u
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}/content
  • GET /v1/videos/generations/{request_id}/content
Check job status
GET original status
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
python3 - <<'PY_STATUS_URL'
import json
from pathlib import Path
from urllib.parse import quote
r=json.loads(Path('result.json').read_text())
if not isinstance(r.get('id'),str) or not r['id']:raise SystemExit('Keep the original response and headers for reconciliation; no returned ID')
Path('status-url.txt').write_text('https://api.ailoot.ai/v1/videos/'+quote(r['id'],safe=''))
PY_STATUS_URL
curl --fail-with-body --silent --show-error "$(cat status-url.txt)" \
  -H "Authorization: Bearer $AILOOT_API_KEY" -D status-headers.txt -o status.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
r=json.loads(Path('status.json').read_text())
print(json.dumps(r,ensure_ascii=False,indent=2))
print('Keep the complete JSON and response headers; do not resubmit an unknown creation.')
PY_RESULT
Other content reads
Save every completed owned output
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
python3 - <<'PY_ASSETS'
import json,os,subprocess
from pathlib import Path
from urllib.parse import urljoin,urlsplit
r=json.loads(Path('status.json').read_text())
if r.get('status')!='completed':raise SystemExit('Keep the original ID and read its status; never recreate an unknown job')
if not isinstance(r.get('data'),list) or not r['data']:raise SystemExit('Keep the complete original status; no completed outputs supplied')
urls=[]
for i,u in enumerate(r.get('data',[])):
    if not isinstance(u,str):raise SystemExit('Keep the original response; unexpected asset shape')
    urls.append((str(i),u))
for label,path in urls:
    u=urljoin('https://api.ailoot.ai',path);z=urlsplit(u)
    if z.scheme!='https' or z.netloc!='api.ailoot.ai' or z.username or z.password:raise SystemExit('Use the actual returned Ailoot owned content URL')
    target=Path('owned-'+label+'.bin')
    subprocess.run(['curl','--fail-with-body','--silent','--show-error',u,'-H','Authorization: Bearer '+os.environ['AILOOT_API_KEY'],'-D',str(target)+'.headers','-o',str(target)],check=True)
print('All returned owned URLs saved; complete metadata, timing and usage remain in the JSON.')
PY_ASSETS
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
FieldTypeMeaning
FieldidTypestringMeaning—
FieldobjectTypestringMeaning—
FieldmodelTypestringMeaning—
FieldstatusTypestringMeaning—
Fielddata[]Typesigned content URLMeaning—
Fieldcharge_pending_checkTypebooleanMeaning—
Fielderror.codeTypestringMeaning—
Fielderror.messageTypestringMeaning—
Fieldrequested_nominal_duration_secondsTypeintegerMeaning—
Fieldmeasured_duration_secondsTypenumberMeaning—
FieldwidthTypeintegerMeaning—
FieldheightTypeintegerMeaning—
Fieldoperation_idTypestringMeaningReturned when status=unknown; actual original public video operation ID
Fieldrequest_idTypestringMeaningOptional when status=unknown; returned only if the original task has a request ID
Errors and next steps
ResponseConditionNext step
Response400 · invalid_request_errorConditionReading the raw request body fails before parsing the video profileNext stepPreserve the returned response and correct the unreadable request body.
Response422 · price_unavailableConditionParsing the exact video profile fails, or the complete parsed profile has no ready exact price cardNext stepPreserve the response; use the complete exact admitted profile and its published card. This branch runs before a provider send.
Response409 · video_not_readyConditionOriginal result content is not yet availableNext stepPoll the original returned ID and respect Retry-After.
Responseserver_errorConditionThe returned response says the operation or result requires a checkNext stepKeep the original returned operation/task ID, request headers and response; continue supported reads of that original operation. Do not resubmit the creation request.
Response200 · video_result_unverifiedConditionOriginal Fast task state is unknown; status=unknown and charge_pending_check=trueNext stepKeep the actual returned id/operation_id and optional request_id; read only the original task. Never resubmit.

Aliases

Model aliases

Ailoot Ultra MiniMax-Hailuo-2.3-Fast

Method path aliases

/v1/videos/generations, /videos, /videos/generations

Related caller IDs

MiniMax-Hailuo-2.3-Fast

FAQ · Hailuo 2.3 Fast
What inputs and results are available?

POST /v1/videos · MiniMax-Hailuo-2.3-Fast: text, image → video

Which fields does the request use?

POST /v1/videos · MiniMax-Hailuo-2.3-Fast: model, prompt, duration, resolution, first_frame_image

What limits apply?

POST /v1/videos · MiniMax-Hailuo-2.3-Fast: prompt.maximum_length: 199

More details

Connect Ailoot to Claude Code, OpenCode, Hermes or your own app.

The company and its project portfolio

The company and its project portfolio: millions of customers; monthly sales in the billions.

Buy tokens at a discount.

Subscription discounts for regular use. Promo codes offer up to 50% off token purchases.

Subscription
Choose a discounted plan for your regular requests.
Promo code: up to 50% off
Enter your code at checkout. The price updates to reflect the current promotion.
Spending in your history
The model, tokens and amount are recorded for each request.

Choose a subscription · View model prices

Connect the API to a product you sell.

Use Ailoot in SaaS, apps and bots under its official service offer and licence agreement. Request a reseller licence for resale.

Commercial application
Add text, image, video and audio generation to paid features in your service.
Reseller licence
Send a description of your project and how you provide access. Request written terms for use and resale.
Documents on the website
The service offer, licence agreement and data processing policy are available before you connect.

Request a reseller licence · Service offer and licence agreement