API Seedance
Intégrez la génération vidéo dans votre produit avec Seedance 2.5 ou Seedance 2.0, des tâches asynchrones, des webhooks et une facturation basée sur les crédits.
https://api.seevio.aiSur cette page
Introduction
L'API vous permet de soumettre des tâches de génération vidéo Seedance 2.5 et Seedance 2.0 de manière programmatique. Seedance 2.5 est le modèle recommandé et prend en charge le text-to-video, l'image-to-video (première image ou première et dernière images) et le reference-to-video multimodal. La génération est asynchrone : vous créez une tâche, recevez immédiatement un ID de tâche, puis récupérez la vidéo finale en interrogeant l'API (polling) ou via un webhook.
Tâches asynchrones
L'interrogation (polling) convient parfaitement pour le développement et les intégrations simples.
Prêt pour les webhooks
Les webhooks sont recommandés en production afin d'éviter les requêtes répétitives et de notifier votre service dès qu'une tâche atteint son état final.
Gestion des crédits
Les crédits sont réservés lors de la soumission de la tâche. Les tâches réussies sont facturées sur cette réserve ; les tâches échouées ou expirées sont automatiquement remboursées.
Authentification
Générez une clé API dans votre tableau de bord et transmettez-la en tant que jeton Bearer lors de chaque requête. La clé complète ne s'affiche qu'une seule fois au moment de sa création.
Authorization: Bearer sk_live_xxxxxxxxUtilisez des clés sk_live_ pour le trafic de production.
Utilisez des clés sk_test_ pour vos tests d'intégration dans l'environnement de sandbox (bac à sable) avec le même contrat API.
Les clés manquantes, invalides ou révoquées renvoient une erreur invalid_api_key avec un code HTTP 401.
Démarrage rapide
Commencez par soumettre une tâche. Une fois celle-ci acceptée, choisissez votre méthode de récupération du résultat : interrogez le point de terminaison de la tâche (polling) ou recevez le résultat final via un webhook.
Créez une tâche vidéo asynchrone et recevez immédiatement un ID de tâche.
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": "720p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false
}
}'Interrogez le point de terminaison de statut de la tâche si votre intégration préfère les requêtes explicites.
curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Renseignez le paramètre callback_url lors de la soumission pour recevoir une notification en cas de succès ou d'échec, et mettre à jour votre propre base de données.
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 de génération vidéo via une requête POST sur /v1/videos/generations. Le corps de la requête doit contenir un modèle de niveau supérieur, un paramètre callback_url optionnel et un objet input contenant le prompt et les paramètres de génération.
/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": "720p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false
}
}'Modes de génération
Le paramètre generation_type détermine les types de médias acceptés en entrée et la manière dont le modèle les interprète.
Définissez le modèle sur seedance-2-5 pour générer des vidéos en 480p ou 720p d'une durée de 4 à 30 secondes.
- Text-to-video avec format d'image adaptatif, 16:9, 9:16, 1:1, 4:3, 3:4 ou 21:9
- Image-to-video à partir d'une image de départ ou de deux images (début et fin) ; le format d'image doit être configuré sur adaptatif
- Reference-to-video avec un maximum de 30 images, 10 vidéos et 10 fichiers audio (limite globale de 50 éléments)
- Chaque référence vidéo ou audio doit durer entre 2 et 30 secondes ; la durée cumulée des vidéos et celle des audios ne doivent pas dépasser 30 secondes chacune
- La référence audio seule et return_last_frame sont pris en charge ; le paramètre seed n'est pas disponible
| Mode | Médias requis | Médias facultatifs | Remarques |
|---|---|---|---|
text-to-video | prompt | duration, aspect_ratio, resolution, seed | Prompt textuel uniquement. image_urls, video_urls et audio_urls ne sont pas nécessaires. |
image-to-video | prompt + tableau image_urls (1 à 2 URL d'images) | duration, aspect_ratio, resolution, seed | image_urls doit être un tableau. Fournissez 1 URL d'image pour la première image, ou 2 URL pour la première et la dernière. Les vidéos et audios sont ignorés. |
reference-to-video | prompt + au moins une référence image, vidéo ou audio | images, vidéos et audios dans la limite des fichiers autorisés | Seedance 2.5 prend en charge les références audio seules. Pour Seedance 2.0, ajoutez au moins une image ou une vidéo lorsque de l'audio est fourni. |
text-to-videoUtilisez le mode text-to-video lorsque le prompt textuel est votre seule entrée créative.
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": "720p",
"generate_audio": true,
"watermark": false,
"web_search": false,
"return_last_frame": false
}
}'image-to-videoUtilisez le mode image-to-video lorsque input.image_urls contient un tableau de 1 à 2 URL d'images : une URL définit la première image, deux URL définissent la première et la dernière. Les références vidéo et audio sont ignorées dans ce mode.
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-videoUtilisez le mode reference-to-video pour un contrôle plus précis à l'aide d'images, de vidéos ou d'audios de référence. Seedance 2.5 accepte l'audio comme unique type de référence ; Seedance 2.0 requiert au moins une image ou une vidéo lorsque de l'audio est fourni.
Limites de fichiers sources
- Seedance 2.5 : jusqu'à 30 images de référence
- Seedance 2.5 : jusqu'à 10 vidéos de référence (2-30 secondes chacune, durée cumulée <= 30 secondes)
- Seedance 2.5 : jusqu'à 10 fichiers audio de référence (2-30 secondes chacun, durée cumulée <= 30 secondes)
- Seedance 2.5 : maximum de 50 fichiers de référence au total, tous types confondus
- Les variantes de Seedance 2.0 conservent leurs limites actuelles : 9 images, 3 vidéos, 3 audios et 15 secondes max par groupe vidéo/audio
Combinaisons d'entrées prises en charge
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"
}
}'Paramètres de requête
Les noms de paramètres, les valeurs d'énumération, les chemins d'accès et les exemples font partie intégrante du contrat de l'API. Les descriptions ci-dessous expliquent le comportement de chaque champ.
En-têtes
| En-tête | Requis | 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 le format JSON. | application/json |
Champs de premier niveau
| Champ | Type | Requis | Par défaut | Plage / Énumération | Modes | Exemple |
|---|---|---|---|---|---|---|
modelVariante du modèle utilisée pour la génération. Utilisez seedance-2-5 pour Seedance 2.5, seedance-2-0 pour Seedance 2.0, seedance-2-0-fast pour Seedance 2.0 Fast ou seedance-2-0-mini pour Seedance 2.0 Mini. | string | Oui | - | seedance-2-5 | seedance-2-0 | seedance-2-0-fast | seedance-2-0-mini | tous | seedance-2-5 |
callback_urlPoint de terminaison HTTPS qui reçoit les notifications de succès et d'échec de la tâche. | string | Non | - | URL HTTPS (les réseaux privés ne sont pas autorisés) | tous | https://your-domain.com/hook |
inputParamètres de génération et fichiers de référence. | object | Oui | - | - | tous | - |
input.* champs
| Champ | Type | Requis | Par défaut | Plage / Énumération | Modes | Exemple |
|---|---|---|---|---|---|---|
input.promptPrompt textuel décrivant la vidéo à générer. | string | Oui | - | texte non vide | tous | a cat surfing |
input.generation_typeMode de génération. Valeur par défaut : 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 publiques. Pour le mode image-to-video, envoyez 1 image pour la première image ou 2 images pour la première et la dernière. Pour le mode reference-to-video, Seedance 2.5 accepte jusqu'à 30 images et Seedance 2.0 jusqu'à 9. | string[] | Conditionnel | [] | Image-to-video : 1 ou 2 images. Reference-to-video : jusqu'à 30 pour Seedance 2.5 ; jusqu'à 9 pour Seedance 2.0. | image-to-video / reference-to-video | ["https://.../a.jpg"] |
input.video_urlsVidéos de référence publiques (uniquement pour le mode reference-to-video). Seedance 2.5 accepte jusqu'à 10 vidéos de 2-30 secondes chacune (durée cumulée <= 30 secondes). Seedance 2.0 accepte jusqu'à 3 vidéos (durée cumulée <= 15 secondes). | string[] | Non | [] | Seedance 2.5 : jusqu'à 10 vidéos de 2-30 secondes, durée cumulée <= 30 secondes. Seedance 2.0 : jusqu'à 3, durée cumulée <= 15 secondes. | reference-to-video | [] |
input.audio_urlsFichiers audio de référence publics (uniquement pour le mode reference-to-video). Seedance 2.5 accepte jusqu'à 10 fichiers de 2-30 secondes chacun (durée cumulée <= 30 secondes) et autorise les références audio seules. Seedance 2.0 accepte jusqu'à 3 fichiers (durée cumulée <= 15 secondes). | string[] | Non | [] | Seedance 2.5 : jusqu'à 10 fichiers audio de 2-30 secondes, durée cumulée <= 30 secondes. Seedance 2.0 : jusqu'à 3, durée cumulée <= 15 secondes. | reference-to-video | [] |
input.durationDurée de la vidéo de sortie en secondes. | int | Non | 5 | Seedance 2.5 : 4-30 secondes. Seedance 2.0 : 4-15 secondes. | tous | 5 |
input.aspect_ratioFormat d'image de sortie. Le mode adaptive permet au service de déterminer le meilleur format. Le mode image-to-video de Seedance 2.5 ne prend en charge que le format adaptive. | string | Non | adaptive | 16:9 | 4:3 | 1:1 | 3:4 | 9:16 | 21:9 | adaptive | tous | 16:9 |
input.resolutionRésolution de la vidéo de sortie. | string | Non | 720p | Seedance 2.5 : 480p | 720p. Seedance 2.0 : 480p | 720p | 1080p | 4k (selon la variante). | tous | 720p |
input.generate_audioIndique si le modèle doit générer de l'audio lorsque cela est possible. | boolean | Non | true | true | false | tous | true |
input.watermarkIndique s'il faut appliquer un filigrane. | boolean | Non | false | true | false | tous | false |
input.web_searchIndique s'il faut autoriser l'enrichissement par recherche web lorsque la fonctionnalité est disponible. | boolean | Non | false | true | false | tous | false |
input.return_last_frameIndique s'il faut retourner l'URL de la dernière image lorsqu'elle est disponible. | boolean | Non | false | true | false | tous | false |
input.seedSeed déterministe pour les variantes de Seedance 2.0. Seedance 2.5 ne prend pas en charge ce paramètre ; veuillez l'omettre. | int | Non | -1 | -1 ou 0-4294967295 | tous | -1 |
Le coût en crédits varie selon la résolution, la durée, le modèle sélectionné et la présence de références vidéo dans le mode reference-to-video. La valeur credits retournée dans la réponse de création correspond au montant exact réservé pour cette tâche.
Voir les tarifs en créditsRéponse
Il s'agit de la réponse de succès renvoyée par POST /v1/videos/generations. Elle confirme que la tâche a été acceptée et que les crédits ont été réservés. Utilisez le taskId retourné pour interroger le point de terminaison GET /v1/tasks/:id ou pour identifier la notification de succès ou d'échec.
Réponse de succès pour POST /v1/videos/generations
{
"taskId": "3f2aK9mR...",
"credits": 100
}Obtenir le statut de la tâche
Utilisez la requête GET /v1/tasks/:id pour récupérer l'état actuel d'une tâche. Limitez vos requêtes à une toutes les 10 secondes au maximum. Pour les systèmes en production, privilégiez l'usage des webhooks.
curl https://api.seevio.ai/v1/tasks/3f2aK9mR7xQp4TnZ8bLc6YwH \
-H "Authorization: Bearer sk_live_xxx"Réponse d'une tâche terminée avec succès
{
"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
}
}Réponse d'une tâche ayant échoué
{
"id": "3f2aK9mR...",
"status": "failed",
"created_at": 1781234567,
"model": "seedance-2-5",
"billing_status": "refunded",
"credits": 100,
"failed_reason": "provider_failed"
}| Valeur | Signification |
|---|---|
status=queued | Acceptée et en attente d'envoi ou de traitement. |
status=generating | Le fournisseur traite actuellement la génération. |
status=completed | Génération vidéo terminée. L'objet data.results contient l'URL du fichier généré. |
status=failed | La génération a échoué ou a expiré. |
billing_status=reserved | Les crédits sont réservés pendant toute la durée de traitement de la tâche. |
billing_status=charged | La tâche a réussi, la réservation de crédits est validée et facturée. |
billing_status=refunded | La tâche a échoué ou a expiré, les crédits réservés ont été restitués. |
billing_status=refund_failed | La transaction de remboursement a échoué et nécessite une intervention manuelle. |
Une fois la date video_expires_at dépassée, l'objet data.results est vidé. Téléchargez et stockez le fichier avant l'expiration de cette période de validité.
Webhooks
Si callback_url est renseigné, Seedance appelle votre point de terminaison dès que la tâche est terminée (succès ou échec) et lui transmet les données JSON du résultat final. Si votre serveur renvoie un code autre que 2xx ou ne répond pas dans les 15 secondes, la notification est tentée de nouveau jusqu'à 5 fois. Les tentatives successives conservent le même ID de tâche ; veillez à dédoublonner les requêtes reçues à l'aide de cet ID. Renvoyez une réponse HTTP 200 dès que vous avez enregistré les données du webhook.
Webhook de fin de tâche (succès)
{
"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
}
}Webhook d'échec de tâche
{
"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 });
}Validez le format des données reçues, dédoublonnez les requêtes grâce à l'ID, mettez à jour le statut de la tâche dans votre système et renvoyez une réponse rapidement.
La callback_url doit impérativement utiliser le protocole HTTPS et ne pas pointer vers des plages d'adresses privées, de bouclage (loopback) ou de liaison locale (link-local).
Erreurs
Les requêtes POST /v1/videos/generations et GET /v1/tasks/:id renvoient ce format d'erreur lorsque la requête API échoue (paramètres non valides, clé API incorrecte, crédits insuffisants, limite de requêtes atteinte ou tâche introuvable). Selon le cas, certaines erreurs contiennent des champs supplémentaires comme required, available ou retry_after.
{
"error": {
"code": "insufficient_credits",
"message": "Not enough credits for this task.",
"required": 100,
"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 | Clé API manquante, non valide ou révoquée. | Non, utilisez une clé valide. |
insufficient_credits | 402 | Nombre de crédits insuffisant. La tâche n'est ni acceptée ni facturée. | Après rechargement du compte. |
forbidden | 403 | La clé API ne dispose pas des droits requis. | Non. |
not_found | 404 | La tâche n'existe pas ou n'appartient pas au propriétaire de la clé API. | Non. |
rate_limited | 429 | Limite de requêtes dépassée. | Oui, conformez-vous à l'en-tête Retry-After. |
internal_error | 500 | Erreur interne du serveur. | Oui, réessayez plus tard. |
Limites de requêtes
Les limites de requêtes s'appliquent par clé API selon un principe de fenêtre glissante. Par défaut, la génération est limitée à 100 requêtes par minute ; les requêtes de statut de tâche bénéficient d'une limite plus souple. Les réponses HTTP 429 incluent l'en-tête Retry-After.
Génération
100/min
Requêtes de statut
Limite plus souple
En-tête 429
Retry-After
Facturation & crédits
L'API applique un principe de réservation à la soumission, de facturation en cas de succès et de remboursement en cas d'échec. Les pages de suivi de consommation de votre tableau de bord affichent l'historique des crédits API, les journaux d'activité et des statistiques d'utilisation détaillées.
Réservés
Les crédits sont vérifiés et réservés dès que la tâche est acceptée.
Facturés
La réussite d'une tâche valide définitivement la réservation de crédits correspondante.
Remboursés
Les tâches en échec ou expirées restituent automatiquement les crédits qui avaient été réservés.
Suivez votre consommation depuis le tableau de bord
Consultez les journaux d'activité de l'API, la chronologie des tâches, l'historique des crédits et des indicateurs d'utilisation dans le temps.