Ideal House
Przejdź do treści

Dokumentacja Magic Editor API#

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


📖 Przegląd#

Magic Editor API umożliwia inteligentną edycję i transformację obrazów za pomocą AI. Podając obraz źródłowy i opcjonalne polecenie tekstowe, AI zastosuje inteligentne modyfikacje do obrazu na podstawie wybranego trybu modelu. Praca jest asynchroniczna i obejmuje dwa kroki:

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

🔐 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] 🪙 Kredyty są odbierane na podstawie wybranego modelType po pomyślnym utworzeniu zadania. Jeśli zadanie ostatecznie zawiedzie, odebrane kredyty zostaną automatycznie zwrócone na Twoje konto.
Niewystarczające kredyty zwrócą kod błędu 9051. 📄 Zobacz Referencja odejmowania kredytów.

Model (modelType)Odebrane kredyty
Flash1 kredyt
Base3 kredyty
Pro10 kredyty

📌 Końcówki API#


1. Utworzenie zadania Magic Editor#

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

Końcówka

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

Nagłówki żądania

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

Ciało żądania

PoleTypWymaganeOpis
imageUrlstring✅ TakAdres URL obrazu źródłowego do edycji
promptstring⚠️ WarunkowePolecenie tekstowe opisujące pożądane edycje. Wymagane, gdy modelType to Base; opcjonalne dla trybów Flash i Pro
modelTypestring❌ OpcjonalneTyp modelu. Wyliczenie: Flash, Base, Pro. Domyślnie: Flash

🖼️ Wymagania dotyczące obrazów: Używaj 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. Adres URL obrazu musi być bezpośrednio dostępny dla serwera API.


Typy modeli

WartośćOpisWymagane polecenie
FlashDomyślny. Szybka edycja z automatyczną, inteligentną generacją opartą na AI❌ Opcjonalne
BaseEdycja kierowana tekstem — używa Twojego polecenia do precyzyjnego sterowania wynikiem✅ Wymagane
ProEdycja o wyższej jakości z bardziej szczegółowymi wynikami❌ Opcjonalne

⚠️ Ważne: Gdy modelType to Base, pole prompt musi zostać podane. Żądania z modelType=Base i bez prompt zwrócą błąd parametru.


📥 Przykłady żądań#

cURL
bash
# Flash mode (default) — prompt is optional
curl -X POST "https://api.ideal.house/api/v1/magicEditor/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "modelType": "Flash"
  }'

# Base mode — prompt is required
curl -X POST "https://api.ideal.house/api/v1/magicEditor/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "prompt": "Change the wall color to warm beige and add wooden flooring",
    "modelType": "Base"
  }'

# Pro mode — prompt is optional
curl -X POST "https://api.ideal.house/api/v1/magicEditor/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "prompt": "Modern Scandinavian style interior",
    "modelType": "Pro"
  }'
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class MagicEditorApiExample {

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

        // Flash mode (default) — no prompt needed
        String requestBody = """
            {
                "imageUrl": "https://example.com/room.jpg",
                "modelType": "Flash"
            }
            """;

        // Base mode — prompt is required
        // String requestBody = """
        //     {
        //         "imageUrl": "https://example.com/room.jpg",
        //         "prompt": "Change the wall color to warm beige and add wooden flooring",
        //         "modelType": "Base"
        //     }
        //     """;

        // Pro mode — prompt is optional
        // String requestBody = """
        //     {
        //         "imageUrl": "https://example.com/room.jpg",
        //         "prompt": "Modern Scandinavian style interior",
        //         "modelType": "Pro"
        //     }
        //     """;

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

# Flash mode (default) — no prompt needed
payload = {
    "imageUrl": "https://example.com/room.jpg",
    "modelType": "Flash"
}

# Base mode — prompt is required
# payload = {
#     "imageUrl": "https://example.com/room.jpg",
#     "prompt": "Change the wall color to warm beige and add wooden flooring",
#     "modelType": "Base"
# }

# Pro mode — prompt is optional
# payload = {
#     "imageUrl": "https://example.com/room.jpg",
#     "prompt": "Modern Scandinavian style interior",
#     "modelType": "Pro"
# }

response = requests.post(
    f"{BASE_URL}/api/v1/magicEditor/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 createMagicEditorTask() {
  try {
    const response = await axios.post(
      `${BASE_URL}/api/v1/magicEditor/generate`,
      {
        // Flash mode (default) — no prompt needed
        imageUrl: 'https://example.com/room.jpg',
        modelType: 'Flash'

        // Base mode — prompt is required:
        // imageUrl: 'https://example.com/room.jpg',
        // prompt: 'Change the wall color to warm beige and add wooden flooring',
        // modelType: 'Base'

        // Pro mode — prompt is optional:
        // imageUrl: 'https://example.com/room.jpg',
        // prompt: 'Modern Scandinavian style interior',
        // 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);
  }
}

createMagicEditorTask();

📤 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 Magic Editor.

Końcówka

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

public class MagicEditorResultExample {

    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/magicEditor/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/magicEditor/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", "Termination"):
        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/magicEditor/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', 'Termination'].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": "Change the wall color to warm beige and add wooden flooring",
      "modelType": "Base"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/magic_editor_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": 40,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "modelType": "Flash"
    },
    "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",
      "modelType": "Flash"
    },
    "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 (jeśli podano)
input.modelTypestringużyty typ modelu
outputobjectwynik generowania (dostępny tylko, gdy status wynosi Success)
output.resultUrlstringAdres URL edytowanego obrazu wyjściowego
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
Terminationzadanie zostało przerwane lub zakończone

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 przy modelType=BaseUpewnij się, że podano prompt przy użyciu trybu Base
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.