bytedance/seedance-2.5/image-to-videoОт 93 кредитов за клип длиной 5 с· Видео из картинки

Seedance 2.5 image-to-video от ByteDance начинает клип с вашего изображения и оживляет его, звук — за тот же проход. Клипы по 4–30 секунд в 480p, 720p или 1080p; необязательный финальный кадр задаёт, на чём закончится план.

Вызывайте его по имени модели bytedance/seedance-2.5/image-to-video через POST /jobs/createTask, от 93 кредита за клип длиной 5 с (0,93 $). Новые аккаунты получают 30 бесплатных кредитов, чтобы вы могли сначала попробовать в Playground.

  • Создать видео
  • Видео из картинки
  • Видео по референсам
  • Продлить видео
  • До 1080p
  • Ролики 4–30 с
  • Со звуком
  • Первый и последний кадр
  • До 30 референсов
  • Соотношений сторон: 6
Имя моделиbytedance/seedance-2.5/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.5/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 собран по схеме ниже, поэтому проходит проверку как есть. Замените промпт и ссылки на свои.

Цена

ВариантКредиты за секунду≈ USD
resolution 480p18,510,19 $
resolution 720p41,60,42 $
resolution 1080p102,351,02 $

1 кредит = 0,01 $ · Все варианты и цены: GET /models/bytedance/seedance-2.5/image-to-video

Каждая задача округляется вверх до целых кредитов, поэтому один запуск на самом дешёвом уровне стоит 93 кредита за клип длиной 5 с (0,93 $).

Ограничения

Длина клипа
4–30 s
Разрешения
480p · 720p · 1080p
Соотношения сторон
adaptive

Параметры

Эти поля взяты из той же схемы, по которой мы проверяем каждый запрос. Поля, которых нет в списке, отклоняются.

  • image_urlstringОбязательное

    Картинка, с которой всё начинается.

    Диапазон
    image/jpeg, image/png, image/webp, image/gif
  • promptstringНеобязательное

    What to generate: subject, action, camera movement and mood.

  • last_image_urlstringНеобязательное

    Необязательный последний кадр, чтобы ролик закончился там, где нужно.

    Диапазон
    image/jpeg, image/png, image/webp, image/gif
  • aspect_ratiostringНеобязательное

    Форма кадра: широкая, квадратная или вертикальная.

    По умолчанию
    "adaptive"
    Допустимые значения
    "adaptive"
  • resolutionstringНеобязательноеВлияет на цену

    Размер результата. Больше — чётче и дороже.

    По умолчанию
    "720p"
    Допустимые значения
    "480p""720p""1080p"
  • duration_secondsintegerНеобязательноеВлияет на цену

    Длина ролика. Оплата посекундная.

    По умолчанию
    5
    Допустимые значения
    456789101112131415161718192021222324252627282930
  • generate_audiobooleanНеобязательноеВлияет на цену

    Добавляет звук под картинку: голоса, атмосферу и эффекты.

    По умолчанию
    true
  • output_formatstringНеобязательное

    Формат файла результата.

    По умолчанию
    "mp4"
    Допустимые значения
    "mp4""mov"
  • enable_web_searchbooleanНеобязательное

    Сначала проверяет в интернете даты, места и свежие факты.

    По умолчанию
    false
  • seedintegerНеобязательное

    Одно и то же число даёт повторяемый результат.

    Диапазон
    0 – 2147483647
  • return_last_framebooleanНеобязательное

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

    По умолчанию
    false
  • watermarkbooleanНеобязательное

    Ask the model to watermark the video as AI-generated.

    По умолчанию
    false
Исходная JSON-схема
{
  "additionalProperties": false,
  "properties": {
    "aspect_ratio": {
      "default": "adaptive",
      "description": "Aspect ratio of the generated video. Seedance 2.5 frames an image-to-video clip on the first frame, so adaptive is the only accepted value.",
      "enum": [
        "adaptive"
      ],
      "type": "string"
    },
    "duration_seconds": {
      "default": 5,
      "description": "Clip length in seconds. This is the billed quantity.",
      "enum": [
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
        13,
        14,
        15,
        16,
        17,
        18,
        19,
        20,
        21,
        22,
        23,
        24,
        25,
        26,
        27,
        28,
        29,
        30
      ],
      "type": "integer"
    },
    "enable_web_search": {
      "default": false,
      "description": "Let the model search the web for information related to the prompt before rendering.",
      "type": "boolean"
    },
    "generate_audio": {
      "default": true,
      "description": "Generate a native soundtrack synchronised to the picture.",
      "type": "boolean"
    },
    "image_url": {
      "contentMediaType": [
        "image/jpeg",
        "image/png",
        "image/webp",
        "image/gif"
      ],
      "description": "URL of the image used as the first frame.",
      "type": "string"
    },
    "last_image_url": {
      "contentMediaType": [
        "image/jpeg",
        "image/png",
        "image/webp",
        "image/gif"
      ],
      "description": "URL of the image used as the closing frame. Only accepted together with image_url.",
      "type": "string"
    },
    "output_format": {
      "default": "mp4",
      "description": "Container of the returned video.",
      "enum": [
        "mp4",
        "mov"
      ],
      "type": "string"
    },
    "prompt": {
      "description": "What to generate: subject, action, camera movement and mood.",
      "type": "string"
    },
    "resolution": {
      "default": "720p",
      "description": "Output resolution. Super-resolution tiers are not offered.",
      "enum": [
        "480p",
        "720p",
        "1080p"
      ],
      "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": "Ask the model to watermark the video as AI-generated.",
      "type": "boolean"
    }
  },
  "required": [
    "image_url"
  ],
  "type": "object"
}

Настоящий результат Seedance 2.5

ПромптTime is frozen: the rain and the wall of shattered glass hang dead still for a beat. Then the camera charges in fast and whips around her as she closes her raised hand into a fist; the suspended shards snap into a spiralling orbit around her, the frozen raindrops streak into long lines, and the whole shockwave blasts outward past the lens as the rain crashes down all at once. Her gown and hair whip in the blast. Extreme camera move, anamorphic flares, cold blue-white grade, shattering glass and a deep low boom.
Тот же запрос через API
{
  "model": "bytedance/seedance-2.5/image-to-video",
  "input": {
    "prompt": "Time is frozen: the rain and the wall of shattered glass hang dead still for a beat. Then the camera charges in fast and whips around her as she closes her raised hand into a fist; the suspended shards snap into a spiralling orbit around her, the frozen raindrops streak into long lines, and the whole shockwave blasts outward past the lens as the rain crashes down all at once. Her gown and hair whip in the blast. Extreme camera move, anamorphic flares, cold blue-white grade, shattering glass and a deep low boom.",
    "image_url": "https://media.popnow.ai/influencer/examples/marco.webp",
    "aspect_ratio": "adaptive",
    "resolution": "720p",
    "duration_seconds": 5,
    "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.5/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.5/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"
}

Скачайте файл по url до expiresAt. Нужна новая ссылка позже? Запросите её через 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.