🎁 Nouveau Inscription gratuite, 10 appels offerts. Jusqu'à 1 $, sans carte.

Génération de vidéos

POST /v1/videos · GET /v1/videos/{id} · DELETE /v1/videos/{id}

Générez de courtes vidéos à partir d'un prompt texte, éventuellement guidées par des frames de référence (première/dernière). C'est une API de jobs asynchrones au format standard create + poll : POST /v1/videos crée une tâche qui répond en ~2 secondes, vous la sondez jusqu'à la fin, et l'en-tête Prefer: wait transforme les générations rapides en un seul appel synchrone. Modèles Seedance, une seule clé API, la même facturation que les autres endpoints.

L'API vidéo est en preview limitée (tests sur invitation). Les modèles apparaissent dans le catalogue et la tarification, mais créer des tâches nécessite que votre espace de travail soit sur liste d'autorisation — contactez-nous pour l'activer.

Endpoints et cycle de vie d'une tâche

Une ressource tâche, quatre opérations. Une tâche passe de queuedin_progress → un état terminal : completed, failed ou cancelled. La réponse de création inclut des liens status_url / cancel_url prêts à l'emploi — vous n'assemblez jamais d'URL à la main.

Point de terminaisonDescription
POST /v1/videosCrée une tâche de génération. Répond en ~2 s avec l'objet tâche (status queued) et les liens de suivi.
GET /v1/videos/{id}Sonde la tâche. En completed vous obtenez data[0].url, usage.completion_tokens et les paramètres réellement appliqués ; en failed une erreur structurée avec le code et le message du fournisseur.
DELETE /v1/videos/{id}Annule la tâche. Seules les tâches queued peuvent être annulées ; une tâche annulée n'est jamais facturée.
GET /v1/videos/modelsListe les modèles vidéo disponibles pour votre clé, avec les contraintes de résolution/durée et les prix par modèle.

Sucre synchrone — Prefer: wait

Ajoutez un en-tête Prefer: wait ou Prefer: wait=N (N borné à 1..60 secondes) à l'appel de création et la passerelle garde la requête ouverte. Si la tâche se termine dans la fenêtre, vous recevez directement l'objet terminal — URL de la vidéo et usage inclus, sans polling. Sinon, l'appel se dégrade proprement : vous recevez l'objet d'état courant (pas d'erreur, la tâche continue) et poursuivez avec le polling normal.

Corps de la requête

ParamètreTypeDescription
model*stringLe modèle vidéo à utiliser (p. ex. seedance-1-5-pro-251215). Listez tous les modèles disponibles via GET /v1/videos/models.
prompt*stringDescription texte de la vidéo souhaitée.
imagestring | string[]Entrée image-to-video : une image = première frame, deux images = première + dernière frame. Chaque entrée est un data URI ou une URL https.
resolutionstringRésolution de sortie : 480p, 720p, 1080p ou 4k. L'ensemble supporté varie selon le modèle — voir le tableau des modèles.
ratiostringFormat d'image : 16:9, 4:3, 1:1, 3:4, 9:16, 21:9 ou adaptive.
durationintegerDurée du clip en secondes (plage par modèle, entre 2 et 15). Certains modèles acceptent aussi -1 pour laisser le modèle choisir.
seedintegerSeed optionnelle pour une sortie reproductible (selon le modèle).
watermarkbooleanAfficher ou non le filigrane du fournisseur.
generate_audiobooleanGénérer une piste audio (true par défaut). Sur les modèles à double tarif, cela change le prix — voir le tableau des modèles.

Modèles disponibles

La disponibilité des modèles dépend de votre déploiement. Récupérez la liste en direct, sensible à la conformité — avec les contraintes de résolution/durée et les prix de chaque modèle — via GET /v1/videos/models. La gamme actuelle :

ModèleRésolutionsDuréePrixRemarques
dreamina-seedance-2-0-260128 480p · 720p · 1080p · 4k 4–15 s 480p/720p $7.0 · 1080p $7.7 · 4k $4.0 Fleuron 2.0 ; jusqu'à 4K
dreamina-seedance-2-0-fast-260128 480p · 720p 4–15 s $5.6 Variante 2.0 plus rapide
dreamina-seedance-2-0-mini-260615 480p · 720p 4–15 s $3.5 Variante 2.0 la plus compacte
seedance-1-5-pro-251215 480p · 720p · 1080p 4–12 s $2.4 audio · $1.2 muted Tarif selon generate_audio
seedance-1-0-pro-fast-251015 480p · 720p · 1080p 2–12 s $1.0 Le moins cher

Prix : USD par 1M de video tokens. seedance-1-5-pro-251215 facture $2.4 avec la piste audio activée (generate_audio: true, le défaut) et $1.2 sans ; les autres modèles ont un tarif unique par palier de résolution.

Video tokens et tarification

La vidéo est facturée en video tokens, dérivés de la sortie réelle : tokens ≈ largeur × hauteur × 24 fps × secondes / 1024. Les tarifs sont par 1M de video tokens et suivent les paramètres réellement appliqués (renvoyés dans la tâche completed) — ratio: "adaptive" et duration: -1 sont donc facturés selon ce que le modèle a réellement produit.

Repères concrets sur seedance-1-5-pro-251215 avec audio : un clip 480p / 16:9 / 4 s ≈ 40,6K video tokens ≈ $0.10 ; un clip 720p / 5 s ≈ 108,9K tokens ≈ $0.26.

Facturation

Facturé uniquement en cas de succès : le débit a lieu une seule fois, quand la tâche atteint completed pour la première fois, au prorata de l'usage en video tokens renvoyé. Les tâches échouées (y compris les rejets de modération de contenu) et annulées ne sont jamais facturées — l'erreur du fournisseur est transmise telle quelle.

!

Le data[0].url renvoyé est une URL fournisseur pré-signée qui expire au bout d’environ 24 heures — téléchargez rapidement et réhébergez le fichier sur votre propre stockage si vous en avez besoin durablement.

Exemple — curl, en un coup (Prefer: wait)

curl https://synthorai.io/v1/videos \
  -H "Authorization: Bearer $SYNTHORAI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Prefer: wait=60" \
  -d '{
    "model": "seedance-1-0-pro-fast-251015",
    "prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
    "resolution": "480p",
    "ratio": "16:9",
    "duration": 4
  }'

# Finished inside the wait window → the terminal object comes straight back:
{
  "id": "vid_6091d8d1af805818b1470488",
  "object": "video",
  "model": "seedance-1-0-pro-fast-251015",
  "status": "completed",
  "data": [{ "url": "https://…tos….mp4?…" }],
  "usage": { "completion_tokens": 40594, "total_tokens": 40594 },
  "resolution": "480p", "ratio": "16:9", "duration": 4, "fps": 24,
  "seed": 34142
}
# Not done in time → the current status object is returned instead (no error,
# the task keeps running) — continue polling status_url as usual.

Exemple — curl, create + poll

# 1) Create — returns in ~2 s with a queued task object
curl https://synthorai.io/v1/videos \
  -H "Authorization: Bearer $SYNTHORAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-1-5-pro-251215",
    "prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
    "resolution": "720p",
    "duration": 5,
    "generate_audio": true
  }'

{
  "id": "vid_6091d8d1af805818b1470488",
  "object": "video",
  "model": "seedance-1-5-pro-251215",
  "status": "queued",
  "created_at": 1784619862,
  "status_url": "https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488",
  "cancel_url": "https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488"
}

# 2) Poll until status is terminal (completed | failed | cancelled)
curl https://synthorai.io/v1/videos/vid_6091d8d1af805818b1470488 \
  -H "Authorization: Bearer $SYNTHORAI_API_KEY"

{
  "id": "vid_6091d8d1af805818b1470488",
  "object": "video",
  "model": "seedance-1-5-pro-251215",
  "status": "completed",
  "data": [{ "url": "https://…tos….mp4?…" }],
  "usage": { "completion_tokens": 108900, "total_tokens": 108900 },
  "resolution": "720p", "ratio": "16:9", "duration": 5, "fps": 24,
  "seed": 34142, "generate_audio": true
}

# 3) Download the video — the URL is pre-signed (no auth header) and expires
#    in ~24 h: fetch promptly and re-host if you need it long-term.
curl -o out.mp4 "https://…tos….mp4?…"

Exemple — Python (requests)

import time
import requests

BASE = "https://synthorai.io/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}

task = requests.post(f"{BASE}/videos", headers=HEADERS, json={
    "model": "seedance-1-5-pro-251215",
    "prompt": "A corgi puppy chasing a butterfly across a meadow, cinematic",
    "resolution": "720p",
    "duration": 5,
}).json()

while task["status"] not in ("completed", "failed", "cancelled"):
    time.sleep(5)
    task = requests.get(task["status_url"], headers=HEADERS).json()

if task["status"] == "completed":
    url = task["data"][0]["url"]  # pre-signed, valid ~24 h — re-host promptly
    with open("out.mp4", "wb") as f:
        f.write(requests.get(url).content)
else:
    print(task["error"])  # provider code + message, passed through verbatim

Exemple — Node (fetch)

import fs from "node:fs";

const BASE = "https://synthorai.io/v1";
const HEADERS = { Authorization: `Bearer ${process.env.SYNTHORAI_API_KEY}` };

let task = await (await fetch(`${BASE}/videos`, {
  method: "POST",
  headers: { ...HEADERS, "Content-Type": "application/json" },
  body: JSON.stringify({
    model: "seedance-1-5-pro-251215",
    prompt: "A corgi puppy chasing a butterfly across a meadow, cinematic",
    resolution: "720p",
    duration: 5,
  }),
})).json();

while (!["completed", "failed", "cancelled"].includes(task.status)) {
  await new Promise((r) => setTimeout(r, 5000));
  task = await (await fetch(task.status_url, { headers: HEADERS })).json();
}

if (task.status === "completed") {
  const url = task.data[0].url; // pre-signed, valid ~24 h — re-host promptly
  fs.writeFileSync("out.mp4", Buffer.from(await (await fetch(url)).arrayBuffer()));
} else {
  console.error(task.error); // provider code + message, passed through verbatim
}

Idempotence

Passez un en-tête X-Idempotency-Key sur l'appel de création pour sécuriser les retries : une requête répétée avec la même clé renvoie 409 au lieu de créer (et facturer) une seconde tâche. La génération vidéo est lente et sujette aux retries — cela évite les doubles débits.