Seedance 2.0 MiniRéférence API
Tout ce qu’il faut pour appeler Seedance 2.0 Mini depuis votre code : un démarrage rapide en trois étapes, chaque champ avec ses limites, la formule de prix, les webhooks et l’idempotence. Les outils MCP tournent sur la même API /v1 ; connecté via MCP, vous dépensez le solde création, avec une clé API le solde de l’API développeur.
L’accès à l’API développeur se fait sur demande.
Démarrage rapideen trois appels
Définissez une clé, envoyez la tâche avec un plafond de prix, puis lisez le résultat.
- 01
Définissez votre clé
L’accès à l’API développeur se fait sur demande : demandez-le dans le studio, sous Clés API. La clé n’est affichée qu’une fois : gardez-la dans une variable d’environnement.
export API_KEY="sk_test_…" - 02
Envoyez la tâche
Envoyez le clip en POST avec un Idempotency-Key et un plafond max_credits (ou un quote_id). Vous recevez aussitôt un 202 et une tâche en file, et les crédits sont réservés.
curl https://api.pershot.app/v1/videos/generations \ -H "Authorization: Bearer $API_KEY" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2.0-mini", "prompt": "Creator holds the bottle to camera and explains one benefit, handheld, natural room light.", "duration": 10, "resolution": "720p", "aspect_ratio": "16:9", "generate_audio": true, "max_credits": 42 }'{ "id": "job_01J9ZK4T8W", "object": "job", "kind": "video", "status": "queued", "money_status": "reserved", "queue_position": 2, "requested_model": "seedance-2.0-mini", "credits_quoted": 42, "credits_charged": null } - 03
Lisez le résultat
Faites un GET sur la tâche jusqu’à ce que son statut soit succeeded. outputs[].url est signé et expire au bout de 24 heures : téléchargez ce que vous gardez.
curl https://api.pershot.app/v1/jobs/job_01J9ZK4T8W \ -H "Authorization: Bearer $API_KEY"
Paramètreset limites
Lus dans le document OpenAPI, généré à partir des mêmes schémas que ceux utilisés par l’API pour valider. Les champs inconnus sont refusés.
| Champ | Type | Valeurs admises | Remarques |
|---|---|---|---|
modelObligatoire | string | seedance-2.0-fast · seedance-2.0-mini · auto | L’identifiant du modèle. |
promptObligatoire | string | 2–2 000 caractères | Ce qu’il faut générer : le sujet, la caméra et la lumière. |
durationPar défaut 5 | integer | 4–15 | Durée de sortie en secondes entières, jusqu’à 15. |
resolutionPar défaut "720p" | string | 480p · 720p | Résolution de sortie. 480p pour les brouillons, 720p pour la livraison ; chacune est une génération distincte. |
aspect_ratioPar défaut "16:9" | string | 16:9 · 9:16 · 1:1 | Forme du cadre. |
generate_audioPar défaut true | boolean | – | Audio natif. Le prix est le même, activé ou non. |
image_urlFacultatif | string | URL https | Première image pour la vidéo ; image source pour les modèles de retouche. Une URL https publique ou une URL d’import. |
reference_image_urlsFacultatif | string[] | Jusqu’à 9 · URL https | Images de référence pour le sujet et le style. Désignez-les dans le prompt par @image1, @image2. |
seedFacultatif | integer | 0–2 147 483 647 | Accepté et ignoré : Seedance 2.0 ne prend pas de graine. |
quote_idFacultatif | string | qt_… | Lancer au prix d’un devis obtenu avec POST /v1/quotes, valable 10 minutes. |
max_creditsFacultatif | number | > 0 | Le maximum que cette tâche peut coûter. Au-delà, la tâche est refusée, jamais facturée. |
webhook_urlFacultatif | string | URL https | Une URL https qui reçoit les événements de la tâche. |
end_user_idFacultatif | string | 1–128 caractères | Pour les comptes développeur approuvés (accès sur demande) : votre propre identifiant utilisateur pour cette requête, affiché dans l’utilisation. |
project_idFacultatif | string | prj_… | |
shot_idFacultatif | string | sht_… | |
routing_preferenceFacultatif | string | stability · speed | |
enhanceFacultatif | object | – |
Envoyez exactement l’un des deux : quote_id ou max_credits. Cet endpoint refuse model "auto" : pour la vidéo, appelez d’abord POST /v1/auto/plan, puis envoyez le modèle choisi avec max_credits.
- Débit et simultanéité
- 60 requêtes par minute et par clé, et 3 tâches simultanées par compte par défaut. Plus de clés n’augmentent pas la simultanéité.
Limites
Lues dans la même table que celle vérifiée par l’API. Chaque ligne indique qui vérifie la limite et ce qui se passe au-delà.
- AppliquéeNous la vérifions et répondons 400 avant tout devis ou toute réservation.
- FournisseurLe fournisseur la vérifie. Une tâche qu’il refuse échoue, et rien n’est facturé.
- RecommandéePersonne ne la vérifie. La respecter donne de meilleurs résultats.
| Limite | Valeur | Unité | Qui vérifie | Au-delà de la limite |
|---|---|---|---|---|
| Requête | ||||
Longueur du promptprompt | 2 à 2 000 | caractères | Appliquée | 400 invalid_request sur prompt, avant tout devis ou toute réservation. |
Prompt en anglaisprompt | jusqu’à 1 000 | mots | Recommandée | Accepté. Le modèle peut suivre moins fidèlement un prompt plus long. |
Prompt en chinoisprompt | jusqu’à 500 | caractères chinois | Recommandée | Accepté. Le modèle peut suivre moins fidèlement un prompt plus long. |
Duréeduration | 4 à 15Par défaut 5 | secondes | Appliquée | 400 invalid_request sur duration. Secondes entières uniquement. |
Résolutionresolution | 480p, 720pPar défaut 720p | – | Appliquée | 400 invalid_request sur resolution. |
Format d’imageaspect_ratio | 16:9, 9:16, 1:1Par défaut 16:9 | – | Appliquée | 400 invalid_request sur aspect_ratio. |
Graineseed | Ignoré | – | Fournisseur | Accepté mais non transmis : Seedance 2.0 ne prend pas de graine, une graine ne reproduit donc pas un résultat. |
Durée de la vidéo d’entréeinput_video_seconds | 2 à 15 | secondes | Appliquée | 400 invalid_request sur POST /v1/quotes. Les générations par l’API ne prennent pas de vidéo en entrée. |
| Images envoyées | ||||
Images de référencereference_image_urls | jusqu’à 9 | images | Appliquée | 400 invalid_request sur reference_image_urls. |
Première image ou référencesreference_image_urls | image_url ou reference_image_urls, pas les deux | – | Appliquée | 400 invalid_request sur reference_image_urls. Seedance 2.0 utilise l’un des deux modes par tâche. |
Côté de l’imageimage_urlreference_image_urls | 300 à 6 000 | px par côté | Appliquée aux imports | Imports : 400 invalid_request sur image_url ou reference_image_urls.N, avant tout devis ou toute réservation. Autres liens : le fournisseur refuse la tâche, et rien n’est facturé. |
Forme de l’imageimage_urlreference_image_urls | 0,4 à 2,5 | largeur ÷ hauteur | Appliquée aux imports | Imports : 400 invalid_request sur image_url ou reference_image_urls.N, avant tout devis ou toute réservation. Autres liens : le fournisseur refuse la tâche, et rien n’est facturé. |
Taille d’importfile | jusqu’à 10 | Mo | Appliquée | POST /v1/uploads répond 400 invalid_request sur file. |
Formats d’importfile | JPEG, PNG, WebP | – | Appliquée | Lu dans le fichier lui-même, pas dans son nom. Tout autre format : 400 invalid_request sur file. |
Taille de l’image liéeimage_urlreference_image_urls | jusqu’à 30 | Mo | Fournisseur | Pour les images liées depuis d’autres hôtes. Le fournisseur refuse la tâche, et rien n’est facturé. |
Formats de l’image liéeimage_urlreference_image_urls | JPEG, PNG, WebP, BMP, TIFF, GIF, HEIC, HEIF | – | Fournisseur | Pour les images liées depuis d’autres hôtes. Le fournisseur refuse la tâche, et rien n’est facturé. |
| Sortie | ||||
| Pixels de sortie | 480p16:9864×4969:16496×8641:1640×640720p16:91280×7209:16720×12801:1960×960 | px | Fournisseur | Fixé par le modèle pour chaque résolution et chaque format d’image. |
| Fréquence d’images | 24 | fps | Fournisseur | Identique pour toutes les vidéos. |
| Format de sortie | MP4 | – | Fournisseur | Chaque vidéo est un MP4, avec le son quand generate_audio est activé. |
| Liens | ||||
| Lien d’import | 7 | jours | Appliquée | Ensuite, le lien répond 403. Importez à nouveau le fichier. |
| Lien de sortie | 24 | heures | Appliquée | Ensuite, le lien répond 403. Refaites un GET sur la tâche pour obtenir un nouveau lien. Le fichier lui-même est conservé 12 mois (outputs_expire_at de la tâche donne la date), plus longtemps si le résultat est enregistré dans la Bibliothèque ou utilisé dans un projet. |
Nous ne récupérons jamais d’images sur d’autres hôtes : pour ces liens, c’est le fournisseur qui vérifie la taille, et une tâche qu’il refuse n’est pas facturée. Les mêmes limites existent en JSON : GET /v1/models renvoie un objet limits pour chaque modèle.
Les tarifscalculés en toute transparence
Chaque tâche fait l’objet d’un devis en crédits avant d’être lancée (1 $ US = 100 crédits). Le tarif à la seconde sert à budgéter ; POST /v1/quotes renvoie le chiffre exact.
crédits = ceil(prix catalogue BytePlus × 0,55 × 100), où prix catalogue = (s d’entrée + s de sortie) × largeur × hauteur × 24 ÷ 1024 × tarif catalogue| Caractéristiques | Par seconde (API) | 5 s | 10 s | 15 s |
|---|---|---|---|---|
| 480pSans vidéo en entrée | 0,020 $Avec une vidéo en entrée : 0,012 $/s≈ 500 s pour 10 $ | 10 cr≈ 0,10 $ | 20 cr≈ 0,20 $ | 30 cr≈ 0,30 $ |
| 720pSans vidéo en entrée | 0,042 $Avec une vidéo en entrée : 0,025 $/s≈ 238 s pour 10 $ | 21 cr≈ 0,21 $ | 42 cr≈ 0,42 $ | 63 cr≈ 0,63 $ |
Les tâches refusées ou échouées ne sont pas facturées.
Webhookset idempotence
Les nouvelles tentatives ne facturent jamais deux fois, et vous n’avez pas besoin d’interroger en boucle.
- Idempotence
- Chaque POST de génération exige un Idempotency-Key (1 à 255 caractères ASCII visibles). La même clé dans les 24 heures renvoie la même tâche avec HTTP 200 : une nouvelle tentative après un délai dépassé ne crée ni ne facture jamais une seconde tâche.
- Prompts refusés
- Un prompt refusé par le contrôle préalable (422 content_rejected) ne crée rien : la même clé peut donc être réutilisée avec un nouveau prompt.
- Événements
job.queuedjob.processingjob.succeededjob.failedjob.cancelled- Signature
- X-Signature contient t, l’heure unix, et v1, un HMAC-SHA256 de t, d’un point et du corps brut, avec votre secret whsec_ comme clé. Refusez les horodatages de plus de cinq minutes et dédoublonnez sur X-Event-Id.
- Livraison
- Un 2xx en moins de 10 secondes vaut livraison. Les livraisons échouées sont retentées après 1 min, 5 min, 30 min, 2 h et 6 h. Les redirections ne sont pas suivies.
{
"id": "evt_01J9ZKB1QX",
"type": "job.succeeded",
"created_at": "2026-09-29T14:02:31Z",
"data": {
"job": {
"id": "job_01J9ZK4T8W",
"object": "job",
"kind": "video",
"status": "succeeded",
"money_status": "settled",
"requested_model": "seedance-2.0-mini",
"credits_charged": 42,
"outputs": [
{
"kind": "video",
"url": "https://…/job_01J9ZK4T8W.mp4?sig=…"
}
]
}
}
}import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody: the request body exactly as received, before any JSON parsing.
export function verifyWebhook(header, rawBody, secret, toleranceSec = 300) {
let t = null;
const signatures = [];
for (const item of (header ?? "").split(",")) {
const [key, value] = item.split("=", 2);
if (key === "t") t = Number(value);
if (key === "v1") signatures.push(Buffer.from(value, "hex"));
}
if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
return signatures.some((s) => s.length === expected.length && timingSafeEqual(s, expected));
}
// verifyWebhook(req.headers["x-signature"], rawBody, process.env.WEBHOOK_SECRET)
// Answer 2xx quickly, and skip an X-Event-Id you have already handled.Les erreurset que faire
Toutes les erreurs ont la même forme : un objet error avec code, message, param et request_id. Celles que vous rencontrerez le plus souvent :
| Code | HTTP | Que faire |
|---|---|---|
invalid_request | 400 | Corrigez le champ indiqué dans param. |
unauthorized | 401 | Vérifiez la clé et l’en-tête Bearer. |
insufficient_credits | 402 | Rechargez, puis réessayez avec le même Idempotency-Key. |
forbidden_model | 403 | Ajoutez le modèle ou l’outil à la liste autorisée de la clé dans le studio, ou utilisez une autre clé. Les outils comme Améliorer ont besoin de leur propre entrée. |
quote_expired | 409 | Demandez un nouveau devis ; un devis dure 10 minutes. |
price_changed | 409 | Le prix a dépassé votre plafond. Redemandez un devis ou augmentez max_credits. |
content_rejected | 422 | Rien n’a été facturé. Modifiez le prompt ou les images. |
rate_limited | 429 | Attendez la durée de Retry-After, puis réessayez. |
upstream_unavailable | 503 | Le modèle est indisponible. Réessayez plus tard ; une tâche qui ne démarre jamais n’est pas facturée. |