Seedance 2.0 API
Wbuduj generowanie wideo w swój produkt dzięki asynchronicznemu tworzeniu zadań, odpytywaniu statusu, webhookom i rozliczeniom uwzględniającym kredyty.
https://api.seedance2.aiNa tej stronie
Wprowadzenie
API umożliwia programowe przesyłanie zadań generowania wideo Seedance 2.0. Generowanie jest asynchroniczne: utwórz zadanie, natychmiast otrzymasz identyfikator zadania, a następnie uzyskasz gotowe wideo poprzez odpytywanie punktu końcowego zadania lub odbieranie webhooka.
Zadania asynchroniczne
Odpytywanie sprawdza się w przypadku programowania i prostych integracji.
Gotowe do webhooka
Webhooki są zalecane do produkcji, ponieważ unikają agresywnego odpytywania i powiadamiają usługę, gdy zadanie osiągnie stan końcowy.
Uwzględnia kredyty
Kredyty są rezerwowane w momencie przesłania. Pomyślne zadania są obciążane z tej rezerwacji; nieudane lub przekroczone czasowo zadania są automatycznie zwracane.
Uwierzytelnianie
Utwórz klucz API w panelu i wysyłaj go jako bearer token przy każdym żądaniu. Pełny klucz jest wyświetlany tylko raz w momencie tworzenia.
Authorization: Bearer sk_live_xxxxxxxxUżywaj kluczy sk_live_ do ruchu produkcyjnego.
Używaj kluczy sk_test_ do testowania integracji w środowisku sandbox z tym samym kontraktem API.
Brakujące, nieprawidłowe lub unieważnione klucze zwracają invalid_api_key z HTTP 401.
Szybki start
Najpierw prześlij zadanie. Po zaakceptowaniu zadania wybierz jedną metodę dostarczania wyników: odpytuj punkt końcowy zadania lub odbieraj wynik końcowy za pośrednictwem webhooka.
Utwórz asynchroniczne zadanie wideo i natychmiast otrzymaj identyfikator zadania.
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
}
}'Pobieraj punkt końcowy statusu zadania, gdy Twoja integracja preferuje jawne odpytywanie.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Przekaż callback_url podczas przesyłania zadania, a następnie odbierz wywołania zwrotne ukończenia lub niepowodzenia i zaktualizuj własny rekord zadania.
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 });
}Utwórz zadanie wideo
Utwórz zadanie wideo za pomocą POST /v1/videos/generations. Treść żądania zawiera model najwyższego poziomu, opcjonalny callback_url oraz obiekt wejściowy zawierający prompt i ustawienia generowania.
/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
}
}'Tryby generowania
generation_type kontroluje, jakie dane wejściowe multimediów są akceptowane i jak model je interpretuje.
| Tryb | Wymagane media | Opcjonalne media | Uwagi |
|---|---|---|---|
text-to-video | prompt | duration, aspect_ratio, resolution, seed | Tylko prompt tekstowy. image_urls, video_urls i audio_urls nie są potrzebne. |
image-to-video | prompt + tablica image_urls (1-2 adresy URL obrazów) | duration, aspect_ratio, resolution, seed | image_urls musi być tablicą. Podaj 1 adres URL obrazu dla pierwszej klatki lub 2 adresy URL obrazów dla pierwszej i ostatniej klatki. Wideo i audio są ignorowane. |
reference-to-video | prompt + co najmniej jeden obraz lub wideo | obrazy, filmy i audio w ramach limitów materiałów | Audio nie może być używane samodzielnie z tekstem. Dodaj co najmniej jeden obraz lub wideo, gdy dostarczono audio. |
text-to-videoUżyj text-to-video, gdy prompt jest jedynym kreatywnym wejściem.
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-videoUżyj image-to-video, gdy input.image_urls jest tablicą zawierającą 1-2 adresy URL obrazów: jeden adres URL ustawia pierwszą klatkę, a dwa adresy URL ustawiają pierwszą i ostatnią klatkę. Odniesienia do wideo i audio są ignorowane w tym trybie.
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-videoUżyj reference-to-video dla bogatszych wskazówek z obrazami referencyjnymi, filmami i dźwiękiem. Audio nie może być używane samodzielnie z tekstem; dołącz co najmniej jeden obraz lub film, gdy dostarczono audio.
Limity materiałów
- Do 9 obrazów referencyjnych
- Do 3 filmów referencyjnych, łączny czas trwania <= 15 sekund
- Do 3 plików audio referencyjnych, łączny czas trwania <= 15 sekund
- Maksymalnie 12 materiałów łącznie dla wszystkich typów
Obsługiwane kombinacje wejściowe
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"
}
}'Parametry żądania
Nazwy parametrów, wartości wyliczeniowe, ścieżki punktów końcowych i przykłady są częścią kontraktu API. Poniższe opisy wyjaśniają zachowanie każdego pola.
Nagłówki
| Nagłówek | Wymagane | Opis | Przykład |
|---|---|---|---|
Authorization | Tak | Klucz API Bearer używany do uwierzytelniania żądania. | Bearer sk_live_xxx |
Content-Type | Tak | Wszystkie żądania zapisu używają JSON. | application/json |
Pola najwyższego poziomu
| Pole | Typ | Wymagane | Domyślne | Zakres / Enum | Tryby | Przykład |
|---|---|---|---|---|---|---|
modelWariant modelu używany do generowania. | string | Tak | - | seedance-2-0 | seedance-2-0-fast | wszystko | seedance-2-0 |
callback_urlPunkt końcowy HTTPS, który odbiera wywołania zwrotne ukończenia i niepowodzenia zadań. | string | Nie | - | Adres URL HTTPS, brak sieci prywatnych | wszystko | https://your-domain.com/hook |
inputUstawienia generowania i odniesienia do multimediów. | object | Tak | - | - | wszystko | - |
input.* pola
| Pole | Typ | Wymagane | Domyślne | Zakres / Enum | Tryby | Przykład |
|---|---|---|---|---|---|---|
input.promptPrompt tekstowy opisujący film do utworzenia. | string | Tak | - | niepusty tekst | wszystko | a cat surfing |
input.generation_typeTryb generowania. Domyślnie 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. Dla image-to-video, wyślij 1 obraz dla pierwszej klatki lub 2 obrazy dla pierwszej i ostatniej klatki. Dla reference-to-video, wyślij do 9 obrazów jako odniesienia wizualne. | string[] | Warunkowo | [] | Image-to-video: 1 lub 2 obrazy. Reference-to-video: do 9 obrazów. (image-to-video) (reference-to-video) | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsPublicznie dostępne filmy referencyjne tylko dla reference-to-video. Możesz wysłać do 3 plików wideo, a ich łączny czas odtwarzania musi wynosić 15 sekund lub mniej. | string[] | Nie | [] | Do 3 filmów. Łączna długość wideo musi wynosić 15 sekund lub mniej. | reference-to-video | [] |
input.audio_urlsPublicznie dostępne pliki audio referencyjne tylko dla reference-to-video. Możesz wysłać do 3 plików audio, a ich łączny czas odtwarzania musi wynosić 15 sekund lub mniej. | string[] | Nie | [] | Do 3 plików audio. Łączna długość audio musi wynosić 15 sekund lub mniej. | reference-to-video | [] |
input.durationDługość wyjściowego wideo w sekundach. | int | Nie | 5 | 4-15 sekund | wszystko | 5 |
input.aspect_ratioWyjściowy współczynnik proporcji. adaptive pozwala usłudze wywnioskować najlepszy współczynnik. | string | Nie | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptive | wszystko | 16:9 |
input.resolutionPoziom rozdzielczości wyjściowej. | string | Nie | 720p | 480p | 720p | 1080p | wszystko | 720p |
input.generate_audioCzy model powinien generować audio, jeśli jest obsługiwane. | boolean | Nie | true | true | false | wszystko | true |
input.watermarkCzy dodać znak wodny. | boolean | Nie | false | true | false | wszystko | false |
input.web_searchCzy zezwolić na rozszerzenie wyszukiwania w sieci, jeśli jest obsługiwane. | boolean | Nie | false | true | false | wszystko | false |
input.return_last_frameCzy zwrócić adres URL ostatniej klatki, jeśli jest dostępny. | boolean | Nie | false | true | false | wszystko | false |
input.seedDeterministyczne ziarno. Użyj -1 dla losowego ziarna. | int | Nie | -1 | -1 lub 0-4294967295 | wszystko | -1 |
Kredyty różnią się w zależności od rozdzielczości, czasu trwania, modelu i tego, czy reference-to-video zawiera odniesienia wideo. Wartość kredytów zwrócona przez odpowiedź utworzenia jest rzeczywistą zarezerwowaną kwotą dla tego zadania.
Zobacz cennik kredytówOdpowiedź
To jest pomyślna odpowiedź z POST /v1/videos/generations. Oznacza to, że zadanie zostało zaakceptowane, a kredyty zostały zarezerwowane. Użyj zwróconego taskId do odpytywania GET /v1/tasks/:id lub do dopasowania wywołania zwrotnego ukończenia lub niepowodzenia.
Pomyślna odpowiedź POST /v1/videos/generations
{
"taskId": "3f2aK9mR...",
"credits": 60
}Pobierz status zadania
Użyj GET /v1/tasks/:id, aby pobrać aktualny stan zadania. Odpytuj nie częściej niż raz na 10 sekund. W systemach produkcyjnych preferowane są webhooki.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Odpowiedź na ukończone zadanie
{
"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
}
}Odpowiedź na nieudane zadanie
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-0",
"billing_status": "refunded",
"credits": 60,
"failed_reason": "provider_failed"
}| Wartość | Znaczenie |
|---|---|
status=queued | Zaakceptowane i oczekujące na przesłanie lub przetworzenie. |
status=generating | Dostawca przetwarza generowanie. |
status=completed | Wideo ukończone, a data.results zawiera URL wyniku. |
status=failed | Generowanie nie powiodło się lub przekroczyło limit czasu. |
billing_status=reserved | Kredyty są rezerwowane, gdy zadanie jest w toku. |
billing_status=charged | Zadanie zakończone pomyślnie, a rezerwacja została uregulowana. |
billing_status=refunded | Zadanie nie powiodło się lub przekroczyło limit czasu, a kredyty zostały zwrócone. |
billing_status=refund_failed | Transakcja zwrotu nie powiodła się i wymaga ręcznej obsługi. |
Po video_expires_at, data.results jest puste. Pobierz i zapisz plik przed upływem okresu ważności.
Webhooki
Gdy callback_url jest obecny, Seedance wywołuje Twój punkt końcowy, gdy zadanie zostanie zakończone lub nie powiedzie się, i wysyła dane JSON opisujące końcowy wynik. Jeśli Twój punkt końcowy zwróci odpowiedź inną niż 2xx lub nie odpowie w ciągu 15 sekund, dostarczenie jest ponawiane do 5 razy. Ponowne próby wykorzystują ten sam identyfikator zadania, więc usuń duplikaty według identyfikatora. Zwróć odpowiedź 200, gdy bezpiecznie zarejestrowałeś dane wywołania zwrotnego.
Wywołanie zwrotne ukończenia zadania
{
"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
}
}Wywołanie zwrotne niepowodzenia zadania
{
"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 });
}Zweryfikuj kształt danych wywołania zwrotnego, usuń duplikaty według identyfikatora, zaktualizuj własny rekord zadania i szybko odpowiedz.
callback_url musi być HTTPS i nie może wskazywać na prywatne, pętlowe lub lokalne zakresy sieciowe.
Błędy
POST /v1/videos/generations i GET /v1/tasks/:id zwracają ten kształt błędu, gdy samo żądanie API zakończy się niepowodzeniem, np. z powodu nieprawidłowych parametrów, nieprawidłowego klucza API, niewystarczających kredytów, limitu żądań lub nieznalezionego zadania. Niektóre błędy zawierają dodatkowe pola, takie jak required, available lub retry_after, w zależności od sytuacji.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this task.",
"required": 60,
"available": 12
}
}| Kod | HTTP | Znaczenie | Ponowić? |
|---|---|---|---|
invalid_request | 400 | Brakujące lub nieprawidłowe parametry. | Nie, popraw żądanie. |
invalid_api_key | 401 | Klucz API jest brakujący, nieprawidłowy lub unieważniony. | Nie, użyj prawidłowego klucza. |
insufficient_credits | 402 | Niewystarczająca liczba kredytów. Zadanie nie jest akceptowane ani obciążane. | Po doładowaniu. |
forbidden | 403 | Klucz API nie posiada wymaganego zakresu. | Nie. |
not_found | 404 | Zadanie nie istnieje lub nie należy do właściciela klucza. | Nie. |
rate_limited | 429 | Przekroczono limit żądań. | Tak, postępuj zgodnie z Retry-After. |
internal_error | 500 | Błąd serwera. | Tak, spróbuj ponownie później. |
Limity żądań
Limity żądań są stosowane dla każdego klucza API z przesuwnym oknem. Generowanie domyślnie wynosi 60 żądań na minutę; zapytania o status są bardziej łagodne. Odpowiedzi HTTP 429 zawierają Retry-After.
Generowanie
60/min
Zapytania o status
Bardziej łagodne
Nagłówek 429
Retry-After
Rozliczenia i kredyty
API wykorzystuje rezerwację w momencie zgłoszenia, obciążenie po sukcesie i zwrot kosztów w przypadku niepowodzenia. Strony użycia w panelu pokazują historię kredytów API, logi zadań i statystyki użycia oparte na czasie.
Zarezerwowane
Kredyty są sprawdzane i rezerwowane w momencie akceptacji zadania.
Obciążone
Ukończone zadania regulują istniejącą rezerwację.
Zwrócone
Nieudane lub przekroczone czasowo zadania automatycznie zwracają zarezerwowane kredyty.
Sprawdź wykorzystanie w panelu
Wyświetl logi API, osie czasu zadań, historię kredytów i metryki użycia oparte na czasie.