Seedance 2.0 API
Вбудуйте генерацію відео у свій продукт за допомогою створення асинхронних завдань, опитування статусу, веб-хуків та білінгу з урахуванням кредитів.
https://api.seedance2.aiНа цій сторінці
Вступ
API дозволяє програмно надсилати завдання на генерацію відео Seedance 2.0. Генерація асинхронна: створіть завдання, негайно отримайте ідентифікатор завдання, а потім отримайте готове відео, опитуючи кінцеву точку завдання або отримуючи веб-хук.
Асинхронні завдання
Опитування добре працює для розробки та простих інтеграцій.
Готовність веб-хуків
Веб-хуки рекомендуються для виробництва, оскільки вони дозволяють уникнути надмірного опитування та повідомляють ваш сервіс, коли завдання досягає кінцевого стану.
З урахуванням кредитів
Кредити резервуються при відправці. За успішні завдання стягується плата з цього резерву; невдалі або такі, що вийшли за часом, завдання автоматично повертаються.
Автентифікація
Створіть ключ API на панелі керування та надсилайте його як токен Bearer у кожному запиті. Повний ключ відображається лише один раз під час створення.
Authorization: Bearer sk_live_xxxxxxxxВикористовуйте ключі sk_live_ для виробничого трафіку.
Використовуйте ключі sk_test_ для тестування інтеграції в пісочниці з тим самим контрактом API.
Відсутні, недійсні або відкликані ключі повертають 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 та налаштування генерації.
/v1/videos/generationscurl 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-video | prompt | duration, aspect_ratio, resolution, seed | Лише текстова підказка. image_urls, video_urls та audio_urls не потрібні. |
image-to-video | prompt + масив image_urls (1-2 URL-адреси зображень) | duration, aspect_ratio, resolution, seed | image_urls має бути масивом. Надайте 1 URL-адресу зображення для першого кадру або 2 URL-адреси зображень для першого та останнього кадрів. Відео та аудіо ігноруються. |
reference-to-video | prompt + принаймні одне зображення або відео | зображення, відео та аудіо в межах лімітів матеріалу | Аудіо не може використовуватися окремо з текстом. Додайте принаймні одне зображення або відео, коли надається аудіо. |
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Використовуйте зображення у відео, коли input.image_urls є масивом з 1-2 URL-адресами зображень: одна URL-адреса встановлює перший кадр, а дві URL-адреси встановлюють перший та останній кадри. Посилання на відео та аудіо ігноруються в цьому режимі. (image-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",
"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 | Так | Bearer API ключ, що використовується для автентифікації запиту. | 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-video | text-to-video | image-to-video | reference-to-video | - | image-to-video |
input.image_urlsПублічно доступні URL-адреси зображень. Для зображення до відео, надішліть 1 зображення для першого кадру або 2 зображення для першого та останнього кадрів. Для посилання на відео, надішліть до 9 зображень як візуальні посилання. (image-to-video) (reference-to-video) | string[] | Умовно | [] | Зображення до відео: 1 або 2 зображення. Посилання на відео: до 9 зображень. (image-to-video) (reference-to-video) | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsПублічно доступні еталонні відео лише для посилання на відео. Ви можете надіслати до 3 відеофайлів, і їх сукупний час відтворення має бути 15 секунд або менше. (reference-to-video) | string[] | Ні | [] | До 3 відео. Загальна довжина відео повинна бути не більше 15 секунд. | reference-to-video | [] |
input.audio_urlsПублічно доступні еталонні аудіофайли лише для посилання на відео. Ви можете надіслати до 3 аудіофайлів, і їх сукупний час відтворення має бути 15 секунд або менше. (reference-to-video) | string[] | Ні | [] | До 3 аудіофайлів. Загальна довжина аудіо повинна бути не більше 15 секунд. | reference-to-video | [] |
input.durationДовжина вихідного відео в секундах. | int | Ні | 5 | 4-15 секунд | всі | 5 |
input.aspect_ratioСпіввідношення сторін вихідного зображення. adaptive дозволяє сервісу визначити найкраще співвідношення. | string | Ні | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptive | всі | 16:9 |
input.resolutionРівень роздільної здатності вихідного зображення. | string | Ні | 720p | 480p | 720p | 1080p | всі | 720p |
input.generate_audioЧи повинна модель генерувати аудіо, якщо це підтримується. | boolean | Ні | true | true | false | всі | true |
input.watermarkЧи додавати водяний знак. | boolean | Ні | false | true | false | всі | false |
input.web_searchЧи дозволяти розширення веб-пошуку, якщо це підтримується. | boolean | Ні | false | true | false | всі | false |
input.return_last_frameЧи повертати URL останнього кадру, якщо він доступний. | boolean | Ні | false | true | 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_request | 400 | Відсутні або недійсні параметри. | Ні, виправте запит. |
invalid_api_key | 401 | Ключ API відсутній, недійсний або відкликаний. | Ні, використовуйте дійсний ключ. |
insufficient_credits | 402 | Недостатньо кредитів. Завдання не приймається і не оплачується. | Після поповнення. |
forbidden | 403 | Ключу API бракує необхідної області. | Ні. |
not_found | 404 | Завдання не існує або не належить власнику ключа. | Ні. |
rate_limited | 429 | Перевищено ліміт запитів. | Так, дотримуйтесь Retry-After. |
internal_error | 500 | Помилка сервера. | Так, повторіть пізніше. |
Ліміти запитів
Ліміти запитів застосовуються для кожного ключа API з плаваючим вікном. Генерація за замовчуванням становить 60 запитів на хвилину; запити статусу є більш лояльними. Відповіді HTTP 429 включають Retry-After.
Генерація
60/min
Запити статусу
Більш лояльні
Заголовок 429
Retry-After
Білінг та кредити
API використовує резервування при відправці, стягнення плати при успіху та повернення коштів при невдачі. Сторінки використання на панелі керування показують історію кредитів API, журнали завдань та статистику використання за часом.
Зарезервовано
Кредити перевіряються та резервуються, коли завдання прийнято.
Списано
Завершені завдання закривають існуючу резервацію.
Повернено
Невдалі або такі, що вийшли за часом, завдання автоматично повертають зарезервовані кредити.
Перегляньте використання на панелі керування
Переглядайте журнали API, тимчасові шкали завдань, історію кредитів та метрики використання за часом.