Ideal House
Naar inhoud gaan

Documentatie voor de API voor virtuele inrichting#

Basis-URL: https://api.ideal.house
Versie: v1
Bijgewerkt: 2026-04-13


📖 Overzicht#

Met de API voor virtuele inrichting kun je een lege of gedeeltelijk gemeubileerde kamer met AI opnieuw inrichten.
Je dient een kamerafbeeldings-URL en een optionele tekstinstructie in en haalt vervolgens het gegenereerde resultaat asynchroon op.

  1. Een taak aanmaken — Dien imageUrl en optioneel prompt in en ontvang een taskId.
  2. Resultaten regelmatig opvragen — Gebruik taskId om de taakstatus op te vragen en de uitvoerafbeelding op te halen.

🔐 Authenticatie#

Alle API-verzoeken moeten worden geauthenticeerd met een API Key.

Neem je API Key op in de verzoekheader:

VerzoekheaderWaarde
APIKEYyour_api_key_here

⚠️ Houd je API Key geheim. Maak deze niet zichtbaar in clientcode of openbare opslagplaatsen.


💰 Creditafschrijving#

[!WARNING] 🪙 Bij het succesvol aanmaken van een taak wordt 1 tegoedeenheid afgeschreven.
Als de taak uiteindelijk mislukt, wordt de afgeschreven credit automatisch terugbetaald.
Onvoldoende credits leveren foutcode 9051 op. 📄 Zie de referentie voor creditafschrijving.

BewerkingAfgeschreven credits
Taak voor virtuele inrichting1 tegoedeenheid

📌 API-endpoints#


1. Een taak voor virtuele inrichting aanmaken#

Maakt een nieuwe taak voor virtuele inrichting aan en retourneert een unieke taskId om de status regelmatig op te vragen.

Eindpunt

Platte tekst
POST /api/v1/virtualStaging/generate

Verzoekheaders

VerzoekheaderVerplichtBeschrijving
APIKEY✅ JaJe API-authenticatiesleutel
Content-Type✅ Jaapplication/json

Verzoekinhoud

VeldTypeVerplichtBeschrijving
imageUrlstring✅ JaURL van de oorspronkelijke kamerafbeelding
promptstring❌ NeeOptionele instructie om stijl en meubilering te sturen
indoorTypeIdstring❌ NeeOptionele voorinstelling voor kamertype. Zie kamertypeopties
indoorStyleIdstring❌ NeeOptionele voorinstelling voor interieurstijl. Zie interieurstijlopties
indoorElemIdstring❌ NeeOptionele voorinstelling voor kamerelementen. Ondersteunt meerdere ID's gescheiden door komma's, bijvoorbeeld id1,id2

🖼️ Afbeeldingsvereisten: Gebruik JPG/JPEG, PNG of WebP. Elke afbeelding mag maximaal 20 MB groot zijn, met afmetingen van 128 × 128 px tot en met 6,000 × 6,000 px. Afbeeldingen boven de maximale pixelafmetingen worden vóór verwerking automatisch evenredig verkleind tot binnen 6,000 × 6,000 px. De afbeeldings-URL moet rechtstreeks bereikbaar zijn voor de API-server.


🎨 Stijlopties#

indoorTypeId, indoorStyleId en indoorElemId kunnen worden gekozen via het endpoint voor API-stijlconfiguratie.

Gebruik:

Platte tekst
GET /api/v1/style/virtual_staging/getStyles
StijlgroepVerzoekveldBeschrijving
roomTypeindoorTypeIdOptie voor het kamertype
styleindoorStyleIdOptie voor de interieurstijl
elementsindoorElemIdOptie voor kamerelementen. Ondersteunt meerdere optie-ID's gescheiden door komma's, bijvoorbeeld id1,id2

Elke optie bevat name, id en url. Geef de id van de optie door in het bijbehorende verzoekveld.


📥 Verzoekvoorbeelden#

cURL
bash
curl -X POST "https://api.ideal.house/api/v1/virtualStaging/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/empty-living-room.jpg",
    "prompt": "Warm and modern living room styling",
    "indoorTypeId": "Interior Design_Interior Scene_Living Room",
    "indoorStyleId": "Interior_Interior Style_Popular_Vs_Modern Farmhouse",
    "indoorElemId": "Interior Design_Scene Elements_Living Room_Shelving,Interior Design_Scene Elements_Living Room_Coffee Table"
  }'
Java (OkHttp)
java
import okhttp3.*;

import java.io.IOException;

public class VirtualStagingApiExample {

    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/empty-bedroom.jpg",
                    "prompt": "Cozy contemporary bedroom",
                    "indoorTypeId": "Interior Design_Interior Scene_Bed Room",
                    "indoorStyleId": "Interior_Interior Style_Popular_Vs_Contemporary Warm",
                    "indoorElemId": "Interior Design_Scene Elements_Living Room_Shelving,Interior Design_Scene Elements_Living Room_Coffee Table"
                }
                """;

        Request request = new Request.Builder()
                .url(BASE_URL + "/api/v1/virtualStaging/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/empty-home-office.jpg",
    "prompt": "Minimal modern home office",
    "indoorTypeId": "Interior Design_Interior Scene_Home Office",
    "indoorStyleId": "Interior_Interior Style_Popular_Vs_Modern Minimal",
    "indoorElemId": "Interior Design_Scene Elements_Living Room_Shelving,Interior Design_Scene Elements_Living Room_Coffee Table"
}

response = requests.post(
    f"{BASE_URL}/api/v1/virtualStaging/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 createVirtualStagingTask() {
  try {
    const response = await axios.post(
      `${BASE_URL}/api/v1/virtualStaging/generate`,
      {
        imageUrl: 'https://example.com/empty-dining-room.jpg',
        prompt: 'Modern luxury dining room',
        indoorTypeId: 'Interior Design_Interior Scene_Dining Room',
        indoorStyleId: 'Interior_Interior Style_Popular_Vs_Modern Luxury',
        indoorElemId: 'Interior Design_Scene Elements_Living Room_Shelving,Interior Design_Scene Elements_Living Room_Coffee Table'
      },
      {
        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);
  }
}

createVirtualStagingTask();

📤 Antwoord#

Succesantwoord

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
VeldTypeBeschrijving
codeinteger0 geeft succes aan
messagestringAntwoordbericht
datalongDe unieke taak-ID voor het regelmatig opvragen van resultaten

2. Taakresultaat ophalen#

Haalt de huidige status en uitvoer van een eerder aangemaakte taak voor virtuele inrichting op.

Eindpunt

Platte tekst
GET /api/v1/virtualStaging/result

Verzoekheaders

VerzoekheaderVerplichtBeschrijving
APIKEY✅ JaJe API-authenticatiesleutel

Queryparameters

QueryparameterTypeVerplichtBeschrijving
taskIdlong✅ JaDe taak-ID die het endpoint voor het aanmaken van taken retourneert

📥 Verzoekvoorbeelden#

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

import java.io.IOException;

public class VirtualStagingResultExample {

    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/virtualStaging/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

while True:
    response = requests.get(
        f"{BASE_URL}/api/v1/virtualStaging/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)

if status == "Success":
    output = result["output"]
    print("Result URL:", output["resultUrl"])
    print("Size:", output["width"], "x", output["height"])
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/virtualStaging/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;
    }

    await new Promise(resolve => setTimeout(resolve, 3000));
  }
}

pollResult(1234567890123456789n);

📤 Antwoord#

Succesantwoord: taak voltooid

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "imageUrl": "https://example.com/empty-room.jpg",
      "prompt": "modern country living room with warm neutral materials",
      "indoorTypeId": "Interior Design_Interior Scene_Living Room",
      "indoorStyleId": "Interior_Interior Style_Popular_Vs_Modern Farmhouse",
      "indoorElemId": "Interior Design_Scene Elements_Living Room_Shelving,Interior Design_Scene Elements_Living Room_Coffee Table"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/virtual_staging_result.jpg",
      "width": 1024,
      "height": 1024
    }
  }
}

Antwoord: taak in verwerking of in de wachtrij

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Processing",
    "waitNumber": 1,
    "percentage": 46,
    "input": {
      "imageUrl": "https://example.com/empty-room.jpg",
      "prompt": "coastal bedroom with soft light and natural textures",
      "indoorTypeId": "Interior Design_Interior Scene_Bed Room",
      "indoorStyleId": "Interior_Interior Style_Popular_Vs_Contemporary Warm"
    },
    "output": null
  }
}

Antwoord: taak mislukt

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Failed",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "imageUrl": "https://example.com/empty-room.jpg",
      "prompt": "..."
    },
    "output": null
  }
}

Antwoordvelden

VeldTypeBeschrijving
idlongUnieke taakidentificatie
statusstringHuidige taakstatus; zie taakstatus
waitNumberintegerAantal taken vóór deze taak in de wachtrij; 0 betekent dat de taak wordt verwerkt
percentageintegerVoltooiingspercentage van de taak (0-100)
errorReasonstringFoutreden wanneer status gelijk is aan Failed
inputobjectOorspronkelijke invoerparameters die voor deze taak zijn ingediend
input.imageUrlstringURL van de oorspronkelijke kamerafbeelding
input.promptstringGebruikersinstructie, indien opgegeven
input.indoorTypeIdstringGebruikte kamertypevoorinstelling, indien opgegeven
input.indoorStyleIdstringGebruikte interieurstijlvoorinstelling, indien opgegeven
input.indoorElemIdstringGebruikte kamerelementvoorinstelling, indien opgegeven. Kan meerdere ID's gescheiden door komma's bevatten
outputobjectGeneratieresultaat, alleen beschikbaar wanneer status gelijk is aan Success
output.resultUrlstringURL van de gegenereerde afbeelding met virtuele inrichting
output.widthintegerBreedte van de uitvoerafbeelding in pixels
output.heightintegerHoogte van de uitvoerafbeelding in pixels

📊 Taakstatus#

StatusBetekenis
UnprocessedDe taak is aangemaakt en wacht in de wachtrij
ProcessingDe taak wordt momenteel uitgevoerd
SuccessDe taak is succesvol voltooid
FailedDe taak is mislukt en er is geen uitvoer geproduceerd

Vraag de status elke 3-5 seconden op. Zie de taaklimiet voor de API.


❌ Foutantwoorden#

Alle foutantwoorden hebben dezelfde JSON-structuur:

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

Foutcodereferentie#

CodeNaamBeschrijvingAanbevolen actie
1001FAILEDVerzoek mislukt: algemene foutControleer het veld message voor specifieke details
1003INTERNAL_ERRORInterne serverfoutProbeer het na een korte wachttijd opnieuw; neem contact op met ondersteuning als de fout blijft optreden
1011PARAM_ERRORFout in verzoekparameters, bijvoorbeeld ontbrekende imageUrlZorg dat imageUrl is opgegeven en een geldige URL is
5002API_KEY_INVALIDOngeldige of ontbrekende API KeyControleer dat de header APIKEY aanwezig is en klopt
9010SCAN_TEXT_ERRORInstructie afgekeurd bij inhoudsmoderatiePas de instructie aan om gevoelige of verboden inhoud te verwijderen
9038PROHIBITED_CONTENTDe gegenereerde uitvoerafbeelding bevat verboden inhoudPas instructie, stijl of invoer aan en probeer opnieuw
9051COINS_NOT_ENOUGHOnvoldoende tegoedVul credits aan en probeer opnieuw

📄 Zie de foutcodereferentie voor de volledige definities van algemene fouten.