API Seedance 2.0
Intégrez la génération vidéo à votre produit avec la création de tâches asynchrones, l'interrogation de statut, les webhooks et une facturation basée sur les crédits.
https://api.seedance2.aiSur cette page
Introduction
L'API vous permet de soumettre des tâches de génération vidéo Seedance 2.0 par programmation. La génération est asynchrone : créez une tâche, recevez un ID de tâche immédiatement, puis obtenez la vidéo terminée en interrogeant le point de terminaison de la tâche ou en recevant un webhook.
Tâches asynchrones
L'interrogation fonctionne bien pour le développement et les intégrations simples.
Prêt pour les webhooks
Les webhooks sont recommandés pour la production car ils évitent une interrogation agressive et informent votre service lorsqu'une tâche atteint un état terminal.
Conscient des crédits
Les crédits sont réservés lors de la soumission. Les tâches réussies sont facturées sur cette réservation ; les tâches échouées ou expirées sont remboursées automatiquement.
Authentification
Créez une clé API dans le tableau de bord et envoyez-la en tant que jeton Bearer à chaque requête. La clé complète n'est affichée qu'une seule fois au moment de la création.
Authorization: Bearer sk_live_xxxxxxxxUtilisez les clés sk_live_ pour le trafic de production.
Utilisez les clés sk_test_ pour les tests d'intégration sandbox avec le même contrat API.
Les clés manquantes, non valides ou révoquées renvoient invalid_api_key avec le code HTTP 401.
Démarrage rapide
Soumettez d'abord une tâche. Une fois la tâche acceptée, choisissez une méthode de livraison des résultats : interrogez le point de terminaison de la tâche ou recevez le résultat terminal via un webhook.
Créez une tâche vidéo asynchrone et recevez un ID de tâche immédiatement.
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
}
}'Récupérez le point de terminaison de l'état de la tâche lorsque votre intégration préfère l'interrogation explicite.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Passez callback_url lors de la soumission de la tâche, puis recevez les rappels de réussite ou d'échec et mettez à jour votre propre enregistrement de tâche.
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 });
}Créer une tâche vidéo
Créez une tâche vidéo avec POST /v1/videos/generations. Le corps de la requête contient un modèle de niveau supérieur, un callback_url facultatif et un objet d'entrée contenant des paramètres de promtp et de génération.
/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
}
}'Modes de génération
generation_type contrôle les entrées média acceptées et la façon dont le modèle les interprète.
| Mode | Média requis | Média facultatif | Notes |
|---|---|---|---|
text-to-video | prompt | durée, rapport d'aspect, résolution, seed | Texte prompt uniquement. image_urls, video_urls et audio_urls ne sont pas nécessaires. |
image-to-video | prompt + tableau image_urls (1-2 URL d'image) | durée, rapport d'aspect, résolution, seed | image_urls doit être un tableau. Fournissez 1 URL d'image pour la première image, ou 2 URL d'image pour la première et la dernière image. La vidéo et l'audio sont ignorés. |
reference-to-video | prompt + au moins une image ou vidéo | images, vidéos et audio dans les limites du matériel | L'audio ne peut pas être utilisé seul avec du texte. Ajoutez au moins une image ou une vidéo lorsque de l'audio est fourni. |
text-to-videoUtilisez le texte-vers-vidéo lorsque le prompt est la seule entrée créative. (text-to-video)
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-videoUtilisez l'image-vers-vidéo lorsque input.image_urls est un tableau avec 1 à 2 URL d'image : une URL définit la première image, et deux URL définissent la première et la dernière image. Les références vidéo et audio sont ignorées dans ce mode. (image-to-video)
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-videoUtilisez la référence-vers-vidéo pour une direction plus riche avec des images, des vidéos et de l'audio de référence. L'audio ne peut pas être utilisé seul avec du texte ; incluez au moins une image ou une vidéo lorsque de l'audio est fourni. (reference-to-video)
Limites des matériaux
- Jusqu'à 9 images de référence
- Jusqu'à 3 vidéos de référence, durée totale <= 15 secondes
- Jusqu'à 3 fichiers audio de référence, durée totale <= 15 secondes
- Maximum 12 matériaux au total pour tous les types
Combinaisons d'entrées prises en charge
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"
}
}'Paramètres de requête
Les noms de paramètres, les valeurs d'énumération, les chemins de point de terminaison et les exemples font partie du contrat API. Les descriptions ci-dessous expliquent comment chaque champ se comporte.
En-têtes
| En-tête | Obligatoire | Description | Exemple |
|---|---|---|---|
Authorization | Oui | Clé API Bearer utilisée pour authentifier la requête. | Bearer sk_live_xxx |
Content-Type | Oui | Toutes les requêtes d'écriture utilisent JSON. | application/json |
Champs de niveau supérieur
| Champ | Type | Obligatoire | Par défaut | Plage / Énumération | Modes | Exemple |
|---|---|---|---|---|---|---|
modelVariante de modèle utilisée pour la génération. | string | Oui | - | seedance-2-0 | seedance-2-0-fast | tous | seedance-2-0 |
callback_urlPoint de terminaison HTTPS qui reçoit les rappels de réussite et d'échec de la tâche. | string | Non | - | URL HTTPS, pas de réseaux privés | tous | https://your-domain.com/hook |
inputParamètres de génération et références médias. | object | Oui | - | - | tous | - |
input.* champs
| Champ | Type | Obligatoire | Par défaut | Plage / Énumération | Modes | Exemple |
|---|---|---|---|---|---|---|
input.promptInvite de texte décrivant la vidéo à créer. | string | Oui | - | texte non vide | tous | a cat surfing |
input.generation_typeMode de génération. Par défaut à texte-vers-vidéo. (text-to-video) | string | Non | text-to-video | text-to-video | image-to-video | reference-to-video | - | image-to-video |
input.image_urlsURL d'images accessibles publiquement. Pour l'image-vers-vidéo, envoyez 1 image pour la première trame ou 2 images pour la première et la dernière trame. Pour la référence-vers-vidéo, envoyez jusqu'à 9 images comme références visuelles. (image-to-video) (reference-to-video) | string[] | Conditionnel | [] | Image-vers-vidéo : 1 ou 2 images. Référence-vers-vidéo : jusqu'à 9 images. (image-to-video) (reference-to-video) | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsVidéos de référence accessibles publiquement pour la référence-vers-vidéo uniquement. Vous pouvez envoyer jusqu'à 3 fichiers vidéo, et leur durée de lecture combinée doit être de 15 secondes ou moins. (reference-to-video) | string[] | Non | [] | Jusqu'à 3 vidéos. La longueur combinée des vidéos doit être de 15 secondes ou moins. | reference-to-video | [] |
input.audio_urlsFichiers audio de référence accessibles publiquement pour la référence-vers-vidéo uniquement. Vous pouvez envoyer jusqu'à 3 fichiers audio, et leur durée de lecture combinée doit être de 15 secondes ou moins. (reference-to-video) | string[] | Non | [] | Jusqu'à 3 fichiers audio. La longueur combinée des audios doit être de 15 secondes ou moins. | reference-to-video | [] |
input.durationDurée de la vidéo de sortie en secondes. | int | Non | 5 | 4-15 secondes | tous | 5 |
input.aspect_ratioRapport d'aspect de sortie. adaptive permet au service d'inférer le meilleur rapport. | string | Non | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptatif | tous | 16:9 |
input.resolutionNiveau de résolution de sortie. | string | Non | 720p | 480p | 720p | 1080p | tous | 720p |
input.generate_audioIndique si le modèle doit générer de l'audio lorsqu'il est pris en charge. | boolean | Non | true | true | false | tous | true |
input.watermarkIndique si un filigrane doit être ajouté. | boolean | Non | false | true | false | tous | false |
input.web_searchIndique si l'augmentation de la recherche web est autorisée lorsqu'elle est prise en charge. | boolean | Non | false | true | false | tous | false |
input.return_last_frameIndique si l'URL de la dernière trame doit être renvoyée lorsqu'elle est disponible. | boolean | Non | false | true | false | tous | false |
input.seedSeed déterministe. Utilisez -1 pour une seed aléatoire. | int | Non | -1 | -1 ou 0-4294967295 | tous | -1 |
Les crédits varient en fonction de la résolution, de la durée, du modèle et du fait que la référence-vers-vidéo inclue des références vidéo. La valeur des crédits renvoyée par la réponse de création est le montant réel réservé pour cette tâche. (reference-to-video)
Voir la tarification des créditsRéponse
Ceci est la réponse de succès de POST /v1/videos/generations. Cela signifie que la tâche a été acceptée et que des crédits ont été réservés. Utilisez le taskId renvoyé pour interroger GET /v1/tasks/:id ou pour correspondre à un rappel de réussite ou d'échec.
Réponse de succès de POST /v1/videos/generations
{
"taskId": "3f2aK9mR...",
"credits": 60
}Obtenir le statut de la tâche
Utilisez GET /v1/tasks/:id pour récupérer l'état actuel de la tâche. N'interrogez pas plus d'une fois toutes les 10 secondes. Pour les systèmes de production, préférez les webhooks.
curl https://api.seedance2.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Réponse de tâche terminée
{
"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éponse de tâche échouée
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-0",
"billing_status": "refunded",
"credits": 60,
"failed_reason": "provider_failed"
}| Valeur | Signification |
|---|---|
status=queued | Accepté et en attente de soumission ou de traitement. |
status=generating | Le fournisseur traite la génération. |
status=completed | Vidéo terminée et data.results contient l'URL du résultat. |
status=failed | La génération a échoué ou a expiré. |
billing_status=reserved | Les crédits sont réservés pendant que la tâche est en cours. |
billing_status=charged | La tâche a réussi et la réservation est réglée. |
billing_status=refunded | La tâche a échoué ou a expiré et les crédits ont été retournés. |
billing_status=refund_failed | La transaction de remboursement a échoué et nécessite une gestion manuelle. |
Après video_expires_at, data.results est vide. Téléchargez et stockez le fichier avant la fin de la fenêtre de validité.
Webhooks
Lorsque callback_url est présent, Seedance appelle votre point de terminaison lorsque la tâche est terminée ou échouée, et envoie des données JSON décrivant le résultat final. Si votre point de terminaison renvoie une réponse non 2xx ou ne répond pas dans les 15 secondes, la livraison est relancée jusqu'à 5 fois. Les relances réutilisent le même ID de tâche, donc dédoublonnez par ID. Renvoyez une réponse 200 dès que vous avez enregistré les données de rappel en toute sécurité.
Rappel d'achèvement de tâche
{
"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
}
}Rappel d'échec de tâche
{
"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 });
}Validez la forme des données de rappel, dédoublonnez par ID, mettez à jour votre propre enregistrement de tâche et répondez rapidement.
callback_url doit être HTTPS et ne doit pas pointer vers des plages de réseaux privés, de bouclage ou locaux de liaison.
Erreurs
POST /v1/videos/generations et GET /v1/tasks/:id renvoient cette forme d'erreur lorsque la requête API elle-même échoue, par exemple des paramètres non valides, une clé API non valide, des crédits insuffisants, une limitation de débit ou une tâche introuvable. Certaines erreurs incluent des champs supplémentaires tels que required, available ou retry_after selon la situation.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this task.",
"required": 60,
"available": 12
}
}| Code | HTTP | Signification | Réessayer ? |
|---|---|---|---|
invalid_request | 400 | Paramètres manquants ou non valides. | Non, corrigez la requête. |
invalid_api_key | 401 | La clé API est manquante, non valide ou révoquée. | Non, utilisez une clé valide. |
insufficient_credits | 402 | Crédits insuffisants. La tâche n'est pas acceptée ou facturée. | Après la recharge. |
forbidden | 403 | La clé API n'a pas la portée requise. | Non. |
not_found | 404 | La tâche n'existe pas ou n'appartient pas au propriétaire de la clé. | Non. |
rate_limited | 429 | Taux de requêtes dépassé. | Oui, suivez Retry-After. |
internal_error | 500 | Erreur de serveur. | Oui, réessayez plus tard. |
Limites de débit
Les limites de débit sont appliquées par clé API avec une fenêtre glissante. La génération est par défaut de 60 requêtes par minute ; les requêtes de statut sont plus indulgentes. Les réponses HTTP 429 incluent Retry-After.
Génération
60/min
Requêtes de statut
Plus indulgent
En-tête 429
Retry-After
Facturation et crédits
L'API utilise la réservation à la soumission, la facturation au succès et le remboursement à l'échec. Les pages d'utilisation du tableau de bord affichent l'historique des crédits API, les journaux de tâches et les statistiques d'utilisation basées sur le temps.
Réservé
Les crédits sont vérifiés et réservés lorsque la tâche est acceptée.
Facturé
Les tâches terminées règlent la réservation existante.
Remboursé
Les tâches échouées ou expirées renvoient automatiquement les crédits réservés.
Examinez l'utilisation dans le tableau de bord
Affichez les journaux API, les chronologies de tâches, l'historique des crédits et les métriques d'utilisation basées sur le temps.