MiniMax H3 Open Weights Reference to Video with custom LoRA support 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.3per run·~33 / $10
The big fluffy grey rabbit strolls through the sunny meadow, stops under a large tree, looks up at a butterfly fluttering around his nose and breaks into a warm smile. Bright daylight, vivid colors, gentle camera pan. Audio: light-hearted orchestral score, birdsong and a soft breeze.
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. |
| loras | No | Up to 3 LoRA weights, each {path, scale}; path is a LoRA file URL. |
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.06 / second |
| Output video (768p) | $0.15 / second |
| Reference image | $0.02 each |
| Reference audio | $0.02 each |
| Reference video (480p) | $0.06 / second |
Grab a WaveSpeedAI API key, then call POST https://api.wavespeed.ai/api/v3/wavespeed-ai/minimax-h3/reference-to-video-lora 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 Lora 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-lora" \
-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-lora";
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-lora", 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 Lora is a WaveSpeedAI model for AI inference, exposed as a REST API on WaveSpeedAI. MiniMax H3 Open Weights Reference to Video with custom LoRA support 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-lora.
Minimax H3 Reference To Video Lora starts at $0.30 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-lora.
Sign up for a free WaveSpeedAI account to claim starter credits, copy your API key from /accesskey, then call the endpoint shown in the API tab of the playground. The playground also auto-generates a code sample in Python, JavaScript, or cURL for the parameters you've set.
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.