Seedance API
Wbuduj generowanie wideo bezpośrednio do swojego produktu dzięki Seedance 2.5 lub Seedance 2.0, zadaniom asynchronicznym, webhookom i rozliczeniom uwzględniającym stan kredytów.
https://api.seevio.aiNa tej stronie
Wprowadzenie
API umożliwia programowe zlecanie zadań generowania wideo przy użyciu modeli Seedance 2.5 oraz Seedance 2.0. Seedance 2.5 to zalecany model, który obsługuje generowanie z tekstu na wideo, z obrazu na wideo (na podstawie pierwszej ramki lub pierwszej i ostatniej) oraz z multimodalnych referencji na wideo. Generowanie odbywa się asynchronicznie: po utworzeniu zadania natychmiast otrzymujesz jego identyfikator (ID), a gotowe wideo odbierasz poprzez odpytywanie punktu końcowego zadania lub za pomocą webhooka.
Zadania asynchroniczne
Odpytywanie (polling) sprawdza się świetnie na etapie programowania i w prostych integracjach.
Obsługa webhooków
Webhooki są zalecane w środowiskach produkcyjnych – pozwalają uniknąć zbyt częstego odpytywania i automatycznie powiadamiają Twój system, gdy zadanie osiągnie stan końcowy.
Kontrola kredytów
Kredyty są rezerwowane w momencie przesłania zadania. Udane zadania są opłacane z tej rezerwacji, natomiast w przypadku błędów lub przekroczenia limitu czasu kredyty są automatycznie zwracane.
Uwierzytelnianie
Utwórz klucz API w panelu i przesyłaj go jako token Bearer w nagłówku każdego żądania. Pełny klucz jest wyświetlany tylko raz, bezpośrednio po jego utworzeniu.
Authorization: Bearer sk_live_xxxxxxxxDo obsługi ruchu produkcyjnego używaj kluczy sk_live_.
Do testowania integracji w środowisku piaskownicy (sandbox) z zachowaniem tej samej specyfikacji API używaj kluczy sk_test_.
Brakujące, nieprawidłowe lub unieważnione klucze powodują zwrócenie błędu invalid_api_key z kodem HTTP 401.
Szybki start
Najpierw prześlij zadanie. Gdy zostanie zaakceptowane, wybierz preferowany sposób odbioru wyniku: możesz odpytywać punkt końcowy zadania lub odebrać ostateczny rezultat za pomocą webhooka.
Utwórz asynchroniczne zadanie wideo i natychmiast odbierz jego identyfikator (ID).
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"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
}
}'Odpytuj punkt końcowy stanu zadania, jeśli Twoja integracja wymaga jawnego pobierania statusu.
curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Przekaż parametr callback_url podczas przesyłania zadania, aby otrzymać powiadomienie o sukcesie lub błędzie i zaktualizować status we własnej bazie.
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 });
}Tworzenie zadania wideo
Utwórz zadanie wideo, wykonując żądanie POST /v1/videos/generations. Treść żądania zawiera główny parametr model, opcjonalny callback_url oraz obiekt input z opisem (prompt) i ustawieniami generowania.
/v1/videos/generationscurl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"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
}
}'Tryby generowania
Parametr generation_type określa, jakie pliki wejściowe są akceptowane i jak model ma je zinterpretować.
Ustaw model na seedance-2-5, aby wygenerować wideo w rozdzielczości 480p lub 720p o długości od 4 do 30 sekund.
- Tekst na wideo (text-to-video) z adaptacyjnym współczynnikiem proporcji lub wymiarami 16:9, 9:16, 1:1, 4:3, 3:4, 21:9
- Obraz na wideo (image-to-video) na podstawie jednego obrazu (pierwsza klatka) lub dwóch obrazów (pierwsza i ostatnia klatka); współczynnik proporcji musi być ustawiony na adaptive
- Referencja na wideo (reference-to-video) przy użyciu maksymalnie 30 obrazów, 10 materiałów wideo i 10 plików audio (łącznie do 50 materiałów)
- Każda referencja wideo lub audio musi trwać od 2 do 30 sekund; łączny czas trwania materiałów wideo oraz łączny czas materiałów audio nie mogą przekraczać 30 sekund
- Obsługiwana jest sama referencja audio oraz parametr return_last_frame; parametr seed nie jest obsługiwany
| Tryb | Wymagane multimedia | Opcjonalne multimedia | Uwagi |
|---|---|---|---|
text-to-video | prompt | duration, aspect_ratio, resolution, seed | Tylko opis tekstowy. Parametry image_urls, video_urls oraz audio_urls nie są wymagane. |
image-to-video | prompt + tablica image_urls (1-2 adresy URL) | duration, aspect_ratio, resolution, seed | image_urls musi być tablicą. Podaj 1 adres URL dla klatki początkowej lub 2 adresy dla klatki początkowej i końcowej. Multimedia wideo i audio są ignorowane. |
reference-to-video | prompt + co najmniej jedna referencja obrazu, wideo lub audio | obrazy, wideo i audio mieszczące się w limitach | Seedance 2.5 obsługuje referencje składające się wyłącznie z audio. W przypadku Seedance 2.0 należy dodać co najmniej jeden obraz lub wideo, jeśli dołączany jest dźwięk. |
text-to-videoUżyj trybu tekst na wideo, gdy jedynym elementem wejściowym jest opis tekstowy (prompt).
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"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
}
}'image-to-videoUżyj trybu obraz na wideo, gdy parametr input.image_urls zawiera tablicę z 1 lub 2 adresami URL obrazów: jeden adres ustawia pierwszą klatkę, a dwa adresy określają klatkę początkową i końcową. Referencje wideo i audio są w tym trybie ignorowane.
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"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-videoUżyj trybu referencja na wideo, aby precyzyjniej sterować generowaniem przy użyciu obrazów, wideo i audio o charakterze referencyjnym. Model Seedance 2.5 pozwala na użycie samego dźwięku jako referencji; model Seedance 2.0 w przypadku dodania dźwięku wymaga dołączenia przynajmniej jednego obrazu lub wideo.
Limity materiałów referencyjnych
- Seedance 2.5: do 30 obrazów referencyjnych
- Seedance 2.5: do 10 materiałów wideo, każdy o długości 2-30 s, łączny czas trwania <= 30 s
- Seedance 2.5: do 10 plików audio, każdy o długości 2-30 s, łączny czas trwania <= 30 s
- Seedance 2.5: maksymalnie 50 materiałów referencyjnych łącznie
- Warianty Seedance 2.0 zachowują swoje dotychczasowe limity: 9 obrazów, 3 materiały wideo, 3 pliki audio i do 15 sekund na grupę wideo/audio
Obsługiwane kombinacje danych wejściowych
curl https://api.seevio.ai/v1/videos/generations \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"model": "seedance-2-5",
"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": "720p"
}
}'Parametry żądania
Nazwy parametrów, wartości typów wyliczeniowych (enum), ścieżki punktów końcowych i przykłady stanowią stałą część specyfikacji API. Poniższe opisy wyjaśniają działanie poszczególnych pól.
Nagłówki
| Nagłówek | Wymagane | Opis | Przykład |
|---|---|---|---|
Authorization | Tak | Klucz API typu Bearer używany do uwierzytelniania żądań. | Bearer sk_live_xxx |
Content-Type | Tak | Wszystkie żądania zapisu wymagają formatu JSON. | application/json |
Pola główne
| Pole | Typ | Wymagane | Domyślnie | Zakres / Enum | Tryby | Przykład |
|---|---|---|---|---|---|---|
modelWariant modelu używany do generowania. Wybierz seedance-2-5 dla Seedance 2.5, seedance-2-0 dla Seedance 2.0, seedance-2-0-fast dla Seedance 2.0 Fast lub seedance-2-0-mini dla Seedance 2.0 Mini. | string | Tak | - | seedance-2-5 | seedance-2-0 | seedance-2-0-fast | seedance-2-0-mini | wszystkie | seedance-2-5 |
callback_urlPunkt końcowy HTTPS, na który wysyłane są powiadomienia o zakończeniu lub błędzie zadania. | string | Nie | - | Adres URL HTTPS, wykluczając sieci prywatne | wszystkie | https://your-domain.com/hook |
inputUstawienia generowania oraz multimedia referencyjne. | object | Tak | - | - | wszystkie | - |
input.* pola
| Pole | Typ | Wymagane | Domyślnie | Zakres / Enum | Tryby | Przykład |
|---|---|---|---|---|---|---|
input.promptOpis tekstowy określający treść filmu, który ma zostać wygenerowany. | string | Tak | - | niepusty ciąg znaków | wszystkie | a cat surfing |
input.generation_typeTryb generowania. Domyślnie ustawiony na text-to-video. | string | Nie | text-to-video | text-to-video | image-to-video | reference-to-video | - | image-to-video |
input.image_urlsPublicznie dostępne adresy URL obrazów. W trybie obraz na wideo podaj 1 obraz dla klatki początkowej lub 2 obrazy dla klatki początkowej i końcowej. W trybie referencja na wideo model Seedance 2.5 przyjmuje do 30 obrazów, a Seedance 2.0 do 9. | string[] | Warunkowo | [] | Obraz na wideo: 1 lub 2 obrazy. Referencja na wideo: do 30 dla Seedance 2.5; do 9 dla Seedance 2.0. | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsPublicznie dostępne referencyjne pliki wideo – wyłącznie dla trybu referencja na wideo. Seedance 2.5 obsługuje do 10 filmów (każdy 2-30 s, łączny czas odtwarzania <= 30 s). Seedance 2.0 obsługuje do 3 filmów (łączny czas <= 15 s). | string[] | Nie | [] | Seedance 2.5: do 10 filmów (każdy 2-30 s, łączna długość <= 30 s). Seedance 2.0: do 3 (łączna długość <= 15 s). | reference-to-video | [] |
input.audio_urlsPublicznie dostępne referencyjne pliki audio – wyłącznie dla trybu referencja na wideo. Seedance 2.5 obsługuje do 10 plików (każdy 2-30 s, łączny czas odtwarzania <= 30 s) i pozwala na użycie samego audio. Seedance 2.0 obsługuje do 3 plików (łączny czas <= 15 s). | string[] | Nie | [] | Seedance 2.5: do 10 plików audio (każdy 2-30 s, łączna długość <= 30 s). Seedance 2.0: do 3 (łączna długość <= 15 s). | reference-to-video | [] |
input.durationDługość wyjściowego wideo w sekundach. | int | Nie | 5 | Seedance 2.5: 4-30 sekund. Seedance 2.0: 4-15 sekund. | wszystkie | 5 |
input.aspect_ratioProporcje obrazu wyjściowego. Wartość adaptive pozwala systemowi dobrać najlepsze proporcje. Tryb obraz na wideo w modelu Seedance 2.5 obsługuje wyłącznie wartość adaptive. | string | Nie | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptive | wszystkie | 16:9 |
input.resolutionRozdzielczość wyjściowa wideo. | string | Nie | 720p | Seedance 2.5: 480p | 720p. Seedance 2.0: 480p | 720p | 1080p | 4k (w zależności od wariantu). | wszystkie | 720p |
input.generate_audioOkreśla, czy model powinien wygenerować ścieżkę dźwiękową (jeśli jest obsługiwana). | boolean | Nie | true | true | false | wszystkie | true |
input.watermarkOkreśla, czy dodać znak wodny. | boolean | Nie | false | true | false | wszystkie | false |
input.web_searchOkreśla, czy zezwolić na wspomaganie generowania wynikami z wyszukiwarki internetowej (jeśli jest obsługiwane). | boolean | Nie | false | true | false | wszystkie | false |
input.return_last_frameOkreśla, czy zwracać adres URL ostatniej klatki wideo (jeśli jest dostępny). | boolean | Nie | false | true | false | wszystkie | false |
input.seedZiarno deterministyczne dla wariantów Seedance 2.0. Model Seedance 2.5 nie obsługuje tego pola (należy je pominąć). | int | Nie | -1 | -1 lub zakres 0-4294967295 | wszystkie | -1 |
Koszt w kredytach zależy od rozdzielczości, czasu trwania, modelu oraz tego, czy tryb referencja na wideo uwzględnia materiały wideo. Wartość kredytów zwrócona w odpowiedzi na żądanie utworzenia zadania to rzeczywista liczba zablokowanych kredytów.
Zobacz cennik kredytówOdpowiedź
To jest poprawna odpowiedź zwrotna z żądania POST /v1/videos/generations. Oznacza ona, że zadanie zostało przyjęte do realizacji, a kredyty zostały zarezerwowane. Użyj zwróconego taskId do odpytywania GET /v1/tasks/:id lub do powiązania go z nadesłanym webhookiem.
Prawidłowa odpowiedź (POST /v1/videos/generations)
{
"taskId": "3f2aK9mR...",
"credits": 100
}Sprawdzanie stanu zadania
Użyj GET /v1/tasks/:id, aby pobrać aktualny stan zadania. Nie odpytuj częściej niż raz na 10 sekund. W systemach produkcyjnych zaleca się stosowanie webhooków.
curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Odpowiedź dla ukończonego zadania
{
"id": "3f2aK9mR...",
"status": "completed",
"created_at": 1781234567,
"model": "seedance-2-5",
"billing_status": "charged",
"credits": 100,
"failed_reason": null,
"data": {
"results": ["https://cdn.seevio.ai/.../x.mp4"],
"video_expires_at": "2026-06-13T10:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Odpowiedź dla nieudanego zadania
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-5",
"billing_status": "refunded",
"credits": 100,
"failed_reason": "provider_failed"
}| Wartość | Znaczenie |
|---|---|
status=queued | Zadanie przyjęte; czeka na przekazanie do realizacji lub przetworzenie. |
status=generating | Dostawca przetwarza proces generowania. |
status=completed | Generowanie wideo zakończone sukcesem; pole data.results zawiera URL do pliku. |
status=failed | Generowanie nie powiodło się lub przekroczono limit czasu. |
billing_status=reserved | Kredyty są zablokowane na czas trwania zadania. |
billing_status=charged | Zadanie zakończone sukcesem – rezerwacja została sfinalizowana pobraniem opłaty. |
billing_status=refunded | Zadanie nie powiodło się lub upłynął limit czasu – zablokowane kredyty zostały zwrócone. |
billing_status=refund_failed | Transakcja zwrotu kredytów nie powiodła się i wymaga ręcznej interwencji. |
Po upływie czasu określonego w video_expires_at pole data.results będzie puste. Pobierz i zapisz plik u siebie przed upływem tego okresu.
Webhooki
Jeśli parametr callback_url jest podany, Seedance wyśle żądanie na Twój punkt końcowy po zakończeniu zadania (sukcesem lub błędem), przesyłając dane JSON z ostatecznym rezultatem. Jeśli Twój serwer zwróci kod inny niż 2xx lub nie odpowie w ciągu 15 sekund, próba zostanie ponowiona maksymalnie 5 razy. Ponowne próby korzystają z tego samego identyfikatora zadania (task id), co pozwala na eliminację duplikatów. Zwróć odpowiedź z kodem 200 od razu po bezpiecznym zapisaniu danych z powiadomienia.
Webhook informujący o ukończeniu zadania
{
"id": "3f2aK9mR...",
"status": "completed",
"created_at": 1781234567,
"model": "seedance-2-5",
"data": {
"results": ["https://cdn.seevio.ai/.../x.mp4"],
"video_expires_at": "2026-06-13T10:00:00Z",
"last_frame_url": null,
"processing_time": 48
}
}Webhook informujący o niepowodzeniu zadania
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-5",
"data": {
"failed_reason": "provider_failed",
"credits_refunded": 100
}
}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 });
}Zweryfikuj format danych z webhooka, usuń ewentualne duplikaty na podstawie identyfikatora ID, zaktualizuj status zadania u siebie i natychmiast wyślij odpowiedź.
Parametr callback_url musi korzystać z protokołu HTTPS i nie może wskazywać na prywatne adresy IP, pętlę zwrotną (loopback) ani adresy lokalne linku (link-local).
Błędy
Metody POST /v1/videos/generations i GET /v1/tasks/:id zwracają poniższą strukturę błędu, gdy samo żądanie do API zakończy się niepowodzeniem (np. nieprawidłowe parametry, błędny klucz API, niewystarczająca liczba kredytów, przekroczenie limitów lub nieznalezione zadanie). Niektóre błędy mogą zawierać dodatkowe pola, takie jak required, available lub retry_after.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this task.",
"required": 100,
"available": 12
}
}| Kod | HTTP | Znaczenie | Ponowić? |
|---|---|---|---|
invalid_request | 400 | Brakujące lub nieprawidłowe parametry. | Nie, popraw strukturę żądania. |
invalid_api_key | 401 | Klucz API jest nieobecny, nieprawidłowy lub został unieważniony. | Nie, użyj poprawnego klucza. |
insufficient_credits | 402 | Niewystarczająca liczba kredytów. Zadanie nie zostanie przyjęte ani rozliczone. | Po doładowaniu konta. |
forbidden | 403 | Klucz API nie posiada wymaganych uprawnień. | Nie. |
not_found | 404 | Zadanie nie istnieje lub nie należy do właściciela użytego klucza API. | Nie. |
rate_limited | 429 | Przekroczono limit częstotliwości żądań. | Tak, zgodnie z nagłówkiem Retry-After. |
internal_error | 500 | Wewnętrzny błąd serwera. | Tak, spróbuj ponownie później. |
Limity żądań
Limity częstotliwości żądań są naliczane dla każdego klucza API w oparciu o ruchome okno czasowe. Limit dla generowania wynosi domyślnie 100 żądań na minutę; zapytania o status zadania podlegają łagodniejszym limitom. Odpowiedzi HTTP 429 zawierają nagłówek Retry-After.
Generowanie
100/min
Zapytania o status
Łagodniejsze limity
Nagłówek 429
Retry-After
Rozliczenia i kredyty
API działa w modelu: rezerwacja przy zgłoszeniu zadania, pobranie opłaty przy sukcesie i zwrot środków przy błędzie. W zakładkach rozliczeń w panelu znajdziesz historię zużycia kredytów API, dzienniki zadań oraz statystyki użycia w czasie.
Rezerwacja
Kredyty są sprawdzane i blokowane w momencie zaakceptowania zadania.
Pobranie opłaty
Ukończone zadania powodują ostateczne rozliczenie zablokowanej rezerwacji.
Zwrot
Zadania nieudane lub te, których czas upłynął, automatycznie zwalniają zablokowane kredyty.
Monitoruj zużycie w panelu
Przeglądaj logi API, osie czasu zadań, historię salda kredytów oraz wykresy zużycia w czasie.