# Génération de vidéos

> Générez des vidéos à partir de texte ou d'images de manière asynchrone, avec audio, résolution et format d'image optionnels.

- Canonical: https://tchavi.com/fr/docs/video-generation

---


<Endpoint method="POST" path="/v1/videos/generations" />

La génération de vidéos s'exécute de manière asynchrone : le point d'accès renvoie immédiatement un `202` avec un `job.id`, et la vidéo est rendue en arrière-plan. Interrogez `GET /v1/jobs/:id` (voir [Tâches asynchrones](/fr/docs/jobs)) jusqu'à ce que `status` passe à `completed` ou `failed`. Le helper `createAndWait(...)` du SDK fait les deux en un seul appel.

La facturation se fait par seconde de sortie, selon la résolution : **480p = 260 cr/sec** · **720p = 580 cr/sec**. Un clip 480p typique de 10 secondes coûte 2 600 crédits. Si une tâche échoue après facturation (erreur en amont, dépassement de délai), les crédits débités sont automatiquement remboursés.

## Paramètres

| Paramètre              | Type     | Requis | Description                                                                                                       |
| ---------------------- | -------- | ------ | ----------------------------------------------------------------------------------------------------------------- |
| `model`                | string   | Oui    | `seedance-2` (ByteDance Seedance 2.0) ou `kling-v3` (Kuaishou Kling V3).                                          |
| `prompt`               | string   | Oui    | Description textuelle de la scène et du mouvement.                                                                |
| `duration`             | integer  | Non    | Secondes, 1–15. Utilisez `-1` pour automatique (facturé à 10 s). Par défaut `5`.                                  |
| `resolution`           | string   | Non    | `"480p"` ou `"720p"`. Par défaut `"480p"`.                                                                        |
| `aspect_ratio`         | string   | Non    | `16:9`, `9:16`, `1:1`, `4:3`, `3:4`, ou `adaptive`. Par défaut `"16:9"`.                                          |
| `generate_audio`       | boolean  | Non    | Synthétise une bande-son (dialogues, effets sonores, musique). Par défaut `true`.                                 |
| `seed`                 | integer  | Non    | Fixe la sortie pour la reproductibilité.                                                                          |
| `image_url`            | string   | Non    | Référence de première image (URL HTTP). Active l'image-vers-vidéo.                                                |
| `last_frame_image_url` | string   | Non    | Image cible de fin. Requiert `image_url`.                                                                         |
| `reference_images`     | string[] | Non    | Jusqu'à 9 URL. Mutuellement exclusif avec `image_url`. Référencées dans le prompt comme `[Image1]`, `[Image2]`, … |
| `reference_videos`     | string[] | Non    | Jusqu'à 3 URL (cumul ≤ 15 s). Référencées comme `[Video1]`, …                                                     |
| `reference_audios`     | string[] | Non    | Jusqu'à 3 URL. Requiert `image_url` ou `reference_images`. Référencées comme `[Audio1]`, …                        |

## Exemple

<CodeTabs>

```tchavi
import Tchavi from '@tchavi/sdk';

const client = new Tchavi({ apiKey: 'YOUR_API_KEY' });

// En une ligne : soumettre + interroger jusqu'à completed/failed
const job = await client.videos.generations.createAndWait({
  model: 'seedance-2',
  prompt: 'Un plan cinématographique de la statue de l\'Amazone de Cotonou à l\'heure dorée',
  duration: 5,
  resolution: '480p',
  aspect_ratio: '9:16',
  generate_audio: true,
});

if (job.status === 'completed') {
  console.log('URL de la vidéo :', job.output?.video_url);
  console.log('Crédits utilisés :', job.tchavi?.credits_used);
} else {
  console.error('Échec :', job.error?.message);
}
```

```javascript
// 1. Soumettre — renvoie { id, status: 'processing', ... }
const submission = await fetch('https://tchavi.com/api/v1/videos/generations', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: 'Bearer YOUR_API_KEY',
  },
  body: JSON.stringify({
    model: 'seedance-2',
    prompt: "Un plan cinématographique de la statue de l'Amazone de Cotonou à l'heure dorée",
    duration: 5,
    resolution: '480p',
    aspect_ratio: '9:16',
  }),
}).then((r) => r.json());

// 2. Interroger toutes les 5 s jusqu'à ce que la tâche soit terminée
let job;
do {
  await new Promise((r) => setTimeout(r, 5000));
  job = await fetch(`https://tchavi.com/api/v1/jobs/${submission.id}`, {
    headers: { Authorization: 'Bearer YOUR_API_KEY' },
  }).then((r) => r.json());
} while (job.status === 'pending' || job.status === 'processing');

console.log(job.status, job.output?.video_url);
```

```python
import requests, time

submission = requests.post(
    "https://tchavi.com/api/v1/videos/generations",
    headers={
        "Content-Type": "application/json",
        "Authorization": "Bearer YOUR_API_KEY",
    },
    json={
        "model": "seedance-2",
        "prompt": "Un plan cinématographique de la statue de l'Amazone de Cotonou à l'heure dorée",
        "duration": 5,
        "resolution": "480p",
    },
).json()

while True:
    time.sleep(5)
    job = requests.get(
        f"https://tchavi.com/api/v1/jobs/{submission['id']}",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
    ).json()
    if job["status"] in ("completed", "failed"):
        break

print(job["status"], job.get("output", {}).get("video_url"))
```

```curl
# Soumettre
curl -X POST https://tchavi.com/api/v1/videos/generations \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "model": "seedance-2",
    "prompt": "Un plan cinématographique à l'\''heure dorée",
    "duration": 5,
    "resolution": "480p"
  }'

# Interroger (remplacez JOB_ID par l'id renvoyé dans la réponse de soumission)
curl https://tchavi.com/api/v1/jobs/JOB_ID \
  -H "Authorization: Bearer YOUR_API_KEY"
```

</CodeTabs>

