H3 Max: image to video
Give it a first frame, a prompt, and optionally a last frame or reference pictures; get
a clip back in a fraction of the time and price of Kling or Seedance, with good motion
and acting. The cost is fine detail: facial hair, skin texture and hair strands come out
mottled and smoothed together, painted rather than photographic, and close-ups look
plastic. Draft on it, keep it for wide shots and subjects with little texture, and move
to kling-v3-image-to-video (close-up texture) or seedance-2-5-image-to-video
(physics, 1080p grain) where the shot needs it. For a still speaking an audio clip use
h3-max-lipsync-a-still; for a scene with a dialogue track, h3-max-dialogue. Always
H3 Max, never plain H3: Max is its fine-tune.
Inputs
- The first frame. The output canvas follows its shape.
- A last frame (optional), continuous with the first: derive it from the locked
first frame (
nano-banana-derive-last-frame). Two independently edited stills made her hair morph mid-shot. - Reference pictures (optional) for subjects the frame doesn't show well or who enter: up to 9 subjects and 9 pictures in all. Every subject keeps its first picture, the rest are dealt round-robin. Single views from a character sheet, not the sheet.
Run it
Call describe on the model before the first run in a job. Before that first run, a
test included, show the person the still that will move and ask (core skill: the person
decides every look).
run("fal/minimax/h3-max/image-to-video", {
"image_url": "<job>/stills/shot04_first_c.png",
"prompt": "<H3 prompt, see below>",
"duration": 3.2,
"resolution": "768P",
"prompt_expansion_mode": "disabled",
"seed": 5000
}, into="<job>/video/raw", unit="shot04_h3", tag="shot04")
duration: the length you want, in seconds as a float, from about 1 s up to 15 s. The clip may come back a little longer than asked (ask for 1 s, get 1.2 to 1.4 s); trim it to the shot. H3 returns 24 fps. Shots longer than about 15 s aren't advisable on any video model: split the shot at a cut or a pause.resolution:480P,768Por1080P, uppercase P. 1080P is 768P plus latent refinement. Priced per second by tier whatever the shape: 768P $0.052/s and 1080P $0.104/s at the promo rate ($0.08 and $0.16 at list).prompt_expansion_mode: "disabled": required by the schema, and fal's "balanced" rewrite adds a soundtrack.end_image_urlpins the last frame.seedis optional; vary it for takes.- With reference pictures, call
fal/minimax/h3-max/reference-to-videoinstead, with the same fields plus"reference_image_urls": [...], in the order of the prompt's<Picture N>labels. The first frame is stillimage_url. Each picture must be 256 to 2,048 px a side with an aspect between 0.4 and 2.5, or fal rejects the whole request (wide logos are the usual offender): pad with the edge colour, never crop.
Prompt
Load h3-prompt-format first: the image-to-video shape without references, the
reference-to-video shape with them. For this mode:
- Say "big, clear motion" in the direction and spell out counts ("blinks exactly once").
- H3 pushes in by default; state "static shot, locked on the opening framing" when the frame must hold.
- Never name a removed accessory, even to forbid it: "no pin or badge" grew a pin by 1 s. Describe the clean state instead ("a plain, unadorned knit, the same from the first frame to the last").
- Ask for the shot's own length. If the clip still runs longer than the shot, ask for the action in real time, then a hold.
What you get
An MP4 at 24 fps, opening on the first frame, a little longer than the duration
asked, with generated sound. Trim to the shot (ffmpeg-frame-exact-trim), keeping the
raw render.
Tips and traps
- Plastic skin on an otherwise good take: add grain in post
(
ffmpeg-grain-for-plastic-skin) before re-rendering on another model. - Not for complex physical motion (papers falling, cloth in wind), 1080p photographic realism, or close-ups where beard, skin or hair texture must hold.
- A draft approves composition and timing, not motion. Re-judge the motion on the final model.
- H3 sometimes reaches for a raised index finger however it's directed; take the least-bad take rather than looping.
Check it
- Frame 0 against the still (and the end against a pinned last frame):
python-check-pinned-frames. - Close-up texture at 100% against the source, if the shot is a close-up.
- Then a review page beside the original or the earlier round.


