# Seedance 2.5 (https://wanapi.app/docs/seedance-2-5)





Seedance 2.5 supports text, first and last frames, and image, video and audio references, with output at 480p, 720p, 1080p. Generate up to 30 seconds per request. [Model details and Playground](/models/seedance-2-5).

## Connect to Wan API [#connect-to-wan-api]

Use `https://api.wanapi.app` as the API base URL. Create a key with the **Seedance** model family in [API key settings](/settings/apikeys) and send it as `Authorization: Bearer YOUR_API_KEY`. Keep keys on your server. Playground uses your website session and charges the same account balance; it does not require pasting a key into the browser.

Access requires an enabled account with sufficient balance. `GET /v1/models` lists the models available to your key. Seedance models use `POST /v1/videos`; select the model in the JSON body.

| Setting         | Seedance 2.5                                                                  |
| --------------- | ----------------------------------------------------------------------------- |
| Model ID        | `bytedance/seedance-2.5`                                                      |
| `resolution`    | `480p`, `720p`, `1080p`; default: `720p`.                                     |
| `duration`      | 4–30 output seconds, or `-1` for automatic; default: `-1`.                    |
| `aspectRatio`   | `adaptive`, `16:9`, `4:3`, `1:1`, `3:4`, `9:16`, `21:9`; default: `adaptive`. |
| `generateAudio` | `true` by default. `false` does not reduce the token rate.                    |
| Output          | One video per request, at 24 fps.                                             |

The [request fields](#request-fields) describe all 13 top-level fields. Use the field names shown here, including `aspectRatio` and `generateAudio`.

## Submit a Seedance 2.5 task [#submit-a-seedance-25-task]

This is a four-second text-to-video request at 720p. Set `WAN_API_KEY` to your Seedance key on the server. Submit once and save the returned `id`.

```bash
curl https://api.wanapi.app/v1/videos \
  -H "Authorization: Bearer $WAN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "bytedance/seedance-2.5",
  "prompt": "A paper boat floats through a sunlit stream. Slow tracking shot.",
  "resolution": "720p",
  "aspectRatio": "16:9",
  "duration": 4,
  "generateAudio": true
}'
```

## Query a Seedance 2.5 task [#query-a-seedance-25-task]

Save the returned `id` as `TASK_ID`, then query with the same key. Submission returns a task receipt; the video is available after completion. Begin polling every five seconds; see [task statuses and downloads](#poll-and-download-the-video).

```bash
curl "https://api.wanapi.app/v1/videos/$TASK_ID" \
  -H "Authorization: Bearer $WAN_API_KEY"
```

## Seedance 2.5 pricing [#seedance-25-pricing]

Rates are in USD per one million video tokens. Input and output video tokens determine the final cost. Resolution, duration and reference video inputs affect usage; use the matching rate for requests with or without reference video. Audio has no separate price tier.

<SeedanceModelPricing model="findSeedanceModel('seedance-2-5')" />

[View Seedance 2.5 pricing and estimates](/models/seedance-2-5#pricing). Review the estimate in the [Playground](/models/seedance-2-5#playground) before submitting.

## Request fields [#request-fields]

Send a JSON object. `model` is required, together with a non-empty prompt or at least one media input. Other fields are optional. Unknown fields are rejected.

| Field             | Type              | Contract                                                                                                                                                                                                   |
| ----------------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `model`           | string            | Required: `bytedance/seedance-2.5`.                                                                                                                                                                        |
| `prompt`          | string            | Text instructions; up to 20,000 characters on this service. A prompt or media input is required.                                                                                                           |
| `image`           | URL or URL object | First-frame image URL, or an object with `type: "url"`, `url` and optional `mediaType`. Use `image` or `frameImages`, not both.                                                                            |
| `frameImages`     | array             | One `first_frame` and an optional `last_frame`. Each entry has `frameType` and `image`; see the frame example below.                                                                                       |
| `inputReferences` | array             | Up to 30 images and 10 videos. Each entry has `type: "url"`, `url` and `mediaType`. The `data`/`mediaType` URL form is also accepted.                                                                      |
| `aspectRatio`     | string            | `adaptive` (default), `16:9`, `4:3`, `1:1`, `3:4`, `9:16`, `21:9`. First-frame modes require adaptive.                                                                                                     |
| `resolution`      | string            | `480p`, `720p`, `1080p`. Default: `720p`. Also accepts `854x480`, `1280x720`, `1920x1080` as resolution tiers; use `aspectRatio` to select the shape.                                                      |
| `duration`        | integer           | 4–30 output seconds, or `-1` for automatic. Default: `-1`.                                                                                                                                                 |
| `fps`             | integer           | Fixed at `24`; omit or send `24`.                                                                                                                                                                          |
| `seed`            | integer           | Optional; `-1` to `2147483647`. No repeatability guarantee. Do not also specify `providerOptions.bytedance.seed`.                                                                                          |
| `generateAudio`   | boolean           | Generate audio. Default: `true`; disabling it does not change the token rate.                                                                                                                              |
| `n`               | integer           | Fixed at `1`; one video per request.                                                                                                                                                                       |
| `providerOptions` | object            | Optional `bytedance` object: `referenceAudio` (up to 10 HTTP(S) URLs), `seed` (same bounds as top-level `seed`), `draft` (boolean; default `false`; `true` requires `480p`). Unknown options are rejected. |

### Input combinations and media limits [#input-combinations-and-media-limits]

* Use `image` for a first frame, or `frameImages` for a first frame and optional last frame. A last frame alone and duplicate frame types are rejected.

* Frames cannot be combined with `inputReferences` or `providerOptions.bytedance.referenceAudio`.

* Reference mode accepts up to 30 images, 10 videos and 10 audio clips, with at most 50 references in total.

* Frame inputs require `aspectRatio: "adaptive"`. Reference audio can be used without an image or video.

* Media inputs must be public HTTP(S) URLs. Upload bytes and credential-bearing URLs are not accepted.

* Images: JPEG, PNG, WebP, BMP, TIFF or GIF, HEIC or HEIF; below 30 MB; each side 300–6000 pixels; aspect ratio 0.4–2.5.

* Videos: MP4 or MOV; at most 200 MB per file; each clip 2–30 seconds and at most 30 seconds combined; 300–6000 pixels per side, aspect ratio 0.4–2.5, 24–60 fps.

* Audio: MP3 or WAV; at most 15 MB per file; each clip 2–30 seconds and at most 30 seconds combined.

* Remote media size, encoding and duration are checked during processing; URL validation alone cannot guarantee that a file is usable.

* Draft-to-final rendering from an earlier task and arbitrary native task options are not exposed by this endpoint.

## Frame and reference examples [#frame-and-reference-examples]

Send these bodies to the same `POST /v1/videos` endpoint. Replace every `example.com` URL with your own directly accessible media URL before submitting. Keep input URLs available until the task finishes.

### First and last frames [#first-and-last-frames]

For a single first frame, use `image: "https://example.com/first-frame.jpg"` and omit `frameImages`. To set both endpoints of the clip, use:

```json
{
  "model": "bytedance/seedance-2.5",
  "prompt": "The camera slowly moves from the opening scene to the closing scene.",
  "frameImages": [
    {
      "frameType": "first_frame",
      "image": "https://example.com/first-frame.jpg"
    },
    {
      "frameType": "last_frame",
      "image": "https://example.com/last-frame.jpg"
    }
  ],
  "aspectRatio": "adaptive",
  "resolution": "720p",
  "duration": 4
}
```

### Image, video and audio references [#image-video-and-audio-references]

Put image and video inputs in `inputReferences`, with an explicit MIME type. Put audio URLs in `providerOptions.bytedance.referenceAudio`. Do not add frame inputs to this request.

```json
{
  "model": "bytedance/seedance-2.5",
  "prompt": "Use the character from the image and the camera movement from the video.",
  "inputReferences": [
    {
      "type": "url",
      "url": "https://example.com/character.jpg",
      "mediaType": "image/jpeg"
    },
    {
      "type": "url",
      "url": "https://example.com/motion.mp4",
      "mediaType": "video/mp4"
    }
  ],
  "providerOptions": {
    "bytedance": {
      "referenceAudio": [
        "https://example.com/sound.wav"
      ]
    }
  },
  "resolution": "720p",
  "duration": 4
}
```

### Draft preview [#draft-preview]

Use `providerOptions.bytedance.draft: true` with `resolution: "480p"` to create a draft. Draft uses the normal 480p token rate. This endpoint does not accept an earlier draft task as the input for a final render; a new generation is a separate request.

```json
{
  "model": "bytedance/seedance-2.5",
  "prompt": "A paper boat floats through a sunlit stream. Slow tracking shot.",
  "resolution": "480p",
  "aspectRatio": "16:9",
  "duration": 4,
  "generateAudio": true,
  "providerOptions": {
    "bytedance": {
      "draft": true
    }
  }
}
```

## Poll and download the video [#poll-and-download-the-video]

An accepted task returns an object like this. Example IDs and timestamps are illustrative:

```json
{
  "id": "task_EXAMPLE",
  "object": "video",
  "model": "bytedance/seedance-2.5",
  "status": "queued",
  "progress": 0,
  "created_at": 1792022400
}
```

Poll `GET /v1/videos/{task_id}` with your API key. The query returns the same public task ID and model. Use `status` to decide when to stop polling; `progress` is not an estimate of remaining time.

| Status        | Meaning                     | Next step                          |
| ------------- | --------------------------- | ---------------------------------- |
| `queued`      | The task has been accepted. | Continue polling.                  |
| `in_progress` | Generation is running.      | Continue polling.                  |
| `completed`   | The video is ready.         | Read `videos[0].url` and download. |
| `failed`      | Generation failed.          | Stop polling and inspect `error`.  |

A completed query includes `videos`, an array of objects containing `url` and `mediaType`. Timestamps use Unix seconds; `completed_at` appears when completion is recorded.

```json
{
  "id": "task_EXAMPLE",
  "object": "video",
  "model": "bytedance/seedance-2.5",
  "status": "completed",
  "progress": 100,
  "created_at": 1792022400,
  "completed_at": 1792022460,
  "videos": [
    {
      "url": "/v1/tasks/task_EXAMPLE/artifacts/video/content",
      "mediaType": "video/mp4"
    }
  ]
}
```

When the returned URL is a relative path, resolve it against `https://api.wanapi.app` and authenticate with your API key. For the example above:

```bash
curl "https://api.wanapi.app/v1/tasks/$TASK_ID/artifacts/video/content" \
  -H "Authorization: Bearer $WAN_API_KEY" \
  -o video.mp4
```

If a signed HTTPS media URL is returned, use it directly without forwarding your API key to that host. Result URLs can expire. Save videos you want to keep to your own storage. Polling and downloading an existing result do not create another generation.

A failed task includes an `error` object with `code` and `message`, for example:

```json
{
  "id": "task_EXAMPLE",
  "object": "video",
  "model": "bytedance/seedance-2.5",
  "status": "failed",
  "error": {
    "code": "generation_failed",
    "message": "Video generation failed"
  }
}
```

## Billing and failure handling [#billing-and-failure-handling]

The final charge follows actual video token usage and the current model rate. The Playground estimate is a maximum estimate, not a fixed quote. Longer clips and larger output resolutions can increase token usage. Failed requests are not charged.

* **Invalid parameters:** correct the fields or input combination before submitting again. Check media formats and limits as well as URL syntax.
* **Authentication or model access:** use a valid Seedance key enabled for the requested model.
* **Insufficient balance:** add funds before a new paid request. A key limit does not add account credit.
* **Temporary polling failure:** retry the GET with backoff and a maximum waiting period. A failed query does not mean the generation failed.
* **Submission timeout or missing task ID:** the outcome may be unknown. Do not automatically repeat the POST; it could create a second paid task.
* **Download failure:** retry the existing result before starting a new generation.

Keep the task ID and contact [support](/contact) if an uncertain submission needs investigation.

[Download the Seedance 2.5 OpenAPI schema](https://wanapi.app/models/seedance-2-5/openapi.json).
