MiniMax H3 Reference-to-Video API
minimax/h3/reference-to-videoMiniMax H3 Reference-to-Video API accepts a prompt, up to 9 reference images, 3 reference videos, and 3 optional reference audio clips. Include at least one image or video, then choose a 5–15 second duration and adaptive or fixed framing for the fixed 2K video task.
Input

Output
ReadyContinue with
REST API
Quick Start
Make your first reference-to-video request in three steps. The short example shows how to assign a clear role to each reference, 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
Run the short example with at least one image or video reference. Audio is optional and cannot be submitted as the only reference type.
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/reference-to-video",
"input": {
"prompt": "Use the first image for character appearance and the reference video for movement.",
"reference_image_urls": [
"https://example.com/character.jpg"
],
"reference_video_urls": [
"https://example.com/motion.mp4"
],
"duration": 5,
"resolution": "2K",
"aspect_ratio": "adaptive"
}
}'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": "task-unified-...",
"status": "running",
"created_time": "2026-08-22T10:00:00Z"
}
}{
"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 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/reference-to-video",
"input": {
"prompt": "Use the first image for character appearance and the reference video for movement.",
"reference_image_urls": [
"https://example.com/character.jpg"
],
"reference_video_urls": [
"https://example.com/motion.mp4"
],
"duration": 5,
"resolution": "2K",
"aspect_ratio": "adaptive"
}
}
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
Send model and optional callback_url at the top level. Put the prompt, references, and generation settings inside input.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| model | string | Yes | — | Must be minimax/h3/reference-to-video. |
| callback_url | string (URL) | No | — | Optional public HTTP(S) endpoint that receives the final asynchronous result. Omit it when polling. |
| input | object | Yes | — | Container for the model-specific generation parameters below. |
| input.prompt | string | Yes | — | Trimmed scene and reference-role prompt from 1 to 2,000 characters. |
| input.reference_image_urls | string[] | Conditional | — | Up to 9 image URLs. At least one reference image or video is required. |
| input.reference_video_urls | string[] | Conditional | — | Up to 3 video URLs. At least one reference image or video is required. |
| input.reference_audio_urls | string[] | No | — | Up to 3 audio URLs. Audio cannot be the only reference type. |
| input.duration | integer | No | 5 | Generated duration in whole seconds, from 5 through 15. |
| input.resolution | string | No | 2K | Fixed output resolution. The only accepted value is 2K. |
| input.aspect_ratio | string | No | — | adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, or 9:16. |
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 | Details |
|---|---|---|
| Input mode | Prompt + references | At least one reference image or video is required; reference audio is optional. |
| Output | Video | MiniMax H3 Reference-to-Video API returns an asynchronous video generation task. |
| Resolution | 2K | Resolution is fixed for every accepted request. |
| Duration | 5–15 seconds | Use a whole-second value; the default is 5 seconds. |
| Aspect ratio | Adaptive or fixed | Supports adaptive, 21:9, 16:9, 4:3, 1:1, 3:4, and 9:16. |
| Reference limits | 9 images / 3 videos / 3 audios | Audio cannot be submitted without at least one image or video reference. |
Related Models
Frequently Asked Questions about MiniMax H3 Reference to Video API
What is the MiniMax H3 Reference-to-Video API?
MiniMax H3 Reference-to-Video API accepts a prompt with up to 9 reference images, 3 reference videos, and 3 optional reference audio clips, then returns an asynchronous fixed-2K video task. At least one image or video is required, so an audio-only request is rejected.
How do I call the MiniMax H3 Reference-to-Video API?
Send a POST request to /api/generate/submit with a Bearer API key, model set to minimax/h3/reference-to-video, and generation fields inside input. The API returns a task_id immediately; runnable cURL, JavaScript, and Python examples appear in the API tab, with the full schema at https://docs.vidgo.ai/api-manual/video-series/minimax-h3-reference-to-video.
How much does MiniMax H3 Reference-to-Video cost?
Generated video costs 21 credits per second. Each reference video's duration is rounded down separately and billed at 21 credits per second; reference images six through nine add 6.4 credits each. The Run button shows the calculated USD price, or a minimum USD price until a remote reference video's duration is available.
What inputs does MiniMax H3 Reference-to-Video accept?
Key inputs are prompt, reference_image_urls, reference_video_urls, reference_audio_urls, duration, resolution, and aspect_ratio. At least one image or video is required, audio cannot be submitted alone, duration is 5 to 15 whole seconds, and resolution is fixed at 2K. The parameter table above lists the 9/3/3 reference limits, defaults, and adaptive or fixed framing values.
How do I get the generated video?
Poll GET /api/generate/status/{task_id} with the returned task_id until status is finished or failed. When finished, read the video URL from data.files[].file_url; alternatively, include callback_url in the submit request to receive the final result asynchronously.
Which MiniMax H3 API mode should I choose?
Use Reference-to-Video when the request needs several image, video, or optional audio references. Choose Image-to-Video for one required start frame and one optional end frame, or Text-to-Video when the request contains no source media.










