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

# Seedance 2.0 動画生成 API リファレンス

> インタラクティブな Playground を備えた Seedance 2.0 の動画生成 API リファレンスです。text-to-video、first+last/first frame、マルチモーダルな reference-to-video を 1 つの非同期エンドポイントで利用でき、ポーリングとダウンロードの完全なコードも含まれています。

<Info>
  右側の Playground を使います。**Authorization** を `Bearer sk-your-api-key` に設定し（Token には `SeeDance2` グループが有効になっている必要があります）、`model` / `content` を入力して送信してください。送信が成功すると task `id` が返ります。ポーリングとダウンロードの流れは、下のコードサンプルで説明しています。
</Info>

<Warning>
  **Playground の「no response received」エラーについて**: これは非同期 task エンドポイントであり、ブラウザで Send をクリックするとそのメッセージが表示されることがあります。ブラウザのクロスオリジン安全性チェックがレスポンスをブロックしただけで、**task は実際には正常に送信されています**（下の query エンドポイントまたはコンソールログで確認してください）。Playground では task を作成することしかできず、video のポーリングやダウンロードはできません。create → poll → download の一連の流れを実行するには、下の **code samples**（cURL / Python / Node.js）をコピーして実行してください。
</Warning>

<Tip>
  これは Seedance 2.0 の task 作成エンドポイントです。Text-to-video、first+last/first frame、および multi-modal reference-to-video はすべてこれを共有しており、`content` 配列でモードを選択します。model の選択、pricing、解像度/ピクセル表、FAQ については、[Seedance 2.0 概要](/ja/api-capabilities/seedance2/overview) をご覧ください。
</Tip>

<Warning>
  * パス接頭辞は `/seedance/api/v3` です — **`/api` セグメントを省略しないでください**。また、`/v1/videos` は使用しないでください
  * Token では **`SeeDance2` グループ** を有効にしておく必要があります。そうしないと "no available channel for this model" が表示されます
  * `generate_audio` は **true がデフォルト** です（出力には音声があります）— 無音の video にするには `false` を明示的に指定してください
  * Python requests には `"Accept-Encoding": "identity"` ヘッダーが必要です — これがないと、gzip のデコードエラー、途中で切れた非 JSON 本文（たとえば先頭の `{"` が失われて `id":"cgt-xxx"}` しか取得できない）、または断続的な 400s に遭遇することがあります
  * 成功ステータスは `succeeded` です（`completed` ではありません）。video の URL は `content.video_url` にあり、**24 時間で期限切れになります**
</Warning>

## コード例

<CodeGroup>
  ```bash cURL（テキストから動画） theme={null}
  curl -X POST "https://api.apiyi.com/seedance/api/v3/contents/generations/tasks" \
    -H "Authorization: Bearer sk-your-api-key" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "doubao-seedance-2-0-fast-260128",
      "content": [
        {"type": "text", "text": "Drone shot flying over an autumn valley, golden forests and a winding river, cinematic"}
      ],
      "resolution": "720p",
      "ratio": "16:9",
      "duration": 5,
      "generate_audio": false
    }'
  # Returns {"id":"cgt-2026xxxx-xxxxx"} — poll the query endpoint with this id
  ```

  ```python Python（全体フロー：作成 → ポーリング → ダウンロード） theme={null}
  import time
  import requests

  BASE = "https://api.apiyi.com/seedance/api/v3/contents/generations/tasks"
  HEADERS = {
      "Authorization": "Bearer sk-your-api-key",
      "Content-Type": "application/json",
      # Required: the gateway's gzip header does not match the actual encoding.
      # Without this you may get gzip decode errors, a truncated non-JSON body
      # (e.g. id":"cgt-xxx"} with the leading {" lost), or intermittent 400s
      "Accept-Encoding": "identity",
  }

  # 1. Create the task
  body = {
      "model": "doubao-seedance-2-0-fast-260128",
      "content": [
          {"type": "text", "text": "Waves crashing on rocks at sunset, slow motion, serene mood"}
      ],
      "resolution": "720p",
      "ratio": "16:9",
      "duration": 5,
      # "generate_audio": False,  # defaults to True; uncomment for silent video
      # "seed": 12345,            # fix the seed for similar, reproducible results
  }
  task_id = requests.post(BASE, json=body, headers=HEADERS, timeout=60).json()["id"]
  print("task_id:", task_id)

  # 2. Poll until a terminal state (succeeded / failed / expired)
  while True:
      time.sleep(20)
      task = requests.get(f"{BASE}/{task_id}", headers=HEADERS, timeout=30).json()
      status = task.get("status")
      print("status:", status)
      if status in ("succeeded", "failed", "expired"):
          break

  # 3. Download the video (the URL expires in 24 h — copy it out immediately)
  if status == "succeeded":
      video_url = task["content"]["video_url"]   # note: under content, not top-level
      print("tokens:", task["usage"]["completion_tokens"])
      with requests.get(video_url, stream=True, timeout=300) as r:
          r.raise_for_status()
          with open(f"{task_id}.mp4", "wb") as f:
              for chunk in r.iter_content(chunk_size=1 << 20):
                  f.write(chunk)
      print(f"saved {task_id}.mp4")
  else:
      print("task did not succeed:", task.get("error"))
  ```

  ```python Python（最初と最後のフレーム / 参照モード） theme={null}
  # First + last frame: 2 images, roles required; mutually exclusive with reference mode
  body_first_last = {
      "model": "doubao-seedance-2-0-260128",
      "content": [
          {"type": "text", "text": "Smooth transition from the first frame to the last, slow camera move"},
          {"type": "image_url", "image_url": {"url": "https://example.com/first.jpg"},
           "role": "first_frame"},
          {"type": "image_url", "image_url": {"url": "https://example.com/last.jpg"},
           "role": "last_frame"},
      ],
      "resolution": "720p",
      "ratio": "adaptive",   # match the first frame's ratio to avoid cropping
      "duration": 5,
  }

  # Multi-modal reference: 0-9 reference images + 0-3 reference videos + 0-3 reference audios
  # (at least 1 image or 1 video); can create / edit / extend videos
  body_reference = {
      "model": "doubao-seedance-2-0-260128",
      "content": [
          {"type": "text", "text": "Using the reference character and style, the character walks down a rainy street at night"},
          {"type": "image_url", "image_url": {"url": "https://example.com/character.png"},
           "role": "reference_image"},
          # {"type": "video_url", "video_url": {"url": "..."}, "role": "reference_video"},
          # {"type": "audio_url", "audio_url": {"url": "..."}, "role": "reference_audio"},
      ],
      "resolution": "720p",
      "ratio": "16:9",
      "duration": 5,
  }
  # Images also accept Base64 (data:image/png;base64,xxx) and platform asset IDs (asset://xxx)
  ```

  ```javascript Node.js（fetch） theme={null}
  const BASE = "https://api.apiyi.com/seedance/api/v3/contents/generations/tasks";
  const HEADERS = {
    "Authorization": "Bearer sk-your-api-key",
    "Content-Type": "application/json",
  };

  // 1. Create the task
  const { id } = await fetch(BASE, {
    method: "POST",
    headers: HEADERS,
    body: JSON.stringify({
      model: "doubao-seedance-2-0-fast-260128",
      content: [{ type: "text", text: "A mountain lake reflecting the starry sky, time-lapse" }],
      resolution: "720p",
      ratio: "9:16",        // portrait costs the same as landscape
      duration: 5,
    }),
  }).then(r => r.json());
  console.log("task_id:", id);

  // 2. Poll until a terminal state
  let task;
  do {
    await new Promise(r => setTimeout(r, 20000));
    task = await fetch(`${BASE}/${id}`, { headers: HEADERS }).then(r => r.json());
    console.log("status:", task.status);
  } while (!["succeeded", "failed", "expired"].includes(task.status));

  // 3. The video link (expires in 24 h — re-host immediately)
  if (task.status === "succeeded") console.log(task.content.video_url);
  ```

  ```bash cURL（タスクをポーリング） theme={null}
  curl "https://api.apiyi.com/seedance/api/v3/contents/generations/tasks/cgt-2026xxxx-xxxxx" \
    -H "Authorization: Bearer sk-your-api-key"
  ```
</CodeGroup>

## パラメータリファレンス

| パラメータ                     | 型      | 必須 | デフォルト      | 備考                                                                                                                                                                                |
| ------------------------- | ------ | -- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `model`                   | string | ✓  | —          | `doubao-seedance-2-0-260128`（標準、1080p）/ `doubao-seedance-2-0-fast-260128`（高速、最大 720p）/ `doubao-seedance-2-0-mini-260615`（mini/lite、最大 720p、標準価格の約半額）。プレーン ID で、`ep-` プレフィックスは不要です |
| `content`                 | array  | ✓  | —          | 入力配列 — 下の「生成モード」を参照してください                                                                                                                                                         |
| `resolution`              | string |    | `720p`     | `480p` / `720p` / `1080p`（1080p は standard のみ対応。fast と mini は 720p まで）                                                                                                            |
| `ratio`                   | string |    | `adaptive` | `16:9` / `4:3` / `1:1` / `3:4` / `9:16` / `21:9` / `adaptive`；各ティア内のどのレシオも料金は同じです                                                                                                 |
| `duration`                | int    |    | `5`        | 整数秒で 4-15；`-1` でモデルに選択させます（実際の出力に基づいて課金されます）                                                                                                                                      |
| `generate_audio`          | bool   |    | `true`     | 同期オーディオ（音声/SFX/音楽、モノラル）                                                                                                                                                           |
| `watermark`               | bool   |    | `false`    | AI 生成のウォーターマークを追加します                                                                                                                                                              |
| `seed`                    | int    |    | `-1`       | \[-1, 2^32-1]；同じ seed なら似た（同一ではない）結果になります                                                                                                                                         |
| `return_last_frame`       | bool   |    | `false`    | クリップ連結用に、ウォーターマークなしの最終フレーム png を返します                                                                                                                                              |
| `execution_expires_after` | int    |    | `172800`   | タスクの失効しきい値（秒）、範囲 \[3600, 259200]                                                                                                                                                  |

<Warning>
  Seedance 2.0 は `frames`、`camera_fixed`、または `service_tier`（オンライン推論のみ）を**サポートしていません** — これらは Seedance 1.x のパラメータであり、無視されるか拒否されます。
</Warning>

### 生成モード（コンテンツの組み合わせ）

| モード             | コンテンツ項目                                                                            | role の値                                                   |
| --------------- | ---------------------------------------------------------------------------------- | --------------------------------------------------------- |
| テキストから動画        | 1 `text`                                                                           | —                                                         |
| 先頭フレーム + 最終フレーム | 任意のテキスト + 2 `image_url`                                                            | 必須: `first_frame` / `last_frame`                          |
| 先頭フレーム          | 任意のテキスト + 1 `image_url`                                                            | `first_frame` または省略可                                      |
| マルチモーダル参照から動画   | テキスト + 0-9 `image_url`（+ 任意で 0-3 `video_url` / 0-3 `audio_url`、少なくとも 1 画像または 1 動画） | `reference_image` / `reference_video` / `reference_audio` |

3 つの画像モードは**相互排他的**です。画像は公開 URL、Base64（`data:image/png;base64,...`）、およびアセット ID（`asset://...`）を受け付けます。実在の人物の顔を含む入力は拒否されます。音声は、少なくとも 1 つの画像または動画と一緒に送信する必要があります。エンドツーエンドのアセット参照コード（取り込み → `asset://` → 生成 → ダウンロード）については、[アセット参照ガイド](/ja/api-capabilities/seedance2/asset-reference) をご覧ください。

## レスポンス形式

作成ではタスク ID のみが返ります（**動画ではありません**）:

```json theme={null}
{ "id": "cgt-20260606160057-6bbjd" }
```

`GET /seedance/api/v3/contents/generations/tasks/{id}` をポーリングしてください。成功したタスクは次のようになります（テストでの実際のサンプルです）:

```json theme={null}
{
  "id": "cgt-20260606160057-6bbjd",
  "model": "doubao-seedance-2-0-fast-260128",
  "status": "succeeded",
  "content": {
    "video_url": "https://ark-acg-cn-beijing.tos-cn-beijing.volces.com/....mp4?X-Tos-Expires=86400&..."
  },
  "usage": { "completion_tokens": 108900, "total_tokens": 108900 },
  "created_at": 1780732857,
  "updated_at": 1780732991,
  "seed": 97151,
  "resolution": "720p",
  "ratio": "16:9",
  "duration": 5,
  "framespersecond": 24,
  "generate_audio": true,
  "draft": false
}
```

<Warning>
  * 動画の URL はトップレベルではなく **`content.video_url`** にあります。これは署名付きリンクで、**24時間で期限切れ**になります。すぐにダウンロードしてください
  * 状態マシン: `queued → running → succeeded / failed / expired`; 成功は **`succeeded`**
  * 署名付き URL には通常の GET でリンクをダウンロードしてください — **`Authorization`** ヘッダーは送信しないでください
</Warning>

<Info>
  `usage.completion_tokens` は課金対象の token 数で、`tokens ≈ duration × width × height × 24 / 1024` に従います（テストでは 0.1% 以内でした）。`duration: -1` または `ratio: adaptive` を使用すると、実際の長さと比率がレスポンスの `duration` / `ratio` フィールドに返されます。
</Info>


## OpenAPI

````yaml api-reference/seedance2-video-openapi-en.yaml POST /seedance/api/v3/contents/generations/tasks
openapi: 3.1.0
info:
  title: Seedance 2.0 Video Generation API
  description: >
    ByteDance Seedance 2.0 video generation (official Volcengine Mainland China
    resource).


    Capabilities:

    - Text-to-video / image-to-video (first+last frame, first frame) /
    multi-modal reference-to-video (0-9 reference images + 0-3 reference videos
    + 0-3 reference audios, at least 1 image or 1 video)

    - Resolutions 480p / 720p / 1080p (fast model caps at 720p), 6 aspect ratios
    plus adaptive; all ratios in the same tier share the same pixel area and
    price

    - Duration 4-15 s (or -1 for model-chosen length), fixed 24 fps,
    synchronized audio ON by default (generate_audio defaults to true)

    - Async task flow: create returns a task id, poll GET
    /seedance/api/v3/contents/generations/tasks/{id} until succeeded, then
    download from content.video_url (expires in ~24 hours)


    Authentication: Bearer Token (the Token must have the SeeDance2 group
    enabled and use the Pay-as-you-go Priority billing model).

    Get your key from the APIYI console → Token management.
  version: 1.0.0
servers:
  - url: https://api.apiyi.com
    description: Primary endpoint
  - url: https://vip.apiyi.com
    description: Backup endpoint
security:
  - bearerAuth: []
paths:
  /seedance/api/v3/contents/generations/tasks:
    post:
      tags:
        - Video Generation
      summary: Create a Seedance 2.0 video generation task
      description: >
        Async endpoint: returns a task `id` immediately — **not the video
        itself**.


        - Required: `model` + `content` (text only, text+images,
        text+images+video+audio, etc.)

        - The three image modes are mutually exclusive: first+last frame (2
        images, role required) / first frame (1 image) / multi-modal
        reference-to-video (0-9 images + 0-3 videos + 0-3 audios, at least 1
        image or 1 video, image role = reference_image)

        - Inputs containing real human faces are rejected; audio must be sent
        together with at least one image or video

        - `frames` / `camera_fixed` are NOT supported (Seedance 1.x only)

        - Billing is pre-charged on submit and settled on completion; rejected
        requests are not billed


        After creation, poll `GET
        /seedance/api/v3/contents/generations/tasks/{id}`.

        Status flow: `queued → running → succeeded / failed / expired`.

        On success, download the mp4 from `content.video_url` (expires in ~24
        hours).

        See the "Seedance 2.0 Overview" doc for details.
      operationId: createSeedance2VideoTaskEn
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Seedance2CreateTaskRequest'
            example:
              model: doubao-seedance-2-0-fast-260128
              content:
                - type: text
                  text: >-
                    Drone shot flying over an autumn valley, golden forests and
                    a winding river, cinematic
              resolution: 720p
              ratio: '16:9'
              duration: 5
              generate_audio: false
      responses:
        '200':
          description: Task created. Returns the task ID for polling
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Seedance2TaskCreated'
              example:
                id: cgt-20260606160057-6bbjd
        '400':
          description: >-
            InvalidParameter — e.g. 1080p with the fast model, duration outside
            4-15, or an unsupported ratio. The error message names the offending
            parameter; not billed
        '401':
          description: Unauthorized - invalid API key
        '403':
          description: Content moderation rejection (real human faces, policy violations)
        '429':
          description: Rate limited or insufficient quota
        '500':
          description: Internal server error
      security:
        - bearerAuth: []
components:
  schemas:
    Seedance2CreateTaskRequest:
      type: object
      required:
        - model
        - content
      properties:
        model:
          type: string
          description: >-
            Model ID (plain ID, no ep- prefix). Standard supports 1080p; fast
            caps at 720p but generates faster — both bill at the same rate on
            APIYI
          enum:
            - doubao-seedance-2-0-260128
            - doubao-seedance-2-0-fast-260128
          example: doubao-seedance-2-0-fast-260128
        content:
          type: array
          description: >-
            Input array. Text-to-video: a single text item. Image-to-video: add
            image_url items (role: first_frame / last_frame). Multi-modal
            reference-to-video: 0-9 image_url items (role: reference_image) plus
            optional 0-3 video_url / 0-3 audio_url (at least 1 image or 1 video;
            can create / edit / extend videos). The three image modes are
            mutually exclusive
          items:
            type: object
            properties:
              type:
                type: string
                description: Content type
                enum:
                  - text
                  - image_url
                  - video_url
                  - audio_url
                example: text
              text:
                type: string
                description: >-
                  Prompt (required when type=text). Up to ~1000 English words;
                  put spoken lines in double quotes to improve generated
                  voice-over
                example: Waves crashing on rocks at sunset, slow motion, serene mood
              image_url:
                type: object
                description: >-
                  Image object (required when type=image_url). Accepts public
                  URL, Base64 (data:image/png;base64,...), or asset ID
                  (asset://...). Formats jpeg/png/webp/bmp/tiff/gif/heic/heif;
                  aspect ratio (0.4, 2.5); sides (300, 6000) px; under 30 MB
                  each. Real human faces are not allowed
                properties:
                  url:
                    type: string
                    description: Image URL / Base64 / asset:// ID
                    example: https://example.com/first.jpg
              video_url:
                type: object
                description: >-
                  Reference video object (required when type=video_url);
                  multi-modal reference mode only
                properties:
                  url:
                    type: string
                    description: Video URL
              audio_url:
                type: object
                description: >-
                  Reference audio object (required when type=audio_url).
                  wav/mp3, 2-15 s per clip, up to 3 clips and 15 s total; must
                  accompany at least one image or video
                properties:
                  url:
                    type: string
                    description: Audio URL
              role:
                type: string
                description: >-
                  Media role. Required for first+last frame
                  (first_frame/last_frame); optional for a single first frame;
                  reference media use reference_*
                enum:
                  - first_frame
                  - last_frame
                  - reference_image
                  - reference_video
                  - reference_audio
        resolution:
          type: string
          description: >-
            Resolution tier (defines pixel area — every ratio in a tier costs
            the same). 1080p is not available on the fast model
          enum:
            - 480p
            - 720p
            - 1080p
          default: 720p
        ratio:
          type: string
          description: >-
            Aspect ratio. adaptive auto-fits the input (recommended for
            image-to-video to avoid cropping); the actual ratio is returned in
            the task's ratio field
          enum:
            - '16:9'
            - '4:3'
            - '1:1'
            - '3:4'
            - '9:16'
            - '21:9'
            - adaptive
          default: adaptive
        duration:
          type: integer
          description: >-
            Video length in whole seconds, 4-15; or -1 to let the model choose
            (billed by actual output). Cost scales linearly with duration
          default: 5
          example: 5
        generate_audio:
          type: boolean
          description: >-
            Generate synchronized audio (voice, SFX, background music; mono).
            Note it DEFAULTS TO TRUE — pass false explicitly for silent video
          default: true
        watermark:
          type: boolean
          description: Add an AI-generated watermark in the bottom-right corner
          default: false
        seed:
          type: integer
          description: >-
            Random seed, [-1, 2^32-1]. The same seed produces similar (not
            identical) results; -1 means random
          default: -1
        return_last_frame:
          type: boolean
          description: >-
            Return the last frame as a watermark-free png (same dimensions as
            the video) — chain it as the first frame of the next task to produce
            continuous multi-clip videos
          default: false
        execution_expires_after:
          type: integer
          description: >-
            Task expiry threshold in seconds; tasks exceeding it are marked
            expired. Range [3600, 259200]
          default: 172800
    Seedance2TaskCreated:
      type: object
      description: >-
        Creation response. Poll GET
        /seedance/api/v3/contents/generations/tasks/{id}; on success the video
        URL is at content.video_url (expires in ~24 h) and billed tokens at
        usage.completion_tokens
      properties:
        id:
          type: string
          description: Video generation task ID (kept for 7 days)
          example: cgt-20260606160057-6bbjd
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API key from the APIYI console (Token must have the SeeDance2 group
        enabled)

````