S
Guide API Seedance 2.0

API de génération vidéo Seedance 2.0

Accédez aux model de génération vidéo Seedance 2.0 de ByteDance via l'API unifiée TokenHub. Prend en charge la génération texte vers vidéo, image vers vidéo, l'édition vidéo, la génération pilotée par l'audio, et plus encore. Ce guide vous accompagne tout au long du processus d'intégration.

Text → VideoImage → VideoVideo → VideoAudio Reference480p / 720p / 1080p4–15 s

1Obtenez votre API Key

  1. Visitez tokenhub.store pour créer un compte (connexion GitHub / Google prise en charge)
  2. Allez dans Dashboard → API Keys, puis cliquez sur "Create New Key"
  3. Allez dans Dashboard → Billing pour ajouter des Credits (1 Credit = 1 $ USD)
  4. Copiez votre API Key (format : th-xxxxxxxxxxxx...
⚠️ L'API Key n'est affichée qu'une seule fois lors de sa création. Enregistrez-la en lieu sûr. Si vous la perdez, vous devrez en créer une nouvelle.

2Aperçu de l'API

Base URL

https://tokenhub.store/api/v1

Authentification

Toutes les requêtes nécessitent une API Key dans l'en-tête :

Header
Authorization: Bearer th-your-api-key

Deux endpoints

POST
/videos/generations

Crée une tâche de génération vidéo, renvoie l'ID de tâche

GET
/videos/generations/{task_id}

Interroge l'état de la tâche, renvoie l'URL de la vidéo en cas de succès

3Modèles et tarification

ID du modelEntréePrixDescription
doubao-seedance-2.0Sans entrée vidéo$6.970/1M (1080p $7.727)model phare, qualité maximale. 1080p pris en charge.
Avec entrée vidéo$4.242/1M (1080p $4.697)Version phare avec entrée vidéo, rentable.
doubao-seedance-2.0-fastSans entrée vidéo$5.606/1Mmodel rapide, génération plus rapide.
Avec entrée vidéo$3.333/1Mmodel rapide avec entrée vidéo, le plus abordable.

Détails de facturation :

  • Vidéo de sortie: facturé par 1M tokens (le nombre de tokens dépend de la résolution et de la durée)
  • Image d'entrée: gratuite (aucun frais)
  • Vidéo d'entrée: facturé par 1M tokens au tarif avec entrée vidéo
  • Coût total = tokens consommés au total × tarif par token (voir le tableau ci-dessus)

Exemple : doubao-seedance-2.0 sans entrée vidéo (≤720p), génération d'une vidéo de 5 s à ~1M tokens → coût ≈ $6.970

4Paramètres de requête

ParamètreTypeObligatoireDescription
modelstringObligatoireModel ID, par ex. "doubao-seedance-2.0"
promptstringObligatoireTexte décrivant la vidéo. Les prompts en anglais donnent généralement de meilleurs résultats
durationnumberFacultatifDurée de la vidéo (sec), plage 4–15, défaut 5
resolutionstringFacultatif"480p", "720p" ou "1080p" (720p par défaut ; 1080p uniquement pour doubao-seedance-2.0)
aspect_ratiostringFacultatifRapport d'aspect : "adaptive" (par défaut), "16:9", "9:16", "1:1", etc.
image_urlstringFacultatifURL de l'image de référence (image-to-video)
image_urlsstring[]FacultatifTableau de plusieurs URL d'images de référence
video_urlstringFacultatifURL de la vidéo de référence (édition vidéo / video-to-video)
video_urlsstring[]FacultatifTableau de plusieurs URL de vidéos de référence (max 3)
video_durationsnumber[]FacultatifTableau des durées par vidéo en secondes, par ex. [3, 5]
input_video_durationnumberFacultatifDurée totale de la vidéo d'entrée en secondes (alternative à video_durations)
audio_urlstringFacultatifURL de l'audio de référence (musique de fond / SFX)
audio_urlsstring[]FacultatifTableau de plusieurs URL d'audios de référence (max 3)
generate_audiobooleanFacultatifIndiquez s’il faut générer l’audio, par défaut true
watermarkbooleanFacultatifIndiquez s’il faut ajouter un filigrane, par défaut false
contentarrayFacultatifTableau d’assets multimédias. Chaque élément : { type: "image_url", image_url: { url }, role }. Rôles pris en charge : first_frame (max 1), last_frame (max 1), reference_image, reference_video, reference_audio

5Limites d’entrée

Vous pouvez combiner librement texte, images, vidéos et audio comme entrée. Notez les limites suivantes :

Images : 0–9 par requête
Vidéos : 0–3 par requête, chacune de 2 à 15 s, durée totale ≤ 15 s
Audios : 0–3 par requête, chacun de 2 à 15 s, durée totale ≤ 15 s
❌ Les entrées "Text + Audio only" et "Pure Audio" ne sont PAS prises en charge

Formats pris en charge

  • Formats d’image : JPEG, PNG, WebP, BMP, TIFF, GIF (30MB max chacun)
  • Formats vidéo : MP4, MOV (H.264/H.265, 50MB max chacun)
  • Formats audio : WAV, MP3 (15MB max chacun)
⚡ Astuce : seule la durée de la vidéo affecte la facturation. Coût total = (durée de la vidéo d’entrée + durée de la vidéo de sortie) × rate. Les images d’entrée sont gratuites.

6Exemples API complets

L’utilisation la plus basique — décrivez une scène en texte pour générer une vidéo.

bash
curl -X POST https://tokenhub.store/api/v1/videos/generations \
  -H "Authorization: Bearer th-your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "doubao-seedance-2.0",
    "prompt": "A golden retriever running on a sunny beach, waves crashing in the background, cinematic slow motion, 4K quality",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "watermark": false
  }'

Réponse :

json
{
  "id": "xxxxxx-task-id",
  "object": "video.generation.task",
  "model": "doubao-seedance-2.0",
  "status": "queued",
  "created": 1719900000
}

La génération vidéo est asynchrone — interrogez le statut jusqu’à la fin.

bash
# Poll task status using the task_id from creation response
curl https://tokenhub.store/api/v1/videos/generations/YOUR_TASK_ID \
  -H "Authorization: Bearer th-your-api-key"

Tâche en cours :

json
{
  "id": "YOUR_TASK_ID",
  "object": "video.generation.task",
  "model": "doubao-seedance-2.0",
  "status": "running",
  "created": 1719900000
}

Tâche terminée (URL de la vidéo reçue) :

json
{
  "id": "YOUR_TASK_ID",
  "object": "video.generation.task",
  "model": "doubao-seedance-2.0",
  "status": "succeeded",
  "created": 1719900000,
  "data": [
    {
      "video_url": "https://tokenhub-data.tos-cn-hongkong.volces.com/user_sd_file/YOUR_TASK_ID.mp4",
      "cover_image_url": "https://tokenhub-data.tos-cn-hongkong.volces.com/user_sd_file/YOUR_TASK_ID_cover.jpg"
    }
  ],
  "usage": {
    "video_duration": 5
  }
}
💡 Intervalle d’interrogation recommandé : toutes les 3 à 5 secondes. Valeurs de statut : queued → waiting, running → generating, succeeded → done, failed → error

7Exemple complet en Python

python
import requests
import time

API_BASE = "https://tokenhub.store/api/v1"
API_KEY = "th-your-api-key"

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

# Step 1: Create video generation task
payload = {
    "model": "doubao-seedance-2.0",
    "prompt": "A majestic eagle soaring over snow-capped mountains, golden hour lighting, cinematic aerial shot",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "16:9",
    "watermark": False
}

resp = requests.post(f"{API_BASE}/videos/generations", json=payload, headers=headers)
task = resp.json()
task_id = task["id"]
print(f"Task created: {task_id}, status: {task['status']}")

# Step 2: Poll for result
while True:
    resp = requests.get(f"{API_BASE}/videos/generations/{task_id}", headers=headers)
    result = resp.json()
    status = result["status"]
    print(f"Status: {status}")

    if status == "succeeded":
        video_url = result["data"][0]["video_url"]
        duration = result["usage"]["video_duration"]
        print(f"Video ready! Duration: {duration}s")
        print(f"URL: {video_url}")
        break
    elif status == "failed":
        print(f"Failed: {result.get('error', {}).get('message', 'Unknown error')}")
        break

    time.sleep(5)

8Exemple complet en JavaScript / Node.js

javascript
const API_BASE = "https://tokenhub.store/api/v1";
const API_KEY = "th-your-api-key";

const headers = {
  "Authorization": `Bearer ${API_KEY}`,
  "Content-Type": "application/json"
};

// Step 1: Create task
const createResp = await fetch(`${API_BASE}/videos/generations`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    model: "doubao-seedance-2.0",
    prompt: "A majestic eagle soaring over snow-capped mountains, cinematic aerial shot",
    duration: 5,
    resolution: "720p",
    aspect_ratio: "16:9",
    watermark: false,
  }),
});
const task = await createResp.json();
console.log("Task created:", task.id);

// Step 2: Poll for result
const poll = async () => {
  while (true) {
    const resp = await fetch(`${API_BASE}/videos/generations/${task.id}`, { headers });
    const result = await resp.json();
    console.log("Status:", result.status);

    if (result.status === "succeeded") {
      console.log("Video URL:", result.data[0].video_url);
      console.log("Duration:", result.usage.video_duration, "seconds");
      return result;
    }
    if (result.status === "failed") {
      console.error("Failed:", result.error?.message);
      return result;
    }
    await new Promise(r => setTimeout(r, 5000));
  }
};

await poll();

9Exemple Python image vers vidéo

python
import requests, time

API_BASE = "https://tokenhub.store/api/v1"
headers = {
    "Authorization": "Bearer th-your-api-key",
    "Content-Type": "application/json"
}

# Image-to-Video with a single reference image
payload = {
    "model": "doubao-seedance-2.0",
    "prompt": "The woman in the photo turns to face the camera and smiles warmly, her hair gently blowing in the wind",
    "duration": 5,
    "resolution": "720p",
    "image_url": "https://your-bucket.com/portrait.jpg",
    "watermark": False
}

resp = requests.post(f"{API_BASE}/videos/generations", json=payload, headers=headers)
task_id = resp.json()["id"]
print(f"Task: {task_id}")

# Poll for result
while True:
    r = requests.get(f"{API_BASE}/videos/generations/{task_id}", headers=headers).json()
    if r["status"] == "succeeded":
        print(f"Done: {r['data'][0]['video_url']}")
        break
    elif r["status"] == "failed":
        print(f"Error: {r.get('error', {}).get('message')}")
        break
    time.sleep(5)

10Image d'une personne réelle vers vidéo

Lorsque votre image d'entrée contient une personne réelle, TokenHub redirige automatiquement la requête vers un upstream qui prend en charge la génération de personnes réelles. Aucune modification côté client requise.

Se déclenche automatiquement lorsque le filtre de contenu en amont détecte une personne réelle dans l'image d'entrée.

La structure de la requête est identique à celle d'une conversion image-to-video ordinaire — même corps POST /v1/videos/generations.

Deux formats de réponse possibles

  • Normal : { "id": "cgt-...", "status": "queued" } (comportement existant)
  • Parcours personne réelle : { "id": "pat-...", "status": "queued" } — traitement supplémentaire des assets, prévoyez 10 à 90 secondes de latence additionnelle

Le polling GET est identique — appelez /v1/videos/generations/{id} avec l'id renvoyé par POST, jusqu'à ce que status soit succeeded ou failed. Les réécritures d'id sont gérées côté serveur ; vous voyez toujours le même id pendant toute la durée de vie de la requête.

Erreur : unsupported_real_person_input

Renvoyé avec le statut 400 lorsqu'aucun fournisseur prenant en charge les personnes réelles n'est configuré pour votre compte. Contactez votre administrateur pour activer un fournisseur pris en charge.

Erreur : délai d'attente du traitement des assets dépassé

Renvoyé via GET avec status: failed lorsque la préparation des assets en amont dépasse 5 minutes. Vous pouvez relancer la requête sans risque.

Exemple de cycle de vie complet

Le pat-id est opaque pour votre client — continuez le polling jusqu'à ce que status change.

bash
# POST
curl -X POST https://tokenhub.store/api/v1/videos/generations \
  -H "Authorization: Bearer $TH_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "doubao-seedance-2.0",
    "prompt": "let her dance and spin",
    "duration": 8,
    "resolution": "480p",
    "content": [
      { "type": "image_url", "image_url": { "url": "https://example.com/portrait.png" }, "role": "first_frame" }
    ]
  }'
# → {"id":"pat-abc123","status":"queued"}

# GET (asset still uploading)
curl https://tokenhub.store/api/v1/videos/generations/pat-abc123 -H "Authorization: Bearer $TH_KEY"
# → {"id":"pat-abc123","status":"queued"}

# GET (upstream task running)
# → {"id":"pat-abc123","status":"running"}

# GET (complete — id stays pat-, video_url in data)
# → {"id":"pat-abc123","status":"succeeded","data":[{"video_url":"..."}]}

11Conseils pour les prompts

Structure de base

Format recommandé : [Sujet] + [Action] + [Environnement/Arrière-plan] + [Caméra/Style]

Exemples de bons prompts

  • "A young woman walking through a cherry blossom garden, petals falling in slow motion, soft natural lighting, cinematic 35mm film look"
  • "Close-up of hands pouring latte art into a ceramic cup, steam rising, warm cafe ambiance, shallow depth of field"
  • "Aerial drone shot of a winding river through autumn forest, golden and red leaves, morning mist, 4K cinematic"

Conseils pour les images/vidéos de référence

  • Utilisez "image 1", "image 2", "video 1", "audio 1" dans le prompt pour faire référence à vos assets
  • Précisez le contenu de la scène par segment temporel (par ex. "0-2s: xxx, 2-4s: xxx")
  • Précisez les images de début/fin (par ex. "first frame is image 1", "end frame freezes on image 2")
  • Précisez la source du cadrage caméra (par ex. "use video 1 POV throughout")
  • Précisez l’usage de l’audio (par ex. "use audio 1 as background music throughout")

Conseils

  • Les prompts en anglais donnent généralement de meilleurs résultats ; le chinois est également pris en charge
  • Des descriptions plus précises et plus vivantes donnent de meilleurs résultats
  • Évitez les descriptions trop abstraites (par ex. "a nice video")
  • Le vocabulaire caméra améliore nettement la qualité (slow motion, close-up, aerial shot, tracking shot...)

12FAQ

Prêt à commencer ?

Inscrivez-vous sur TokenHub et commencez dès maintenant à utiliser l’API de génération vidéo Seedance 2.0

© 2026 TokenHub · Powered by ByteDance Seedance 2.0 · support@tokenhub.store