Minimax H3 Controlnet Union API Documentation

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, scribble and gray, all extracted automatically from your video.

  • Character animation
    Combine pose with 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
    Use gray to keep the brightness structure and change colors, lighting or grading from the prompt.

  • Native audio or preserved audio
    Generate new audio, or set generate_audio to false to keep the source video’s soundtrack.


Parameters

ParameterRequiredDescription
promptYesDescribe the output video. Refer to reference inputs as <Picture 1>..<Picture 9> and <Audio 1>..<Audio 3>.
videoYesURL 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_typeNopose (default), depth, canny, soft_edge, lines, scribble or gray.
control_strengthNoHow strongly the control constrains the output, 0 to 2. Default: 1.
reference_imagesNoOptional reference images for the subject or style, up to 9.
reference_audiosNoOptional reference audio to guide audio generation, up to 3.
resolutionNo480p, 540p, 768p or 1080p. Default: 480p.
generate_audioNoGenerate native audio (default), or false to keep the source video’s audio track.
seedNoRandom seed. A negative value means a random seed will be used.

Choosing a Control Type

control_typeKeeps from the sourceGood for
poseBody, hand and face motionCharacter animation, dance, performance transfer
depthSpatial layout and camera movementChanging the scene or style while keeping composition
cannyPrecise edgesFaithful restyling of detailed shots
soft_edgeSofter outlinesStylized re-rendering with more freedom
linesStraight linesArchitecture, interiors, products
scribbleLoose sketch linesCreative reinterpretation with rough structure
grayBrightness structureColorizing, 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.

ResolutionPer second3s video5s video10s video15s 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

ConfigurationCalculationCost
5s video, 480p5 × $0.10$0.50
8s video, 768p + 1 reference image8 × $0.20 + $0.02$1.62
20s video (first 15s used), 1080p15 × $0.40$6.00

Pro Tips

  • For character animation, use pose with a clear full-body reference image in reference_images and 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_strength when the prompt should change more; raise it when the output drifts from the source.
  • Set generate_audio to false to keep the original soundtrack, for example for dance videos.

Notes

  • prompt and video are required.
  • Up to 15 seconds of the source video are used; the output keeps the source duration and aspect ratio.
  • reference_images supports up to 9 images and reference_audios up to 3.

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
done

Parameters

Task Submission Parameters

Request Parameters

ParameterTypeRequiredDefaultRangeDescription
promptstringYes-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>.
videostringYes-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_typestringNoposepose, depth, canny, soft_edge, lines, scribble, grayWhat 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_strengthnumberNo10 ~ 2How strongly the control signal constrains the output. Lower values give the prompt more freedom.
reference_imagesarray<string>No-0 ~ 9 itemsOptional 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_audiosarray<string>No-0 ~ 3 itemsOptional reference audio URLs to guide audio generation. Refer to them in the prompt as <Audio 1>..<Audio 3>.
resolutionstringNo480p480p, 540p, 768p, 1080pOutput 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_audiobooleanNotrue-Whether to generate native audio. When set to false, the source video's audio track is preserved on the output instead.
seedintegerNo--The random seed to use for the generation. A negative value means a random seed will be used.

Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
data.idstringUnique identifier for the prediction, Task Id
data.modelstringModel ID used for the prediction
data.outputsarrayOutput values, usually URL strings; some models return text strings or structured result objects (empty when status is not completed)
data.urlsobjectObject containing related API endpoints
data.statusstringTask status. completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses.
data.created_atstringISO timestamp of when the request was created (e.g., “2023-04-01T12:34:56.789Z”)
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds

Result Request Parameters

ParameterTypeRequiredDefaultDescription
idstringYes-Task ID

Result Response Parameters

ParameterTypeDescription
codeintegerHTTP status code (e.g., 200 for success)
messagestringStatus message (e.g., “success”)
dataobjectThe prediction data object containing all details
data.idstringUnique identifier for the prediction
data.modelstringModel ID used for the prediction
data.outputsarray<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.urlsobjectObject containing related API endpoints
data.statusstringStatus: completed is successful; failed, cancelled, timeout, and deleted are failure terminal statuses
data.created_atstringISO timestamp of when the request was created
data.errorstringError message (empty if no error occurred)
data.timingsobjectObject containing timing details
data.timings.inferenceintegerInference time in milliseconds
© 2026 WaveSpeedAI. All rights reserved.