Create a video
Start a video with any video model, read its job, and download the file.
Send a prompt and a video model, get the job back at once. Pick a model and its values from GET /videos/models: a value the model doesn't list is refused before anything is held. See Videos for pictures, extending, costs and limits.
Authorization: Bearer binf_... or x-api-key.Request body
Only these fields are taken: any other is refused or left out.
modelstringRequiredA video model id from GET /videos/models, such as
alibaba/wan-3.0.promptstringWhat happens in the video: the scene, the movement, the camera. Up to 2,000 characters. Needed unless the video starts from pictures or carries one on.
durationintegerRequiredSeconds, one of the model's
supported_durations.resolutionstringRequiredSuch as
720p, one of the model'ssupported_resolutions.aspect_ratiostringRequiredSuch as
"16:9"or"9:16", one of the model'ssupported_aspect_ratios.generate_audiobooleanSound, on models with
generate_audio: true. Off when left out.seedintegerThe same seed and settings give a similar video, on models with
seed: true.frame_imagesobject[]Pictures the video starts or ends on, each
{ "type": "image_url", "image_url": { "url": "https://..." }, "frame_type": "first_frame" }(orlast_frame), as the model'ssupported_frame_imagesallow. Links are publichttpsones.input_referencesobject[]Pictures of people, things or a look to keep, each
{ "type": "image_url", "image_url": { "url": "https://..." } }, up to the model'smax_input_references, as publichttpslinks. Not withframe_images.previous_job_idstringOne of this agent's completed videos to carry on, on a model with
extends: true.
Headers
Idempotency-Keystring8 to 64 letters, digits, - or _. A second call with the same key answers the same video and makes no new one.
Response
idstringThe video's id:
vid_and 20 letters and digits.status"pending" | "in_progress" | "completed" | "failed" | "expired"pendingorin_progresswhile it is made, thencompletedorfailed;expiredonce it is no longer kept.polling_urlstringWhere to read the job: GET it with your key every 10 seconds or so.
unsigned_urlsstring[]Once completed: where to GET the file, with your key. It answers with a link that works for an hour.
estimated_costnumberThe most this video costs, in dollars. It is held from your balance until the video ends.
usageobject | nullOnce completed:
cost, what it was charged. A video that fails is charged nothing.errorobject | nullWhy it failed, as a
codesuch ascontent_refused.expires_atstring | nullWhen the file is deleted: 30 days after it was made.
curl https://binference.io/api/v1/videos \ -H "Authorization: Bearer $BINF_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "alibaba/wan-3.0", "prompt": "A paper boat drifts across a calm pond at sunrise, slow tracking shot", "duration": 5, "resolution": "720p", "aspect_ratio": "16:9" }'{ "id": "vid_TFEnw4pmFHxtp2oqMHR8", "object": "video.generation", "model": "alibaba/wan-3.0", "status": "pending", "polling_url": "https://binference.io/api/v1/videos/vid_TFEnw4pmFHxtp2oqMHR8", "unsigned_urls": [], "estimated_cost": 0.6, "usage": null, "error": null, "created_at": "2026-10-04T17:26:08.000Z", "expires_at": null}Read a video
GET /videos/{id} with your key answers the same job as POST /videos, as it is now. Ask every 10 seconds or so until status is completed or failed. Each key may read jobs 60 times a minute.
Download a video
GET /videos/{id}/content with your key answers 302 to the file, an H.264 MP4, through a link that works for an hour. It answers 404 with not_ready before the video is done and after it is deleted, 30 days after it was made.
List video models
GET /videos/models needs no key. For each model: supported_resolutions, supported_aspect_ratios, supported_durations, supported_frame_images, max_input_references, generate_audio, seed, extends, and from_price, its shortest, smallest video in dollars. The list changes when models arrive or leave, at most every hour.