bytedance/seedance-2.0-mini/image-to-video19 點數起 / 5 秒影片· 圖生影片

Seedance 2.0 Mini 是字節跳動 Seedance 2.0 系列裡最小、最便宜的一款:文生影片、圖生影片、參考場景和影片續寫,4 到 15 秒,480p 或 720p,聲音在同一次生成裡完成。它為吞吐量而生,同一個鏡頭多試幾個版本是家常便飯。

在 POST /jobs/createTask 把模型名稱填成 bytedance/seedance-2.0-mini/image-to-video 就能呼叫,19 點數/ 5 秒影片起(US$0.19)。新帳戶送 30 點數,可以先在 Playground 免費試用。

  • 生成影片
  • 圖生影片
  • 參考生影片
  • 影片延伸
  • 最高 720p
  • 4–15 秒
  • 附帶聲音
  • 首尾畫格
  • 最多 9 張參考圖
  • 6 種畫面比例
模型名稱bytedance/seedance-2.0-mini/image-to-video
端點POST https://api.popnow.ai/api/v1/jobs/createTask
# 1. Create the task. Keep the Idempotency-Key if you retry after a network error.
export IDEMPOTENCY_KEY="$(uuidgen)"
curl -X POST https://api.popnow.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $IDEMPOTENCY_KEY" \
  -d '{
  "model": "bytedance/seedance-2.0-mini/image-to-video",
  "input": {
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "image_url": "https://media.popnow.ai/influencer/examples/marco.webp",
    "aspect_ratio": "adaptive",
    "resolution": "720p",
    "duration_seconds": 5,
    "generate_audio": true
  }
}'

# 2. Copy data.taskId from the response, then poll until state is succeeded, failed, canceled or expired.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.popnow.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $POPNOW_API_KEY"

input 依下方的 Schema 產生,原樣就能通過驗證。把提示詞和連結換成你自己的即可。

價格

選項點數 /秒≈ 美元
resolution 480p3.69US$0.037
enable_web_search trueresolution 480p5.4US$0.054
resolution 720p7.94US$0.079
enable_web_search trueresolution 720p10.8US$0.11

1 點數 = $0.01 · 全部選項及價格:GET /models/bytedance/seedance-2.0-mini/image-to-video

每個任務會無條件進位到整數點數,所以最低檔跑一次是 19 點數/ 5 秒影片(US$0.19)。

限制

影片長度
4–15 s
解析度
480p · 720p
畫面比例
16:9 · 9:16 · 4:3 · 3:4 · 1:1 · 21:9 · adaptive

參數

這些欄位來自我們驗證每個請求所用的同一份 Schema。沒列出的欄位會被拒絕。

  • image_urlstring必填

    作為起點的那張圖。

    範圍
    image/jpeg, image/png, image/webp, image/gif
  • promptstring選填

    Describe the intended subject, action, camera, light, sound, and constraints.

    範圍
    1 – … chars
  • last_image_urlstring選填

    可選的結尾畫面,讓影片剛好停在你要的地方。

    範圍
    image/jpeg, image/png, image/webp, image/gif
  • aspect_ratiostring選填

    畫面形狀:橫式、方形或直式。

    預設值
    "adaptive"
    可用值
    "16:9""9:16""4:3""3:4""1:1""21:9""adaptive"
  • resolutionstring選填影響價格

    輸出尺寸。越大越清晰,價格也越高。

    預設值
    "720p"
    可用值
    "480p""720p"
  • duration_secondsinteger選填影響價格

    影片長度,按秒計費。

    預設值
    5
    可用值
    -1456789101112131415
  • generate_audioboolean選填影響價格

    加上和畫面相配的聲音:人聲、環境音和音效。

    預設值
    true
  • enable_web_searchboolean選填影響價格

    先上網查日期、地點和最新資訊。

    預設值
    false
  • seedinteger選填

    用同一個數字,結果就能重現。

    範圍
    0 – 2147483647
  • return_last_frameboolean選填

    Also return the clip’s final frame as a separate image.

    預設值
    false
  • bitrate_modestring選填

    Encoding bitrate of the delivered file: standard, or high for crisper detail and a larger file.

    預設值
    "standard"
    可用值
    "standard""high"
  • watermarkboolean選填

    Add the model’s visible "AI generated" watermark to the video.

    預設值
    false
原始 JSON Schema
{
  "additionalProperties": false,
  "properties": {
    "aspect_ratio": {
      "default": "adaptive",
      "description": "Output frame ratio.",
      "enum": [
        "16:9",
        "9:16",
        "4:3",
        "3:4",
        "1:1",
        "21:9",
        "adaptive"
      ],
      "type": "string"
    },
    "bitrate_mode": {
      "default": "standard",
      "description": "Encoding bitrate of the delivered file: standard, or high for crisper detail and a larger file.",
      "enum": [
        "standard",
        "high"
      ],
      "type": "string"
    },
    "duration_seconds": {
      "default": 5,
      "description": "Requested output duration in seconds. Pass -1 for smart duration: the model picks the length itself instead of a fixed number.",
      "enum": [
        -1,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
        13,
        14,
        15
      ],
      "type": "integer"
    },
    "enable_web_search": {
      "default": false,
      "description": "Let the model search the web for information related to the prompt before rendering. Requests with it on are billed at the web-search rate.",
      "type": "boolean"
    },
    "generate_audio": {
      "default": true,
      "description": "Request synchronised output audio.",
      "type": "boolean"
    },
    "image_url": {
      "contentMediaType": [
        "image/jpeg",
        "image/png",
        "image/webp",
        "image/gif"
      ],
      "description": "A source image that you are authorised to process.",
      "type": "string"
    },
    "last_image_url": {
      "contentMediaType": [
        "image/jpeg",
        "image/png",
        "image/webp",
        "image/gif"
      ],
      "description": "Optional closing image for the chosen video workflow.",
      "type": "string"
    },
    "prompt": {
      "description": "Describe the intended subject, action, camera, light, sound, and constraints.",
      "minLength": 1,
      "type": "string"
    },
    "resolution": {
      "default": "720p",
      "description": "Output resolution.",
      "enum": [
        "480p",
        "720p"
      ],
      "type": "string"
    },
    "return_last_frame": {
      "default": false,
      "description": "Also return the clip’s final frame as a separate image.",
      "type": "boolean"
    },
    "seed": {
      "description": "Random seed. Omit to let the model pick one.",
      "maximum": 2147483647,
      "minimum": 0,
      "type": "integer"
    },
    "watermark": {
      "default": false,
      "description": "Add the model’s visible \"AI generated\" watermark to the video.",
      "type": "boolean"
    }
  },
  "required": [
    "image_url"
  ],
  "type": "object"
}

Seedance 2.0 Mini 的真實成品

提示詞A gloved hand enters from the right and fills the gap in the upper row can by can, facing each label forward, then withdraws. Camera locked off on the shelf. Small metallic clinks, chiller hum, fluorescent light unchanged throughout.
透過 API 送出的同一個請求
{
  "model": "bytedance/seedance-2.0-mini/image-to-video",
  "input": {
    "prompt": "A gloved hand enters from the right and fills the gap in the upper row can by can, facing each label forward, then withdraws. Camera locked off on the shelf. Small metallic clinks, chiller hum, fluorescent light unchanged throughout.",
    "image_url": "https://media.popnow.ai/influencer/examples/marco.webp",
    "aspect_ratio": "16:9",
    "resolution": "720p",
    "duration_seconds": 4,
    "generate_audio": true
  }
}

這則是從上傳的檔案開始的:把範例連結換成你自己的檔案連結。

回應、輪詢與回呼

所有模型的用法都一樣:先建立任務,再輪詢,或等待回呼。

先報價

cURL
curl -X POST https://api.popnow.ai/api/v1/jobs/quote \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "bytedance/seedance-2.0-mini/image-to-video",
  "input": {
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "image_url": "https://media.popnow.ai/influencer/examples/marco.webp",
    "aspect_ratio": "adaptive",
    "resolution": "720p",
    "duration_seconds": 5,
    "generate_audio": true
  }
}'

請求內容和 createTask 相同。它回傳預估扣款和最高可能扣款,不會真的執行。

已受理

HTTP
HTTP/1.1 202 Accepted

{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued"
  },
  "request_id": "req_example_create"
}

HTTP 202 代表任務已受理,點數先凍結、尚未扣除。最終扣款不會超過凍結額。

查詢狀態

cURL
curl "https://api.popnow.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $POPNOW_API_KEY"

每隔幾秒查詢一次並逐步拉長間隔,state 變成 succeeded、failed、canceled 或 expired 時停止。

完成的任務

JSON
{
  "code": 200,
  "msg": "success",
  "data": {
    "taskId": "task_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "bytedance/seedance-2.0-mini/image-to-video",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "url": "https://cdn.popnow.ai/tasks/task_01k3m8x9q2z4v7n5p6r8s0t1w3/output.mp4?signature=FROM_RESPONSE",
          "expiresAt": "2026-10-17T12:20:00Z",
          "mime": "video/mp4",
          "width": 1280,
          "height": 720,
          "durationSeconds": 5
        }
      ]
    },
    "settled": true
  },
  "request_id": "req_example_record"
}

請在 expiresAt 之前從 url 下載。之後需要新連結,請呼叫 POST /common/download-url。

驗證回呼

Node.js
import { createHash, createHmac, timingSafeEqual } from "node:crypto";
import express from "express";

const app = express();
// express.raw keeps the exact bytes that were signed; express.json would not match.
app.post("/hooks/popnow", express.raw({ type: "application/json" }), (req, res) => {
  const timestamp = req.header("X-Webhook-Timestamp");
  const signature = req.header("X-Webhook-Signature") ?? "";
  const body = JSON.parse(req.body.toString("utf8"));
  const taskId = body.data?.taskId ?? body.task_id;
  const digest = createHash("sha256").update(req.body).digest("hex");
  const expected = createHmac("sha256", process.env.POPNOW_WEBHOOK_SECRET)
    .update(`${taskId}.${timestamp}.${digest}`)
    .digest("base64");
  const ok = expected.length === signature.length && timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
  // Check the signature first, then reject anything older than five minutes.
  if (!ok || Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return res.status(401).end();
  res.status(200).end(); // answer fast, then fetch the task and store its files
});

設定 callBackUrl 後,我們會把完成的任務送給你。先用原始請求內容驗證簽名,再信任它。

上傳本機檔案

cURL
curl -X POST https://api.popnow.ai/api/v1/common/upload-url \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"contentType": "image/png", "bytes": 482113}'

# PUT the file bytes to data.uploadUrl with every header in data.headers, then commit it:
curl -X POST https://api.popnow.ai/api/v1/files/$FILE_ID/commit \
  -H "Authorization: Bearer $POPNOW_API_KEY"
# The commit returns a popnow://f/... reference. Put it in any image, video or
# audio field of the task input instead of a public https URL.

公開的 https 連結可以直接用。本機檔案要先經過 upload-url 和 commit。