Ideal House
Zum Hauptinhalt springen

API zum Entfernen von Objekten-Dokumentation#

Basis-URL: https://api.ideal.house
Version: v1
Aktualisiert: 2026-03-06


📖 Übersicht#

Die API zum Entfernen von Objekten ermöglicht es Ihnen, unerwünschte Objekte oder Möbel aus Innenraumbildern mithilfe von KI zu entfernen. Sie unterstützt zwei Modi:

  • single_furniture — Entfernen Sie ein bestimmtes Möbelstück, indem Sie ein Maskenbild bereitstellen, das den Zielbereich markiert. Die KI füllt den entfernten Bereich intelligent auf, um ein sauberes, natürlich wirkendes Ergebnis zu erzeugen.
  • whole_house — Entfernt automatisch alle Möbel aus dem gesamten Raum, ohne eine Maske zu benötigen.

Der Arbeitsablauf ist asynchron und umfasst zwei Schritte:

  1. Task erstellen — Übermitteln Sie Ihr Quellbild, Ihre Maske und Ihre Parameter und erhalten Sie eine taskId.
  2. Ergebnisse regelmäßig abfragen — Verwenden Sie die taskId, um den Status des Tasks abzufragen und das Ergebnisbild abzurufen.

🔐 Authentifizierung#

Alle API Anfragen müssen mit einem API Key authentifiziert werden.

Fügen Sie Ihren API Key in den Anforderungsheader ein:

KopfzeileWert
APIKEYyour_api_key_here

⚠️ Bewahren Sie Ihren API Key sicher auf. Geben Sie ihn nicht in Client-seitigem Code oder öffentlichen Repositorien frei.


💰 Guthabenverbrauch#

[!WARNING] 🪙 Bei erfolgreicher Aufgabenerstellung wird Ihrem Konto 1 Credit abgezogen. Wenn die Aufgabe letztendlich fehlschlägt, werden die abgebuchten Credits automatisch erstattet auf Ihr Konto.
Unzureichende Guthabeneinheiten geben Fehlercode 9051 zurück. 📄 Siehe Referenz zum Guthabenverbrauch.


🖼️ Format des Maskenbildes#

Das Maskenbild definiert den Bereich, der aus dem Quellbild entfernt werden soll.

Maskenregeln:

FarbeBedeutung
SchwarzZu entfernender Bereich (Objekt / Region zum Löschen)
WeißZu erhaltender Bereich (Hintergrund, der behalten werden soll)

⚠️ Das Maskenbild muss die gleichen Abmessungen wie das Quellbild haben (imageUrl).

Maskenbeispiel:

Maskenbeispiel

Der schwarze Bereich in der Maske markiert das zu entfernende Möbelstück; der weiße Bereich ist der zu erhaltende Hintergrund.


📌 API Endpunkte#


1. Aufgabe zum Entfernen von Objekten erstellen#

Erstellt eine neue KI-Aufgabe zum Entfernen von Objekten und gibt eine eindeutige taskId zur regelmäßigen Ergebnisabfrage zurück.

Endpunkt

Klartext
POST /api/v1/objectRemover/generate

Anforderungsheader

KopfzeileErforderlichBeschreibung
APIKEY✅ JaIhr API Authentifizierungsschlüssel
Content-Type✅ Jaapplication/json

Anforderungskörper

FeldTypErforderlichBeschreibung
imageUrlstring✅ JaURL des Quellbildes
emptyTypestring✅ JaEntfernungsmodus. Aufzählung: whole_house, single_furniture. Steuert, wie die KI den entfernten Bereich auffüllt
maskUrlstring⚠️ Erforderlich wenn emptyType=single_furnitureURL des Maskenbildes. Schwarze Bereiche werden entfernt; weiße Bereiche bleiben erhalten. Wirkt nur im single_furniture-Modus
maskBase64string⚠️ Erforderlich wenn emptyType=single_furnitureBase64-kodiertes Maskenbild (PNG-Format empfohlen). Alternative zu maskUrl. Wirkt nur im single_furniture-Modus

⚠️ Maskenanforderung je nach Modus:

  • single_furniture — Es muss mindestens einer von maskUrl oder maskBase64 gegeben sein. Wenn beide angegeben sind, hat maskUrl Vorrang.
  • whole_house — Maskenfelder werden ignoriert. Die KI entfernt automatisch alle Möbel aus dem gesamten Raum.

🖼️ Anforderungen an das Bild: Quellbild und Maske müssen JPG/JPEG, PNG oder WebP verwenden. Jedes Bild darf nicht größer als 20 MB sein und muss Abmessungen von 128 × 128 px bis maximal 6,000 × 6,000 px (einschließlich) haben. Bilder, die die maximalen Pixeldimensionen überschreiten, werden vor der Verarbeitung automatisch proportional verkleinert, um innerhalb von 6,000 × 6,000 px zu passen. Die Bild-URLs müssen vom API-Server direkt erreichbar sein. Eine Base64-Maske unterliegt denselben Grenzwerten für das dekodierte Bild und darf kein data-URL-Präfix enthalten.


Optionen für den Entfernungsmodus

WertMaske erforderlichBeschreibung
single_furniture✅ JaEntfernt ein bestimmtes, durch die Maske definiertes Möbelstück und füllt den Bereich natürlich auf
whole_house❌ NeinEntfernt automatisch alle Möbel aus dem gesamten Raum — keine Maske erforderlich

📥 Anfragebeispiele#

cURL
bash
# single_furniture mode — mask required (using maskUrl)
curl -X POST "https://api.ideal.house/api/v1/objectRemover/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "emptyType": "single_furniture",
    "maskUrl": "https://example.com/mask.png"
  }'

# single_furniture mode — mask required (using maskBase64)
curl -X POST "https://api.ideal.house/api/v1/objectRemover/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "emptyType": "single_furniture",
    "maskBase64": "iVBORw0KGgoAAAANSUhEUgAA..."
  }'

# whole_house mode — no mask needed
curl -X POST "https://api.ideal.house/api/v1/objectRemover/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "emptyType": "whole_house"
  }'
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 ObjectRemoverApiExample {

    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",
                "maskUrl": "https://example.com/mask.png",
                "emptyType": "single_furniture"
            }
            """;

        // 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",
        //         "maskBase64": "%s",
        //         "emptyType": "single_furniture"
        //     }
        //     """.formatted(maskBase64);

        Request request = new Request.Builder()
            .url(BASE_URL + "/api/v1/objectRemover/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",
    "maskUrl": "https://example.com/mask.png",
    "emptyType": "single_furniture"
}

# 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",
#     "maskBase64": mask_base64,
#     "emptyType": "single_furniture"
# }

response = requests.post(
    f"{BASE_URL}/api/v1/objectRemover/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 createObjectRemoverTask() {
  try {
    // Option 1: Use maskUrl
    const payload = {
      imageUrl: 'https://example.com/room.jpg',
      maskUrl: 'https://example.com/mask.png',
      emptyType: 'single_furniture'
    };

    // 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',
    //   maskBase64: maskBase64,
    //   emptyType: 'single_furniture'
    // };

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

createObjectRemoverTask();

📤 Antwort#

Erfolgreiche Antwort

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
FeldTypBeschreibung
codeinteger0 zeigt Erfolg an
messagestringAntwortnachricht
datalongDie eindeutige Aufgaben-ID für die Ergebnisabfrage

2. Aufgabenergebnis abrufen#

Abrufen des aktuellen Status und der Ausgabe eines zuvor erstellten Aufgabe zum Entfernen von Objekten.

Endpunkt

Klartext
GET /api/v1/objectRemover/result

Anforderungsheader

KopfzeileErforderlichBeschreibung
APIKEY✅ JaIhr API Authentifizierungsschlüssel

Abfrageparameter

ParameterTypErforderlichBeschreibung
taskIdlong✅ JaDie vom Erstellungsendpunkt zurückgegebene Aufgaben-ID

📥 Anfragebeispiele#

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

public class ObjectRemoverResultExample {

    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/objectRemover/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/objectRemover/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/objectRemover/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);

📤 Antwort#

Erfolgreiche Antwort (Aufgabe abgeschlossen)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Success",
    "waitNumber": 0,
    "percentage": 100,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "maskUrl": "https://example.com/mask.png",
      "emptyType": "single_furniture"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/object_remover_result.jpg",
      "width": 1024,
      "height": 1024
    }
  }
}

Antwort (Aufgabe in Bearbeitung / in Warteschlange)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Processing",
    "waitNumber": 1,
    "percentage": 50,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "maskUrl": "https://example.com/mask.png",
      "emptyType": "single_furniture"
    },
    "output": null
  }
}

Antwort (Aufgabe fehlgeschlagen)

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Failed",
    "waitNumber": 0,
    "percentage": 0,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "maskUrl": "https://example.com/mask.png",
      "emptyType": "single_furniture"
    },
    "output": null
  }
}

Antwortfelder

FeldTypBeschreibung
idlongEindeutiger Aufgabenbezeichner
statusstringAktueller Aufgabenstatus (siehe Aufgabestatus)
waitNumberintegerAnzahl der Aufgaben vor Ihnen in der Warteschlange (0 bedeutet aktuell in Bearbeitung)
percentageintegerFortschritt der Aufgabe in Prozent (0–100)
inputobjectDie ursprünglichen Eingabeparameter der Aufgabe
input.imageUrlstringQuellbild URL
input.maskUrlstringMaskenbild URL (falls über maskUrl bereitgestellt)
input.emptyTypestringVerwendeter Entfernungsmodus (single_furniture oder whole_house)
outputobjectGenerierungsergebnis (nur verfügbar, wenn status Success ist)
output.resultUrlstringURL zum Ergebnisbild mit entfernten Objekten
output.widthintegerAusgabebreite in Pixeln
output.heightintegerAusgabehöhe in Pixeln

📊 Aufgabenstatus#

StatusBeschreibung
UnprocessedAufgabe wurde erstellt, aber noch nicht gestartet
ProcessingAufgabe wird derzeit verarbeitet
SuccessAufgabe erfolgreich abgeschlossen — Ausgabe ist verfügbar
FailedAufgabe aufgrund eines Fehlers fehlgeschlagen

Alle 3-5 Sekunden abfragen. Siehe API Aufgabenlimit.


❌ Fehlerantworten#

Alle Fehlerantworten haben dieselbe JSON-Struktur:

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

Fehlercode-Referenz#

CodeNameBeschreibungEmpfohlene Maßnahme
1001FAILEDAnfrage fehlgeschlagen (generischer Fehler)Überprüfen Sie das message-Feld für spezifische Fehlerdetails
1003INTERNAL_ERRORInterner ServerfehlerWiederholen Sie nach kurzer Verzögerung; wenden Sie sich an den Support, falls es anhält
1011PARAM_ERRORFehler bei der Anfrageparameter — zum Beispiel sowohl maskUrl als auch maskBase64 fehlenStellen Sie sicher, dass mindestens ein Maskenfeld bereitgestellt wird
5002API_KEY_INVALIDUngültiger oder fehlender API KeyStellen Sie sicher, dass der APIKEY Header vorhanden ist und der Wert korrekt ist
9038PROHIBITED_CONTENTGeneriertes Ausgangsbild enthält verbotene InhaltePassen Sie Prompt/Stil/Eingaben an und wiederholen Sie
9051COINS_NOT_ENOUGHUnzureichende Münzen / CreditsLaden Sie Ihre Kontocredits auf und wiederholen Sie den Vorgang

📄 Für die vollständige Liste gemeinsamer API Fehlercodes beachten Sie die Fehlercode-Referenz.