Passer au contenu principal

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.
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

x-api-key
string
requis
Votre clé API IACrea
Content-Type
string
requis
Doit être application/json

Corps de requête

video
object
requis
Objet vidéo contenant toutes les séquences et paramètres
video.format
string
requis
Format de la vidéo : "landscape" | "portrait" | "square"
video.template
string
Template vidéo. Défaut : "SaleProperty". Optionnel.
video.music
string
URL de la musique de fond. Optionnel.
video.font
string
Police de caractères (ex : "Inter"). Défaut : "Inter". Optionnel.
video.colors
array
requis
Tableau de deux couleurs [background, text] (ex : ["#1a1a2e", "#ffffff"]). La première couleur est le fond, la seconde la couleur du texte.
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.
video.logoUrl
string
URL du logo. Nécessaire si displayLogo=true ou si vous souhaitez afficher le logo sur les intros/outros. Optionnel.

Séquences

video.sequences
array
requis
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.
video.sequences[].order
number
requis
Ordre d’affichage de la séquence dans la vidéo (commence à 0). L’intro doit être en premier (0), l’outro en dernier.
video.sequences[].duration
number
requis
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
video.sequences[].type
string
requis
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)
video.sequences[].animationType
string
requis
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

Médias

video.sequences[].medias
array
requis
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 []).
video.sequences[].medias[].url
string
requis
URL de l’image ou de la vidéo source. Pour les effets BEFORE_AFTER, il s’agit de l’image “avant”.
video.sequences[].medias[].start
number
requis
Temps de début du média dans la séquence (en secondes). Généralement 0.
video.sequences[].medias[].end
number
requis
Temps de fin du média dans la séquence (en secondes). Doit correspondre à la durée.
video.sequences[].medias[].order
number
Ordre du média dans la séquence. Optionnel. Défaut : 0.
video.sequences[].medias[].selected
boolean
Média actif dans la séquence. Mettez true pour le média principal. Optionnel.

Données de séquence (data)

video.sequences[].data
object
Données supplémentaires pour la séquence. Le contenu varie selon le type de séquence.

Données Intro (type: "intro")

video.sequences[].data.description
string
Texte affiché sous le logo (ex : "vous présente", "À vendre").
Afficher le logo (de video.logoUrl) sur l’intro. Défaut : true.
video.sequences[].data.bg
string
Couleur de fond personnalisée pour l’intro (ex : "#1a1a2e"). Défaut : première couleur de video.colors.

Données Outro (type: "outro")

video.sequences[].data.avatar
string
URL de la photo de profil (agent, conseiller). Affichée en cercle.
video.sequences[].data.displayAvatar
boolean
Afficher l’avatar sur l’outro. Défaut : true.
video.sequences[].data.name
string
Nom affiché sur l’outro (ex : "Jean Dupont").
video.sequences[].data.email
string
Email affiché sur l’outro.
video.sequences[].data.tel
string
Téléphone affiché sur l’outro.
video.sequences[].data.displayLogo
boolean
Afficher le logo (de video.logoUrl) sur l’outro. Défaut : true.
video.sequences[].data.bg
string
Couleur de fond personnalisée pour l’outro.
Pour les templates Interview et Sample (générique) :
video.sequences[].data.title
string
Titre affiché sur l’outro.
video.sequences[].data.description
string
Description affichée sous le titre.

Données Before/After

video.sequences[].data.afterImage
string
Requis pour les effets BEFORE_AFTER. URL de l’image “après” transformation. L’image “avant” est fournie via medias[0].url.

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.
video.sequences[].data.transition
object
Configuration de la transition d’entrée pour cette séquence.
video.sequences[].data.transition.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
video.sequences[].data.transition.duration
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

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

webhookUrl
string
URL du webhook pour recevoir une notification lorsque la vidéo est terminée. Optionnel.

Réponses

201 — Créé avec succès

id
string
Identifiant unique de la vidéo générée. À utiliser avec GET /api/video-editor/generate/video/{id} pour suivre l’avancement.
generatedContent
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")
creditsTotal
number
Nombre de crédits restants
creditsUsed
number
Nombre de crédits utilisés pour cette génération

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

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

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

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

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

{
  "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éIntroOutro (SaleProperty)Outro (Interview/Sample)
data.descriptionTexte de présentationDescription
data.displayLogoAfficher le logo centréAfficher le logo centréAfficher le logo centré
data.bgCouleur de fondCouleur de fondCouleur de fond
data.avatarPhoto de profil
data.displayAvatarAfficher l’avatar
data.nameNom
data.emailEmail
data.telTéléphone
data.titleTitre

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.
TypeDescription
fadeFondu enchaîné classique
wipeBalayage horizontal
slideGlissement latéral
flipRetournement 3D
clock-wipeBalayage en mouvement d’horloge
irisOuverture circulaire depuis le centre
noneCoupe franche (pas de transition)

Récapitulatif Before/After

animationTypeDescriptionImage “avant”Image “après”
BEFORE_AFTER_INTERIORMeublage progressifmedias[0].urldata.afterImage
BEFORE_AFTER_EXTERIORAménagement paysagermedias[0].urldata.afterImage
BEFORE_AFTER_DECLUTTERDébarras (meubles disparaissent)medias[0].urldata.afterImage
BEFORE_AFTER_RENOVATIONRénovation (timelapse équipe)medias[0].urldata.afterImage
ContexteParamètreTaillePosition
Séquence video/imagevideo.displayLogo + video.logoUrl100 pxCoin supérieur droit
Séquence introsequence.data.displayLogo + video.logoUrl200 pxCentré
Séquence outrosequence.data.displayLogo + video.logoUrl150 pxCentré