Skip to main content
POST /v3/videos is a deterministic, provider-agnostic video endpoint. You pass a model and a prompt; Opper runs the job and gives you a URL to poll. The same two-step flow works across every video provider (Google Veo, xAI Grok-Imagine, Alibaba Wan, Pruna, and more): only the contents of parameters differ per model.
Video generation is asynchronous: submitting returns immediately with an id, and you poll for the result. A clip typically takes from ~30 seconds to a few minutes depending on the model, resolution, and duration.

How it works

  1. Submit: POST /v3/videos with model + prompt → 202 { id, status_url }
  2. Poll: GET {status_url} until status is completed or failed
  3. Download: fetch the presigned url from the completed response (valid 1 hour)
Rather not poll? Pass a callback_url (or save a default URL for the project) and Opper sends a signed video.completed or video.failed event when the job ends. See Webhooks.

Run your first generation

1

Get an API key

Create a project-scoped runtime API key in the Opper dashboard.
2

Submit a generation

3

Poll until ready, then download

Models and parameters

model and prompt are required. A model id names its provider, such as bytedance:ap/seedance-2.5 or fal/kling-3.0-pro: the same model can be served by several providers, each with its own inputs, defaults and price. A bare name like seedance-2.5 answers 400 with the ids that serve it. Length, resolution and shape are top-level fields, normalized for every model:
To discover what’s available programmatically, call GET /v3/videos/models. Each model’s params.video lists its accepted aspect_ratios, resolutions and max_duration, plus a parameters list of the provider knobs it takes, and pricing gives its per-second rates:

Audio

Kling, Seedance and Veo render native audio, and a silent clip costs less. The default differs by provider, so set parameters.generate_audio to true or false explicitly. A model whose rate depends on it shows an audio dimension on its pricing.rates, or a separate price_per_second_audio.

Image, video and audio inputs

Each input is an http(s) URL, a data-URI, or a file_id. A model takes an input only when it has the matching capability, and answers 400 otherwise:
A file_id from a previous image generation or upload works as any of these inputs, with no re-upload. See Files for how files work, lifecycle, and storage quotas.
Edit a clip (Seedance 2.5 on BytePlus)
Seedance (on BytePlus and on fal) refuses an image or video input that shows a realistic person, AI-generated ones included. On bytedance:ap/ models an image made with a bytedance:ap/seedream-* model through Opper passes, because BytePlus trusts its own outputs for 30 days. For an edit or extension, leave seconds and aspect_ratio out: the clip keeps the input’s.
Source-format rules differ per provider:

Reference

Last modified on November 2, 2026