Animate this exact adult telephone operator in one continuous medium close-up. Listening through the same headset, she first knits her eyebrows in puzzled concentration, shifts only her eyes briefly to the side as if checking whether she heard correctly, then presses her lips together to suppress a laugh. A tiny involuntary shoulder movement gives away her amusement. Preserve the face, hairstyle, headset, clothing and switchboard. Keep her hands still. Restrained believable micro-expressions, no broad grin, speaking or head turn. Locked camera and stable warm practical lighting. No cuts, no lettering, no logos, no advertising, no watermark.
Hailuo 2.3 Pro Image to Video API
minimax/hailuo-2.3/pro/image-to-videoHailuo 2.3 Pro Image to Video transforms static reference images into cinematic native 1080p video clips with pixel-accurate facial preservation, realistic physics, and expressive motion dynamics. It preserves delicate character features, clothing textures, and lighting balance while orchestrating natural micro-expressions and sweeping cinematic camera moves across focused 6-second sequences.

Required first frame. Playground uploads support JPG, PNG and WebP, up to 10 MiB. Use JSON mode to supply an HTTP(S) URL.
Examples
REST API Spec
Quick Start
Submit an endpoint request and poll for status. Replace example URLs with your accessible files.
Step 1: Configure API authentication
Obtain an API key from the dashboard and include Authorization: Bearer <API_KEY> in every request header.
- Submission Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Auth Header
- Authorization: Bearer VIDGO_API_KEY
Step 2: Submit a generation task
POST /api/generate/submit. Pass model and optional callback_url at the root level, with generation parameters inside input.
REQUEST_BODY=$(cat <<'JSON'
{
"model": "minimax/hailuo-2.3/pro/image-to-video",
"input": {
"prompt": "A quiet forest in morning light, with a slow camera pan.",
"duration": 6,
"resolution": "1080p",
"prompt_optimizer": false,
"start_image_url": "https://example.com/start-image.png"
}
}
JSON
)
RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
CODE=$(printf '%s' "$RESPONSE" | jq -r '.code // empty')
if [ "$CODE" != "0" ] && [ "$CODE" != "200" ]; then
printf 'API error: %s
' "$RESPONSE" >&2
exit 1
fi
printf '%s
' "$RESPONSE"Step 3: Poll for task completion
Poll status with task_id; continue while not_started or running, and stop on finished or failed. Read video URLs from data.files[].file_url on success, or data.error_message on failure.
Status Endpoint
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll status using task_id; continue while not_started or running, stop when finished or failed. On success, read data.files[].file_url; on failure, read data.error_message.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-example",
"status": "not_started",
"created_time": "2026-09-23T08:00:00"
}
}{
"code": 200,
"data": {
"task_id": "task-unified-...",
"status": "finished",
"files": [
{
"file_url": "https://storage.vidgo.ai/generated/video.mp4",
"file_type": "video"
}
],
"created_time": "2026-08-22T10:00:00Z",
"progress": 100,
"error_message": null
}
}Complete end-to-end script example
Expand to view a production-ready script with retry logic, error handling, and timeout safeguards.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "minimax/hailuo-2.3/pro/image-to-video",
"input": {
"prompt": "A quiet forest in morning light, with a slow camera pan.",
"duration": 6,
"resolution": "1080p",
"prompt_optimizer": false,
"start_image_url": "https://example.com/start-image.png"
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
BUSINESS_CODE=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Submit failed:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
START_TIME=$(date +%s)
POLL_DELAY=2
while true; do
if [ $(( $(date +%s) - START_TIME )) -ge 600 ]; then
printf 'Timed out after 600 seconds
' >&2
exit 1
fi
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
BUSINESS_CODE=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.code // empty')
if [ "$BUSINESS_CODE" != "0" ] && [ "$BUSINESS_CODE" != "200" ]; then
printf 'Status request failed:
%s
' "$STATUS_RESPONSE" >&2
exit 1
fi
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep "$POLL_DELAY"
if [ "$POLL_DELAY" -lt 10 ]; then POLL_DELAY=$((POLL_DELAY + 1)); fi
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneRequest Parameters (input object)
Supported generation parameters inside the input object when submitting a POST request to /api/generate/submit:
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| prompt | string | Yes | — | Required nonblank string, trimmed before validation. Maximum 5,000 Unicode characters. |
| duration | integer | No | 6 | Only 6 seconds; defaults to 6. |
| resolution | string | No | 1080p | Fixed to 1080p for this endpoint; used when omitted. |
| start_image_url | string | Yes | — | Required first-frame HTTP(S) image URL with a hostname and no embedded credentials. End frames, arrays and data URLs are not supported. |
| prompt_optimizer | boolean | No | — | Optional boolean; omit to leave unspecified upstream. No API default. The playground starts with false; no extra charge. |
Response Fields (query result)
Task details returned when polling GET /api/generate/status/{task_id}:
| Field | Type | Description |
|---|---|---|
| code | integer | Business response code, 200 on success. |
| data.task_id | string | Globally unique asynchronous task identifier. |
| data.status | string | Execution status: not_started, running, finished, or failed. |
| data.files | array | Generated video files upon completion, each with file_url and file_type. |
| data.error_message | string | null | Error description if task fails. |
Task Lifecycle
Clients should inspect the status field and stop polling when reaching finished or failed:
not_startedTask received and queued for execution.
runningGeneration is in progress.
finishedGeneration complete; retrieve video URL from data.files.
failedGeneration failed; inspect data.error_message; deducted credits are refunded per standard policy.
Polling & Error Handling
- Recommended Polling IntervalStart polling every 2–3 seconds, increasing to 5 seconds as the task continues, to avoid excessive requests.
- Network Fluctuations & RetriesIf status polling encounters 5xx or timeouts, the task is still running; retry querying after a brief pause.
- Asynchronous Webhook CallbackProvide callback_url at the root of the request payload to receive the completed task result automatically via POST.
Specifications
| Specification | Value | Description |
|---|---|---|
| Model ID | minimax/hailuo-2.3/pro/image-to-video | Root-level model field. |
| Resolution | 1080p | Fixed to 1080p for this endpoint; used when omitted. |
| Duration | 6s | Only 6 seconds; defaults to 6. |
Hailuo 2.3 Pro Image to Video API frequently asked questions
What is the Hailuo 2.3 Pro Image to Video API?
Hailuo 2.3 Pro Image to Video is MiniMax's premier image-guided video generation model, engineered for commercial advertising, virtual human acting, and cinematic shot animation. It animates a single reference start image into a native 1080p full HD video sequence across a focused 6-second duration, guided by natural language prompts up to 5,000 characters. Powered by MiniMax's high-capacity generative diffusion architecture, it guarantees pixel-level identity preservation, realistic micro-expressions, and depth-aware camera parallax while maintaining the original lighting and composition. Developers can integrate this endpoint via Vidgo's high-performance REST API or test image animations directly within the interactive playground above.
What resolution does Hailuo 2.3 Pro Image to Video produce?
Hailuo 2.3 Pro Image to Video outputs native 1080p full HD video files directly from generation without relying on post-generation spatial interpolation, preserving sharp textures, authentic film grain, and intricate background details.
What image formats are supported for the start image in Hailuo 2.3 Pro Image to Video?
When calling the API, start_image_url requires a public HTTP or HTTPS URL pointing to a JPG, PNG, or WebP image. In the interactive playground, you can directly upload image files up to 10 MiB in size.
Does Hailuo 2.3 Pro Image to Video support an end frame parameter?
No, this endpoint is specifically optimized for single first-frame image animation via start_image_url. If you need to direct where the video ends, describe the final position, expression, and camera framing in detail within the prompt text.
Why is Hailuo 2.3 Pro Image to Video fixed to a 6-second duration?
The Pro tier concentrates computational capacity on per-frame photorealism, authentic physics, and high-definition micro-movements within a calibrated 6-second format. Setting duration to any value other than 6 will return a validation error.
How does pricing work for Hailuo 2.3 Pro Image to Video?
Generating a video with Hailuo 2.3 Pro Image to Video costs a flat 60 credits ($0.300 based on $0.005 per credit) per 6-second 1080p render. Toggling prompt_optimizer does not add any extra fees.
When should I choose Hailuo 2.3 Pro Image to Video over the Standard Image to Video endpoint?
Choose Hailuo 2.3 Pro Image to Video when your project demands native 1080p clarity, immaculate facial micro-expression fidelity, and cinematic 3D camera parallax for luxury advertising or film assets. For rapid concept prototyping, tighter production budgets (35 credits for 6s), or when 10-second extended animations (70 credits) are required, the Standard Image to Video endpoint is the ideal choice.