Ideal House
تخطّي إلى المحتوى

توثيق API المحرر السحري#

URL الأساسي: https://api.ideal.house
الإصدار: v1
آخر تحديث: 2026-03-06


📖 نظرة عامة#

تتيح لك API المحرر السحري تحرير وتحوير الصور بذكاء باستخدام الذكاء الاصطناعي. من خلال توفير صورة مصدر وطلب نصي اختياري، سيقوم الذكاء الاصطناعي بتطبيق تعديلات ذكية على الصورة بناءً على وضع النموذج المحدد. سير العمل غير متزامن ويتكون من خطوتين:

  1. إنشاء مهمة — قدّم صورتك ومعاملاتك، ثم احصل على taskId.
  2. استفسار عن النتائج دورياً — استخدم taskId لاستعلام حالة المهمة واسترجاع الصورة المعدلة.

🔐 المصادقة#

يجب مصادقة جميع طلبات API باستخدام مفتاح API.

تضمّن مفتاح API في رأس الطلب:

الرأسالقيمة
APIKEYyour_api_key_here

⚠️ احفظ مفتاح API بأمان. لا تعرضه في كود الواجهة الأمامية أو المستودعات العامة.


💰 خصم الرصيد#

[!WARNING] 🪙 تُخصم الأرصدة بحسب modelType المحدد عند إنشاء المهمة بنجاح. إذا فشلت المهمة في النهاية، تُعاد الأرصدة المخصومة إلى حسابك تلقائيًا.
سيعيد نقص الرصيد رمز الخطأ 9051. 📄 اطّلِع على مرجع خصم الرصيد.

النموذج (modelType)الرصيد المخصوم
Flash1 رصيد
Base3 رصيد
Pro10 رصيد

📌 نقاط نهاية API#


1. إنشاء مهمة المحرر السحري#

ينشئ مهمة جديدة لتحرير الصور بالذكاء الاصطناعي ويعيد taskId فريد لاستعلامه.

نقطة النهاية

نص عادي
POST /api/v1/magicEditor/generate

رؤوس الطلب

الرأسمطلوبالوصف
APIKEY✅ نعممفتاح مصادقة API الخاص بك
Content-Type✅ نعمapplication/json

جسم الطلب

الحقلالنوعمطلوبالوصف
imageUrlstring✅ مطلوبURL صورة المصدر للتعديل عليها
promptstring⚠️ شرطيالطلب النصي الوصفي للتعديلات المطلوبة. مطلوب عندما يكون modelType هو Base؛ اختياري لوضعي Flash و Pro
modelTypestring❌ اختيارينوع النموذج. القيم: Flash، Base، Pro. الافتراضي هو Flash

🖼️ متطلبات الصور: استخدم JPG/JPEG أو PNG أو WebP. ألا يتجاوز حجم كل صورة 20 ميجابايت، وأن تكون الأبعاد من 128 × 128 بكسل إلى 6,000 × 6,000 بكسل (شاملًا). يتم تصغير الصور التي تتجاوز أبعاد البكسل القصوى تلقائيًا بشكل متناسب لتناسب 6,000 × 6,000 بكسل قبل المعالجة. يجب أن تكون URL الصورة مباشرةً قابلة للوصول من قبل خوادم API.


أنواع النماذج

القيمةالوصفمطلوب طلب نصي
Flashالافتراضي. تعديل سريع مع توليد ذكي تلقائي بالذكاء الاصطناعي❌ اختياري
Baseالتعديل الموجه بالنص — يستخدم طلبك للتحكم بدقة في المخرجات✅ مطلوب
Proتعديل عالي الجودة مع نتائج أكثر تفصيلاً❌ اختياري

⚠️ مهم: عندما يكون modelType هو Base، يجب تقديم حقل prompt. ستعيد الطلبات التي تحتوي على modelType=Base بدون prompt خطأ معامل.


📥 أمثلة الطلب#

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

📤 الاستجابة#

استجابة النجاح

json
{
  "code": 0,
  "message": "success",
  "data": 1234567890123456789
}
الحقلالنوعالوصف
codeintegerيشير 0 إلى النجاح
messagestringرسالة الاستجابة
datalongمعرف المهمة الفريد للاستعلام عن النتائج

2. استرداد نتيجة المهمة#

يسترجع الحالة الحالية والمخرجات لمهمة المحرر السحري تم إنشاؤها سابقاً.

نقطة النهاية

نص عادي
GET /api/v1/magicEditor/result

رؤوس الطلب

الرأسمطلوبالوصف
APIKEY✅ نعممفتاح مصادقة API الخاص بك

معاملات الاستعلام

المعاملالنوعمطلوبالوصف
taskIdlong✅ نعممعرف المهمة الذي تمت إعادته من نقطة النهاية لإنشاء المهمة

📥 أمثلة الطلب#

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

📤 الاستجابة#

استجابة النجاح (اكتمال المهمة)

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

استجابة (معالجة المهمة / في الطابور)

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

استجابة (فشل المهمة)

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

حقول الاستجابة

الحقلالنوعالوصف
idlongمعرّف المهمة الفريد
statusstringحالة المهمة الحالية (اطّلِع على حالة المهمة)
waitNumberintegerعدد المهام التي تسبق هذه المهمة في الطابور (يعني 0 المعالجة حاليًا)
percentageintegerنسبة اكتمال المهمة (0–100)
inputobjectمعاملات الإدخال الأصلية للمهمة
input.imageUrlstringURL صورة المصدر
input.promptstringالطلب النصي (إذا تم تقديمه)
input.modelTypestringنوع النموذج المستخدم
outputobjectنتيجة التوليد (متاحة فقط عندما يكون status هو Success)
output.resultUrlstringURL إلى صورة الإخراج المعدلة
output.widthintegerعرض الإخراج بالبكسل
output.heightintegerارتفاع الإخراج بالبكسل

📊 حالة المهمة#

الحالةالوصف
Unprocessedتم إنشاء المهمة ولكن لم تبدأ بعد
Processingتتم معالجة المهمة حاليًا
Successاكتملت المهمة بنجاح — الإخراج متاح
Failedفشلت المهمة بسبب خطأ
Terminationتم قطع المهمة أو إنهاؤها

استعلم كل 3-5 ثوانٍ. اطّلِع على حد مهمات API.


❌ استجابات الخطأ#

تتشارك جميع استجابات الخطأ نفس هيكل JSON:

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

مرجع رموز الخطأ#

الرمزالاسمالوصفالإجراء المقترح
1001FAILEDفشل الطلب (خطأ عام)تحقق من حقل message للحصول على تفاصيل الخطأ المحددة
1003INTERNAL_ERRORخطأ داخلي في الخادمأعد المحاولة بعد فترة انتظار قصيرة; تواصل مع الدعم إذا استمر
1011PARAM_ERRORخطأ في معاملات الطلب — مثلًا، prompt مفقود عندما يكون modelType=Baseتأكد من تقديم prompt عند استخدام وضع Base
5002API_KEY_INVALIDمفتاح API غير صالح أو مفقودتأكد من وجود رأس APIKEY وأن القيمة صحيحة
9010SCAN_TEXT_ERRORفشل مراجعة محتوى مطالبة النصعدّل المطالبة لإزالة أي محتوى حساس أو محظور
9038PROHIBITED_CONTENTتحتوي صورة الإخراج المُولَّدة على محتوى محظورعدّل التوجيه النصي/النمط/الإدخالات وأعد المحاولة
9051COINS_NOT_ENOUGHرصيد / عملات غير كافيةقم بشحن رصيد حسابك وأعد المحاولة

📄 للحصول على القائمة الكاملة لرموز خطأ API الشائعة، راجع مرجع رموز الخطأ.