Seedance 2.5.
В вашем продукте.
Превращайте текст, изображения и референсы в видео через один API. Используйте кредиты Seedance 3.0 и привычный рабочий процесс: от отправки запроса до получения результата действует единая понятная спецификация.
{
"model": "seedance-2.5",
"mode": "text-to-video",
"prompt": "A paper boat drifting into the morning light",
"duration": 5,
"resolution": "720p",
"aspectRatio": "16:9"
}Первое видео за несколько запросов.
Сохраните ключ на сервере в переменной SEADANCE_API_KEY. Задайте уникальное значение SEADANCE_REQUEST_KEY для этого видео (например, с помощью uuidgen) и сохраняйте его для повторных попыток. Убедитесь, что на аккаунте достаточно кредитов. В этом примере предварительно списывается 350 кредитов за видео длительностью 5 секунд в 720p. Сохраните полученный id, чтобы проверять статус задачи.
export SEADANCE_API_KEY="sd_live_your_key"
# Keep this value for retries; choose a new value for a new video.
export SEADANCE_REQUEST_KEY="${SEADANCE_REQUEST_KEY:-$(uuidgen)}"
curl --fail-with-body "https://seedance3ai.dev/api/v1/videos" \
-H "Authorization: Bearer $SEADANCE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SEADANCE_REQUEST_KEY" \
--data '{
"model": "seedance-2.5",
"mode": "text-to-video",
"prompt": "A paper boat floating through a sunlit stream, gentle camera movement",
"aspectRatio": "16:9",
"resolution": "720p",
"duration": 5
}'Эта документация не запускает генерацию автоматически. Отправка запроса на создание видео расходует ваши кредиты.
Выполняйте аутентификацию на сервере.
Каждый вызов API использует Authorization: Bearer sd_live_…. Не размещайте ключи в браузере, мобильных приложениях, открытых репозиториях или клиентском коде. Полный ключ показывается один раз; его можно отозвать в панели API.
https://seedance3ai.dev/api/v1Разрешения ключа по умолчанию: videos:write — загрузка и генерация; videos:read — модели и статус задач; account:read — баланс кредитов. Настройки доступа и лимиты аккаунта распространяются на все ключи.
Создайте задачу генерации видео.
/api/v1/videosИспользуйте Content-Type: application/json и уникальный Idempotency-Key для каждого запланированного видео. Приём задачи внешним провайдером может занять время. Если соединение прервалось по тайм-ауту, повторите то же тело запроса с тем же ключом. HTTP 202 означает, что задача принята, но ещё не завершена. Idempotency-Key допускает 1–128 печатных символов ASCII без пробелов.
| Параметр | Значения и требования |
|---|---|
modelstring | seedance-2.5Обязательно. Сейчас API поддерживает Seedance 2.5. |
modestring | text-to-video | image-to-video | reference-to-videoОбязательно. Выберите режим ввода; поля с материалами должны соответствовать этому режиму. |
promptstring | 3–30 000 символовОбязательно. Опишите сцену, движение и звук. |
durationinteger | 4, 5, 6, 8, 10, 12, 15, 20, 25, 29, 30Обязательно, в секундах. При редактировании используется длительность исходного видео, округлённая вверх до целых секунд для расчёта стоимости. |
resolutionstring | 480p | 720p | 1080pОбязательно. Определяет тариф в кредитах. |
aspectRatiostring | 1:1 | 4:3 | 3:4 | 16:9 | 9:16 | 21:9Обязательно. При генерации по изображению используется соотношение сторон первого кадра. |
firstFrameUrl / lastFrameUrlstring | publicObjectUrl загруженного материалаДля генерации по изображению нужен первый кадр. Последний кадр необязателен. |
referenceImageUrlsstring[] | До 30 изображенийДля reference-to-video. Сначала загрузите каждый файл в свой аккаунт. |
referenceVideoUrls / referenceAudioUrlsstring[] | До 10 видео / 10 аудиофайловОбщая длительность каждой группы — не более 30 секунд. Сервер проверяет материалы перед генерацией. |
referenceTaskTypestring | reference | edit | extendНеобязательно, по умолчанию reference. Для edit и extend нужен режим reference-to-video и ровно одно исходное видео. |
generateAudioboolean | trueНеобязательно. Seedance 2.5 включает генерацию звука; значение false не допускается. |
batchCountinteger | 1Необязательно. Одно видео на запрос. |
Эти поля позволяют использовать в Seedance 2.5 текст, первый и последний кадры, мультимодальные референсы, редактирование и продление видео. Актуальные возможности и цены указаны в ответе GET /models.
Пример запроса генерации по изображению
{
"model": "seedance-2.5",
"mode": "image-to-video",
"prompt": "A paper boat floating through a sunlit stream, gentle camera movement",
"aspectRatio": "16:9",
"resolution": "720p",
"duration": 5,
"firstFrameUrl": "YOUR_UPLOADED_PUBLIC_OBJECT_URL"
}Пример запроса генерации по референсам
{
"model": "seedance-2.5",
"mode": "reference-to-video",
"prompt": "A paper boat floating through a sunlit stream, gentle camera movement",
"aspectRatio": "16:9",
"resolution": "720p",
"duration": 5,
"referenceImageUrls": [
"YOUR_UPLOADED_IMAGE_URL"
],
"referenceVideoUrls": [
"YOUR_UPLOADED_VIDEO_URL"
]
}Загрузите один раз. Используйте URL.
Отправьте в POST /uploads поля fileName, contentType, size (в байтах) и kind (image, video или audio). До expiresAt загрузите исходные байты файла методом PUT на uploadUrl с заголовками requiredHeaders. После успешной загрузки используйте publicObjectUrl в запросе генерации. Материалы должны принадлежать тому же аккаунту; произвольные внешние URL и данные base64 не принимаются.
// Node.js 20+ · upload once, then use publicObjectUrl
import { readFile } from "node:fs/promises";
const bytes = await readFile("./first-frame.jpg");
const signed = await fetch("https://seedance3ai.dev/api/v1/uploads", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SEADANCE_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
fileName: "first-frame.jpg", contentType: "image/jpeg",
size: bytes.length, kind: "image",
}),
});
const upload = await signed.json();
if (!signed.ok) throw new Error(JSON.stringify(upload));
const stored = await fetch(upload.uploadUrl, {
method: "PUT", headers: upload.requiredHeaders, body: bytes,
});
if (!stored.ok) throw new Error("Upload failed");
console.log(upload.publicObjectUrl);
// Use this URL as firstFrameUrl in an image-to-video request.Указанные размер и тип содержимого должны совпадать с загруженным файлом. URL загрузки имеет срок действия; при необходимости запросите новый. Перед генерацией проверяются длительность, размеры и формат материалов.
Следите за задачей до завершения.
GET /videos/:id возвращает текущую задачу. Опрашивайте её каждые 5–10 секунд и остановитесь при succeeded или failed. При наличии Retry-After выдерживайте указанную задержку. Доступны только задачи, созданные вашим аккаунтом через API. Текущая интеграция использует периодический опрос.
curl --fail-with-body "https://seedance3ai.dev/api/v1/videos/TASK_ID" \
-H "Authorization: Bearer $SEADANCE_API_KEY"queuedprocessingsucceeded / failed{
"id": "a1b2c3d4-1234-4567-8901-abcdef123456",
"status": "succeeded",
"credits_reserved": 350,
"created_at": "2026-10-27T00:00:00.000Z",
"output": {
"url": "https://your-result-host.example/video.mp4"
},
"error": null,
"refund_status": "not_applicable"
}Пока видео не готово, output равен null. Неудачная задача содержит error; статус возврата кредитов указан в refund_status. Скачивайте готовые видео своевременно. Удаление видео не сбрасывает запрос: повтор с тем же Idempotency-Key вернёт 410 video_deleted и не создаст видео заново.
Узнайте стоимость в кредитах до интеграции.
Генерация через API использует те же кредиты аккаунта и тарифы Seedance 2.5, что и сайт. При приёме запроса кредиты списываются предварительно. Если генерация не удалась, они возвращаются на баланс разовых кредитов. Ошибка проверки до создания задачи не создаёт платного видео.
480p
30кредитов / секунду результата
+ 20 кредитов / секунду видеореференса
720p
70кредитов / секунду результата
+ 50 кредитов / секунду видеореференса
1080p
160кредитов / секунду результата
+ 90 кредитов / секунду видеореференса
Стоимость = длительность результата × тариф результата + длительность видеореференса × тариф референса. Длительность видеореференсов измеряется на сервере; общая длительность округляется вниз до целых секунд для расчёта стоимости. Генерация звука включена. Например, 5 секунд в 720p стоят 350 кредитов, а с видеореференсом длительностью 5 секунд — 600 кредитов.
curl --fail-with-body "https://seedance3ai.dev/api/v1/models" \
-H "Authorization: Bearer $SEADANCE_API_KEY"
curl --fail-with-body "https://seedance3ai.dev/api/v1/credits" \
-H "Authorization: Bearer $SEADANCE_API_KEY"В панели API можно проверить доступные кредиты, историю запросов и лимиты аккаунта. Пополняйте кредиты на странице тарифов сайта из того же аккаунта; отдельного баланса API или эндпоинта пополнения нет. При достаточном количестве доступных кредитов активная подписка не требуется. Правила истечения подписки и использования разовых кредитов такие же, как на сайте.
Пополнение кредитов не увеличивает частоту запросов, число параллельных задач или суточные лимиты API и не включает отключённый аккаунт. В суточный лимит входят все предварительно списанные кредиты, включая возвращённые после неудачной генерации. Лимит сбрасывается в 00:00 UTC. Для повышения лимитов обратитесь в поддержку.
Посмотреть тарифы и пополнить кредитыПовторяйте безопасно, без повторной оплаты.
Используйте один Idempotency-Key на каждое запланированное видео и сохраняйте его вместе с точным телом запроса, пока результат не станет известен. Новый ключ означает новую генерацию. Ответ с ошибкой содержит error.code, error.message и request_id; при обращении в поддержку укажите ID запроса.
| HTTP | Значение | Что делать |
|---|---|---|
| 400 | Некорректный запрос | Перед повтором проверьте сообщение об ошибке, поля и ограничения для материалов. |
| 401 | Недействительный API-ключ | Проверьте заголовок Bearer. Отозванные ключи нельзя использовать повторно. |
| 402 | Недостаточно кредитов | Пополните баланс того же аккаунта Seedance 3.0. |
| 403 | Доступ запрещён | Доступ к API отключён или у ключа нет необходимого разрешения. |
| 404 | Видео не найдено | Используйте ID задачи, созданной вашим аккаунтом через этот API. |
| 409 | Конфликт запроса | При request_in_progress подождите и повторите запрос с тем же телом и ключом. idempotency_conflict означает, что ключ использован повторно с другим телом запроса. request_expired или request_previously_failed подтверждает, что видео не было отправлено на генерацию: устраните указанную проблему и используйте новый ключ. |
| 410 | Видео удалено | video_deleted означает, что исходный запрос обработан, но видео удалено. Его ключ нельзя использовать для повторной генерации. Прекратите повторы; используйте новый ключ, только если намеренно хотите запустить новую платную генерацию. |
| 429 | Лимит аккаунта | Соблюдайте Retry-After. Ограничения частоты запросов, параллельных задач и суточного расхода кредитов общие для всех ключей. Суточный лимит сбрасывается в 00:00 UTC. |
| 500 / 503 | Временная ошибка сервиса | Сохраните Idempotency-Key и повторите тот же запрос. Не создавайте новый ключ, если результат предыдущего запроса неизвестен. |
Если отправка вернула request_in_progress, подождите и повторите тот же запрос. Не меняйте ключ, чтобы обойти тайм-аут. Если возврат кредитов за неудачную задачу ещё не выполнен, сохраните её ID и обратитесь в поддержку.
Готовы подключиться?
Создайте ключ и начните первую интеграцию.