Ideal House
Aller au contenu principal

Documentation de l'API de conversion d'images en vidéos#

URL de base : https://api.ideal.house
Version : v1
Mis à jour : 2026-03-25


📖 Vue d'ensemble#

L'API de conversion d'images en vidéos permet de générer des vidéos par IA à partir d'une seule image source, ou en fournissant une image de début et une image de fin pour contrôler le début et la fin de la vidéo générée. Le traitement est asynchrone et comprend deux étapes :

  1. Créer une tâche — Soumettez votre(s) image(s), le type de modèle, la durée et la résolution, puis recevez un taskId.
  2. Interrogation périodique des résultats — Utilisez le taskId pour interroger l'état de la tâche et récupérer la vidéo générée.

🔐 Authentification#

Toutes les requêtes API doivent être authentifiées à l'aide d'une clé API.

Incluez votre clé API dans l'en-tête de la requête :

En-têteValeur
APIKEYyour_api_key_here

⚠️ Conservez votre clé API en sécurité. Ne l'exposez pas dans du code côté client ou dans des dépôts publics.


💰 Déduction de crédits#

[!WARNING] 🪙 Lors de la création réussie de la tâche, les crédits sont déduits en fonction des valeurs sélectionnées pour modelType, resolution et duration, ainsi que de l'activation ou non de generateAudio. Si la tâche échoue finalement, les crédits déduits seront automatiquement remboursés sur votre compte.
Un solde insuffisant retournera le code d'erreur 9051. 📄 Consultez Référence de déduction des crédits.

Modèle Flash (modelType: "Flash", par défaut) :

RésolutionDuréeCrédits déduits
480p5s10 crédits
480p10s20 crédits
720p5s20 crédits
720p10s40 crédits
1080p5s40 crédits
1080p10s80 crédits

Modèle Base (modelType: "Base", generateAudio: false) :

RésolutionDuréeCrédits déduits
480p5s8 crédits
480p10s16 crédits
720p5s16 crédits
720p10s32 crédits
1080p5s32 crédits
1080p10s64 crédits

Modèle Base avec audio (modelType: "Base", generateAudio: true) :

RésolutionDuréeCrédits déduits
480p5s16 crédits
480p10s32 crédits
720p5s32 crédits
720p10s64 crédits
1080p5s64 crédits
1080p10s128 crédits

📌 Points de terminaison de l'API#


1. Créer une tâche de conversion d'images en vidéos#

Crée une nouvelle tâche de génération IA de vidéo à partir d’images et renvoie un taskId unique pour l'interrogation périodique.

Point de terminaison

Texte brut
POST /api/v1/imageToVideo/generate

En-têtes de la requête

En-têteRequisDescription
APIKEY✅ OuiVotre clé d'authentification API
Content-Type✅ Ouiapplication/json

Corps de la requête

ChampTypeRequisDescription
imageUrlstring✅ ObligatoireURL de l'image source. En mode première-dernière image, cela sert de première image de la vidéo
durationinteger✅ ObligatoireDurée de la vidéo en secondes. Enum : 5, 10
resolutionstring✅ ObligatoireRésolution de sortie vidéo. Enum : 480p, 720p, 1080p
modelTypestring❌ FacultatifType de modèle à utiliser pour la génération. Enum : Flash, Base. Par défaut Flash
generateAudioboolean❌ FacultatifIndique s'il faut générer un audio d'arrière-plan pour la vidéo. Uniquement applicable lorsque modelType vaut Base. Par défaut false
promptstring❌ FacultatifPrompt textuel pour guider le style et le mouvement de génération vidéo
lastImageUrlstring❌ FacultatifURL de la dernière image de la vidéo. Lorsqu'elle est fournie, active le mode première-dernière image : la vidéo fera une transition de imageUrl (première image) vers lastImageUrl (dernière image)

💡 Mode première-dernière image : Si lastImageUrl est fourni, l'API génère une vidéo qui effectue une transition fluide depuis la première image de la vidéo (imageUrl) jusqu'à la dernière image de la vidéo (lastImageUrl), vous offrant un contrôle précis sur le début et la fin de la vidéo.

🖼️ Requis image : La première image et la dernière image facultative de la vidéo doivent utiliser les formats JPG/JPEG, PNG ou WebP. Chaque image ne doit pas dépasser 20 Mo, avec des dimensions allant de 128 × 128 px à 6,000 × 6,000 px (inclus). Les images dont les dimensions dépassent ces maximums sont automatiquement redimensionnées proportionnellement pour tenir dans 6,000 × 6,000 px avant traitement. Les URLs d'image doivent être directement accessibles par le serveur API.


Types de modèle

ValeurDescription
FlashPar défaut. Vitesse de génération plus rapide avec un rendu de haute qualité
BaseModèle alternatif — prend en charge la génération audio IA optionnelle (generateAudio)

Options de durée

ValeurDescription
5Vidéo de 5 secondes
10Vidéo de 10 secondes

Options de résolution

ValeurDescription
480pDéfinition standard — traitement plus rapide
720pHaute définition — meilleur rendu
1080pFull HD — qualité de sortie maximale

📥 Exemples de requête#

cURL
bash
# Flash model (default) — single source image
curl -X POST "https://api.ideal.house/api/v1/imageToVideo/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "duration": 5,
    "resolution": "720p",
    "modelType": "Flash",
    "prompt": "Gentle camera zoom in with soft lighting"
  }'

# Base model with audio — single source image
curl -X POST "https://api.ideal.house/api/v1/imageToVideo/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "duration": 5,
    "resolution": "1080p",
    "modelType": "Base",
    "generateAudio": true,
    "prompt": "Peaceful living room ambiance"
  }'

# First-last frame mode — specify both first and last frame
curl -X POST "https://api.ideal.house/api/v1/imageToVideo/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room-day.jpg",
    "lastImageUrl": "https://example.com/room-night.jpg",
    "duration": 10,
    "resolution": "720p",
    "modelType": "Flash",
    "prompt": "Smooth day to night transition"
  }'
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class ImageToVideoApiExample {

    private static final String BASE_URL = "https://api.ideal.house";
    private static final String API_KEY  = "your_api_key_here";

    public static void main(String[] args) throws IOException {
        OkHttpClient client = new OkHttpClient();

        // Flash model — standard mode
        String requestBody = """
            {
                "imageUrl": "https://example.com/room.jpg",
                "duration": 5,
                "resolution": "720p",
                "modelType": "Flash",
                "prompt": "Gentle camera zoom in with soft lighting"
            }
            """;

        // Base model with audio
        // String requestBody = """
        //     {
        //         "imageUrl": "https://example.com/room.jpg",
        //         "duration": 5,
        //         "resolution": "1080p",
        //         "modelType": "Base",
        //         "generateAudio": true,
        //         "prompt": "Peaceful living room ambiance"
        //     }
        //     """;

        // First-last frame mode
        // String requestBody = """
        //     {
        //         "imageUrl": "https://example.com/room-day.jpg",
        //         "lastImageUrl": "https://example.com/room-night.jpg",
        //         "duration": 10,
        //         "resolution": "720p",
        //         "modelType": "Flash",
        //         "prompt": "Smooth day to night transition"
        //     }
        //     """;

        Request request = new Request.Builder()
            .url(BASE_URL + "/api/v1/imageToVideo/generate")
            .addHeader("APIKEY", API_KEY)
            .addHeader("Content-Type", "application/json")
            .post(RequestBody.create(requestBody, MediaType.parse("application/json")))
            .build();

        try (Response response = client.newCall(request).execute()) {
            System.out.println("Response: " + response.body().string());
        }
    }
}
Python (requests)
python
import requests

BASE_URL = "https://api.ideal.house"
API_KEY  = "your_api_key_here"

headers = {
    "APIKEY": API_KEY,
    "Content-Type": "application/json"
}

# Flash model — single source image
payload = {
    "imageUrl": "https://example.com/room.jpg",
    "duration": 5,
    "resolution": "720p",
    "modelType": "Flash",
    "prompt": "Gentle camera zoom in with soft lighting"
}

# Base model with audio
# payload = {
#     "imageUrl": "https://example.com/room.jpg",
#     "duration": 5,
#     "resolution": "1080p",
#     "modelType": "Base",
#     "generateAudio": True,
#     "prompt": "Peaceful living room ambiance"
# }

# First-last frame mode
# payload = {
#     "imageUrl": "https://example.com/room-day.jpg",
#     "lastImageUrl": "https://example.com/room-night.jpg",
#     "duration": 10,
#     "resolution": "720p",
#     "modelType": "Flash",
#     "prompt": "Smooth day to night transition"
# }

response = requests.post(
    f"{BASE_URL}/api/v1/imageToVideo/generate",
    headers=headers,
    json=payload
)

data = response.json()
task_id = data.get("data")
print(f"Task ID: {task_id}")
Node.js (axios)
javascript
const axios = require('axios');

const BASE_URL = 'https://api.ideal.house';
const API_KEY  = 'your_api_key_here';

async function createVideoTask() {
  try {
    // Flash model — standard mode
    const payload = {
      imageUrl: 'https://example.com/room.jpg',
      duration: 5,
      resolution: '720p',
      modelType: 'Flash',
      prompt: 'Gentle camera zoom in with soft lighting'
    };

    // Base model with audio:
    // const payload = {
    //   imageUrl: 'https://example.com/room.jpg',
    //   duration: 5,
    //   resolution: '1080p',
    //   modelType: 'Base',
    //   generateAudio: true,
    //   prompt: 'Peaceful living room ambiance'
    // };

    // First-last frame mode:
    // const payload = {
    //   imageUrl: 'https://example.com/room-day.jpg',
    //   lastImageUrl: 'https://example.com/room-night.jpg',
    //   duration: 10,
    //   resolution: '720p',
    //   modelType: 'Flash',
    //   prompt: 'Smooth day to night transition'
    // };

    const response = await axios.post(
      `${BASE_URL}/api/v1/imageToVideo/generate`,
      payload,
      {
        headers: {
          'APIKEY': API_KEY,
          'Content-Type': 'application/json'
        }
      }
    );

    const taskId = response.data.data;
    console.log('Task ID:', taskId);
    return taskId;
  } catch (error) {
    console.error('Error:', error.response?.data || error.message);
  }
}

createVideoTask();

📤 Réponse#

Réponse de succès

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
ChampTypeDescription
codeinteger0 indique le succès
messagestringMessage de réponse
datalongL'ID unique de la tâche pour l'interrogation périodique des résultats

2. Obtenir le résultat de la tâche#

Récupère l'état actuel et la sortie d'une tâche de génération vidéo à partir d’images précédemment créée.

Point de terminaison

Texte brut
GET /api/v1/imageToVideo/result

En-têtes de la requête

En-têteRequisDescription
APIKEY✅ OuiVotre clé d'authentification API

Paramètres de requête

ParamètreTypeRequisDescription
taskIdlong✅ OuiL'ID de tâche renvoyé par le point de terminaison de création

📥 Exemples de requête#

cURL
bash
curl -X GET "https://api.ideal.house/api/v1/imageToVideo/result?taskId=1234567890123456789" \
  -H "APIKEY: your_api_key_here"
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class ImageToVideoResultExample {

    private static final String BASE_URL = "https://api.ideal.house";
    private static final String API_KEY  = "your_api_key_here";

    public static void main(String[] args) throws IOException {
        OkHttpClient client = new OkHttpClient();
        long taskId = 1234567890123456789L;

        Request request = new Request.Builder()
            .url(BASE_URL + "/api/v1/imageToVideo/result?taskId=" + taskId)
            .addHeader("APIKEY", API_KEY)
            .get()
            .build();

        try (Response response = client.newCall(request).execute()) {
            System.out.println("Response: " + response.body().string());
        }
    }
}
Python (requests)
python
import requests
import time

BASE_URL = "https://api.ideal.house"
API_KEY  = "your_api_key_here"

headers = {
    "APIKEY": API_KEY
}

task_id = 1234567890123456789

# Poll until task is complete
while True:
    response = requests.get(
        f"{BASE_URL}/api/v1/imageToVideo/result",
        headers=headers,
        params={"taskId": task_id}
    )

    data = response.json()
    result = data.get("data", {})
    status = result.get("status")

    print(f"Status: {status}, Progress: {result.get('percentage')}%, Queue: {result.get('waitNumber')}")

    if status in ("Success", "Failed"):
        break

    time.sleep(5)  # Poll every 5 seconds (video generation takes longer)

if status == "Success":
    output = result["output"]
    print("Video URL:", output["resultUrl"])
    print("Cover Image:", output["cover"])
else:
    print("Task failed")
Node.js (axios)
javascript
const axios = require('axios');

const BASE_URL = 'https://api.ideal.house';
const API_KEY  = 'your_api_key_here';

async function pollResult(taskId) {
  const headers = { 'APIKEY': API_KEY };

  while (true) {
    const response = await axios.get(
      `${BASE_URL}/api/v1/imageToVideo/result`,
      {
        headers,
        params: { taskId }
      }
    );

    const result = response.data.data;
    const { status, percentage, waitNumber } = result;

    console.log(`Status: ${status} | Progress: ${percentage}% | Queue: ${waitNumber}`);

    if (['Success', 'Failed'].includes(status)) {
      if (status === 'Success') {
        console.log('Video URL:', result.output.resultUrl);
        console.log('Cover Image:', result.output.cover);
        console.log('Resolution:', result.output.width, 'x', result.output.height);
      } else {
        console.log('Task failed');
      }
      break;
    }

    // Wait 5 seconds before next poll (video tasks take longer)
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
}

pollResult(1234567890123456789n);

📤 Réponse#

Réponse de succès (tâche terminée — mode standard)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "duration": 5,
      "resolution": "720p",
      "modelType": "Flash",
      "prompt": "Gentle camera zoom in with soft lighting"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/video_result.mp4",
      "cover": "https://cdn.ideal.house/output/video_cover.jpg",
      "width": 1280,
      "height": 720
    }
  }
}

Réponse de succès (tâche terminée — mode première-dernière image)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "imageUrl": "https://example.com/room-day.jpg",
      "lastImageUrl": "https://example.com/room-night.jpg",
      "duration": 10,
      "resolution": "720p",
      "modelType": "Flash",
      "prompt": "Smooth day to night transition"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/video_result.mp4",
      "cover": "https://cdn.ideal.house/output/video_cover.jpg",
      "width": 1280,
      "height": 720
    }
  }
}

Réponse (tâche en cours de traitement / en file d'attente)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Processing",
    "waitNumber": 2,
    "percentage": 30,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "duration": 5,
      "resolution": "720p",
      "modelType": "Flash"
    },
    "output": null
  }
}

Réponse (tâche échouée)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Failed",
    "waitNumber": 0,
    "percentage": 0,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "duration": 5,
      "resolution": "720p",
      "modelType": "Flash"
    },
    "output": null
  }
}

Champs de la réponse

ChampTypeDescription
idlongIdentifiant unique de la tâche
statusstringÉtat actuel de la tâche (voir État de la tâche)
waitNumberintegerNombre de tâches qui précèdent cette tâche dans la file d’attente (0 signifie actuellement en cours de traitement)
percentageintegerPourcentage d'avancement de la tâche (0–100)
inputobjectLes paramètres d'entrée originaux de la tâche
input.imageUrlstringURL de l'image source (première image en mode première-dernière)
input.lastImageUrlstringURL de la dernière image de la vidéo (présente uniquement en mode première-dernière image)
input.durationintegerDurée vidéo en secondes (5 ou 10)
input.resolutionstringRésolution vidéo (480p, 720p ou 1080p)
input.modelTypestringType de modèle utilisé (Flash ou Base)
input.generateAudiobooleanIndique si la génération audio a été activée (modèle Base uniquement)
input.promptstringInvite textuelle (si fournie)
outputobjectRésultat de la génération (disponible uniquement lorsque status est Success)
output.resultUrlstringURL vers le fichier vidéo généré
output.coverstringURL vers l'image de couverture / miniature vidéo
output.widthintegerLargeur vidéo en pixels
output.heightintegerHauteur vidéo en pixels

📊 État de la tâche#

ÉtatDescription
UnprocessedLa tâche a été créée mais n'a pas encore démarré
ProcessingLa tâche est actuellement en cours de traitement
SuccessTâche terminée avec succès — sortie vidéo disponible
FailedLa tâche a échoué en raison d'une erreur

Effectuez une interrogation périodique toutes les 3-5 secondes. Consultez Limite de tâches API.


❌ Réponses d'erreur#

Toutes les réponses d'erreur partagent la même structure JSON :

json
{
  "code": 5002,
  "message": "Invalid API Key",
  "data": null
}

Référence des codes d'erreur#

CodeNomDescriptionAction recommandée
1001FAILEDÉchec de la requête (erreur générique)Consultez le champ message pour les détails spécifiques de l'erreur
1003INTERNAL_ERRORErreur interne du serveurRéessayez après un bref délai ; contactez le support si le problème persiste
1011PARAM_ERRORErreur de paramètre de requête — par exemple, combinaison invalide de modelType, resolution ou durationVérifiez que tous les paramètres obligatoires sont fournis et correctement formatés
5002API_KEY_INVALIDClé API invalide ou manquanteAssurez-vous que l'en-tête APIKEY est présent et que la valeur est correcte
9010SCAN_TEXT_ERRORL'invite textuelle a échoué à l'examen de contenuModifiez l'invite pour supprimer tout contenu sensible ou interdit
9038PROHIBITED_CONTENTL'image de sortie générée contient du contenu interditAjustez l'invite/le style/les entrées et réessayez
9051COINS_NOT_ENOUGHCrédits / pièces insuffisantsAlimentez vos crédits de compte et réessayez

📄 Pour la liste complète des codes d'erreur courants de l'API, reportez-vous à la Référence des codes d'erreur.