Aller au contenu

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.

Point d’accèsPOST /v1/videos/generationsVersion du modèledreamina-seedance-2-0-mini-260615OpenAPIllms.txtPour les agents IA
Demander l’accès à l’API

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.

  1. 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.

    Shell
    export API_KEY="sk_test_…"
  2. 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.

    POST /videos/generations
    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
      }'
    Vous devriez voir
    {
      "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
    }
  3. 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.

    GET /jobs/{id}
    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.

Champs de requête de Seedance 2.0 Mini
ChampTypeValeurs admisesRemarques
modelObligatoirestringseedance-2.0-fast · seedance-2.0-mini · autoL’identifiant du modèle.
promptObligatoirestring2–2 000 caractèresCe qu’il faut générer : le sujet, la caméra et la lumière.
durationPar défaut 5integer4–15Durée de sortie en secondes entières, jusqu’à 15.
resolutionPar défaut "720p"string480p · 720pRésolution de sortie. 480p pour les brouillons, 720p pour la livraison ; chacune est une génération distincte.
aspect_ratioPar défaut "16:9"string16:9 · 9:16 · 1:1Forme du cadre.
generate_audioPar défaut trueboolean–Audio natif. Le prix est le même, activé ou non.
image_urlFacultatifstringURL httpsPremiè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_urlsFacultatifstring[]Jusqu’à 9 · URL httpsImages de référence pour le sujet et le style. Désignez-les dans le prompt par @image1, @image2.
seedFacultatifinteger0–2 147 483 647Accepté et ignoré : Seedance 2.0 ne prend pas de graine.
quote_idFacultatifstringqt_…Lancer au prix d’un devis obtenu avec POST /v1/quotes, valable 10 minutes.
max_creditsFacultatifnumber> 0Le maximum que cette tâche peut coûter. Au-delà, la tâche est refusée, jamais facturée.
webhook_urlFacultatifstringURL httpsUne URL https qui reçoit les événements de la tâche.
end_user_idFacultatifstring1–128 caractèresPour les comptes développeur approuvés (accès sur demande) : votre propre identifiant utilisateur pour cette requête, affiché dans l’utilisation.
project_idFacultatifstringprj_…
shot_idFacultatifstringsht_…
routing_preferenceFacultatifstringstability · speed
enhanceFacultatifobject–

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.
Limites pour seedance-2.0-mini
LimiteValeurUnitéQui vérifieAu-delà de la limite
Requête
Longueur du promptprompt2 à 2 000caractèresAppliquée400 invalid_request sur prompt, avant tout devis ou toute réservation.
Prompt en anglaispromptjusqu’à 1 000motsRecommandéeAccepté. Le modèle peut suivre moins fidèlement un prompt plus long.
Prompt en chinoispromptjusqu’à 500caractères chinoisRecommandéeAccepté. Le modèle peut suivre moins fidèlement un prompt plus long.
Duréeduration4 à 15Par défaut 5secondesAppliquée400 invalid_request sur duration. Secondes entières uniquement.
Résolutionresolution480p, 720pPar défaut 720p–Appliquée400 invalid_request sur resolution.
Format d’imageaspect_ratio16:9, 9:16, 1:1Par défaut 16:9–Appliquée400 invalid_request sur aspect_ratio.
GraineseedIgnoré–FournisseurAccepté 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_seconds2 à 15secondesAppliquée400 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_urlsjusqu’à 9imagesAppliquée400 invalid_request sur reference_image_urls.
Première image ou référencesreference_image_urlsimage_url ou reference_image_urls, pas les deux–Appliquée400 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_urls300 à 6 000px par côtéAppliquée aux importsImports : 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_urls0,4 à 2,5largeur ÷ hauteurAppliquée aux importsImports : 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’importfilejusqu’à 10MoAppliquéePOST /v1/uploads répond 400 invalid_request sur file.
Formats d’importfileJPEG, PNG, WebP–AppliquéeLu 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_urlsjusqu’à 30MoFournisseurPour 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_urlsJPEG, PNG, WebP, BMP, TIFF, GIF, HEIC, HEIF–FournisseurPour les images liées depuis d’autres hôtes. Le fournisseur refuse la tâche, et rien n’est facturé.
Sortie
Pixels de sortie480p16:9864×4969:16496×8641:1640×640720p16:91280×7209:16720×12801:1960×960pxFournisseurFixé par le modèle pour chaque résolution et chaque format d’image.
Fréquence d’images24fpsFournisseurIdentique pour toutes les vidéos.
Format de sortieMP4–FournisseurChaque vidéo est un MP4, avec le son quand generate_audio est activé.
Liens
Lien d’import7joursAppliquéeEnsuite, le lien répond 403. Importez à nouveau le fichier.
Lien de sortie24heuresAppliquéeEnsuite, 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
Prix de Seedance 2.0 Mini
CaractéristiquesPar seconde (API)5 s10 s15 s
480pSans vidéo en entrée0,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ée0,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.
Corps du webhook
{
  "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=…"
        }
      ]
    }
  }
}
Vérifier X-Signature
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 :

CodeHTTPQue faire
invalid_request400Corrigez le champ indiqué dans param.
unauthorized401Vérifiez la clé et l’en-tête Bearer.
insufficient_credits402Rechargez, puis réessayez avec le même Idempotency-Key.
forbidden_model403Ajoutez 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_expired409Demandez un nouveau devis ; un devis dure 10 minutes.
price_changed409Le prix a dépassé votre plafond. Redemandez un devis ou augmentez max_credits.
content_rejected422Rien n’a été facturé. Modifiez le prompt ou les images.
rate_limited429Attendez la durée de Retry-After, puis réessayez.
upstream_unavailable503Le modèle est indisponible. Réessayez plus tard ; une tâche qui ne démarre jamais n’est pas facturée.