Ideal House
Aller au contenu principal

Documentation de l'API de remplacement intelligent#

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


📖 Vue d'ensemble#

L'API de remplacement intelligent vous permet de remplacer de manière intelligente une zone sélectionnée d'une image par du contenu généré par IA en fonction de votre invite textuelle. Vous fournissez une image source, une image de masque qui définit la zone à remplacer, et une invite textuelle décrivant ce qui doit remplir cette zone. L'IA intégrera de manière harmonieuse le contenu généré dans l'image originale. Le processus est asynchrone et comprend deux étapes :

  1. Créer une tâche — Soumettez votre image, votre masque et votre invite, 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 résultat.

🔐 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] 🪙 Chaque tâche déduit 1 crédit de votre compte lors de la création réussie de la tâche. Si la tâche échoue finalement, les crédits déduits vous seront remboursés automatiquement sur votre compte.
Un solde insuffisant retournera le code d'erreur 9051. 📄 Consultez Référence de déduction des crédits.


🖼️ Format de l'image de masque#

L'image de masque définit la zone qui doit être remplacée dans l'image source.

Règles du masque :

CouleurSignification
NoirZone à remplacer (région où un nouveau contenu sera généré)
BlancZone à conserver (arrière-plan à laisser inchangé)

⚠️ L'image de masque doit correspondre aux mêmes dimensions que l'image source (imageUrl).

Exemple de masque :

Exemple de masque

La zone noire du masque indique la région à remplacer par l'IA ; la zone blanche est l'arrière-plan à conserver.


📌 Points de terminaison de l'API#


1. Créer une tâche de remplacement intelligent#

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

Point de terminaison

Texte brut
POST /api/v1/smartReplace/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✅ RequisURL de l'image source
promptstring✅ RequisInvite textuelle décrivant le contenu à générer dans la zone masquée (par exemple, "a modern armchair", "marble flooring")
maskUrlstring⚠️ Soit maskUrl soit maskBase64URL de l'image de masque. Les zones noires seront remplacées ; les zones blanches seront conservées
maskBase64string⚠️ Soit maskUrl soit maskBase64Image de masque encodée en Base64 (format PNG recommandé). À utiliser lorsque vous ne pouvez pas fournir une URL hébergée

⚠️ Au moins l'un des champs maskUrl ou maskBase64 doit être fourni. Si les deux sont fournis, maskUrl est prioritaire.

🖼️ Exigences image : L'image source et le masque 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 (inclus). Les images dont les dimensions pixel dépassent le maximum sont automatiquement redimensionnées proportionnellement pour tenir dans 6,000 × 6,000 px avant le traitement. Les URLs des images doivent être directement accessibles par le serveur de l'API. Un masque Base64 est soumis aux mêmes limites d'image décodée et ne doit pas inclure de préfixe data-URL.


📥 Exemples de requête#

cURL
bash
# Using maskUrl
curl -X POST "https://api.ideal.house/api/v1/smartReplace/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "prompt": "a modern velvet sofa in dark blue",
    "maskUrl": "https://example.com/mask.png"
  }'

# Using maskBase64
curl -X POST "https://api.ideal.house/api/v1/smartReplace/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "prompt": "a modern velvet sofa in dark blue",
    "maskBase64": "iVBORw0KGgoAAAANSUhEUgAA..."
  }'
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;

public class SmartReplaceApiExample {

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

        // Option 1: Use maskUrl
        String requestBody = """
            {
                "imageUrl": "https://example.com/room.jpg",
                "prompt": "a modern velvet sofa in dark blue",
                "maskUrl": "https://example.com/mask.png"
            }
            """;

        // Option 2: Use maskBase64 (encode local mask file)
        // byte[] maskBytes = Files.readAllBytes(Path.of("/path/to/mask.png"));
        // String maskBase64 = Base64.getEncoder().encodeToString(maskBytes);
        // String requestBody = """
        //     {
        //         "imageUrl": "https://example.com/room.jpg",
        //         "prompt": "a modern velvet sofa in dark blue",
        //         "maskBase64": "%s"
        //     }
        //     """.formatted(maskBase64);

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

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

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

# Option 1: Use maskUrl
payload = {
    "imageUrl": "https://example.com/room.jpg",
    "prompt": "a modern velvet sofa in dark blue",
    "maskUrl": "https://example.com/mask.png"
}

# Option 2: Use maskBase64 (encode local mask file)
# with open("/path/to/mask.png", "rb") as f:
#     mask_base64 = base64.b64encode(f.read()).decode("utf-8")
# payload = {
#     "imageUrl": "https://example.com/room.jpg",
#     "prompt": "a modern velvet sofa in dark blue",
#     "maskBase64": mask_base64
# }

response = requests.post(
    f"{BASE_URL}/api/v1/smartReplace/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 fs = require('fs');

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

async function createSmartReplaceTask() {
  try {
    // Option 1: Use maskUrl
    const payload = {
      imageUrl: 'https://example.com/room.jpg',
      prompt: 'a modern velvet sofa in dark blue',
      maskUrl: 'https://example.com/mask.png'
    };

    // Option 2: Use maskBase64 (encode local mask file)
    // const maskBuffer = fs.readFileSync('/path/to/mask.png');
    // const maskBase64 = maskBuffer.toString('base64');
    // const payload = {
    //   imageUrl: 'https://example.com/room.jpg',
    //   prompt: 'a modern velvet sofa in dark blue',
    //   maskBase64: maskBase64
    // };

    const response = await axios.post(
      `${BASE_URL}/api/v1/smartReplace/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);
  }
}

createSmartReplaceTask();

📤 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 remplacement intelligent précédemment créée.

Point de terminaison

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

public class SmartReplaceResultExample {

    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/smartReplace/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/smartReplace/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":
    print("Result URL:", result["output"]["resultUrl"])
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/smartReplace/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('Size:', result.output.width, 'x', result.output.height);
      } 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/room.jpg",
      "prompt": "a modern velvet sofa in dark blue",
      "maskUrl": "https://example.com/mask.png"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/smart_replace_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/room.jpg",
      "prompt": "a modern velvet sofa in dark blue",
      "maskUrl": "https://example.com/mask.png"
    },
    "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",
      "prompt": "a modern velvet sofa in dark blue",
      "maskUrl": "https://example.com/mask.png"
    },
    "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
input.promptstringInvite textuelle décrivant le contenu de remplacement
input.maskUrlstringURL de l'image de masque (si fournie via maskUrl)
outputobjectRésultat de la génération (disponible uniquement lorsque status est Success)
output.resultUrlstringURL pointant vers l'image résultat du remplacement intelligent
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, prompt ou masque manquantAssurez-vous que prompt et au moins un champ de masque sont fournis
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.