OpenRouter supports video generation from text prompts (and optional reference images) via a dedicated asynchronous API. You can find the supported models, their capabilities, and pricing by filtering our model list by video output.
Adding video generation to an app? The
Video Generation Cookbook
breaks this workflow into step-by-step recipes for choosing a model,
submitting text-to-video jobs, using images, passing provider options, and
handling webhooks.For reusable agent knowledge across projects, install the openrouter-video skill.
List of supported output resolutions (e.g., 720p, 1080p)
supported_aspect_ratios
List of supported aspect ratios (e.g., 16:9, 9:16)
supported_sizes
List of supported pixel dimensions (e.g., 1280x720)
pricing_skus
Pricing information per SKU
allowed_passthrough_parameters
Provider-specific parameters that can be passed through via the provider option
Use this endpoint to check which resolutions, aspect ratios, and passthrough parameters are supported by each model before submitting a generation request.
Visit the Models page and filter by output modalities to find models capable of video generation. Look for models that list "video" in their output modalities.
There are two ways to provide images, each
triggering a different generation mode:
frame_images — Specifies first or last frame
images for image-to-video generation. Each entry
must include a frame_type of first_frame or
last_frame.
input_references — Provides style or content
reference images for reference-to-video
generation. The model uses these as visual guidance
rather than exact frames.
If both fields are provided, frame_images takes
precedence and the request is treated as
image-to-video.
You can pass provider-specific options using the provider parameter. Options are keyed by provider slug, and only the options for the matched provider are forwarded:
{ "model": "google/veo-3.1", "prompt": "A time-lapse of a flower blooming", "provider": { "options": { "google-vertex": { "parameters": { "personGeneration": "allow", "negativePrompt": "blurry, low quality" } } } }}
Use the Video Models API to check which passthrough parameters each model supports via the allowed_passthrough_parameters field.
Once the job status is completed, the unsigned_urls array contains URLs to download the generated video content. You can also use the content endpoint directly:
Instead of polling for job status, you can receive a webhook notification when a video generation job completes. There are two ways to configure a callback URL:
Per-request: Pass callback_url in the request body. This takes priority over the workspace default.
Workspace default: Set a default callback URL in your workspace settings. This applies to all video generation requests that don’t specify their own callback_url.
When a job reaches a terminal state, a POST request is sent to the callback
URL with an event envelope. Each delivery also carries an
X-OpenRouter-Idempotency-Key header of the form <job_id>-<status> for
safe retry deduplication.video.generation.completed:
You can configure a signing secret in your workspace settings to verify that webhook payloads are authentically from OpenRouter. When a signing secret is configured, each webhook delivery includes an X-OpenRouter-Signature header.The signature includes a timestamp and an HMAC hash:
Use the raw request body (the exact bytes received) for verification. Parsing and re-serializing JSON may change key ordering or number formatting, which will cause verification to fail.
Detailed Prompts: Provide specific, descriptive prompts for better video quality. Include details about motion, camera angles, lighting, and scene composition
Appropriate Resolution: Higher resolutions take longer to generate and cost more. Choose the resolution that fits your use case
Polling Interval: Use a reasonable polling interval (e.g., 30 seconds) to avoid excessive API calls. Video generation typically takes 30 seconds to several minutes depending on the model and parameters
Error Handling: Always check the job status for failed state and handle the error field appropriately
Reference Images: When using reference images, ensure they are high quality and relevant to the desired video output
Video generation is not eligible for Zero Data Retention (ZDR). Because video generation is asynchronous, the generated video output must be retained by the provider for a short period of time so that it can be retrieved after generation is complete. This temporary retention is inherent to the async polling workflow and cannot be bypassed.If you have ZDR enforcement enabled (either via account settings or the per-request zdr parameter), video generation requests will not be routed.