POST /v1/videos/generations is always asynchronous. It returns 202 Accepted with a generation in queued status right away; poll it or receive a webhook when it finishes.
202 Accepted
Parameters
Allowed values come from the model’s
generation_config. A value outside them returns 400 unsupported_value, and the message lists the allowed values.
Frames and references
image_url (https or data URL) or file_id. Videos and audio take https links. What a model accepts is declared in its capabilities (first_frame, last_frame, reference_image, reference_video, reference_audio) and limits (max_reference_images, max_reference_videos, max_reference_audios).
Some models take the aspect ratio from the first frame or reference image, in which case
aspect_ratio is ignored. The model page shows this.
Result
Whenstatus becomes completed, the generation’s output.videos contains:
Pricing
Price per second × the requested duration, by resolution and whether audio is generated (second_per_spec, for example 720p|audio). Failed videos are not charged; for cancellations see below.
Seedance models are billed per video token instead (video_tokens_per_spec):
- Tokens = actual output width × height × frames / 1024, rounded down, with frames = 24 × seconds + 1. The size is the size of the video you get back (for example 720p is 1280×720 at 16:9 and 834×1112 at 3:4), so every aspect ratio costs about the same.
- With reference videos, each reference video adds width × height × 24 × seconds / 1024 tokens, and all tokens are billed at
video_tokens_video_input_per_spec. usage.video_tokensreports the billed tokens. The hold at submission is a slightly larger estimate; you are charged for the actual tokens.
Cancel
POST /v1/generations/{id}/cancel cancels a video. A queued video is cancelled right away and not charged. A video already being generated is charged only if it can’t be stopped and completes anyway. See Async requests.