Ideal House
Aller au contenu principal

Documentation de l'API d'essai de mobilier#

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


📖 Vue d'ensemble#

L'API d'essai de mobilier vous permet de placer virtuellement des articles de mobilier dans une scène de pièce grâce à l'IA. Vous fournissez une image de la pièce et une liste d'articles de mobilier (chacun avec une image et un identifiant de produit), et l'IA intègre harmonieusement le mobilier dans la scène. Le flux de travail est asynchrone et comporte deux étapes :

  1. Créer une tâche — Soumettez votre image de pièce et votre liste de mobilier, 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 l'image générée.

📌 Remarque : Actuellement, seul le mode creative est pris en charge.


🔐 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] 🪙 Les crédits sont déduits en fonction du modelType sélectionné lors de la création réussie de la tâche. Si la tâche échoue finalement, les crédits déduits vous seront automatiquement remboursés.
Un solde insuffisant retournera le code d'erreur 9051. 📄 Consultez Référence de déduction des crédits.

Modèle (modelType)Crédits déduits
Base3 crédits
Pro10 crédits

📌 Points de terminaison de l'API#


1. Créer une tâche d'essai de mobilier#

Crée une nouvelle tâche d'essai de mobilier par IA et renvoie un taskId unique pour l'interrogation périodique.

Point de terminaison

Texte brut
POST /api/v1/furnitureTryOn/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 de la scène de la pièce dans laquelle le mobilier sera placé
furnitureListarray✅ ObligatoireListe des articles de mobilier à placer dans la scène. Maximum 6 articles. Voir Objet Article de mobilier
promptstring❌ OptionnelInvite textuelle personnalisée pour guider davantage le placement et le style
modelTypestring❌ OptionnelType de qualité du modèle. Énumération : Base, Pro. Valeur par défaut Base

🛋️ Objet Article de mobilier#

Chaque élément de furnitureList doit être un objet avec les champs suivants :

ChampTypeRequisDescription
imageUrlstring✅ ObligatoireURL de l'image du produit de mobilier (un fond transparent ou propre est recommandé)

⚠️ furnitureList peut contenir au maximum 6 articles.

🖼️ Exigences relatives aux images : L'image de la pièce et chaque image de mobilier doivent utiliser les formats JPG/JPEG, PNG ou WebP. Chaque image ne doit pas dépasser 20 Mo, avec des dimensions comprises entre 128 × 128 px et 6,000 × 6,000 px (bornes incluses). Les images dépassant les dimensions maximales en pixels sont automatiquement redimensionnées proportionnellement pour s'intégrer dans 6,000 × 6,000 px avant le traitement. Les URLs des images doivent être directement accessibles par le serveur API.

Exemple

json
"furnitureList": [
  {
    "imageUrl": "https://example.com/sofa.png"
  },
  {
    "imageUrl": "https://example.com/table.png"
  }
]

Types de modèle

ValeurDescription
BasePar défaut. Équilibre entre vitesse et qualité
ProQualité de sortie supérieure, traitement plus lent

📥 Exemples de requête#

cURL
bash
# Basic request (Base model)
curl -X POST "https://api.ideal.house/api/v1/furnitureTryOn/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/living-room.jpg",
    "furnitureList": [
      {
        "imageUrl": "https://example.com/sofa.png"
      },
      {
        "imageUrl": "https://example.com/coffee-table.png"
      }
    ],
    "prompt": "modern minimalist style"
  }'

# Pro model
curl -X POST "https://api.ideal.house/api/v1/furnitureTryOn/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/living-room.jpg",
    "furnitureList": [
      {
        "imageUrl": "https://example.com/sofa.png"
      }
    ],
    "prompt": "Scandinavian interior with warm lighting",
    "modelType": "Pro"
  }'
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class FurnitureTryOnApiExample {

    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();

        String requestBody = """
            {
                "imageUrl": "https://example.com/living-room.jpg",
                "furnitureList": [
                    {
                        "imageUrl": "https://example.com/sofa.png"
                    },
                    {
                        "imageUrl": "https://example.com/coffee-table.png"
                    }
                ],
                "prompt": "modern minimalist style",
                "modelType": "Base"
            }
            """;

        Request request = new Request.Builder()
            .url(BASE_URL + "/api/v1/furnitureTryOn/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"
}

payload = {
    "imageUrl": "https://example.com/living-room.jpg",
    "furnitureList": [
        {
            "imageUrl": "https://example.com/sofa.png"
        },
        {
            "imageUrl": "https://example.com/coffee-table.png"
        }
    ],
    "prompt": "modern minimalist style",
    "modelType": "Base"
}

# Pro model example:
# payload = {
#     "imageUrl": "https://example.com/living-room.jpg",
#     "furnitureList": [
#         {
#             "imageUrl": "https://example.com/sofa.png"
#         }
#     ],
#     "prompt": "Scandinavian interior with warm lighting",
#     "modelType": "Pro"
# }

response = requests.post(
    f"{BASE_URL}/api/v1/furnitureTryOn/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 createFurnitureTryOnTask() {
  try {
    const response = await axios.post(
      `${BASE_URL}/api/v1/furnitureTryOn/generate`,
      {
        imageUrl: 'https://example.com/living-room.jpg',
        furnitureList: [
          {
            imageUrl: 'https://example.com/sofa.png'
          },
          {
            imageUrl: 'https://example.com/coffee-table.png'
          }
        ],
        prompt: 'modern minimalist style',
        modelType: 'Base'

        // Pro model:
        // modelType: 'Pro'
      },
      {
        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);
  }
}

createFurnitureTryOnTask();

📤 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 d'essai de mobilier précédemment créée.

Point de terminaison

Texte brut
GET /api/v1/furnitureTryOn/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/furnitureTryOn/result?taskId=1234567890123456789" \
  -H "APIKEY: your_api_key_here"
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class FurnitureTryOnResultExample {

    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/furnitureTryOn/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/furnitureTryOn/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(3)  # Poll every 3 seconds

if status == "Success":
    output = result["output"]
    print("Result URL:", output["resultUrl"])
    print("Matched Items:", output.get("items", []))
else:
    print("Task ended with status:", status)
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/furnitureTryOn/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('Result URL:', result.output.resultUrl);
        console.log('Matched Items:', result.output.items);
      } else {
        console.log('Task ended with status:', status);
      }
      break;
    }

    // Wait 3 seconds before next poll
    await new Promise(resolve => setTimeout(resolve, 3000));
  }
}

pollResult(1234567890123456789n);

📤 Réponse#

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

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "imageUrl": "https://example.com/living-room.jpg",
      "furnitureList": [
        {
          "imageUrl": "https://example.com/sofa.png"
        },
        {
          "imageUrl": "https://example.com/coffee-table.png"
        }
      ],
      "prompt": "modern minimalist style",
      "modelType": "Base"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/furniture_try_on_result.jpg",
      "width": 1024,
      "height": 1024
    }
  }
}

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

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Processing",
    "waitNumber": 1,
    "percentage": 45,
    "input": {
      "imageUrl": "https://example.com/living-room.jpg",
      "furnitureList": [
        {
          "imageUrl": "https://example.com/sofa.png"
        }
      ],
      "prompt": "modern minimalist style",
      "modelType": "Base"
    },
    "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/living-room.jpg",
      "furnitureList": [
        {
          "imageUrl": "https://example.com/sofa.png"
        }
      ],
      "modelType": "Base"
    },
    "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 de la scène de la pièce
input.furnitureListarrayListe des articles de mobilier soumis (max 6 articles)
input.furnitureList[].imageUrlstringURL de l'image du produit de mobilier
input.promptstringInvite textuelle personnalisée (le cas échéant)
input.modelTypestringType de modèle utilisé
outputobjectRésultat de la génération (disponible uniquement lorsque status est Success)
output.resultUrlstringURL vers l'image de la pièce générée avec le mobilier placé
output.widthintegerLargeur de sortie en pixels
output.heightintegerHauteur de sortie 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 — la sortie est 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, imageUrl ou furnitureList manquant, ou furnitureList dépasse 6 articlesVeuillez fournir imageUrl et furnitureList, veiller à ce qu'ils ne soient pas vides et à ce qu'ils contiennent au maximum 6 articles
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 insuffisantsRechargez les crédits de votre compte, puis 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.