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

Продолжите клип в Seedance 2.0 Mini: последний кадр вашего видео открывает новый фрагмент длиной от 4 до 15 секунд со звуком, а в ответ вы получаете один файл со склеенными оригиналом и продолжением, в 480p или 720p.

От $0.025/с

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

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

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

Примеры используют публичные параметры выбранного эндпоинта. Замените 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.0-mini/video-extend",
  "input": {
    "bitrate_mode": "standard",
    "duration_seconds": 5,
    "enable_web_search": false,
    "generate_audio": true,
    "resolution": "720p",
    "video_url": "https://example.com/reference.mp4"
  }
}'

# 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. Не предполагайте значение по умолчанию, если оно не задано.

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

Клип, который нужно продолжить: MP4, MOV или WebM, до 60 секунд. Его последний кадр становится начальным кадром нового фрагмента, поэтому обрежьте клип по чистому, чёткому кадру. Исходный клип не оплачивается.

По умолчанию
Не задано
Ограничения
minLength:1
format:"uri"
contentMediaType:["video/mp4","video/webm","video/quicktime"]
watermarkbooleanНеобязательно

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

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

Битрейт кодирования нового фрагмента в том виде, в каком его выдаёт модель: `standard` (по умолчанию) или `high`. High сохраняет более чёткими мелкие текстуры и быстрое движение, а файл фрагмента получается заметно больше; склеенный файл платформа кодирует заново. На цену не влияет.

По умолчанию
"standard"
Допустимые значения
"standard""high"
seedintegerНеобязательно

Целое число от 0 до 2147483647; если не указывать, каждый запуск берёт своё. Зафиксируйте его, чтобы сравнивать по одному изменённому полю; это инструмент сравнения, а не обещание повторов, идентичных кадр в кадр.

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

По умолчанию выключено. Если включить, перед рендером нового фрагмента модель может поискать в интернете сведения, связанные с вашим промптом. Запросы с включённым поиском оплачиваются по тарифу веб-поиска, он выше стандартного; оценка перед отправкой его уже учитывает.

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

По умолчанию включено, поэтому новый фрагмент получает сгенерированный звук; выключение не снижает цену в этом тарифе. Исходный клип в любом случае сохраняет собственный звук; если одна из сторон без звука, склеенный файл дополняется тишиной.

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

Длина нового фрагмента в целых секундах: от 4 до 15 или -1, чтобы длину выбрала модель; тогда заранее резервируется 15 секунд, а оплата пересчитывается по фактически выданной длине. По умолчанию 5. Исходный клип добавляется спереди и не оплачивается.

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

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

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

Необязательный целевой конечный кадр: новый фрагмент заканчивается на этом изображении, а не там, где решит модель. Удобно для перехода или возврата к знакомому кадру. Дайте ему те же пропорции, что у последнего кадра клипа, иначе его обрежут. Каждая сторона должна быть от 300 до 6000 пикселей; меньшее изображение отклоняется проверкой входа до списания оплаты.

По умолчанию
Не задано
Ограничения
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]
promptstringНеобязательно

Необязательный. Что происходит дальше: следующее действие, движение камеры и звук. Если не указывать, модель сама определит движение по последнему кадру. Начальный кадр уже задаёт героя и обстановку, поэтому слова оставьте для движения.

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

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

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.0-mini/video-extend",
    "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.0 Mini · Video Extend. У узла те же параметры, что и на этой странице, а цена показывается до запуска.

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