MiniMax H3 Open Weights Reference to Video generates coherent 480P / 768P videos from prompts and multimodal references, guided by up to 9 reference images, 3 reference videos, and 3 reference audios, with native stereo audio and flexible reference-based video generation on WaveSpeedAI infrastructure. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Idle
$0.25per run·~40 / $10
Fast-paced fashion video, shot on ARRI Alexa 35, HDR golden hour natural light, hyperrealistic live-action. Stunning blonde European woman inside a blue sedan leaning out the window, outstretching palm toward camera for audience interaction. Camera pushes forward smoothly, focus shifts from her face to hand, subtle gentle orbit movement, hair blowing lightly in wind, 85mm lens, shallow depth of field, lifelike skin texture, clean frame, no text or logos.
Fast-paced thrilling action video, shot on ARRI Alexa 35, golden hour sunrise lighting, hyperrealistic cinematic footage. Handsome European man in skydiving harness leans out of small airplane doorway above sea of clouds. Dynamic camera movement, slow push-in toward the man, subtle camera shake, wind tousles his hair. He leans further outward, ready to leap. Shallow depth of field, crisp details, lifelike skin texture, airplane fuselage marked "WAVESPEED", dramatic warm backlight, intense adventurous atmosphere, smooth natural motion.
Run the open-weights edition of MiniMax H3 on WaveSpeedAI's own GPU infrastructure. This endpoint is separate from the official minimax/h3 API: same model family, independently hosted, with its own 480p/768p resolutions and per-second pricing.
MiniMax H3 is an omni-modal video model that generates picture and native stereo audio in a single pass. In reference-to-video mode you guide the generation with up to 9 reference images, 3 reference videos, and 3 reference audio tracks, then tell the model — in the prompt — what each reference is for.
Refer to every input in the prompt with an angle-bracket tag: <Picture 1>, <Video 1>, <Audio 1>, and so on. The tags must be written exactly like that, with the brackets — plain text such as Picture 1 is treated as ordinary words, not a reference.
Assign a job to each reference. Explicit assignments work far better than leaving the model to guess:
"Use the character from
<Picture 1>, place them in the setting from<Picture 2>, and match the camera motion of<Video 1>."
Numbering
<Picture 1>…<Picture 9>, standalone audios are <Audio 1>…, videos are <Video 1>…<Video 3>.<Audio …> slots; any standalone reference_audios you provide are numbered after the video soundtracks. If you only need the video's audio, refer to it via its <Video …> tag.Rules
reference_videos is available only at 480p output resolution.Write the prompt as a timeline with a schedule, and weave the reference tags into it:
<Picture 1> stands on the balcony from <Picture 2> … [3s-6s] turns toward camera and smiles …".Audio: line with entrance cues; reference an input voice or track by tag if you want it matched.| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Desired video with references addressed as <Picture 1>, <Video 1>, <Audio 1>, plus an Audio: line for the soundtrack. |
| reference_images | No | Up to 9 reference image URLs. |
| reference_videos | No | Up to 3 reference video URLs. 480p output only. Their soundtracks are used automatically. |
| reference_audios | No | Up to 3 standalone reference audio URLs (each trimmed to 15s). |
| aspect_ratio | No | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, or 9:21. Default: 16:9. |
| resolution | No | 480p (faster, lower cost) or 768p (native canvas). Default: 480p. |
| duration | No | Output length in seconds, 3–15. Default: 5. |
| seed | No | Fixed seed for reproducible output. |
At least one of reference_images, reference_videos, or reference_audios is required.
| Item | Detail |
|---|---|
| Output | MP4 with native stereo audio |
| Frame rate | 24 fps |
| Resolution | 480p or 768p |
| Duration | 3–15 seconds (snaps to the model's frame grid, so a 5s request lands at ~5.2s) |
| Reference images | Up to 9 |
| Reference videos | Up to 3, 480p output only, 15s total budget |
| Reference audio | Up to 3, trimmed to 15s each |
| Seed | Supported |
Output video is billed per generated second, plus per-reference charges:
| Item | Price |
|---|---|
| Output video (480p) | $0.05 / second |
| Output video (768p) | $0.125 / second |
| Reference image | $0.02 each |
| Reference audio | $0.02 each |
| Reference video (480p) | $0.05 / second |
Example: a 10s 480p video with 2 reference images and a 5s reference video costs 10 × $0.05 + 2 × $0.02 + 5 × $0.05 = $0.79.
Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/wavespeed-ai/minimax-h3/reference-to-video with your input as JSON. The endpoint returns a prediction id. Start polling the result endpoint around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. On completed, read output values from data.outputs. Examples for Minimax H3 Reference To Video below.
set -euo pipefail
: "${WAVESPEED_API_KEY:?Set WAVESPEED_API_KEY}"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"aspect_ratio": "16:9",
"resolution": "480p",
"duration": 5,
"seed": -1
}
JSON
)
# 1. Submit the prediction.
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
-X POST "https://api.wavespeed.ai/api/v3/wavespeed-ai/minimax-h3/reference-to-video" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $WAVESPEED_API_KEY" \
-d "$REQUEST_BODY")
TASK=$(printf '%s' "$SUBMIT_RESPONSE" | jq 'if has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "$TASK" | jq -r '.id')
if [ -z "$PREDICTION_ID" ] || [ "$PREDICTION_ID" = "null" ]; then
printf 'Submission response did not contain a prediction id
' >&2
exit 1
fi
RESULT_URL=$(printf '%s' "$TASK" | jq -r '.urls.get // empty')
if [ -z "$RESULT_URL" ]; then
RESULT_URL="https://api.wavespeed.ai/api/v3/predictions/$PREDICTION_ID/result"
fi
# 2. Poll until the prediction finishes.
while true; do
RESPONSE=$(curl --silent --show-error --fail-with-body "$RESULT_URL" \
-H "Authorization: Bearer $WAVESPEED_API_KEY")
RESULT=$(printf '%s' "$RESPONSE" | jq 'if has("data") then .data else . end')
STATUS=$(printf '%s' "$RESULT" | jq -r '.status')
case "$STATUS" in
completed) printf '%s\n' "$RESULT" | jq '.outputs'; break ;;
failed|cancelled|timeout) printf '%s\n' "$RESULT" | jq . >&2; exit 1 ;;
created|processing) sleep 2 ;;
*) printf 'Unexpected status: %s
' "$STATUS" >&2; exit 1 ;;
esac
doneconst submitUrl = "https://api.wavespeed.ai/api/v3/wavespeed-ai/minimax-h3/reference-to-video";
const apiKey = process.env.WAVESPEED_API_KEY;
if (!apiKey) throw new Error('Set WAVESPEED_API_KEY');
async function requestJson(url, options = {}) {
const response = await fetch(url, options);
if (!response.ok) throw new Error(await response.text());
return response.json();
}
// 1. Submit the prediction.
const body = await requestJson(submitUrl, {
method: "POST",
headers: {
"Authorization": `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"aspect_ratio": "16:9",
"resolution": "480p",
"duration": 5,
"seed": -1
}),
});
const task = body.data ?? body;
if (!task.id) throw new Error("Submission response did not contain a prediction id");
const resultUrl = task.urls?.get ||
`https://api.wavespeed.ai/api/v3/predictions/${task.id}/result`;
// 2. Poll until the prediction finishes.
while (true) {
const resultBody = await requestJson(resultUrl, {
headers: { "Authorization": `Bearer ${apiKey}` },
});
const result = resultBody.data ?? resultBody;
if (result.status === "completed") {
console.log(result.outputs);
break;
}
if (["failed", "cancelled", "timeout"].includes(result.status)) throw new Error(JSON.stringify(result));
if (!["created", "processing"].includes(result.status)) throw new Error("Unexpected status: " + result.status);
await new Promise(resolve => setTimeout(resolve, 2000));
}import json
import os
import time
from urllib.request import Request, urlopen
api_key = os.environ["WAVESPEED_API_KEY"]
headers = {"Authorization": f"Bearer {api_key}", "Content-Type": "application/json"}
payload = {
"prompt": "A cinematic shot of a city at sunset, soft golden light",
"aspect_ratio": "16:9",
"resolution": "480p",
"duration": 5,
"seed": -1
}
def request_json(url, data=None):
request = Request(url, data=data, headers=headers, method="POST" if data else "GET")
with urlopen(request) as response:
return json.load(response)
# 1. Submit the prediction.
body = request_json("https://api.wavespeed.ai/api/v3/wavespeed-ai/minimax-h3/reference-to-video", json.dumps(payload).encode())
task = body.get("data", body)
if not task.get("id"):
raise RuntimeError("Submission response did not contain a prediction id")
result_url = task.get("urls", {}).get("get") or f"https://api.wavespeed.ai/api/v3/predictions/{task['id']}/result"
# 2. Poll until the prediction finishes.
while True:
result_body = request_json(result_url)
result = result_body.get("data", result_body)
status = result.get("status")
if status == "completed":
print(result.get("outputs", []))
break
if status in {"failed", "cancelled", "timeout"}:
raise RuntimeError(result)
if status not in {"created", "processing"}:
raise RuntimeError(f"Unexpected status: {status}")
time.sleep(2)Minimax H3 Reference To Video is a WaveSpeedAI model for video generation from images, exposed as a REST API on WaveSpeedAI. MiniMax H3 Open Weights Reference to Video generates coherent 480P / 768P videos from prompts and multimodal references, guided by up to 9 reference images, 3 reference videos, and 3 reference audios, with native stereo audio and flexible reference-based video generation on WaveSpeedAI infrastructure. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing. You can call it programmatically or try it from the playground above.
POST your input parameters to the model's REST endpoint (shown in the API tab of this playground) with your WaveSpeedAI API key in the Authorization header. Submission returns a prediction ID. Poll the result endpoint starting around every 2 seconds, increase the interval for long-running tasks, and stop on any terminal status. The playground generates production-oriented Python, JavaScript, and cURL examples with timeouts, transient-error handling, and safe GET retries. Full request/response shape is documented at https://wavespeed.ai/docs/docs-api/wavespeed-ai/minimax-h3-reference-to-video.
Minimax H3 Reference To Video starts at $0.25 per run. That figure is the base price — the final charge scales with the parameters you set in the form (output size, length, count, references, or whatever knobs this model exposes), so a higher-quality or larger output costs more than a minimal one. The exact cost for your current input is shown live next to the Generate button before you submit, and the actual per-call charge is recorded on the prediction afterwards.
Key inputs: `prompt`, `aspect_ratio`, `resolution`, `duration`, `seed`, `reference_images`. The full JSON schema (types, defaults, allowed values) is rendered above the Generate button and mirrored in the API reference at https://wavespeed.ai/docs/docs-api/wavespeed-ai/minimax-h3-reference-to-video.
Median end-to-end generation time on WaveSpeedAI is around 154 seconds per request, based on recent successful runs. Queue time varies with global demand; live status is visible in the prediction record.
Commercial usage rights depend on the model's license, set by its provider (WaveSpeedAI). The license summary appears on the model card above; see WaveSpeedAI's Terms of Service for platform-level conditions.