Ideal House
Przejdź do treści

Dokumentacja Smart Replace API#

Podstawowy URL: https://api.ideal.house
Wersja: v1
Zaktualizowano: 2026-03-06


📖 Przegląd#

Smart Replace API umożliwia inteligentną zamianę wybranego obszaru na obrazie na treść wygenerowaną przez AI na podstawie podanego przez Ciebie polecenia tekstowego. Podajesz obraz źródłowy, obraz maski, który definiuje obszar do zamiany, oraz polecenie tekstowe opisujące, co powinno wypełnić ten obszar. AI płynnie wtopi wygenerowaną treść w oryginalny obraz. Praca jest asynchroniczna i obejmuje dwa etapy:

  1. Utworzenie zadania — Prześlij swój obraz, maskę i polecenie, a następnie otrzymaj taskId.
  2. Cykliczne sprawdzanie wyników — Użyj taskId, aby zapytać o status zadania i pobrać obraz wyniku.

🔐 Uwierzytelnianie#

Wszystkie żądania API muszą być uwierzytelniane za pomocą klucza API.

Włącz swój klucz API w nagłówku żądania:

NagłówekWartość
APIKEYyour_api_key_here

⚠️ Zabezpiecz swój klucz API. Nie ujawniaj go w kodzie po stronie klienta ani w publicznych repozytoriach.


💰 Odejmowanie kredytów#

[!WARNING] 🪙 Każde zadanie pobiera 1 kredyt z Twojego konta po pomyślnym utworzeniu zadania. Jeśli zadanie ostatecznie zawiedzie, pobrane kredyty zostaną automatycznie zwrócone na Twoje konto.
Niewystarczające kredyty zwrócą kod błędu 9051. 📄 Zobacz Referencja odejmowania kredytów.


🖼️ Format obrazu maski#

Obraz maski definiuje obszar, który ma zostać zamieniony na obrazie źródłowym.

Zasady maski:

KolorZnaczenie
CzarnyObszar do zamiany (region, w którym zostanie wygenerowana nowa treść)
BiałyObszar do zachowania (tło, które ma pozostać bez zmian)

⚠️ Obraz maski musi mieć te same wymiary co obraz źródłowy (imageUrl).

Przykład maski:

Przykład maski

Czarny obszar na masce oznacza region, który ma zostać zamieniony przez AI; biały obszar to tło, które należy zachować.


📌 Końcówki API#


1. Utworzenie zadania Smart Replace#

Tworzy nowe zadanie inteligentnej zamiany z użyciem AI i zwraca unikalny taskId do cyklicznego sprawdzania.

Końcówka

Zwykły tekst
POST /api/v1/smartReplace/generate

Nagłówki żądania

NagłówekWymaganyOpis
APIKEY✅ TakTwój klucz uwierzytelniający API
Content-Type✅ Takapplication/json

Ciało żądania

PoleTypWymaganeOpis
imageUrlstring✅ TakURL obrazu źródłowego
promptstring✅ TakPolecenie tekstowe opisujące treść do wygenerowania w zamaskowanym obszarze (np., "a modern armchair", "marble flooring")
maskUrlstring⚠️ Albo maskUrl albo maskBase64URL obrazu maski. Obszary czarne zostaną zamienione; obszary białe zostaną zachowane
maskBase64string⚠️ Albo maskUrl albo maskBase64Obraz maski zakodowany w Base64 (zalecany format PNG). Używane, gdy nie można podać hostowanego URL

⚠️ Należy podać co najmniej jedno z: maskUrl lub maskBase64. Jeśli podano oba, maskUrl ma pierwszeństwo.

🖼️ Wymagania dotyczące obrazów: Obraz źródłowy i maska muszą używać formatu JPG/JPEG, PNG lub WebP. Każdy obraz nie może być większy niż 20 MB, a jego wymiary muszą mieścić się w przedziale od 128 × 128 px do 6,000 × 6,000 px (włącznie). Obrazy przekraczające maksymalne wymiary pikseli są automatycznie skalowane proporcjonalnie, aby zmieścić się w 6,000 × 6,000 px przed przetwarzaniem. Adresy URL obrazów muszą być bezpośrednio dostępne dla serwera API. Maska w formacie Base64 podlega tym samym limitom rozmiaru po dekodowaniu i nie może zawierać prefiksu data-URL.


📥 Przykłady żądań#

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

📤 Odpowiedź#

Odpowiedź sukcesu

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
PoleTypOpis
codeinteger0 wskazuje sukces
messagestringkomunikat odpowiedzi
datalongunikalny identyfikator zadania do cyklicznego sprawdzania wyników

2. Pobranie wyniku zadania#

Pobiera bieżący status i wynik wcześniej utworzonego zadania Smart Replace.

Końcówka

Zwykły tekst
GET /api/v1/smartReplace/result

Nagłówki żądania

NagłówekWymaganyOpis
APIKEY✅ TakTwój klucz uwierzytelniający API

Parametry zapytania

ParametrTypWymaganyOpis
taskIdlong✅ Takidentyfikator zadania zwrócony z końcówki tworzenia zadania

📥 Przykłady żądań#

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

📤 Odpowiedź#

Odpowiedź sukcesu (zadanie zakończone)

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
    }
  }
}

Odpowiedź (zadanie w trakcie przetwarzania / w kolejce)

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
  }
}

Odpowiedź (zadanie niepowodzenie)

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
  }
}

Pola odpowiedzi

PoleTypOpis
idlongunikalny identyfikator zadania
statusstringbieżący status zadania (zobacz Status zadania)
waitNumberintegerliczba zadań przed Tobą w kolejce (0 oznacza bieżące przetwarzanie)
percentageintegerprocent ukończenia zadania (0–100)
inputobjectoryginalne parametry wejściowe zadania
input.imageUrlstringAdres URL obrazu źródłowego
input.promptstringPolecenie tekstowe opisujące zamienianą treść
input.maskUrlstringAdres URL obrazu maski (jeśli podano przez maskUrl)
outputobjectwynik generowania (dostępny tylko, gdy status wynosi Success)
output.resultUrlstringAdres URL obrazu wyniku po zamianie Smart Replace
output.widthintegerszerokość wyjścia w pikselach
output.heightintegerwysokość wyjścia w pikselach

📊 Status zadania#

StatusOpis
Unprocessedzadanie zostało utworzone, ale nie zostało jeszcze rozpoczęte
Processingzadanie jest obecnie przetwarzane
Successzadanie zakończyło się pomyślnie — wynik jest dostępny
Failedzadanie nie powiodło się z powodu błędu

Cyklicznie sprawdzaj co 3-5 sekund. Zobacz Limit zadań API.


❌ Odpowiedzi błędów#

Wszystkie odpowiedzi błędów mają tę samą strukturę JSON:

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

Referencja kodów błędów#

KodNazwaOpisSugerowane działanie
1001FAILEDżądanie nie powiodło się (błąd ogólny)Sprawdź pole message, aby uzyskać szczegółowe informacje o błędzie
1003INTERNAL_ERRORwewnętrzny błąd serweraPonów po krótkim opóźnieniu; skontaktuj się z pomocą techniczną, jeśli problem utrzymuje się
1011PARAM_ERRORBłąd parametru żądania — np., brak prompt lub maskiUpewnij się, że podano zarówno prompt, jak i co najmniej jedno pole maski
5002API_KEY_INVALIDnieprawidłowy lub brakujący klucz APIUpewnij się, że nagłówek APIKEY jest obecny i wartość jest poprawna
9010SCAN_TEXT_ERRORprompt tekstowy nie przeszedł weryfikacji treściZmodyfikuj prompt, aby usunąć wszelką wrażliwą lub zakazaną treść
9038PROHIBITED_CONTENTwygenerowany obraz wyjściowy zawiera zakazaną treśćDostosuj prompt/styl/wejścia i ponów
9051COINS_NOT_ENOUGHniewystarczające monety / kredytyDoładuj kredyty na swoim koncie i ponów

📄 Pełna lista powszechnych kodów błędów API znajduje się w Referencji kodów błędów.