Seedance 2.0 API
Integrează generarea de videoclipuri în produsul tău cu crearea asincronă de sarcini, interogarea stării, webhook-uri și facturare bazată pe credite.
https://api.seedance2.aiPe această pagină
Introducere
API-ul vă permite să trimiteți sarcini de generare video Seedance 2.0 în mod programatic. Generarea este asincronă: creați o sarcină, primiți un ID de sarcină imediat, apoi obțineți videoclipul finalizat prin interogarea endpoint-ului sarcinii sau prin primirea unui webhook.
Sarcini asincrone
Interogarea funcționează bine pentru dezvoltare și integrări simple.
Gata de webhook
Webhook-urile sunt recomandate pentru producție, deoarece evită interogarea agresivă și notifică serviciul dvs. atunci când o sarcină atinge o stare finală.
Conștient de credite
Creditele sunt rezervate la trimitere. Sarcinile reușite sunt taxate din acea rezervare; sarcinile eșuate sau care au expirat sunt rambursate automat.
Autentificare
Creează o cheie API în tabloul de bord și trimite-o ca token Bearer la fiecare cerere. Cheia completă este afișată o singură dată la momentul creării.
Authorization: Bearer sk_live_xxxxxxxxUtilizați cheile sk_live_ pentru traficul de producție.
Utilizați cheile sk_test_ pentru testarea integrării sandbox cu același contract API.
Cheile lipsă, invalide sau revocate returnează invalid_api_key cu HTTP 401.
Ghid rapid
Trimiteți o sarcină mai întâi. După ce sarcina este acceptată, alegeți o metodă de livrare a rezultatului: interogați endpoint-ul sarcinii sau primiți rezultatul final printr-un webhook.
Creează o sarcină video asincronă și primește un ID de sarcină imediat.
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
}
}'Extrageți endpoint-ul de stare a sarcinii atunci când integrarea dvs. preferă interogarea explicită.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Transmiteți callback_url la trimiterea sarcinii, apoi primiți callback-uri de finalizare sau eșec și actualizați-vă propria înregistrare a sarcinii.
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 });
}Creează o sarcină video
Creați o sarcină video cu POST /v1/videos/generations. Corpul cererii are un model de nivel superior, un callback_url opțional și un obiect de intrare care conține setări de prompt și de generare.
/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
}
}'Moduri de generare
generation_type controlează ce intrări media sunt acceptate și cum le interpretează modelul.
| Mod | Media necesară | Media opțională | Note |
|---|---|---|---|
text-to-video | prompt | durată, raport de aspect, rezoluție, seed | Doar prompt text. image_urls, video_urls și audio_urls nu sunt necesare. |
image-to-video | prompt + array image_urls (1-2 URL-uri imagine) | durată, raport de aspect, rezoluție, seed | image_urls trebuie să fie un array. Furnizați 1 URL de imagine pentru primul cadru, sau 2 URL-uri de imagine pentru primul și ultimul cadru. Video și audio sunt ignorate. |
reference-to-video | prompt + cel puțin o imagine sau un videoclip | imagini, videoclipuri și audio în limitele materialului | Audio nu poate fi utilizat singur cu text. Adăugați cel puțin o imagine sau un videoclip atunci când este furnizat audio. |
text-to-videoUtilizați text-to-video atunci când prompt-ul este singura intrare creativă.
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-videoUtilizați image-to-video atunci când input.image_urls este un array cu 1-2 URL-uri de imagine: un URL setează primul cadru, iar două URL-uri setează primul și ultimul cadru. Referințele video și audio sunt ignorate în acest mod.
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-videoUtilizați reference-to-video pentru o direcție mai bogată cu imagini, videoclipuri și audio de referință. Audio nu poate fi utilizat singur cu text; includeți cel puțin o imagine sau un videoclip atunci când este furnizat audio.
Limite de material
- Până la 9 imagini de referință
- Până la 3 videoclipuri de referință, durată totală <= 15 secunde
- Până la 3 fișiere audio de referință, durată totală <= 15 secunde
- Maxim 12 materiale în total, pentru toate tipurile
Combinații de intrare acceptate
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"
}
}'Parametri cerere
Numele parametrilor, valorile enumerate, căile endpoint-urilor și exemplele fac parte din contractul API. Descrierile de mai jos explică cum se comportă fiecare câmp.
Anteturi
| Antet | Obligatoriu | Descriere | Exemplu |
|---|---|---|---|
Authorization | Da | Cheia API Bearer utilizată pentru autentificarea cererii. | Bearer sk_live_xxx |
Content-Type | Da | Toate cererile de scriere utilizează JSON. | application/json |
Câmpuri de nivel superior
| Câmp | Tip | Obligatoriu | Implicit | Interval / Enum | Moduri | Exemplu |
|---|---|---|---|---|---|---|
modelVarianta modelului utilizată pentru generare. | string | Da | - | seedance-2-0 | seedance-2-0-fast | toate | seedance-2-0 |
callback_urlEndpoint HTTPS care primește callback-uri de finalizare și eșec a sarcinilor. | string | Nu | - | URL HTTPS, fără rețele private | toate | https://your-domain.com/hook |
inputSetări de generare și referințe media. | object | Da | - | - | toate | - |
input.* câmpuri
| Câmp | Tip | Obligatoriu | Implicit | Interval / Enum | Moduri | Exemplu |
|---|---|---|---|---|---|---|
input.promptPrompt text care descrie videoclipul de creat. | string | Da | - | text nevid | toate | a cat surfing |
input.generation_typeMod de generare. Implicit text-to-video. | string | Nu | text-to-video | text-to-video | image-to-video | reference-to-video | - | image-to-video |
input.image_urlsURL-uri de imagini accesibile public. Pentru imagine-la-video, trimiteți 1 imagine pentru primul cadru sau 2 imagini pentru primul și ultimul cadru. Pentru referință-la-video, trimiteți până la 9 imagini ca referințe vizuale. (image-to-video) (reference-to-video) | string[] | Condițional | [] | Imagine-la-video: 1 sau 2 imagini. Referință-la-video: până la 9 imagini. (image-to-video) (reference-to-video) | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsVideoclipuri de referință accesibile public doar pentru referință-la-video. Puteți trimite până la 3 fișiere video, iar timpul lor de redare combinat trebuie să fie de 15 secunde sau mai puțin. (reference-to-video) | string[] | Nu | [] | Până la 3 videoclipuri. Lungimea combinată a videoclipurilor trebuie să fie de 15 secunde sau mai puțin. | reference-to-video | [] |
input.audio_urlsFișiere audio de referință accesibile public doar pentru referință-la-video. Puteți trimite până la 3 fișiere audio, iar timpul lor de redare combinat trebuie să fie de 15 secunde sau mai puțin. (reference-to-video) | string[] | Nu | [] | Până la 3 fișiere audio. Lungimea combinată a fișierelor audio trebuie să fie de 15 secunde sau mai puțin. | reference-to-video | [] |
input.durationLungimea videoclipului de ieșire în secunde. | int | Nu | 5 | 4-15 secunde | toate | 5 |
input.aspect_ratioRaportul de aspect al ieșirii. adaptiv permite serviciului să deducă cel mai bun raport. | string | Nu | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptiv | toate | 16:9 |
input.resolutionNivelul de rezoluție al ieșirii. | string | Nu | 720p | 480p | 720p | 1080p | toate | 720p |
input.generate_audioDacă modelul ar trebui să genereze audio atunci când este acceptat. | boolean | Nu | true | true | false | toate | true |
input.watermarkDacă să adăugați un filigran. | boolean | Nu | false | true | false | toate | false |
input.web_searchDacă să permiteți augmentarea căutării web atunci când este acceptată. | boolean | Nu | false | true | false | toate | false |
input.return_last_frameDacă să returnați URL-ul ultimului cadru când este disponibil. | boolean | Nu | false | true | false | toate | false |
input.seedSeed determinist. Utilizați -1 pentru un seed aleatoriu. | int | Nu | -1 | -1 sau 0-4294967295 | toate | -1 |
Creditele variază în funcție de rezoluție, durată, model și dacă referința-la-video include referințe video. Valoarea creditelor returnată de răspunsul de creare este suma reală rezervată pentru acea sarcină. (reference-to-video)
Vezi prețurile creditelorRăspuns
Acesta este răspunsul de succes de la POST /v1/videos/generations. Înseamnă că sarcina a fost acceptată și creditele au fost rezervate. Utilizați taskId returnat pentru a interoga GET /v1/tasks/:id sau pentru a se potrivi cu un callback de finalizare sau eșec.
POST /v1/videos/generations răspuns de succes
{
"taskId": "3f2aK9mR...",
"credits": 60
}Obține starea sarcinii
Utilizați GET /v1/tasks/:id pentru a prelua starea curentă a sarcinii. Nu interogați mai des de o dată la 10 secunde. Pentru sistemele de producție, preferați webhook-urile.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Răspuns sarcină finalizată
{
"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
}
}Răspuns sarcină eșuată
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-0",
"billing_status": "refunded",
"credits": 60,
"failed_reason": "provider_failed"
}| Valoare | Semnificație |
|---|---|
status=queued | Acceptată și în așteptarea trimiterii sau procesării. |
status=generating | Furnizorul procesează generarea. |
status=completed | Videoclipul a fost finalizat și data.results conține URL-ul rezultatului. |
status=failed | Generarea a eșuat sau a expirat. |
billing_status=reserved | Creditele sunt rezervate în timp ce sarcina este în curs. |
billing_status=charged | Sarcina a reușit și rezervarea este decontată. |
billing_status=refunded | Sarcina a eșuat sau a expirat și creditele au fost returnate. |
billing_status=refund_failed | Tranzacția de rambursare a eșuat și necesită gestionare manuală. |
După video_expires_at, data.results este gol. Descărcați și stocați fișierul înainte de expirarea ferestrei de valabilitate.
Webhook-uri
Când callback_url este prezent, Seedance vă apelează endpoint-ul atunci când sarcina este finalizată sau a eșuat și trimite date JSON care descriu rezultatul final. Dacă endpoint-ul dvs. returnează un răspuns non-2xx sau nu răspunde în 15 secunde, livrarea este reîncercată de până la 5 ori. Reîncercările reutilizează același ID de sarcină, deci deduplicați după ID. Returnați un răspuns 200 imediat ce ați înregistrat în siguranță datele callback.
Callback de finalizare a sarcinii
{
"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
}
}Callback de eșec a sarcinii
{
"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 });
}Validați forma datelor callback, deduplicați după ID, actualizați-vă propria înregistrare a sarcinii și răspundeți rapid.
callback_url trebuie să fie HTTPS și nu trebuie să indice intervale de rețea private, loopback sau link-local.
Erori
POST /v1/videos/generations și GET /v1/tasks/:id returnează această formă de eroare atunci când cererea API în sine eșuează, cum ar fi parametri invalizi, cheie API invalidă, credite insuficiente, limitare a ratei sau sarcină negăsită. Unele erori includ câmpuri suplimentare, cum ar fi required, available sau retry_after, în funcție de situație.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this task.",
"required": 60,
"available": 12
}
}| Cod | HTTP | Semnificație | Reîncearcă? |
|---|---|---|---|
invalid_request | 400 | Parametri lipsă sau invalizi. | Nu, corectați cererea. |
invalid_api_key | 401 | Cheia API lipsește, este invalidă sau revocată. | Nu, utilizați o cheie validă. |
insufficient_credits | 402 | Credite insuficiente. Sarcina nu este acceptată sau taxată. | După reîncărcare. |
forbidden | 403 | Cheia API nu are domeniul de aplicare necesar. | Nu. |
not_found | 404 | Sarcina nu există sau nu aparține proprietarului cheii. | Nu. |
rate_limited | 429 | Rata cererilor a fost depășită. | Da, urmați Retry-After. |
internal_error | 500 | Eroare de server. | Da, reîncercați mai târziu. |
Limite de rată
Limitele de rată sunt aplicate per cheie API cu o fereastră glisantă. Generarea este limitată la 60 de cereri pe minut; interogările de stare sunt mai îngăduitoare. Răspunsurile HTTP 429 includ Retry-After.
Generare
60/min
Interogări stare
Mai îngăduitor
Antet 429
Retry-After
Facturare & credite
API-ul utilizează rezervare la trimitere, taxare la succes și rambursare la eșec. Paginile de utilizare din tabloul de bord afișează istoricul creditelor API, jurnalele de sarcini și statisticile de utilizare bazate pe timp.
Rezervat
Creditele sunt verificate și rezervate la acceptarea sarcinii.
Taxat
Sarcinile finalizate reglează rezervarea existentă.
Rambursat
Sarcinile eșuate sau care au expirat returnează creditele rezervate automat.
Inspectați utilizarea în tabloul de bord
Vizualizați jurnalele API, cronologiile sarcinilor, istoricul creditelor și metricile de utilizare bazate pe timp.