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

Images take either 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

When status becomes completed, the generation’s output.videos contains:
Links are signed and expire. Query the generation again to get fresh links.

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_tokens reports the billed tokens. The hold at submission is a slightly larger estimate; you are charged for the actual tokens.
For example, a 4-second 720p 9:16 Seedance 2.0 video (720×1280, 97 frames) is 87,300 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.