Seedance API
Integreer videogeneratie in je product met Seedance 2.5 of Seedance 2.0, asynchrone taken, webhooks en credit-gebaseerde facturatie.
https://api.seevio.aiOp deze pagina
Introductie
Met de API kun je programmatisch Seedance 2.5 en Seedance 2.0 videogeneratietaken indienen. Seedance 2.5 is het aanbevolen model en ondersteunt tekst-naar-video, afbeelding-naar-video (met eerste frame of eerste en laatste frame) en multimodale referentie-naar-video. Generatie verloopt asynchroon: je maakt een taak aan, ontvangt direct een taak-ID en haalt vervolgens de voltooide video op via polling van het taak-endpoint of via een webhook.
Asynchrone taken
Polling werkt goed voor ontwikkeling en eenvoudige integraties.
Klaar voor webhooks
Webhooks worden aanbevolen voor productie omdat ze agressieve polling voorkomen en je service direct op de hoogte stellen wanneer een taak de eindstatus bereikt.
Credit-bewust
Credits worden gereserveerd bij het indienen van de taak. Succesvolle taken worden in rekening gebracht via deze reservering; mislukte of verlopen taken worden automatisch terugbetaald.
Authenticatie
Maak een API-sleutel aan in het dashboard en stuur deze als Bearer-token mee bij elk verzoek. De volledige sleutel wordt slechts eenmalig getoond bij het aanmaken.
Authorization: Bearer sk_live_xxxxxxxxGebruik sk_live_ sleutels voor productie.
Gebruik sk_test_ sleutels voor integratietesten in de sandbox met hetzelfde API-contract.
Ontbrekende, ongeldige of ingetrokken sleutels retourneren invalid_api_key met HTTP 401.
Snelstartgids
Dien eerst een taak in. Zodra de taak is geaccepteerd, kies je een methode voor het ontvangen van het resultaat: poll het taak-endpoint of ontvang de eindstatus via een webhook.
Maak een asynchrone videogeneratietaak aan en ontvang direct een taak-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": "1080p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false
}
}'Vraag de status op via het taakstatus-endpoint als je integratie de voorkeur geeft aan expliciete polling.
curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Geef een callback_url mee bij het indienen van de taak om callbacks voor voltooiing of fouten te ontvangen en je eigen taakstatus bij te werken.
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 });
}Videotaak aanmaken
Maak een videogeneratietaak aan met POST /v1/videos/generations. De request-body bevat een model op het hoogste niveau, een optionele callback_url en een input-object met prompt- en generatie-instellingen.
/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": "1080p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false
}
}'Generatiemodi
generation_type bepaalt welke media-inputs worden geaccepteerd en hoe het model deze interpreteert.
Stel model in op seedance-2-5 om 480p-, 720p- of 1080p-video's te genereren met een duur van 4 tot 30 seconden.
- Tekst-naar-video met adaptieve, 16:9, 9:16, 1:1, 4:3, 3:4 of 21:9 aspect ratio
- Afbeelding-naar-video op basis van één eerste-frame afbeelding of twee eerste-en-laatste-frame afbeeldingen; de aspect ratio moet op adaptive staan
- Referentie-naar-video met maximaal 30 afbeeldingen, 10 video's en 10 audiobestanden, tot een maximum van 50 materialen in totaal
- Elke video- of audioreferentie moet 2-30 seconden duren; de gecombineerde video- en gecombineerde audioduur mag elk maximaal 30 seconden zijn
- Alleen audio als referentie-input en return_last_frame worden ondersteund; seed wordt niet ondersteund
| Modus | Vereiste media | Optionele media | Opmerkingen |
|---|---|---|---|
text-to-video | prompt | duration, aspect_ratio, resolution, seed | Alleen tekstprompt. image_urls, video_urls en audio_urls zijn niet nodig. |
image-to-video | prompt + image_urls array (1-2 afbeelding-URL's) | duration, aspect_ratio, resolution, seed | image_urls moet een array zijn. Geef 1 afbeelding-URL op voor het eerste frame, of 2 afbeelding-URL's voor het eerste en laatste frame. Video en audio worden genegeerd. |
reference-to-video | prompt + ten minste één afbeelding-, video- of audioreferentie | afbeeldingen, video's en audio binnen de materiaallimieten | Seedance 2.5 ondersteunt referenties die alleen uit audio bestaan. Voeg voor Seedance 2.0 ten minste één afbeelding of video toe wanneer audio wordt meegeleverd. |
text-to-videoGebruik tekst-naar-video wanneer de prompt de enige creatieve input is.
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": "1080p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false
}
}'image-to-videoGebruik afbeelding-naar-video wanneer input.image_urls een array is met 1-2 afbeelding-URL's: één URL bepaalt het eerste frame, twee URL's bepalen het eerste en laatste frame. Video- en audioreferenties worden in deze modus genegeerd.
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-videoGebruik referentie-naar-video voor meer gerichte sturing met behulp van referentie-afbeeldingen, video's en audio. Seedance 2.5 accepteert audio als het enige referentietype; Seedance 2.0 vereist ten minste één afbeelding of video wanneer audio wordt meegeleverd.
Limieten voor materialen
- Seedance 2.5: maximaal 30 referentie-afbeeldingen
- Seedance 2.5: maximaal 10 referentievideo's, elk 2-30 seconden en totale duur <= 30 seconden
- Seedance 2.5: maximaal 10 referentie-audiobestanden, elk 2-30 seconden en totale duur <= 30 seconden
- Seedance 2.5: maximaal 50 materialen in totaal over alle typen heen
- Seedance 2.0-varianten behouden hun bestaande limieten: 9 afbeeldingen, 3 video's, 3 audiobestanden en 15 seconden per video-/audiogroep
Ondersteunde inputcombinaties
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"
}
}'Request-parameters
Parameternamen, enum-waarden, endpoint-paden en voorbeelden maken deel uit van het API-contract. De onderstaande beschrijvingen leggen de werking van elk veld uit.
Headers
| Header | Vereist | Beschrijving | Voorbeeld |
|---|---|---|---|
Authorization | Ja | Bearer API-sleutel die wordt gebruikt om het verzoek te verifiëren. | Bearer sk_live_xxx |
Content-Type | Ja | Alle schrijfbewerkingen gebruiken JSON. | application/json |
Velden op het hoogste niveau
| Veld | Type | Vereist | Standaard | Bereik / Enum | Modi | Voorbeeld |
|---|---|---|---|---|---|---|
modelModelvariant die wordt gebruikt voor de generatie. Gebruik seedance-2-5 voor Seedance 2.5, seedance-2-0 voor Seedance 2.0, seedance-2-0-fast voor Seedance 2.0 Fast of seedance-2-0-mini voor Seedance 2.0 Mini. | string | Ja | - | seedance-2-5 | seedance-2-0 | seedance-2-0-fast | seedance-2-0-mini | alle | seedance-2-5 |
callback_urlHTTPS-endpoint dat de callbacks voor voltooide of mislukte taken ontvangt. | string | Nee | - | HTTPS-URL, geen privénetwerken | alle | https://your-domain.com/hook |
inputGeneratie-instellingen en mediareferenties. | object | Ja | - | - | alle | - |
input.* velden
| Veld | Type | Vereist | Standaard | Bereik / Enum | Modi | Voorbeeld |
|---|---|---|---|---|---|---|
input.promptTekstprompt die de te maken video beschrijft. | string | Ja | - | niet-lege tekst | alle | a cat surfing |
input.generation_typeGeneratiemodus. Standaard ingesteld op text-to-video. | string | Nee | text-to-video | text-to-video | image-to-video | reference-to-video | - | image-to-video |
input.image_urlsPubliek toegankelijke afbeelding-URL's. Stuur voor afbeelding-naar-video 1 afbeelding mee voor het eerste frame, of 2 afbeeldingen voor het eerste en laatste frame. Voor referentie-naar-video accepteert Seedance 2.5 maximaal 30 afbeeldingen en Seedance 2.0 maximaal 9. | string[] | Voorwaardelijk | [] | Afbeelding-naar-video: 1 of 2 afbeeldingen. Referentie-naar-video: maximaal 30 voor Seedance 2.5; maximaal 9 voor Seedance 2.0. | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsPubliek toegankelijke referentievideo's, uitsluitend voor referentie-naar-video. Seedance 2.5 accepteert maximaal 10 video's van elk 2-30 seconden met een gecombineerde afspeeltijd van <= 30 seconden. Seedance 2.0 accepteert maximaal 3 video's met een gecombineerde afspeeltijd van <= 15 seconden. | string[] | Nee | [] | Seedance 2.5: maximaal 10 video's, elk 2-30 seconden, gecombineerde duur <= 30 seconden. Seedance 2.0: maximaal 3, gecombineerde duur <= 15 seconden. | reference-to-video | [] |
input.audio_urlsPubliek toegankelijke referentie-audiobestanden, uitsluitend voor referentie-naar-video. Seedance 2.5 accepteert maximaal 10 audiobestanden van elk 2-30 seconden met een gecombineerde afspeeltijd van <= 30 seconden en staat uitsluitend audio-referenties toe. Seedance 2.0 accepteert maximaal 3 audiobestanden met een gecombineerde afspeeltijd van <= 15 seconden. | string[] | Nee | [] | Seedance 2.5: maximaal 10 audiobestanden, elk 2-30 seconden, gecombineerde duur <= 30 seconden. Seedance 2.0: maximaal 3, gecombineerde duur <= 15 seconden. | reference-to-video | [] |
input.durationDuur van de gegenereerde video in seconden. | int | Nee | 5 | Seedance 2.5: 4-30 seconden. Seedance 2.0: 4-15 seconden. | alle | 5 |
input.aspect_ratioAspect ratio van de output. Met adaptive bepaalt de service zelf de beste verhouding. Seedance 2.5 afbeelding-naar-video ondersteunt alleen adaptive. | string | Nee | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptive | alle | 16:9 |
input.resolutionResolutieniveau van de output. | string | Nee | 720p | Seedance 2.5: 480p | 720p | 1080p. Seedance 2.0: 480p | 720p | 1080p | 4k (afhankelijk van variant). | alle | 720p |
input.generate_audioBepaalt of het model audio moet genereren indien dit wordt ondersteund. | boolean | Nee | true | true | false | alle | true |
input.watermarkBepaalt of er een watermerk moet worden toegevoegd. | boolean | Nee | false | true | false | alle | false |
input.web_searchBepaalt of zoeken op het web mag worden gebruikt ter verrijking, indien ondersteund. | boolean | Nee | false | true | false | alle | false |
input.return_last_frameBepaalt of de URL van het laatste frame moet worden geretourneerd indien beschikbaar. | boolean | Nee | false | true | false | alle | false |
input.seedDeterminische seed voor Seedance 2.0-varianten. Seedance 2.5 ondersteunt dit veld niet; laat dit veld weg. | int | Nee | -1 | -1 of 0-4294967295 | alle | -1 |
Het aantal credits varieert op basis van resolutie, duur, model en of referentie-naar-video video-referenties bevat. De creditwaarde die in de response van het aanmaken wordt geretourneerd, is het daadwerkelijk gereserveerde bedrag voor die taak.
Bekijk credit-tarievenResponse
Dit is de succesvolle response van POST /v1/videos/generations. Dit betekent dat de taak is geaccepteerd en dat de credits zijn gereserveerd. Gebruik de geretourneerde taskId om de status te polleren via GET /v1/tasks/:id of om deze te koppelen aan een callback bij voltooiing of een fout.
Succesvolle response van POST /v1/videos/generations
{
"taskId": "3f2aK9mR...",
"credits": 100
}Taakstatus ophalen
Gebruik GET /v1/tasks/:id om de huidige status van een taak op te halen. Poll niet vaker dan één keer per 10 seconden. Voor productiesystemen wordt het gebruik van webhooks aanbevolen.
curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Response bij voltooide taak
{
"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
}
}Response bij mislukte taak
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-5",
"billing_status": "refunded",
"credits": 100,
"failed_reason": "provider_failed"
}| Waarde | Betekenis |
|---|---|
status=queued | Geaccepteerd en wachtend op indiening of verwerking. |
status=generating | De provider is bezig met het genereren van de video. |
status=completed | Video succesvol gegenereerd; data.results bevat de URL van het resultaat. |
status=failed | Generatie mislukt of time-out opgetreden. |
billing_status=reserved | Credits zijn gereserveerd zolang de taak in uitvoering is. |
billing_status=charged | Taak geslaagd en de credit-reservering is definitief afgerekend. |
billing_status=refunded | Taak mislukt of time-out opgetreden; de gereserveerde credits zijn teruggestort. |
billing_status=refund_failed | Terugstorting mislukt; handmatige afhandeling is vereist. |
Na video_expires_at is data.results leeg. Download en sla het bestand op voordat de geldigheidsperiode verloopt.
Webhooks
Wanneer callback_url is opgegeven, roept Seedance je endpoint aan zodra de taak is voltooid of mislukt, en stuurt JSON-data met de definitieve resultaten. Als je endpoint een non-2xx statuscode retourneert of niet binnen 15 seconden reageert, wordt de poging tot maximaal 5 keer herhaald. Bij herhalingen wordt hetzelfde task id gebruikt, dus ontdubbel op basis van dit ID. Stuur direct een 200-response zodra je de callback-data veilig hebt opgeslagen.
Callback bij voltooide taak
{
"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
}
}Callback bij mislukte taak
{
"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 });
}Valideer de structuur van de callback-data, ontdubbel op basis van ID, werk je eigen taakgegevens bij en reageer snel.
De callback_url moet HTTPS gebruiken en mag niet verwijzen naar private, loopback- of link-local netwerken.
Foutmeldingen
POST /v1/videos/generations en GET /v1/tasks/:id retourneren deze foutstructuur wanneer de API-aanroep zelf mislukt, zoals bij ongeldige parameters, een ongeldige API-sleutel, onvoldoende credits, rate limiting of wanneer de taak niet is gevonden. Sommige foutmeldingen bevatten extra velden zoals required, available of retry_after, afhankelijk van de situatie.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this task.",
"required": 100,
"available": 12
}
}| Code | HTTP | Betekenis | Opnieuw proberen? |
|---|---|---|---|
invalid_request | 400 | Ontbrekende of ongeldige parameters. | Nee, pas de aanvraag aan. |
invalid_api_key | 401 | API-sleutel ontbreekt, is ongeldig of is ingetrokken. | Nee, gebruik een geldige sleutel. |
insufficient_credits | 402 | Onvoldoende credits. De taak is niet geaccepteerd en er zijn geen credits afgeschreven. | Na opwaarderen. |
forbidden | 403 | API-sleutel heeft niet de vereiste rechten (scope). | Nee. |
not_found | 404 | De taak bestaat niet of is niet van de eigenaar van de API-sleutel. | Nee. |
rate_limited | 429 | Maximum aantal aanvragen overschreden. | Ja, volg de Retry-After-header. |
internal_error | 500 | Interne serverfout. | Ja, probeer het later opnieuw. |
Rate limits
Rate limits worden per API-sleutel toegepast op basis van een sliding window. Voor generaties geldt een standaardlimiet van 100 aanvragen per minuut; statusopvragingen zijn ruimer ingesteld. HTTP 429-responses bevatten een Retry-After-header.
Generatie
100/min
Status opvragen
Ruimer ingesteld
429-header
Retry-After
Facturatie & credits
De API werkt op basis van reservering bij indiening, afschrijving bij succes en terugstorting bij fouten. De verbruikspagina's in het dashboard tonen de geschiedenis van je API-credits, taaklogboeken en verbruiksstatistieken over tijd.
Gereserveerd
Credits worden gecontroleerd en gereserveerd zodra de taak is geaccepteerd.
Afgeschreven
Bij succesvol voltooide taken wordt de openstaande reservering definitief afgerekend.
Teruggestort
Bij mislukte of verlopen taken worden de gereserveerde credits automatisch teruggestort.
Analyseer je verbruik in het dashboard
Bekijk API-logs, taaktijdlijnen, credit-geschiedenis en verbruiksstatistieken over tijd.