Przejdź do treści głównej

Seedance 2.0 Fast reference-to-video od ByteDance buduje jedno ujęcie z Twoich materiałów: do 9 obrazów, 3 klipów wideo i 3 ścieżek audio, bez pierwszej klatki. Wynik 4–15 sekund w 480p lub 720p, z dźwiękiem w tym samym przebiegu.

Od $0.023/s

Obszar roboczy

Wyślij żądanie

Szybki start

Przykłady korzystają z publicznych definicji parametrów wybranego endpointu. Podmień klucz API i przykładowe media, a potem wyślij żądanie ze swojego serwera.

SDK i integracje
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Uwierzytelnianie API

Klucz API trzymaj w zmiennej środowiskowej serwera SPICY_API_KEY. Dla żądań JSON używaj uwierzytelniania Bearer i Content-Type: application/json.

Authorization: Bearer $SPICY_API_KEY
Przykładowy wynikUżyj tego przykładu
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "bytedance/seedance-2.0-fast/reference-to-video",
  "input": {
    "aspect_ratio": "adaptive",
    "bitrate_mode": "standard",
    "duration_seconds": 5,
    "generate_audio": true,
    "prompt": "A slow aerial shot drifting over a misty pine forest at sunrise",
    "resolution": "720p",
    "reference_image_urls": [
      "https://example.com/reference.png"
    ]
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Wygenerowane ze schematu wejścia tego modelu – tego samego, względem którego API waliduje każde żądanie.

Parametry wejściowe

Te pola umieść w obiekcie input w ciele żądania. Nazwy i typy odpowiadają API. Gdy wartości domyślnej nie podano, nie zakładaj żadnej.

Ten model ma zależności między polami. Pola oznaczone jako wymagane warunkowo zależą od innych danych wejściowych; reguły znajdziesz w pełnym JSON Schema poniżej.

promptstringWymagane

Wymagany, a tutaj odpowiada też za obsadę. Referencje są czytane w kolejności wysłania, więc napisz, który obraz jest którą postacią, co wnosi każdy klip i do czego służy audio. Briefów my nie sprawdzamy; tam, gdzie własna warstwa bezpieczeństwa Seedance odrzuca same słowa, pierwsza klatka w image-to-video nadal dowozi efekt.

Domyślnie
Nie określono
Ograniczenia
minLength:1
watermarkbooleanOpcjonalne

Dodaje do wideo widoczny znak wodny „AI generated” samego modelu. Domyślnie wyłączone; włącz, gdy miejsce publikacji wymaga oznaczania materiałów wygenerowanych przez AI. Nie wpływa na cenę.

Domyślnie
false
bitrate_modestringOpcjonalne

Bitrate dostarczanego pliku: `standard` (domyślnie) albo `high`. `high` przy tej samej rozdzielczości zachowuje ostrzejsze drobne faktury i szybki ruch, a plik jest wyraźnie większy; rozdzielczość, liczba klatek na sekundę i długość się nie zmieniają. Nie wpływa na cenę.

Domyślnie
"standard"
Dozwolone wartości
"standard""high"
return_last_framebooleanOpcjonalne

Oprócz wideo zwraca ostatnią klatkę klipu jako osobny obraz. Wyślij ją do image-to-video jako kolejną klatkę początkową, żeby łączyć ujęcia bez samodzielnego eksportowania kadru. Domyślnie wyłączone; nie wpływa na cenę.

Domyślnie
false
seedintegerOpcjonalne

Całkowity seed; pominięty – każdy przebieg losuje własny. Ustal go przy wszystkim innym bez zmian, żeby ocenić, co naprawdę zmieniła poprawka w prompcie. To narzędzie do porównań, a nie obietnica powtórzeń identycznych klatka w klatkę.

Domyślnie
Nie określono
Ograniczenia
minimum:0
maximum:2147483647
generate_audiobooleanOpcjonalne

Decyduje, czy powstaje własna ścieżka dźwiękowa zsynchronizowana z obrazem. Domyślnie włączone; wyłączenie nie obniża stawki na tym poziomie. Wyłącz je przy niemych pętlach i przy materiale, który udźwiękowisz w postprodukcji.

Domyślnie
true
duration_secondsintegerOpcjonalneWpływa na cenę

Długość gotowego klipu w pełnych sekundach, od 4 do 15, domyślnie 5; przy -1 długość wybiera model, a szacunek zakłada 15 sekund. Razem z sekundami klipów referencyjnych składa się na rozliczaną ilość. Im więcej referencji ujęcie musi pogodzić, tym mniej z nich zmieści się w 4 sekundach – mimo to sprawdź połączenie w krótkiej wersji, zanim zapłacisz za 15.

Domyślnie
5
Dozwolone wartości
-1456789101112131415
resolutionstringOpcjonalneWpływa na cenę

Rozdzielczość wyjściowa: 480p albo domyślne 720p. Wybiera próg cenowy i nie wyostrzy referencji o niskiej rozdzielczości. Sprawdź, czy referencje składają się dobrze na niskim progu, a potem podnieś ją dla finalnego ujęcia.

Domyślnie
"720p"
Dozwolone wartości
"480p""720p"
aspect_ratiostringOpcjonalne

Kadr wyjściowy, domyślnie adaptive: klip przejmuje kształt głównej referencji. Gdy referencje się rozjeżdżają albo miejsce publikacji jest z góry ustalone, wybierz jedną z sześciu proporcji od 21:9 po 9:16 i napisz w prompcie, jak bohaterowie mają się w niej mieścić. Bez wpływu na to, ile zapłacisz.

Domyślnie
"adaptive"
Dozwolone wartości
"16:9""9:16""4:3""3:4""1:1""21:9""adaptive"
reference_audio_urlsarray<string>Opcjonalne

Do 3 plików audio, każdy od 2 do 15 sekund i razem nie dłużej niż 15, każdy poniżej 15 MB, dających ujęciu dźwiękową kotwicę – sposób mówienia, tempo, frazę muzyczną – do której dopasowują się ruch i punkty cięć. Audio nie może być jedyną referencją: wyślij razem z nim co najmniej jeden obraz albo klip. To wejście, a nie ścieżka wyjściowa: o tym, czy gotowy klip ma dźwięk, nadal decyduje `generate_audio`.

Domyślnie
Nie określono
Ograniczenia
maxItems:3
reference_video_urlsarray<string>Wymagane warunkowoWpływa na cenę

Do 3 klipów wnoszących ruch, tempo albo język kamery. Każdy klip powinien trwać od 2 do 15 sekund, a wszystkie razem nie dłużej niż 15; trzymaj każdy plik poniżej 50 MB i w rozdzielczości najwyżej 1080p, inaczej żądanie zostanie odrzucone. Ich sekundy dolicza się do długości wyniku, więc przytnij je do fragmentu, który naprawdę chcesz przywołać.

Domyślnie
Nie określono
Ograniczenia
maxItems:3
reference_image_urlsarray<string>Wymagane warunkowo

Do 9 obrazów, których możesz używać, niosących postać, produkt, styl albo scenografię. Dwa lub trzy ujęcia tego samego obiektu dają więcej niż stos niemal identycznych kadrów. Każde żądanie potrzebuje co najmniej jednego obrazu lub klipu referencyjnego; samo audio zostaje odrzucone. Ten endpoint nie ma pola klatki początkowej ani końcowej: gdy kadr otwierający ma być dokładny, użyj image-to-video. Każdy bok musi mieć od 300 do 6000 pikseli; mniejsze pliki odrzuca kontrola wejściowa, zanim zostanie naliczona jakakolwiek opłata.

Domyślnie
Nie określono
Ograniczenia
maxItems:9

Śledź zadanie

HTTP 202 oznacza, że zadanie zostało przyjęte, a nie ukończone. Zapisz zwrócone taskId i odpytuj właśnie to zadanie. Nie twórz kolejnego zadania, czekając na jego wynik.

Odpowiedź o przyjęciu
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

Odpowiedź o przyjęciu zawiera szacunek, dzięki czemu twoja aplikacja pokaże tę samą kwotę w historii zadań i w rozliczeniach.

Odczytaj zadanie
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Zacznij odpytywać mniej więcej co 2 sekundy i stopniowo wydłużaj odstęp. Zatrzymaj się na stanie końcowym. Po zerwaniu połączenia odpytaj pierwotne taskId. Tworzenie ponawiaj wyłącznie z pierwotnym kluczem idempotentności i pierwotnym ciałem żądania.

Albo odbierz wynik przez callback
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

Podaj callBackUrl przy tworzeniu zadania, a gotowy rekord przyjdzie do ciebie metodą POST – bez żadnej pętli odpytywania. Każda dostawa niesie X-Webhook-Timestamp, X-Webhook-Signature i X-Webhook-Payload-Version. Podpis to HMAC-SHA256 w base64 z taskId.timestamp.sha256(body), więc trzeba go sprawdzać na surowych bajtach: sparsowanie JSON-a i ponowne zserializowanie zmienia je i weryfikacja się nie powiedzie. Nieudane dostawy są ponawiane, więc to samo taskId może przyjść dwa razy – zrób obsługę idempotentną. Najpierw odpowiedz kodem 2xx, a pracę wykonaj potem; wolna obsługa jest traktowana jak nieudana dostawa.

Odczytaj wynik

Wynik wykorzystuj dopiero przy stanie succeeded. Przy niepowodzeniu skorzystaj z errorCode, errorMessage i request_id. Przykładowe koszty i stany nie odpowiadają rzeczywistemu rozliczeniu.

Przykład odpowiedzi po zakończeniu
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "bytedance/seedance-2.0-fast/reference-to-video",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.mp4",
          "mime": "video/mp4",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.mp4?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

Każdy dostępny materiał otwieraj lub pobieraj bezpośrednio spod assets[].url, bez nagłówka Authorization. Podpisany adres wygasa o expiresAt; odpytaj zadanie ponownie, żeby go odświeżyć, dopóki materiał mieści się w okresie przechowywania. Materiał oczekujący lub niedostępny nie ma adresu. Podpisane adresy traktuj jako prywatne.

SDK i integracje

Korzystaj ze SpicyAPI w aplikacji, terminalu, asystencie AI lub wizualnym przepływie pracy. Wybierz instrukcję konfiguracji.

Użyj w ComfyUI

Zainstaluj węzły SpicyAPI przez ComfyUI Manager albo poleceniem poniżej, a potem wyszukaj na płótnie Seedance 2.0 Fast · Reference to Video. Węzeł ma te same opcje co ta strona i pokazuje cenę, zanim ruszy.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi