Перейти к основному контенту

Seedance 2.5 reference-to-video от ByteDance строит план из ваших материалов: до 30 изображений, 10 видеоклипов и 10 аудиодорожек, без первого кадра. Выдача 4–30 секунд в 480p, 720p или 1080p с нативным звуком.

От $0.074/с

Рабочая область

Отправить запрос

Быстрый старт

Примеры используют публичные параметры выбранного эндпоинта. Замените API-ключ и примеры медиафайлов, затем отправьте запрос со своего сервера.

SDK и интеграции
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Аутентификация API

Храните API-ключ в серверной переменной окружения SPICY_API_KEY. Используйте Bearer-аутентификацию и Content-Type: application/json для JSON-запросов.

Authorization: Bearer $SPICY_API_KEY
Пример результатаИспользовать пример
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "bytedance/seedance-2.5/reference-to-video",
  "input": {
    "aspect_ratio": "adaptive",
    "duration_seconds": 5,
    "generate_audio": true,
    "output_format": "mp4",
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "resolution": "720p",
    "reference_image_urls": [
      "https://example.com/reference.png"
    ]
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

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

Входные параметры

Поместите эти поля в объект input тела запроса. Имена и типы соответствуют API. Не предполагайте значение по умолчанию, если оно не задано.

Некоторые поля зависят от других входных данных. Полные правила для условно обязательных полей приведены в JSON Schema ниже.

promptstringОбязательно

Обязателен, и здесь он же занимается кастингом. Референсы цитируются в порядке отправки: назовите, какое изображение — какой персонаж, что вносит каждый клип и зачем нужно аудио. Задания мы принимаем без проверки. Там, где формулировку отклоняет собственный слой Seedance, до цели по-прежнему доводит первый кадр в image-to-video.

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

Просит модель пометить видео водяным знаком ИИ-контента, как описано в документации самой модели. По умолчанию выключено; включите, если площадка, где вы публикуете ролик, требует маркировать видео, созданные ИИ. На цену не влияет.

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

Дополнительно возвращает последний кадр ролика отдельным изображением рядом с видео. Отправьте его следующим стартовым кадром в image-to-video, чтобы склеивать планы без ручной выгрузки кадра. По умолчанию выключено; на цену не влияет.

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

Целочисленный seed; уберите его — и каждый прогон возьмёт свой. Зафиксируйте при неизменном остальном, чтобы понять, что на самом деле изменила правка prompt. Это инструмент сравнения, а не обещание покадрового повтора.

По умолчанию
Не задано
Ограничения
minimum:0
maximum:2147483647
enable_web_searchbooleanНеобязательно

По умолчанию выключено. Если включить, модель может перед рендером поискать в интернете сведения, связанные с промптом. На цену не влияет.

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

Контейнер готового видео: mp4 (по умолчанию) или mov. Картинка в обоих одинаковая; mov хранит звук в несжатом PCM, поэтому файл немного больше и сразу открывается в монтажных программах, которые предпочитают QuickTime. На цену не влияет.

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

По умолчанию включён. Даёт родную дорожку, синхронную картинке. Даже если вы прислали `reference_audio_urls`, выключение означает, что дорожки не будет: референсное аудио задаёт темп и подачу, но это не выходной трек. Выключайте, когда монтаж озвучат на постпродакшене.

По умолчанию
true
duration_secondsintegerНеобязательноВлияет на цену

От 4 до 30 секунд, по умолчанию 5. Учтите: это и длина ваших референсных клипов — два независимых вклада в оплачиваемое количество, поэтому максимум по обоим и делает один запрос дорогим. Проверьте на короткой длительности, что референсы прочитаны так, как вы задумали, и только потом фиксируйте финальную.

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

480p, 720p или 1080p, по умолчанию 720p. Напрямую влияет на оплачиваемое количество. Задаёт только выходную ступень и не сделает низкокачественные референсы резче. Пока вы проверяете, как референсы сочетаются, работайте в 480p или 720p, а ступень поднимайте, когда связь между ними станет читаться правильно. Ступеней апскейла и улучшения здесь нет.

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

По умолчанию `adaptive`. Когда референсы не сходятся по форме, adaptive позволяет модели найти кадр, куда помещаются все субъекты. Жёстко заданное соотношение повышает шанс, что референсный человек или товар окажется срезан. Указывайте форму только под жёсткое требование доставки. На тарификацию не влияет.

По умолчанию
"adaptive"
Допустимые значения
"21:9""16:9""4:3""1:1""3:4""9:16""adaptive"
reference_audio_urlsarray<string>Обязательно при условии

До 10 референсных аудиофайлов, по 2–30 с каждый и не более 30 с суммарно (в прошлом поколении было 3 файла на 15 с). Они дают модели звуковую опору — подачу, темп, музыкальную фразу, — к которой подстраиваются движение и точки склейки. Не путайте с `generate_audio`: сюда вы отправляете вход, а будет ли у готового клипа дорожка, по-прежнему решает `generate_audio`.

По умолчанию
Не задано
Ограничения
maxItems:10
reference_video_urlsarray<string>Обязательно при условииВлияет на цену

До 10 референсных клипов с движением, темпом или языком камеры. Каждый — 2–30 с, суммарно не более 30 с. В прошлом поколении было 3 клипа на 15 с: бюджет референсов удвоился, и теперь можно процитировать целое движение камеры. Но длина референсного клипа по-прежнему идёт в оплачиваемое количество — не как переключение ступени, а как линейный множитель того же рода, что `duration_seconds`. Больший бюджет не повод по привычке загружать весь дубль. Пишите prompt как новый кадр, который заимствует что-то из этих клипов. Если формулировка просит отредактировать сам материал — что-то убрать, заменить или перестилизовать, — Seedance считает задачу редактированием видео, а для него нужна настройка длительности, которую этот эндпоинт не принимает, и задача завершится ошибкой. Просьба продолжить клип тоже не сработает, если `aspect_ratio` не оставлен на `adaptive`.

По умолчанию
Не задано
Ограничения
maxItems:10
reference_image_urlsarray<string>Обязательно при условии

До 30 референсных изображений, чтобы удержать персонажа, стиль или обстановку. В прошлом поколении их было всего 9, так что запас здесь реальный. Два-три ракурса одного персонажа обычно работают лучше десяти почти одинаковых кадров. Учтите: у этого эндпоинта нет полей первого и последнего кадра. Референсный и кадровый режимы взаимоисключающие, поэтому переходите на image-to-video, когда стартовый кадр должен быть точным. Собственная проверка входных данных Seedance может отклонить референсное фото или клип, где видно лицо реального узнаваемого человека. Каждая сторона должна быть от 300 до 6000 пикселей; изображения меньшего размера отсекает входная проверка, и списания при этом не происходит.

По умолчанию
Не задано
Ограничения
maxItems:30

Отследить задачу

HTTP 202 означает принятие задачи, а не завершение генерации. Сохраните полученный taskId и проверяйте эту задачу. Не создавайте новую, пока ждёте результат.

Ответ при приёме задачи
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

В ответе о приёме есть оценка стоимости — приложение сможет показать ту же сумму в истории задач и в расчётах.

Получить задачу
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Начните с интервала около 2 секунд и постепенно увеличивайте его. Прекратите опрос при конечном состоянии. После сбоя соединения используйте исходный taskId. Повторно создавать задачу можно только с исходным ключом идемпотентности и исходным телом запроса.

Или пусть вызов придёт сам
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

Передайте callBackUrl при создании задачи — готовая запись придёт к вам POST-запросом, и никакого опроса не понадобится. В каждой доставке есть X-Webhook-Timestamp, X-Webhook-Signature и X-Webhook-Payload-Version. Подпись — это HMAC-SHA256 в base64 от taskId.timestamp.sha256(body), поэтому проверять её нужно по исходным байтам: если разобрать JSON и сериализовать заново, байты изменятся и проверка не пройдёт. Неудачные доставки повторяются, так что один и тот же taskId может прийти дважды — сделайте обработчик идемпотентным. Сначала ответьте 2xx, работу выполняйте после: медленный обработчик считается неудачной доставкой.

Прочитать результат

Обрабатывайте output только при state, равном succeeded. При ошибке проверьте errorCode, errorMessage и request_id. Стоимость и состояния в примерах не являются фактическим счётом.

Пример ответа после завершения
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "bytedance/seedance-2.5/reference-to-video",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.mp4",
          "mime": "video/mp4",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp4?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

Доступные файлы можно открыть или скачать по assets[].url без заголовка API Authorization. Подписанная ссылка действует до expiresAt. Чтобы обновить её, повторно запросите задачу в течение срока хранения файла. У ожидающих или недоступных файлов URL отсутствует. Не передавайте подписанные ссылки посторонним.

SDK и интеграции

Используйте SpicyAPI в приложении, терминале, ИИ-ассистенте или визуальном процессе. Выберите руководство по настройке.

Использование в ComfyUI

Установите узлы SpicyAPI через ComfyUI Manager или командой ниже и найдите на холсте Seedance 2.5 · Reference to Video. У узла те же параметры, что и на этой странице, а цена показывается до запуска.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi