> ## Documentation Index
> Fetch the complete documentation index at: https://docs.iacrea.com/llms.txt
> Use this file to discover all available pages before exploring further.

# API Vidéo - Création

> Créer une vidéo complète avec intro, outro, séquences animées, transitions et effets avant/après

# API Vidéo - Création

Crée une vidéo complète avec plusieurs séquences. Chaque séquence peut contenir des médias (images ou vidéos) animés selon le type d'animation spécifié. Vous pouvez ajouter une intro, une outro, des transitions entre séquences, un logo, et des effets avant/après.

<ParamField path="POST /api/video-editor/generate/video" />

## Authentification

Toutes les requêtes doivent inclure l'en-tête :

* `x-api-key: VOTRE_API_KEY`

## En-têtes

<ParamField header="x-api-key" type="string" required>
  Votre clé API IACrea
</ParamField>

<ParamField header="Content-Type" type="string" required>
  Doit être `application/json`
</ParamField>

## Corps de requête

<ParamField body="video" type="object" required>
  Objet vidéo contenant toutes les séquences et paramètres
</ParamField>

<ParamField body="video.format" type="string" required>
  Format de la vidéo : `"landscape" | "portrait" | "square"`
</ParamField>

<ParamField body="video.template" type="string">
  Template vidéo. Défaut : `"SaleProperty"`. Optionnel.
</ParamField>

<ParamField body="video.music" type="string">
  URL de la musique de fond. Optionnel.
</ParamField>

<ParamField body="video.font" type="string">
  Police de caractères (ex : `"Inter"`). Défaut : `"Inter"`. Optionnel.
</ParamField>

<ParamField body="video.colors" type="array" required>
  Tableau de deux couleurs `[background, text]` (ex : `["#1a1a2e", "#ffffff"]`).
  La première couleur est le fond, la seconde la couleur du texte.
</ParamField>

<ParamField body="video.displayLogo" type="boolean" required>
  Active l'affichage du logo sur les séquences vidéo/image (coin supérieur
  droit, 100 px). Le logo sur les intro/outro est contrôlé séparément via
  `sequence.data.displayLogo`.
</ParamField>

<ParamField body="video.logoUrl" type="string">
  URL du logo. Nécessaire si `displayLogo=true` ou si vous souhaitez afficher le
  logo sur les intros/outros. Optionnel.
</ParamField>

## Séquences

<ParamField body="video.sequences" type="array" required>
  Tableau de séquences vidéo ordonnées. Chaque séquence représente un clip dans
  la vidéo finale. Les séquences sont composées dans l'ordre de leur champ
  `order`.
</ParamField>

<ParamField body="video.sequences[].order" type="number" required>
  Ordre d'affichage de la séquence dans la vidéo (commence à 0). L'intro doit
  être en premier (`0`), l'outro en dernier.
</ParamField>

<ParamField body="video.sequences[].duration" type="number" required>
  Durée de la séquence en secondes. - Séquences `"video"` : max 5 secondes
  (plafonné automatiquement) - Séquences `"intro"` : 2 à 5 secondes (recommandé
  : 3) - Séquences `"outro"` : 3 à 5 secondes (recommandé : 5) - Séquences
  `"image"` : libre
</ParamField>

<ParamField body="video.sequences[].type" type="string" required>
  Type de séquence : - `"intro"` — Écran d'introduction (logo + texte de
  présentation) - `"outro"` — Écran de fin (logo + coordonnées ou texte) -
  `"video"` — Séquence vidéo animée (déclenche la génération IA) - `"image"` —
  Séquence image statique - `"beforeAfter"` — Séquence avant/après (slide
  comparatif statique)
</ParamField>

<ParamField body="video.sequences[].animationType" type="string" required>
  Type d'animation. Valeurs possibles :

  **Mouvements de caméra :**

  * `"CAMERA_PUSH_IN"` — Zoom avant
  * `"CAMERA_PUSH_OUT"` — Zoom arrière
  * `"CAMERA_MOVE_RIGHT"` — Déplacement vers la droite
  * `"CAMERA_CRANE_UP"` — Mouvement vers le haut
  * `"CAMERA_ORBIT_LEFT"` — Rotation vers la gauche

  **Effets automatiques IA :**

  * `"AUTO_EFFECTS"` — Animation automatique (prompt généré par IA)
  * `"AUTO_REVERSE"` — Animation automatique inversée

  **Effets spéciaux :**

  * `"REALTOR_SMILING"` — Animation portrait agent immobilier

  **Avant/Après (nécessitent 2 images) :**

  * `"BEFORE_AFTER_INTERIOR"` — Transformation intérieur (meublage progressif)
  * `"BEFORE_AFTER_EXTERIOR"` — Transformation extérieur (aménagement paysager)
  * `"BEFORE_AFTER_DECLUTTER"` — Débarras (meubles qui disparaissent)
  * `"BEFORE_AFTER_RENOVATION"` — Rénovation (timelapse avec équipe de rénovation)

  **Sans animation :**

  * `"none"` — Aucune animation
  * `"fade"` — Fondu simple
</ParamField>

## Médias

<ParamField body="video.sequences[].medias" type="array" required>
  Tableau de médias pour cette séquence. Au moins un média requis pour les types
  `"video"` et `"image"`. Les séquences `"intro"` et `"outro"` n'ont pas besoin
  de médias (tableau vide `[]`).
</ParamField>

<ParamField body="video.sequences[].medias[].url" type="string" required>
  URL de l'image ou de la vidéo source. Pour les effets BEFORE\_AFTER, il s'agit
  de l'image **"avant"**.
</ParamField>

<ParamField body="video.sequences[].medias[].start" type="number" required>
  Temps de début du média dans la séquence (en secondes). Généralement `0`.
</ParamField>

<ParamField body="video.sequences[].medias[].end" type="number" required>
  Temps de fin du média dans la séquence (en secondes). Doit correspondre à la
  durée.
</ParamField>

<ParamField body="video.sequences[].medias[].order" type="number">
  Ordre du média dans la séquence. Optionnel. Défaut : `0`.
</ParamField>

<ParamField body="video.sequences[].medias[].selected" type="boolean">
  Média actif dans la séquence. Mettez `true` pour le média principal.
  Optionnel.
</ParamField>

## Données de séquence (data)

<ParamField body="video.sequences[].data" type="object">
  Données supplémentaires pour la séquence. Le contenu varie selon le type de
  séquence.
</ParamField>

### Données Intro (`type: "intro"`)

<ParamField body="video.sequences[].data.description" type="string">
  Texte affiché sous le logo (ex : `"vous présente"`, `"À vendre"`).
</ParamField>

<ParamField body="video.sequences[].data.displayLogo" type="boolean">
  Afficher le logo (de `video.logoUrl`) sur l'intro. Défaut : `true`.
</ParamField>

<ParamField body="video.sequences[].data.bg" type="string">
  Couleur de fond personnalisée pour l'intro (ex : `"#1a1a2e"`). Défaut :
  première couleur de `video.colors`.
</ParamField>

### Données Outro (`type: "outro"`)

<ParamField body="video.sequences[].data.avatar" type="string">
  URL de la photo de profil (agent, conseiller). Affichée en cercle.
</ParamField>

<ParamField body="video.sequences[].data.displayAvatar" type="boolean">
  Afficher l'avatar sur l'outro. Défaut : `true`.
</ParamField>

<ParamField body="video.sequences[].data.name" type="string">
  Nom affiché sur l'outro (ex : `"Jean Dupont"`).
</ParamField>

<ParamField body="video.sequences[].data.email" type="string">
  Email affiché sur l'outro.
</ParamField>

<ParamField body="video.sequences[].data.tel" type="string">
  Téléphone affiché sur l'outro.
</ParamField>

<ParamField body="video.sequences[].data.displayLogo" type="boolean">
  Afficher le logo (de `video.logoUrl`) sur l'outro. Défaut : `true`.
</ParamField>

<ParamField body="video.sequences[].data.bg" type="string">
  Couleur de fond personnalisée pour l'outro.
</ParamField>

Pour les templates `Interview` et `Sample` (générique) :

<ParamField body="video.sequences[].data.title" type="string">
  Titre affiché sur l'outro.
</ParamField>

<ParamField body="video.sequences[].data.description" type="string">
  Description affichée sous le titre.
</ParamField>

### Données Before/After

<ParamField body="video.sequences[].data.afterImage" type="string">
  **Requis pour les effets BEFORE\_AFTER.** URL de l'image "après"
  transformation. L'image "avant" est fournie via `medias[0].url`.
</ParamField>

## Transitions

Les transitions définissent comment une séquence **entre en scène** par rapport à la précédente.
La transition est définie dans le champ `data.transition` de la séquence cible.

<ParamField body="video.sequences[].data.transition" type="object">
  Configuration de la transition d'entrée pour cette séquence.
</ParamField>

<ParamField body="video.sequences[].data.transition.type" type="string">
  Type de transition : - `"fade"` — Fondu enchaîné (défaut) - `"wipe"` —
  Balayage horizontal - `"slide"` — Glissement - `"flip"` — Retournement -
  `"clock-wipe"` — Balayage en horloge - `"iris"` — Ouverture circulaire -
  `"none"` — Pas de transition
</ParamField>

<ParamField body="video.sequences[].data.transition.duration" type="number">
  Durée de la transition en **frames** (1 à 120). À 30 fps : - `15` ≈ 0.5
  seconde - `20` ≈ 0.67 seconde (défaut) - `30` ≈ 1 seconde - `60` ≈ 2 secondes
</ParamField>

## Logo — Comportement détaillé

Le logo est contrôlé à deux niveaux :

1. **Niveau vidéo** (`video.displayLogo` + `video.logoUrl`) :
   * Active l'affichage du logo en **coin supérieur droit** (100 px) sur les séquences de type `"video"` et `"image"`.

2. **Niveau séquence** (`sequence.data.displayLogo`) :
   * Sur les `"intro"` et `"outro"` : le logo de `video.logoUrl` est affiché **centré** (200 px pour l'intro, 150 px pour l'outro).
   * Contrôlé individuellement par `sequence.data.displayLogo` (défaut `true`).
   * Pour masquer le logo sur une intro/outro spécifique, passez `"displayLogo": false` dans son `data`.

## Webhook

<ParamField body="webhookUrl" type="string">
  URL du webhook pour recevoir une notification lorsque la vidéo est terminée.
  Optionnel.
</ParamField>

## Réponses

### 201 — Créé avec succès

<ResponseField name="id" type="string">
  Identifiant unique de la vidéo générée. À utiliser avec `GET
      /api/video-editor/generate/video/{id}` pour suivre l'avancement.
</ResponseField>

<ResponseField name="generatedContent" type="array">
  Liste des contenus générés (un élément par séquence de type `"video"`). Chaque
  élément contient : - `id` : Identifiant de génération - `url` : URL de l'image
  source - `effect` : Type d'animation - `format` : Format de la vidéo -
  `status` : Statut (`"pending" | "success" | "error"`)
</ResponseField>

<ResponseField name="creditsTotal" type="number">
  Nombre de crédits restants
</ResponseField>

<ResponseField name="creditsUsed" type="number">
  Nombre de crédits utilisés pour cette génération
</ResponseField>

### 400 — Erreur de validation

Renvoyé si le corps de requête est invalide (séquence manquante, format invalide, etc.).

### 401 — Non autorisé

Renvoyé si `x-api-key` est manquant ou invalide.

### 500 — Erreur serveur

Erreur interne du serveur.

***

## Exemples

### Exemple 1 — Vidéo basique avec intro + outro + logo

```bash theme={null}
curl --request POST \
  --url 'https://iacrea.com/api/video-editor/generate/video' \
  --header 'x-api-key: VOTRE_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "video": {
      "format": "landscape",
      "template": "SaleProperty",
      "music": "https://exemple.com/music.mp3",
      "font": "Inter",
      "colors": ["#1a1a2e", "#ffffff"],
      "displayLogo": true,
      "logoUrl": "https://exemple.com/logo.png",
      "sequences": [
        {
          "order": 0,
          "duration": 3,
          "type": "intro",
          "animationType": "fade",
          "medias": [],
          "data": {
            "description": "vous présente",
            "displayLogo": true
          }
        },
        {
          "order": 1,
          "duration": 5,
          "type": "video",
          "animationType": "CAMERA_PUSH_IN",
          "medias": [
            {
              "url": "https://exemple.com/salon.jpg",
              "start": 0,
              "end": 5,
              "order": 0,
              "selected": true
            }
          ],
          "data": {
            "description": "Salon lumineux avec vue sur jardin"
          }
        },
        {
          "order": 2,
          "duration": 5,
          "type": "video",
          "animationType": "CAMERA_PUSH_OUT",
          "medias": [
            {
              "url": "https://exemple.com/chambre.jpg",
              "start": 0,
              "end": 5,
              "order": 0,
              "selected": true
            }
          ]
        },
        {
          "order": 3,
          "duration": 5,
          "type": "outro",
          "animationType": "fade",
          "medias": [],
          "data": {
            "avatar": "https://exemple.com/photo-agent.jpg",
            "displayAvatar": true,
            "name": "Jean Dupont",
            "email": "jean.dupont@agence.fr",
            "tel": "06 12 34 56 78",
            "displayLogo": true
          }
        }
      ]
    },
    "webhookUrl": "https://votre-app.com/webhooks/iacrea/video"
  }'
```

### Exemple 2 — Vidéo avec transitions entre séquences

```bash theme={null}
curl --request POST \
  --url 'https://iacrea.com/api/video-editor/generate/video' \
  --header 'x-api-key: VOTRE_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "video": {
      "format": "portrait",
      "template": "SaleProperty",
      "font": "Inter",
      "colors": ["#ffffff", "#333333"],
      "displayLogo": true,
      "logoUrl": "https://exemple.com/logo.png",
      "sequences": [
        {
          "order": 0,
          "duration": 3,
          "type": "intro",
          "animationType": "fade",
          "medias": [],
          "data": {
            "description": "Nouveau bien à la vente",
            "displayLogo": true
          }
        },
        {
          "order": 1,
          "duration": 5,
          "type": "video",
          "animationType": "CAMERA_PUSH_IN",
          "medias": [
            {
              "url": "https://exemple.com/facade.jpg",
              "start": 0,
              "end": 5,
              "order": 0,
              "selected": true
            }
          ],
          "data": {
            "description": "Vue extérieure",
            "transition": {
              "type": "wipe",
              "duration": 25
            }
          }
        },
        {
          "order": 2,
          "duration": 5,
          "type": "video",
          "animationType": "CAMERA_ORBIT_LEFT",
          "medias": [
            {
              "url": "https://exemple.com/salon.jpg",
              "start": 0,
              "end": 5,
              "order": 0,
              "selected": true
            }
          ],
          "data": {
            "transition": {
              "type": "slide",
              "duration": 20
            }
          }
        },
        {
          "order": 3,
          "duration": 5,
          "type": "video",
          "animationType": "CAMERA_CRANE_UP",
          "medias": [
            {
              "url": "https://exemple.com/cuisine.jpg",
              "start": 0,
              "end": 5,
              "order": 0,
              "selected": true
            }
          ],
          "data": {
            "transition": {
              "type": "flip",
              "duration": 30
            }
          }
        },
        {
          "order": 4,
          "duration": 5,
          "type": "outro",
          "animationType": "fade",
          "medias": [],
          "data": {
            "name": "Marie Martin",
            "email": "marie@agence.fr",
            "tel": "06 98 76 54 32",
            "transition": {
              "type": "fade",
              "duration": 20
            }
          }
        }
      ]
    }
  }'
```

### Exemple 3 — Effet BEFORE\_AFTER avec deux images

```bash theme={null}
curl --request POST \
  --url 'https://iacrea.com/api/video-editor/generate/video' \
  --header 'x-api-key: VOTRE_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "video": {
      "format": "landscape",
      "template": "BeforeAfter",
      "font": "Inter",
      "colors": ["#0a0a0a", "#ffffff"],
      "displayLogo": true,
      "logoUrl": "https://exemple.com/logo.png",
      "sequences": [
        {
          "order": 0,
          "duration": 3,
          "type": "intro",
          "animationType": "fade",
          "medias": [],
          "data": {
            "description": "Transformation intérieure",
            "displayLogo": true
          }
        },
        {
          "order": 1,
          "duration": 5,
          "type": "video",
          "animationType": "BEFORE_AFTER_INTERIOR",
          "medias": [
            {
              "url": "https://exemple.com/salon-vide.jpg",
              "start": 0,
              "end": 5,
              "order": 0,
              "selected": true
            }
          ],
          "data": {
            "afterImage": "https://exemple.com/salon-meuble.jpg",
            "description": "Salon avant et après staging"
          }
        },
        {
          "order": 2,
          "duration": 5,
          "type": "video",
          "animationType": "BEFORE_AFTER_EXTERIOR",
          "medias": [
            {
              "url": "https://exemple.com/jardin-avant.jpg",
              "start": 0,
              "end": 5,
              "order": 0,
              "selected": true
            }
          ],
          "data": {
            "afterImage": "https://exemple.com/jardin-apres.jpg",
            "description": "Jardin avant et après aménagement",
            "transition": {
              "type": "wipe",
              "duration": 30
            }
          }
        },
        {
          "order": 3,
          "duration": 5,
          "type": "video",
          "animationType": "BEFORE_AFTER_DECLUTTER",
          "medias": [
            {
              "url": "https://exemple.com/chambre-encombrée.jpg",
              "start": 0,
              "end": 5,
              "order": 0,
              "selected": true
            }
          ],
          "data": {
            "afterImage": "https://exemple.com/chambre-vide.jpg",
            "description": "Chambre avant et après débarras",
            "transition": {
              "type": "iris",
              "duration": 25
            }
          }
        },
        {
          "order": 4,
          "duration": 5,
          "type": "video",
          "animationType": "BEFORE_AFTER_RENOVATION",
          "medias": [
            {
              "url": "https://exemple.com/pièce-à-rénover.jpg",
              "start": 0,
              "end": 5,
              "order": 0,
              "selected": true
            }
          ],
          "data": {
            "afterImage": "https://exemple.com/pièce-rénovée.jpg",
            "description": "Rénovation complète avec équipe",
            "transition": {
              "type": "fade",
              "duration": 20
            }
          }
        },
        {
          "order": 5,
          "duration": 5,
          "type": "outro",
          "animationType": "fade",
          "medias": [],
          "data": {
            "avatar": "https://exemple.com/photo-agent.jpg",
            "name": "Sophie Bernard",
            "email": "sophie@agence.fr",
            "tel": "06 11 22 33 44",
            "displayLogo": true
          }
        }
      ]
    }
  }'
```

### Exemple 4 — Logo masqué sur l'intro mais visible sur les séquences

```bash theme={null}
curl --request POST \
  --url 'https://iacrea.com/api/video-editor/generate/video' \
  --header 'x-api-key: VOTRE_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "video": {
      "format": "square",
      "template": "SaleProperty",
      "font": "Inter",
      "colors": ["#2d3436", "#dfe6e9"],
      "displayLogo": true,
      "logoUrl": "https://exemple.com/logo.png",
      "sequences": [
        {
          "order": 0,
          "duration": 3,
          "type": "intro",
          "animationType": "fade",
          "medias": [],
          "data": {
            "description": "Découvrez ce bien d exception",
            "displayLogo": false,
            "bg": "#000000"
          }
        },
        {
          "order": 1,
          "duration": 5,
          "type": "video",
          "animationType": "AUTO_EFFECTS",
          "medias": [
            {
              "url": "https://exemple.com/piscine.jpg",
              "start": 0,
              "end": 5,
              "order": 0,
              "selected": true
            }
          ]
        },
        {
          "order": 2,
          "duration": 5,
          "type": "outro",
          "animationType": "fade",
          "medias": [],
          "data": {
            "name": "Pierre Leroy",
            "email": "pierre@luxe-immo.fr",
            "tel": "06 00 00 00 00",
            "displayLogo": true,
            "bg": "#000000"
          }
        }
      ]
    }
  }'
```

## Réponse type

```json theme={null}
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "generatedContent": [
    {
      "id": "660e8400-e29b-41d4-a716-446655440001",
      "url": "https://exemple.com/salon.jpg",
      "effect": "CAMERA_PUSH_IN",
      "format": "landscape",
      "status": "pending"
    },
    {
      "id": "660e8400-e29b-41d4-a716-446655440002",
      "url": "https://exemple.com/chambre.jpg",
      "effect": "CAMERA_PUSH_OUT",
      "format": "landscape",
      "status": "pending"
    }
  ],
  "creditsTotal": 48,
  "creditsUsed": 2
}
```

## Notes importantes

* Les séquences `"video"` déclenchent automatiquement la génération d'une animation IA à partir de l'image fournie. **Chaque séquence vidéo consomme 1 crédit.**
* La durée maximale d'une séquence `"video"` est **5 secondes** (plafonnée automatiquement).
* Les séquences `"intro"` et `"outro"` ne consomment pas de crédits (pas de génération IA).
* Utilisez l'`id` retourné avec `GET /api/video-editor/generate/video/{id}` pour suivre l'avancement.
* Si un webhook est fourni, vous recevrez une notification lorsque la vidéo finale est prête.

### Récapitulatif Intro / Outro

| Propriété            | Intro                   | Outro (SaleProperty)    | Outro (Interview/Sample) |
| -------------------- | ----------------------- | ----------------------- | ------------------------ |
| `data.description`   | Texte de présentation   | —                       | Description              |
| `data.displayLogo`   | Afficher le logo centré | Afficher le logo centré | Afficher le logo centré  |
| `data.bg`            | Couleur de fond         | Couleur de fond         | Couleur de fond          |
| `data.avatar`        | —                       | Photo de profil         | —                        |
| `data.displayAvatar` | —                       | Afficher l'avatar       | —                        |
| `data.name`          | —                       | Nom                     | —                        |
| `data.email`         | —                       | Email                   | —                        |
| `data.tel`           | —                       | Téléphone               | —                        |
| `data.title`         | —                       | —                       | Titre                    |

### Récapitulatif Transitions

Les transitions sont optionnelles. Sans transition définie, le passage entre séquences
utilise la transition par défaut du template (fondu de \~20 frames). Pour personnaliser,
ajoutez `data.transition` sur chaque séquence souhaitée.

| Type         | Description                           |
| ------------ | ------------------------------------- |
| `fade`       | Fondu enchaîné classique              |
| `wipe`       | Balayage horizontal                   |
| `slide`      | Glissement latéral                    |
| `flip`       | Retournement 3D                       |
| `clock-wipe` | Balayage en mouvement d'horloge       |
| `iris`       | Ouverture circulaire depuis le centre |
| `none`       | Coupe franche (pas de transition)     |

### Récapitulatif Before/After

| animationType             | Description                      | Image "avant"   | Image "après"     |
| ------------------------- | -------------------------------- | --------------- | ----------------- |
| `BEFORE_AFTER_INTERIOR`   | Meublage progressif              | `medias[0].url` | `data.afterImage` |
| `BEFORE_AFTER_EXTERIOR`   | Aménagement paysager             | `medias[0].url` | `data.afterImage` |
| `BEFORE_AFTER_DECLUTTER`  | Débarras (meubles disparaissent) | `medias[0].url` | `data.afterImage` |
| `BEFORE_AFTER_RENOVATION` | Rénovation (timelapse équipe)    | `medias[0].url` | `data.afterImage` |

### Récapitulatif Logo

| Contexte                 | Paramètre                                     | Taille | Position             |
| ------------------------ | --------------------------------------------- | ------ | -------------------- |
| Séquence `video`/`image` | `video.displayLogo` + `video.logoUrl`         | 100 px | Coin supérieur droit |
| Séquence `intro`         | `sequence.data.displayLogo` + `video.logoUrl` | 200 px | Centré               |
| Séquence `outro`         | `sequence.data.displayLogo` + `video.logoUrl` | 150 px | Centré               |
