Minimax H3 Text To Video LoRA API Documentation
Playground
Try it on WaveSpeedAI!MiniMax H3 Open Weights Text to Video with custom LoRA support generates coherent videos from text prompts, with 480P / 768P output, native stereo audio, 5-15 second duration, flexible aspect ratios, and per-second billing. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
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 — dialogue, sound effects, and music are produced together during generation, never added as a separate dubbing step. Describe both the visuals and the sound in one prompt and the model delivers a finished MP4 with a matching soundtrack.
How to Write a Great Prompt
H3 responds to prompts written as a timeline with a schedule, not a one-line description. The strongest prompts layer these blocks:
- Style — visual language up front: era, palette, texture, mood (e.g. “warm 1970s film look, soft grain, amber tones”).
- Timeline — timestamped beats across the duration: “[0s-2s] wide establishing shot … [2s-4s] slow push-in to the face …”. A clip sliced into beats hits every beat on schedule; one moment stretched across the whole duration looks static.
- Camera — state the movement explicitly, including when it should not move: “slow dolly-in, no cuts, no handheld”.
- Audio — put every sound in an
Audio:line with entrance cues: “Audio: soft piano from 0s, a cello joins at 4s, gentle room tone throughout.” Omit this and the model picks a soundtrack for you. - On-screen text — spell out every readable word in quotes: “the title reads ‘SUNRISE’”, then add “do not misspell, do not add other text, no subtitles.” Text you only describe comes back as letter-shaped noise.
Tips
- Verbs beat adjectives — write the action (“she turns and smiles”), not just the vibe.
- Iterate at 5s (composition and sound resolve there), then deliver at your final length.
- A short negative list (“no dissolves, no captions, no extra people”) is free and prevents default drift.
Parameters
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Scene, action, camera movement, and an Audio: line for the soundtrack. |
| 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. |
Specifications
| 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) |
| Seed | Supported |
Pricing
Billed per generated second:
| Resolution | Price per second | 5s | 15s |
|---|---|---|---|
| 480p | $0.05 | $0.25 | $0.75 |
| 768p | $0.10 | $0.50 | $1.50 |
Explore the MiniMax H3 Open Weights Family
- MiniMax H3 Text-to-Video Open Weights — Generate video with native stereo audio directly from a text prompt.
- MiniMax H3 Image-to-Video Open Weights — Animate a first-frame image with prompt-guided motion and audio.
- MiniMax H3 Reference-to-Video Open Weights — Generate video from image, video, or audio references with prompt guidance.
Authentication
For authentication details, please refer to the Authentication Guide.
API Endpoints
Submit Task & Query Result
set -euo pipefail
export WAVESPEED_API_KEY="your-api-key"
REQUEST_BODY=$(cat <<'JSON'
{
"prompt": "A cinematic ocean wave at sunrise, highly detailed",
"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/text-to-video-lora" \
-H "Authorization: Bearer ${WAVESPEED_API_KEY}" \
-H "Content-Type: application/json" \
-d "${REQUEST_BODY}")
TASK=$(printf '%s' "${SUBMIT_RESPONSE}" | jq 'if type == "object" and has("data") then .data else . end')
PREDICTION_ID=$(printf '%s' "${TASK}" | jq -r '.id // empty')
if [ -z "${PREDICTION_ID}" ]; 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 type == "object" and has("data") then .data else . end')
STATUS=$(printf '%s' "${RESULT}" | jq -r '.status // empty')
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
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | Text description of the video scene, action, camera movement, and the desired soundtrack. Audio is generated natively together with the video. | |
| aspect_ratio | string | No | 16:9 | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, 9:21 | Output aspect ratio. |
| resolution | string | No | 480p | 480p, 768p | Output video resolution. 768p is the model's native canvas; 480p is a faster, lower-cost tier. |
| duration | integer | No | 5 | 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 | Output video duration in seconds. |
| seed | integer | No | -1 | - | The random seed to use for the generation. -1 means a random seed will be used. |
| loras | array<object> | No | 0 ~ 3 items | List of LoRAs to apply (max 3). |
Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data.id | string | Unique identifier for the prediction, Task Id |
| data.model | string | Model ID used for the prediction |
| data.outputs | array | Output values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed) |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to retrieve the prediction result |
| data.status | string | Status of the task: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”) |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |
Result Request Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| id | string | Yes | - | Task ID |
Result Response Parameters
| Parameter | Type | Description |
|---|---|---|
| code | integer | HTTP status code (e.g., 200 for success) |
| message | string | Status message (e.g., “success”) |
| data | object | The prediction data object containing all details |
| data.id | string | Unique identifier for the prediction |
| data.model | string | Model ID used for the prediction |
| data.outputs | array<string | object> | Array of generated outputs (empty when status is not completed). Items are usually URL strings, but may be text strings or structured result objects, depending on the model. |
| data.urls | object | Object containing related API endpoints |
| data.urls.get | string | URL to poll for the prediction result |
| data.status | string | Status: created, processing, completed, or failed |
| data.created_at | string | ISO timestamp of when the request was created |
| data.error | string | Error message (empty if no error occurred) |
| data.timings | object | Object containing timing details |
| data.timings.inference | integer | Inference time in milliseconds |