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 / 720p4–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 modelRésolutionTaux de sortieDescription
doubao-seedance-2.0720p$0.20/sFlagship model, highest quality
480p$0.12/sQualité standard, rentable
doubao-seedance-2.0-fast720p$0.16/sFast model, quicker generation
480p$0.10/sOption la plus abordable

Détails de facturation :

  • Vidéo de sortie: facturée selon la durée réelle × le taux
  • Image d'entrée: gratuite (aucun frais)
  • Vidéo d'entrée: facturée selon la durée de la vidéo d'entrée × le taux
  • Coût total = (durée de la vidéo d'entrée + durée de la vidéo de sortie) × le taux

Exemple : doubao-seedance-2.0 (720p), vidéo d'entrée de 5 s + sortie de 10 s → coût = (5+10)×$0.20 = $3.00

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" ou "720p" (720p par défaut)
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://xxx.volces.com/output-video.mp4",
      "cover_image_url": "https://xxx.volces.com/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)

10Conseils 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...)

11FAQ

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