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).

ModelModeProviderPrice
sora-2TextOpenAI (default)$0.10/s
sora-2-proTextOpenAI$0.30/$0.50/$0.70 per s
veo-3.1TextGoogle$0.40/s
veo-3.1-fastTextGoogle$0.10/$0.12 per s
PrunaAI/p-videoTextDeepInfra$0.02/s
Wan-AI/Wan2.2-T2V-A14BTextDeepInfra$0.036/s
Pixverse/Pixverse-6-T2VTextDeepInfra$0.045/s
Wan-AI/Wan2.6-T2VTextDeepInfra$0.10/s
deepinfra/veo-3.1-fastTextDeepInfra (resold Veo)$0.15/s
deepinfra/veo-3.1TextDeepInfra (resold Veo)$0.40/s
siliconflow/Wan-AI/Wan2.2-T2V-A14BTextSiliconFlow$0.29/clip
siliconflow/Wan-AI/Wan2.2-I2V-A14BImageSiliconFlow$0.29/clip
fal/wan-25-previewTextFal$0.05/$0.10/$0.15 per s
fal/seedance-2.0TextFal$0.3034/$0.682 per s
fal/seedance-2.0-imageImageFal$0.3034/$0.682 per s
fal/seedance-2.0-referenceReferenceFal$0.3034/$0.682 per s
fal/happy-horseImageFal$0.14/$0.18 per s
replicate/minimax-hailuo-02TextReplicate$0.28/6s, $0.56/10s
kling-v2-6TextKling (direct)$0.062/s
minimax-hailuo-02TextMiniMax$0.28/6s, $0.56/10s
luma-ray-2TextLuma$0.064–$0.21 per s
poe-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 secondsGET /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.