Seedance 2.0 API

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

Базовый URL
https://api.seedance2.ai
На этой странице

Введение

API позволяет программно отправлять задачи генерации видео Seedance 2.0. Генерация асинхронна: создайте задачу, немедленно получите идентификатор задачи, затем получите готовое видео, опрашивая конечную точку задачи или получая веб-хук.

Асинхронные задачи

Опрос хорошо работает для разработки и простых интеграций.

Поддержка веб-хуков

Веб-хуки рекомендуются для продакшена, потому что они избегают агрессивного опроса и уведомляют ваш сервис, когда задача достигает конечного состояния.

Учет кредитов

Кредиты резервируются при отправке. Успешные задачи оплачиваются из этого резерва; неудачные или истекшие по времени задачи автоматически возвращаются.

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

Создайте ключ API на панели управления и отправляйте его как токен Bearer в каждом запросе. Полный ключ отображается только один раз при создании.

Authorization: Bearer sk_live_xxxxxxxx
sk_live_

Используйте ключи sk_live_ для продакшен-трафика.

sk_test_

Используйте ключи sk_test_ для тестирования интеграции в песочнице с тем же API-контрактом.

401

Отсутствующие, недействительные или отозванные ключи возвращают invalid_api_key с HTTP 401.

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

Сначала отправьте задачу. После принятия задачи выберите один из методов получения результата: опросите конечную точку задачи или получите окончательный результат через веб-хук.

Отправить задачу

Создайте асинхронную видеозадачу и немедленно получите идентификатор задачи.

curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cat surfing on a neon wave, cinematic lighting",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false,
      "seed": -1
    }
  }'
Вариант получения результата: Опрос

Получайте данные из конечной точки статуса задачи, если ваша интеграция предпочитает явный опрос.

curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
  -H "Authorization: Bearer sk_live_xxx"
Вариант получения результата: Веб-хук

Передайте callback_url при отправке задачи, затем получите обратные вызовы о завершении или сбое и обновите свою запись задачи.

export async function POST(request: Request) {
  const callbackData = await request.json();

  if (callbackData.status === "completed") {
    const videoUrl = callbackData.data.results[0];
    // Save the video URL or update your own task record here.
  }

  if (callbackData.status === "failed") {
    const errorMessage = callbackData.data.failed_reason;
    // Mark your own task record as failed here.
  }

  return new Response(null, { status: 200 });
}

Создать задачу видео

Создайте видеозадачу с помощью POST /v1/videos/generations. Тело запроса содержит модель верхнего уровня, необязательный callback_url и объект input, содержащий prompt и параметры генерации.

POST
/v1/videos/generations
curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cat surfing on a neon wave, cinematic lighting",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false,
      "seed": -1
    }
  }'

Режимы генерации

generation_type контролирует, какие медиавходы принимаются и как модель их интерпретирует.

РежимОбязательные медиаНеобязательные медиаПримечания
text-to-videopromptduration, aspect_ratio, resolution, seedТолько текстовая подсказка. image_urls, video_urls и audio_urls не нужны.
image-to-videoprompt + массив image_urls (1-2 URL изображения)duration, aspect_ratio, resolution, seedimage_urls должен быть массивом. Укажите 1 URL изображения для первого кадра или 2 URL изображения для первого и последнего кадров. Видео и аудио игнорируются.
reference-to-videoprompt + хотя бы одно изображение или видеоизображения, видео и аудио в пределах ограничений по материаламАудио не может использоваться отдельно с текстом. Добавьте хотя бы одно изображение или видео, если предоставляется аудио.
text-to-video

Используйте text-to-video, когда подсказка является единственным творческим входом.

curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "callback_url": "https://your-domain.com/api/seedance/webhook",
    "input": {
      "prompt": "a cinematic drone shot over a futuristic coastal city at sunrise",
      "generation_type": "text-to-video",
      "duration": 5,
      "aspect_ratio": "16:9",
      "resolution": "720p",
      "generate_audio": true,
      "watermark": false,
      "web_search": false,
      "return_last_frame": false,
      "seed": -1
    }
  }'
image-to-video

Используйте image-to-video, когда input.image_urls представляет собой массив из 1-2 URL-адресов изображений: один URL задает первый кадр, а два URL задают первый и последний кадры. Ссылки на видео и аудио игнорируются в этом режиме.

curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "input": {
      "prompt": "the subject turns toward camera, soft studio motion",
      "generation_type": "image-to-video",
      "image_urls": ["https://your.cdn.com/first-frame.jpg"],
      "duration": 5,
      "resolution": "720p"
    }
  }'
reference-to-video

Используйте reference-to-video для более богатого направления с эталонными изображениями, видео и аудио. Аудио не может использоваться отдельно с текстом; включите хотя бы одно изображение или видео, если предоставляется аудио.

Ограничения материалов

  • До 9 эталонных изображений
  • До 3 эталонных видео, общая продолжительность <= 15 секунд
  • До 3 эталонных аудио, общая продолжительность <= 15 секунд
  • Максимум 12 материалов всех типов

Поддерживаемые комбинации входов

Текст + Изображение
Текст + Видео
Текст + Изображение + Видео
Текст + Изображение + Аудио
Текст + Видео + Аудио
Текст + Изображение + Видео + Аудио
curl https://api.seedance2.ai/v1/videos/generations \
  -H "Authorization: Bearer sk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2-0",
    "input": {
      "prompt": "use the product from image 1 and the camera motion from the reference video",
      "generation_type": "reference-to-video",
      "image_urls": ["https://your.cdn.com/product.jpg"],
      "video_urls": ["https://your.cdn.com/camera-motion.mp4"],
      "audio_urls": [],
      "duration": 8,
      "resolution": "1080p"
    }
  }'

Параметры запроса

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

Заголовки

ЗаголовокОбязательноОписаниеПример
AuthorizationДаКлюч API Bearer, используемый для аутентификации запроса.Bearer sk_live_xxx
Content-TypeДаВсе запросы на запись используют JSON.application/json

Поля верхнего уровня

ПолеТипОбязательноПо умолчаниюДиапазон / ПеречислениеРежимыПример
model

Вариант модели, используемый для генерации.

stringДа-seedance-2-0 | seedance-2-0-fastвсеseedance-2-0
callback_url

Конечная точка HTTPS, которая получает обратные вызовы о завершении и сбое задачи.

stringНет-HTTPS URL, без частных сетейвсеhttps://your-domain.com/hook
input

Настройки генерации и ссылки на медиа.

objectДа--все-

input.* поля

ПолеТипОбязательноПо умолчаниюДиапазон / ПеречислениеРежимыПример
input.prompt

Текстовая подсказка, описывающая создаваемое видео.

stringДа-непустой текствсеa cat surfing
input.generation_type

Режим генерации. По умолчанию text-to-video.

stringНетtext-to-videotext-to-video | image-to-video | reference-to-video-image-to-video
input.image_urls

Публично доступные URL-адреса изображений. Для image-to-video отправьте 1 изображение для первого кадра или 2 изображения для первого и последнего кадров. Для reference-to-video отправьте до 9 изображений в качестве визуальных ссылок.

string[]Условно[]Image-to-video: 1 или 2 изображения. Reference-to-video: до 9 изображений. (image-to-video) (reference-to-video)image-to-video / reference-to-video["https://.../a.jpg"]
input.video_urls

Публично доступные эталонные видео только для reference-to-video. Вы можете отправить до 3 видеофайлов, и их общее время воспроизведения должно составлять 15 секунд или меньше.

string[]Нет[]До 3 видео. Общая продолжительность видео должна составлять 15 секунд или меньше.reference-to-video[]
input.audio_urls

Публично доступные эталонные аудиофайлы только для reference-to-video. Вы можете отправить до 3 аудиофайлов, и их общее время воспроизведения должно составлять 15 секунд или меньше.

string[]Нет[]До 3 аудиофайлов. Общая продолжительность аудио должна составлять 15 секунд или меньше.reference-to-video[]
input.duration

Длительность выходного видео в секундах.

intНет54-15 секундвсе5
input.aspect_ratio

Соотношение сторон выходного видео. adaptive позволяет сервису определить наилучшее соотношение.

stringНетadaptive16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptiveвсе16:9
input.resolution

Уровень разрешения выходного видео.

stringНет720p480p | 720p | 1080pвсе720p
input.generate_audio

Должна ли модель генерировать аудио при поддержке.

booleanНетtruetrue | falseвсеtrue
input.watermark

Добавлять ли водяной знак.

booleanНетfalsetrue | falseвсеfalse
input.web_search

Разрешать ли дополнение веб-поиском при поддержке.

booleanНетfalsetrue | falseвсеfalse
input.return_last_frame

Возвращать ли URL последнего кадра, если доступно.

booleanНетfalsetrue | falseвсеfalse
input.seed

Детерминированное зерно. Используйте -1 для случайного зерна.

intНет-1-1 или 0-4294967295все-1

Кредиты зависят от разрешения, продолжительности, модели и того, включает ли reference-to-video ссылки на видео. Значение кредитов, возвращаемое ответом создания, является фактически зарезервированной суммой для этой задачи.

Посмотреть стоимость кредитов

Ответ

Это ответ об успешном выполнении POST /v1/videos/generations. Это означает, что задача принята и кредиты зарезервированы. Используйте возвращенный taskId для опроса GET /v1/tasks/:id или для сопоставления обратного вызова о завершении или сбое.

Ответ об успешном выполнении POST /v1/videos/generations

{
  "taskId": "3f2aK9mR...",
  "credits": 60
}

Получить статус задачи

Используйте GET /v1/tasks/:id для получения текущего состояния задачи. Опрашивайте не чаще одного раза в 10 секунд. Для производственных систем предпочтительны веб-хуки.

curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
  -H "Authorization: Bearer sk_live_xxx"

Ответ завершенной задачи

{
  "id": "3f2aK9mR...",
  "status": "completed",
  "created_at": 1781234567,
  "model": "seedance-2-0",
  "billing_status": "charged",
  "credits": 60,
  "failed_reason": null,
  "data": {
    "results": ["https://cdn.seedance2.ai/.../x.mp4"],
    "video_expires_at": "2026-06-13T10:00:00Z",
    "last_frame_url": null,
    "processing_time": 48
  }
}

Ответ неудачной задачи

{
  "id": "3f2aK9mR...",
  "status": "failed",
  "created_at": 1781234567,
  "model": "seedance-2-0",
  "billing_status": "refunded",
  "credits": 60,
  "failed_reason": "provider_failed"
}
ЗначениеЗначение
status=queuedПринята и ожидает отправки или обработки.
status=generatingПровайдер обрабатывает генерацию.
status=completedВидео завершено и data.results содержит URL результата.
status=failedГенерация не удалась или истекло время.
billing_status=reservedКредиты зарезервированы, пока задача находится в процессе.
billing_status=chargedЗадача успешно выполнена, и резервация рассчитана.
billing_status=refundedЗадача не удалась или истекло время, и кредиты были возвращены.
billing_status=refund_failedТранзакция возврата не удалась и требует ручной обработки.

После video_expires_at data.results пусто. Загрузите и сохраните файл до истечения срока действия.

Веб-хуки

Когда присутствует callback_url, Seedance вызывает вашу конечную точку, когда задача завершена или не удалась, и отправляет данные JSON, описывающие окончательный результат. Если ваша конечная точка возвращает ответ, отличный от 2xx, или не отвечает в течение 15 секунд, доставка повторяется до 5 раз. Повторные попытки используют тот же идентификатор задачи, поэтому удаляйте дубликаты по идентификатору. Возвращайте ответ 200, как только вы надежно записали данные обратного вызова.

Обратный вызов о завершении задачи

{
  "id": "3f2aK9mR...",
  "status": "completed",
  "created_at": 1781234567,
  "model": "seedance-2-0",
  "data": {
    "results": ["https://cdn.seedance2.ai/.../x.mp4"],
    "video_expires_at": "2026-06-13T10:00:00Z",
    "last_frame_url": null,
    "processing_time": 48
  }
}

Обратный вызов о сбое задачи

{
  "id": "3f2aK9mR...",
  "status": "failed",
  "created_at": 1781234567,
  "model": "seedance-2-0",
  "data": {
    "failed_reason": "provider_failed",
    "credits_refunded": 60
  }
}
export async function POST(request: Request) {
  const callbackData = await request.json();

  if (callbackData.status === "completed") {
    const videoUrl = callbackData.data.results[0];
    // Save the video URL or update your own task record here.
  }

  if (callbackData.status === "failed") {
    const errorMessage = callbackData.data.failed_reason;
    // Mark your own task record as failed here.
  }

  return new Response(null, { status: 200 });
}

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

callback_url должен быть HTTPS и не должен указывать на частные, обратные или локальные сетевые диапазоны.

Ошибки

POST /v1/videos/generations и GET /v1/tasks/:id возвращают эту форму ошибки, когда сам запрос API завершается сбоем, например, из-за неверных параметров, неверного ключа API, недостаточных кредитов, превышения лимита запросов или отсутствия задачи. Некоторые ошибки включают дополнительные поля, такие как required, available или retry_after, в зависимости от ситуации.

{
  "error": {
    "code": "insufficient_credits",
    "message": "Not enough credits for this task.",
    "required": 60,
    "available": 12
  }
}
КодHTTPЗначениеПовторить?
invalid_request400Отсутствующие или неверные параметры.Нет, исправьте запрос.
invalid_api_key401Ключ API отсутствует, недействителен или отозван.Нет, используйте действительный ключ.
insufficient_credits402Недостаточно кредитов. Задача не принимается или не оплачивается.После пополнения.
forbidden403Ключу API не хватает необходимой области действия.Нет.
not_found404Задача не существует или не принадлежит владельцу ключа.Нет.
rate_limited429Превышена скорость запросов.Да, следуйте Retry-After.
internal_error500Ошибка сервера.Да, повторите позже.

Ограничения скорости запросов

Ограничения скорости запросов применяются к каждому ключу API с использованием скользящего окна. Генерация по умолчанию составляет 60 запросов в минуту; запросы состояния более лояльны. Ответы HTTP 429 включают Retry-After.

Генерация

60/min

Запросы состояния

Более лояльно

Заголовок 429

Retry-After

Оплата и кредиты

API использует резервирование при отправке, списание при успехе и возврат при сбое. Страницы использования панели управления показывают историю кредитов API, журналы задач и статистику использования по времени.

Зарезервировано

Кредиты проверяются и резервируются при принятии задачи.

Списано

Завершенные задачи урегулируют существующую резервацию.

Возвращено

Неудачные или истекшие по времени задачи автоматически возвращают зарезервированные кредиты.

Просмотр использования на панели управления

Просмотр журналов API, временных шкал задач, истории кредитов и метрик использования по времени.

Журналы API