> ## Documentation Index
> Fetch the complete documentation index at: https://docs.toapis.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Seedance 2.5 Draft Mode

> Preview a low-cost 480p draft first, then render the 1080p final video from that draft

<Note>
  **Note for users in mainland China:** Please use `https://toapis.cn` as the API endpoint (Base URL). Replace `https://toapis.com` with `https://toapis.cn` in the examples in this document.
</Note>

Draft mode splits one generation into two stages: first render a low-cost 480p draft to confirm the camera work and framing, then render the 1080p final video from that draft. The upstream service reuses the draft's prompt and media, so the second stage does not repeat them.

Both stages call `POST /v1/videos/generations` with the same `seedance-2-5` model.

## Two-stage workflow

1. Submit a draft request with `draft: true` and read the draft task ID from the response.
2. Wait for the draft to finish and confirm `status` is `completed` through [Get video task status](/docs/en/api-reference/tasks/video-status).
3. Submit the final request with `draft_task_id` set to the draft task ID from step 1. Do not repeat the prompt or media.

## Stage comparison

| Item | Draft (`draft: true`) | Final (`draft_task_id`) |
| - | - | - |
| Supported model | `seedance-2-5` only | `seedance-2-5` only |
| `resolution` | Always `480p` | Always `1080p` |
| `output_format` | `mp4` | `mp4` or `mov` |
| Prompt and media | Same as [standard generation](./generation) | Rejected, must be omitted |
| Draft task status | - | Must have completed successfully |
| Draft task lifetime | - | Within 7 days of draft creation |
| Billing | Draft rate | Draft is treated as a video input, so video-input rates apply |

<Warning>
  The final request must use the same `model` as the draft, and draft support must still be enabled on the draft's channel. If the draft task did not complete successfully, was created more than 7 days ago, used a different model, or the channel capability was turned off, the final request fails with `invalid_draft_task` and you must render a new draft.
</Warning>

## Body

<ParamField body="draft" type="boolean" default={false}>
  Set to `true` to submit a draft request. The draft renders at `480p`; every other parameter behaves exactly as in [standard generation](./generation).

  Supported for `seedance-2-5` only. Other models return `draft mode is only supported for Seedance 2.5`.
</ParamField>

<ParamField body="draft_task_id" type="string">
  Required for the final request. Pass the task ID returned by the draft request (`tsk_vid_...`).

  Cannot be combined with `draft: true`. Once `draft_task_id` is set, do not send `prompt`, `image_urls`, `image_with_roles`, `video_with_roles`, or `audio_with_roles`, or the request returns `draft requests cannot include prompt or media`.
</ParamField>

<ParamField body="resolution" type="string">
  Drafts are fixed to `480p` and final renders to `1080p`. The field is optional: when omitted, the stage's fixed value is used instead. Any other explicit value is rejected.
</ParamField>

<ParamField body="output_format" type="string" default="mp4">
  Only the final request may set this. Supported values are `mp4` and `mov`.
</ParamField>

<ParamField body="return_last_frame" type="boolean" default={false}>
  The final request does not inherit the draft's last-frame setting. Send `true` again on the final request if you also need the last frame there.
</ParamField>

All remaining parameters (`prompt`, `duration`, `aspect_ratio`, `generate_audio`, reference media, and so on) work the same way during the draft stage as in [Seedance 2.5 video generation](./generation).

## Request examples

The two examples below are the complete requests for submitting a draft and for rendering the final video from it. Run them in order.

<RequestExample>
  ```bash cURL (submit a draft) theme={null}
  curl --request POST \
    --url https://toapis.com/v1/videos/generations \
    --header 'Authorization: Bearer <token>' \
    --header 'Content-Type: application/json' \
    --data '{
      "model": "seedance-2-5",
      "draft": true,
      "prompt": "A cinematic product shot, slow camera push-in, natural room tone.",
      "duration": 4,
      "resolution": "480p",
      "return_last_frame": true
    }'
  ```

  ```bash cURL (render the final video) theme={null}
  curl --request POST \
    --url https://toapis.com/v1/videos/generations \
    --header 'Authorization: Bearer <token>' \
    --header 'Content-Type: application/json' \
    --data '{
      "model": "seedance-2-5",
      "draft_task_id": "tsk_vid_xxx",
      "resolution": "1080p",
      "output_format": "mp4",
      "return_last_frame": true
    }'
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "id": "tsk_vid_xxx",
    "object": "generation.task",
    "model": "seedance-2-5",
    "status": "in_progress",
    "progress": 10,
    "created_at": 1781577600
  }
  ```
</ResponseExample>

## Billing

The draft and the final video are billed separately, each when its own task completes. The draft settles at the draft rate. The final request treats the draft video as a video input, so it settles at video-input rates and costs more per unit than the draft. The task result and [Pricing and actual cost](/docs/en/api-reference/account/pricing) are the source of truth for the amount charged.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.