Animate this original photograph into a five-second continuous shot. The elderly puppeteer gently pulls the strings so the small wooden marionette bows once toward the empty velvet seats, then lifts its little head. Keep the puppeteer's face, hands, puppet costume, strings and warm theater lighting consistent. He smiles and softly says, "Your turn." Subtle camera push from the puppet toward his face, plausible string tension and articulated wooden limbs. Native quiet wood clicks and synchronized brief English speech, intimate theater room tone. No extra people, no subtitles, logos or advertising.
MiniMax H3 Max Turbo Image to Video API
minimax/h3-max-turbo/image-to-videoMiniMax H3 Max Turbo Image to Video turns still images into 5–15 second videos with start and end frame control and synchronized native stereo audio. It preserves the source subject and textures while adding realistic physical motion.
Drag and drop files, paste from clipboard, or provide a URL. Required. Add 1–2 images in order: starting frame, then optional ending frame.
2/2 files added
Examples
REST API
Quick Start
Make your first image-to-video request in three steps. The short example sends a start frame and prompt, then returns a task_id for result retrieval.
Connect to the Vidgo API
Create an API key, keep it on your server, and send it in the Authorization header as a Bearer token.
- Endpoint
- POST
https://api.vidgo.ai/api/generate/submit - Authentication
- Authorization: Bearer VIDGO_API_KEY
Submit one generation task
Provide image_urls in order: starting frame, then optional ending frame, together with a prompt.
curl --request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "minimax/h3-max-turbo/image-to-video",
"input": {
"prompt": "Create a single continuous five-second live-action shot connecting these exact first and last frames. The same helmeted adult BMX rider in the plain orange hoodie makes a small controlled hop from the shallow bank lip, keeps both hands on the handlebars and both feet on the pedals, and lands both wheels smoothly on the flat. Preserve the bicycle frame, wheels, helmet, face and skatepark geometry. Follow the rider with a gentle low tracking camera, without cuts, flips or spins. End at the supplied final pose and composition. Realistic short flight arc, wheel rotation, tire compression on landing and settling cloth. Native rolling tires, one soft landing sound and a satisfied breath, no music. No brands, captions or on-screen text.",
"duration": 5,
"resolution": "768p",
"enable_safety_checker": true,
"image_urls": [
"https://cdn.vidgo.ai/apis/models/minimax/h3-max-turbo/image-to-video/v1/01/input-01.png",
"https://cdn.vidgo.ai/apis/models/minimax/h3-max-turbo/image-to-video/v1/01/input-02.png"
]
}
}'Wait for the result
Use the returned task_id to check the same task until it reaches finished or failed. On success, read data.files[].file_url.
Track status
GET https://api.vidgo.ai/api/generate/status/{task_id}Poll about every 2 seconds while the status is not_started or running. Stop on finished or failed; on success, read data.files[].file_url. For long-running jobs, increase the interval gradually, or add callback_url to the submit request to receive the final result asynchronously.
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "U5OAG5Z0DNS4ITLR",
"status": "running",
"created_time": "2026-10-11T23:09:35"
}
}{
"code": 200,
"data": {
"task_id": "U5OAG5Z0DNS4ITLR",
"status": "finished",
"files": [
{
"file_url": "https://cdn.vidgo.ai/apis/models/minimax/h3-max-turbo/image-to-video/v2/01/output.mp4",
"file_type": "video"
}
],
"created_time": "2026-10-11T23:09:35",
"error_message": null,
"progress": 100
}
}Complete runnable example
Open this after the three-step flow is clear. It combines submission, polling, terminal-state handling, and result extraction in one script.
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "minimax/h3-max-turbo/image-to-video",
"input": {
"prompt": "Create a single continuous five-second live-action shot connecting these exact first and last frames. The same helmeted adult BMX rider in the plain orange hoodie makes a small controlled hop from the shallow bank lip, keeps both hands on the handlebars and both feet on the pedals, and lands both wheels smoothly on the flat. Preserve the bicycle frame, wheels, helmet, face and skatepark geometry. Follow the rider with a gentle low tracking camera, without cuts, flips or spins. End at the supplied final pose and composition. Realistic short flight arc, wheel rotation, tire compression on landing and settling cloth. Native rolling tires, one soft landing sound and a satisfied breath, no music. No brands, captions or on-screen text.",
"duration": 5,
"resolution": "768p",
"enable_safety_checker": true,
"image_urls": [
"https://cdn.vidgo.ai/apis/models/minimax/h3-max-turbo/image-to-video/v1/01/input-01.png",
"https://cdn.vidgo.ai/apis/models/minimax/h3-max-turbo/image-to-video/v1/01/input-02.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')
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
while true; do
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')
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 2
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
doneRequest Parameters
model and callback_url belong at the request root; generation parameters belong inside input.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| model | string | Yes | — | minimax/h3-max-turbo/image-to-video |
| callback_url | string (URL) | No | — | HTTP(S) |
| input | object | Yes | — | An input object containing generation parameters such as prompt, image_urls, and duration. |
| input.prompt | string | Yes | — | 1–50,000 characters |
| input.duration | integer | No | 5 | 5–15 seconds, integer |
| input.resolution | string | No | 768p | 480p | 768p | 1080p |
| input.enable_safety_checker | boolean | No | true | true | false |
| input.image_urls | string[] | Yes | — | 1–2 images, starting frame then optional ending frame. HTTP(S) or Base64 |
Response Fields
Submission returns the task identity immediately. Status responses add progress, output files, or a failure message as the task advances.
| Field | Type | Description |
|---|---|---|
| code | integer | Application result code. Successful responses use 0 or 200. |
| message | string | Human-readable response or error message when present. |
| data.task_id | string | Task identifier used in the status endpoint path. |
| data.status | string | Current state: not_started, running, finished, or failed. |
| data.created_time | string | Task creation time in date-time format. |
| data.progress | number | Completion percentage when the provider reports progress. |
| data.files[] | array | Generated output files returned after a successful task. |
| data.files[].file_url | string | Public URL of the generated video. |
| data.files[].file_type | string | Generated file type, such as video. |
| data.files[].watermark_url | string | null | Watermarked output URL when one is available. |
| data.error_message | string | null | Failure detail when status is failed. |
Task Lifecycle
Treat not_started and running as non-terminal states. finished and failed are terminal alternatives; stop polling when either is returned.
not_startedThe task was accepted and is waiting to begin.
runningGeneration is in progress. Continue polling the same task_id.
finishedGeneration succeeded. Read the video URL from data.files[].file_url.
failedGeneration stopped with an error. Read data.error_message and do not continue polling.
Polling and Errors
- AuthenticationA 401 response indicates a missing or invalid Bearer API key. Correct the credential before retrying.
- ValidationA 400 response means the request is invalid. Read the response message and correct the named field.
- Polling intervalStart around every 2 seconds. Increase the interval gradually for long-running tasks.
- Terminal statesContinue only for not_started or running. Stop immediately on finished or failed.
- Callback optionProvide callback_url to receive the final asynchronous result; otherwise use the status endpoint.
Model Specifications
| Specification | Value | Description |
|---|---|---|
| Model | minimax/h3-max-turbo/image-to-video | Model identifier for the asynchronous image-to-video endpoint |
| Duration | 5–15 | Whole seconds; defaults to 5 seconds |
| Resolution | 480p | 768p | 1080p | Defaults to 768p |
| Pricing | 5 / 8 / 16 credits/s | Per-second pricing by resolution tier (480p / 768p / 1080p) |
Related Models
MiniMax H3 Max Turbo Image to Video API FAQ
What is the MiniMax H3 Max Turbo Image to Video API?
MiniMax H3 Max Turbo Image to Video is an image-driven video generation model developed by MiniMax. Using a starting reference image or paired start and end keyframes with a text prompt, it quickly generates coherent, lively 5–15 second videos at 480p, 768p, or 1080p with native synchronized stereo ambience. Its post-training distillation architecture doubles inference throughput while closely preserving the source subject's features and physical textures. Access it programmatically through the API or try it directly in the playground above.
How do I use start and end frame control in MiniMax H3 Max Turbo Image to Video?
Pass two image URLs in order through image_urls: the first becomes the video's opening frame and the second becomes its ending frame. The model calculates and renders a smooth transition between them, making it useful for storyboard connections or transitions that must end on a precise composition. If you provide only one image, it serves as the opening frame.
What determines the aspect ratio in MiniMax H3 Max Turbo Image to Video?
The image-to-video endpoint automatically inherits the first image's aspect ratio, so it neither accepts nor requires aspect_ratio. Input image dimensions can range from 256 to 5760 pixels per side, with aspect ratios from 0.4 to 2.5. Crop the source image to your target publishing format before uploading for the best composition.
How does MiniMax H3 Max Turbo differ from the base H3 Max for image-to-video generation?
MiniMax H3 Max Turbo uses extensive post-training inference acceleration while retaining the base flagship model's visual quality and prompt adherence. It generates about 2 times faster and costs 50% less per second, reducing time and cost for concurrent video production at scale. The base H3 Max also offers broader multimodal capabilities through reference-to-video (ref2v).
Does MiniMax H3 Max Turbo Image to Video generate sound?
Yes. The model natively generates synchronized audio. As it animates the still image, it uses the reference scene and motion described in the prompt to synthesize matching two-channel stereo sound, such as ambience, wind, footsteps, or machinery, without requiring a separate soundtrack in post-production.
Is MiniMax H3 Max Turbo's 1080p output natively rendered?
The 1080p tier is enhanced through latent refinement upsampling from 768p, rather than a native 1080p base render. For maximum rendering efficiency and value, use the native 768p tier. Choose 1080p when you need higher pixel density for HD delivery.
How is MiniMax H3 Max Turbo Image to Video billed?
The API bills per second based only on the requested duration parameter and selected resolution: 480p costs 5 credits per second (about $0.025/second), 768p costs 8 credits per second (about $0.040/second), and 1080p costs 16 credits per second (about $0.080/second). A default 5-second 768p video costs 40 credits ($0.200). Before submission, the playground's Run button shows a live cost estimate based on the selected settings.















