POST /v1/videos
Reference · Videos — guarded, asynchronous text-to-video. You get a quote, submit a job, poll it, then download the file.
Overview
How a video job works
GET /v1/videos/modelslists the models you can use now, each with afrom_price(the cheapest clip it can make).POST /v1/videos/quoteprices your exact request without holding anything.POST /v1/videosreturns202with a job. The quoted price is held on your prepaid balance and charged only when the video is delivered. A failed, blocked or expired job is refunded.- Poll
GET /v1/videos/{id}untilstatusiscompleted, thenGET /v1/videos/{id}/contentredirects (302) to a short-lived download URL.
The price is the provider's price for that clip plus our margin, in US dollars (quote_usd) and, when a rate is available, in Rupiah (quote_idr). Signup credit and passes can't be used for video; it needs topped-up balance.
Free draft: every account with a verified email can make one free draft while the monthly free-draft budget lasts ("free_draft": true: Veo 3.1 Lite, 4 seconds, 720p, no audio).
Request
Body
| Field | Description |
|---|---|
model | A model id from GET /v1/videos/models, or auto (default) to let the gateway pick by quality. |
prompt | The text prompt, up to 2,000 characters. Required. |
seconds | Clip length. Each model lists the durations it supports. Required. |
resolution | e.g. 720p (default) or 1080p, as the model lists. |
aspect_ratio | 16:9 (default), 9:16 or 1:1, as the model lists. |
audio | Ask for an audio track where the model makes it optional. |
quality | For auto: draft, standard (default) or high. |
negative_prompt, seed | Optional, where the model supports them. |
max_price_usd / max_price_idr | Refuse (409 price_changed) if the price is now above what you showed your user. |
free_draft | true for the one free draft (overrides model, length, resolution and audio). |
Send an Idempotency-Key header so a retry returns the same job instead of a second hold. Image-to-video is not available yet.
Limits & guards
- Prompt guard. Child-safety, violent extremism, NSFW and content moderation (English + Bahasa Indonesia) run before anything is held; validated personal data is masked before the prompt leaves.
- Output check. Frames of every result are checked for nudity before delivery; a blocked result is refunded.
- Labels. Files are named
…-ai-generated.mp4and carry a C2PA manifest signed by Anoman (self-signed). - Where it runs. Generation runs at fal.ai, outside Indonesia (fal does not publish the region), under the model owner's terms (
termson each model). - Caps. A daily spend cap and an in-flight cap per workspace; a busy queue returns
503and nothing is held.
Errors
| Status | error | Meaning |
|---|---|---|
| 402 | insufficient_balance | Not enough topped-up balance for this quote. |
| 409 | price_changed | The price is above your max_price_*. |
| 409 | free_draft_unavailable | The free draft was already used or isn't available. |
| 429 | video_daily_cap_reached / concurrent_limit | A workspace cap is reached. |
| 503 | capacity / video_temporarily_unavailable | Try again later; nothing was charged. |
Response
Illustrative example — the amounts are not a price list; the live quote comes from the API (POST /v1/videos/quote).