Multimodal
Video generation
Async, job-based — create a job, then poll it. Billed per requested second at creation time; polling for
status is free. There's no OpenRouter backstop for this endpoint: each model is served direct by the
provider that owns it. Three generation modes share this one endpoint — plain
text-to-video (below),
image-to-video (animate a starting
frame), and reference-to-video
(guide generation from multiple images, videos, and audio clips at once) — which one you get depends
only on which model you pass.
# create
job = client.post("/videos", cast_to=dict, body={
"model": "sora-2",
"prompt": "a paper airplane gliding over a city",
"seconds": 8,
})
# poll
status = client.get(f"/videos/{job['id']}", cast_to=dict)
print(status["status"]) # pending -> in_progress -> completed
The OpenAI SDK doesn't have first-class video methods yet — use its low-level
client.post/client.get,
or plain requests, against the same
base_url.
For sora-2/sora-2-pro/veo-3.1/veo-3.1-fast
you can also pass an optional size (e.g.
"1280x720") — the DeepInfra and SiliconFlow
rows below ignore it. For sora-2-pro and
veo-3.1-fast, size also changes the price — see
Which models.
Which models
22 models across 10 providers, billed per requested second — except a few flat-fee models
(SiliconFlow's two, Replicate's, MiniMax's) which ignore
seconds and bill a fixed price per clip
instead (see Billing).
sora-2TextOpenAI (default)$0.10/ssora-2-proTextOpenAI$0.30/$0.50/$0.70 per sveo-3.1TextGoogle$0.40/sveo-3.1-fastTextGoogle$0.10/$0.12 per sPrunaAI/p-videoTextDeepInfra$0.02/sWan-AI/Wan2.2-T2V-A14BTextDeepInfra$0.036/sPixverse/Pixverse-6-T2VTextDeepInfra$0.045/sWan-AI/Wan2.6-T2VTextDeepInfra$0.10/sdeepinfra/veo-3.1-fastTextDeepInfra (resold Veo)$0.15/sdeepinfra/veo-3.1TextDeepInfra (resold Veo)$0.40/ssiliconflow/Wan-AI/Wan2.2-T2V-A14BTextSiliconFlow$0.29/clipsiliconflow/Wan-AI/Wan2.2-I2V-A14BImageSiliconFlow$0.29/clipfal/wan-25-previewTextFal$0.05/$0.10/$0.15 per sfal/seedance-2.0TextFal$0.3034/$0.682 per sfal/seedance-2.0-imageImageFal$0.3034/$0.682 per sfal/seedance-2.0-referenceReferenceFal$0.3034/$0.682 per sfal/happy-horseImageFal$0.14/$0.18 per sreplicate/minimax-hailuo-02TextReplicate$0.28/6s, $0.56/10skling-v2-6TextKling (direct)$0.062/sminimax-hailuo-02TextMiniMax$0.28/6s, $0.56/10sluma-ray-2TextLuma$0.064–$0.21 per spoe-kling-2.1TextPoeflat/clip
sora-2-pro bills $0.30/s at 720p sizes
(720x1280/1280x720,
the default when size is omitted), $0.50/s
at 1024p (1024x1792/1792x1024),
and $0.70/s at 1080p (1080x1920/1920x1080).
veo-3.1-fast bills $0.10/s at 720p
(default) and $0.12/s at 1080p. Fal's three-tier rows scale the same way across
size, and Luma's four-tier row spans
540p/720p/1080p/4k.
deepinfra/veo-3.1 and
deepinfra/veo-3.1-fast are DeepInfra's
resold listing of the same Google Veo models served directly above as veo-3.1/veo-3.1-fast —
a separate catalog row, flat-priced by the reselling channel regardless of size (unlike the direct-Google row).
Mode is fixed per model, not a request parameter: Text models take only
prompt; Image models
require exactly one starting-frame image via
input_references (see
Image-to-video); Reference
(currently just fal/seedance-2.0-reference)
takes multiple images/videos/audio clips at once (see
Reference-to-video).
Image-to-video
Animate a single starting frame with input_references —
the same shape image
generation's input_references uses.
Only fal/seedance-2.0-image and
fal/happy-horse support this today —
every other model rejects an input_references
image with a 400, and these two require exactly one.
job = client.post("/videos", cast_to=dict, body={
"model": "fal/seedance-2.0-image",
"prompt": "the subject turns and smiles, gentle camera push-in",
"input_references": [
{"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
],
"seconds": 5,
"size": "1280x720",
})
image_url.url accepts a public
https:// URL or an inline
data:image/...;base64,... URI.
fal/happy-horse's
prompt is optional — omit it and the
image is animated with no text guidance at all.
Reference-to-video
fal/seedance-2.0-reference is a
distinct mode from image-to-video above — not just a bigger version of it. It composites
multiple reference files of three different kinds in one call: up to
9 images, 3 videos, and 3 audio clips (12 combined). Two new request fields extend the same
{"type", "<kind>_url": {"url"}}
convention input_references already
uses, just for video and audio:
job = client.post("/videos", cast_to=dict, body={
"model": "fal/seedance-2.0-reference",
"prompt": "the cat from the reference image walks across the scene",
"input_references": [
{"type": "image_url", "image_url": {"url": "https://example.com/cat.jpg"}}
],
"input_video_references": [
{"type": "video_url", "video_url": {"url": "https://example.com/motion-ref.mp4"}}
],
"input_audio_references": [
{"type": "audio_url", "audio_url": {"url": "https://example.com/ambience.mp3"}}
],
"seconds": 5,
})
All three arrays are optional individually, but at least one reference across all
three is required — a call with none is rejected with a 400 (pass a plain
prompt with no references to
fal/seedance-2.0 instead for
text-to-video). Exceeding any per-kind cap, or 12 combined, is also rejected with a 400.
Billing
The full cost is billed once, at job creation, from the requested seconds —
GET /v1/videos/{id} status polling has
no incremental provider cost and is unbilled.
Exception: SiliconFlow's two siliconflow/-prefixed
models bill a flat $0.29 per clip regardless of any seconds
you request — SiliconFlow's own API ignores duration and always renders a fixed ~5s clip, so any
seconds in the request body for
these two models is ignored on our side too.
replicate/minimax-hailuo-02 and
minimax-hailuo-02 are also
flat-fee, but duration-dependent: $0.28 for a 6-second clip,
$0.56 for a 10-second one. A requested
seconds is snapped to whichever
of those two is closer before both the upstream request and the bill, so what you're charged always
matches what actually renders.
Not yet supported
Generation only — no video editing/extension endpoints. For video as chat input, see Video understanding.
Image-to-video and reference-to-video are Fal-only today — MiniMax, Kling, Luma, and Replicate each have their own image-to-video capability upstream, but it isn't wired into this endpoint yet.