Minimax H3 Controlnet Union API Documentation
Playground
Try it on WaveSpeedAI!MiniMax H3 Open Weights ControlNet Union generates a new video that follows the motion and composition of a source video. Pose, depth, edges, lines, scribble or grayscale structure is extracted from the source automatically and guides the output, optionally with reference images for the subject or style, with native stereo audio generated in the same pass. Ready-to-use REST inference API, best performance, no coldstarts, affordable pricing.
Features
MiniMax H3 ControlNet Union Open Weights generates a new video that follows the motion and composition of a source video. The control signal - pose, depth, edges, straight lines, scribble or grayscale structure - is extracted from the source automatically, so you only upload a normal video, describe the result, and optionally add reference images for the subject or style. Native stereo audio is generated in the same pass, or the source soundtrack can be kept.
Why Choose This?
-
Seven control types in one model
pose,depth,canny,soft_edge,lines,scribbleandgray, all extracted automatically from your video. -
Character animation
Combineposewith a reference image to make your character perform the motion of the source video. -
Restyle while keeping structure
Use edges, lines or depth to re-render a clip in a new style, setting or look while keeping its layout and camera movement. -
Recolor and relight
Usegrayto keep the brightness structure and change colors, lighting or grading from the prompt. -
Native audio or preserved audio
Generate new audio, or setgenerate_audiotofalseto keep the source video’s soundtrack.
Parameters
| Parameter | Required | Description |
|---|---|---|
| prompt | Yes | Describe the output video. Refer to reference inputs as <Picture 1>..<Picture 9> and <Audio 1>..<Audio 3>. |
| video | Yes | URL of the source video. Up to 15 seconds are used; the control signal is extracted from it automatically, and the output keeps its duration and aspect ratio. |
| control_type | No | pose (default), depth, canny, soft_edge, lines, scribble or gray. |
| control_strength | No | How strongly the control constrains the output, 0 to 2. Default: 1. |
| reference_images | No | Optional reference images for the subject or style, up to 9. |
| reference_audios | No | Optional reference audio to guide audio generation, up to 3. |
| resolution | No | 480p, 540p, 768p or 1080p. Default: 480p. |
| generate_audio | No | Generate native audio (default), or false to keep the source video’s audio track. |
| seed | No | Random seed. A negative value means a random seed will be used. |
Choosing a Control Type
| control_type | Keeps from the source | Good for |
|---|---|---|
| pose | Body, hand and face motion | Character animation, dance, performance transfer |
| depth | Spatial layout and camera movement | Changing the scene or style while keeping composition |
| canny | Precise edges | Faithful restyling of detailed shots |
| soft_edge | Softer outlines | Stylized re-rendering with more freedom |
| lines | Straight lines | Architecture, interiors, products |
| scribble | Loose sketch lines | Creative reinterpretation with rough structure |
| gray | Brightness structure | Colorizing, recoloring and relighting |
Pricing
Cost = per-second rate × source video seconds + $0.02 per reference image or reference audio.
Source video seconds are rounded up, with a minimum of 3 and a maximum of 15 (only the first 15 seconds are used). The output has the same duration as the source.
| Resolution | Per second | 3s video | 5s video | 10s video | 15s video |
|---|---|---|---|---|---|
| 480p | $0.10 | $0.30 | $0.50 | $1.00 | $1.50 |
| 540p | $0.15 | $0.45 | $0.75 | $1.50 | $2.25 |
| 768p | $0.20 | $0.60 | $1.00 | $2.00 | $3.00 |
| 1080p | $0.40 | $1.20 | $2.00 | $4.00 | $6.00 |
Add-ons: reference image $0.02 each, reference audio $0.02 each. control_type, control_strength, generate_audio, prompt, and seed do not add separate charges.
Worked Examples
| Configuration | Calculation | Cost |
|---|---|---|
| 5s video, 480p | 5 × $0.10 | $0.50 |
| 8s video, 768p + 1 reference image | 8 × $0.20 + $0.02 | $1.62 |
| 20s video (first 15s used), 1080p | 15 × $0.40 | $6.00 |
Pro Tips
- For character animation, use
posewith a clear full-body reference image inreference_imagesand describe the character in the prompt. - Source videos with a steady camera and the whole subject in frame give the most accurate pose transfer.
- Lower
control_strengthwhen the prompt should change more; raise it when the output drifts from the source. - Set
generate_audiotofalseto keep the original soundtrack, for example for dance videos.
Notes
promptandvideoare required.- Up to
15seconds of the source video are used; the output keeps the source duration and aspect ratio. reference_imagessupports up to9images andreference_audiosup to3.
Related Models
- MiniMax H3 Video Edit Open Weights - Edit a video from prompt instructions.
- MiniMax H3 Reference-to-Video Open Weights - Generate video from image, video, or audio references.
- MiniMax H3 Image-to-Video Open Weights - Animate a first-frame image with prompt-guided motion and audio.
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",
"video": "https://interactive-examples.mdn.mozilla.net/media/cc0-videos/flower.mp4",
"control_type": "pose",
"control_strength": 1,
"resolution": "480p",
"generate_audio": true
}
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/controlnet-union" \
-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="https://api.wavespeed.ai/api/v3/predictions/${PREDICTION_ID}/result"
# 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|deleted) printf '%s\n' "${RESULT}" | jq . >&2; exit 1 ;;
*) sleep 2 ;;
esac
doneParameters
Task Submission Parameters
Request Parameters
| Parameter | Type | Required | Default | Range | Description |
|---|---|---|---|---|---|
| prompt | string | Yes | - | Describe the output video. The source video's motion and composition are carried over through the selected control. Refer to reference inputs as <Picture 1>..<Picture 9> and <Audio 1>..<Audio 3>. | |
| video | string | Yes | - | URL of the source video (up to 15 seconds are used). The control signal is extracted from it automatically and drives motion and composition; the output keeps its duration and aspect ratio. | |
| control_type | string | No | pose | pose, depth, canny, soft_edge, lines, scribble, gray | What to keep from the source video: pose (body, hand and face motion), depth (spatial layout), canny (precise edges), soft_edge (softer outlines), lines (straight lines, for architecture and interiors), scribble (loose sketch lines), gray (brightness structure, for recoloring). |
| control_strength | number | No | 1 | 0 ~ 2 | How strongly the control signal constrains the output. Lower values give the prompt more freedom. |
| reference_images | array<string> | No | - | 0 ~ 9 items | Optional reference image URLs, e.g. the character to animate or a target style. Refer to them in the prompt as <Picture 1>..<Picture 9>. |
| reference_audios | array<string> | No | - | 0 ~ 3 items | Optional reference audio URLs to guide audio generation. Refer to them in the prompt as <Audio 1>..<Audio 3>. |
| resolution | string | No | 480p | 480p, 540p, 768p, 1080p | Output video resolution. 768p is the model's native canvas; 480p is a faster, lower-cost tier; 540p is a mid tier at 1.5x the 480p price. 1080p is the highest-quality full-HD tier at 2x the 768p price (generation takes longer). |
| generate_audio | boolean | No | true | - | Whether to generate native audio. When set to false, the source video's audio track is preserved on the output instead. |
| seed | integer | No | - | - | The random seed to use for the generation. A negative value means a random seed will be used. |
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.status | string | Task status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses. |
| 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.status | string | Status: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses |
| 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 |