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

توثيق API للعرض التصويري 3D بالذكاء الاصطناعي#

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


📖 نظرة عامة#

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

  1. إنشاء مهمة — قدم معاملات الإدخال واحصل على taskId.
  2. التحقق من النتائج — استخدم taskId للاستعلام عن حالة المهمة واسترداد الناتج المنشأ.

🔐 المصادقة#

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

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

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

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


💰 خصم الرصيد#

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

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

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


1. إنشاء مهمة عرض 3D#

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

نقطة النهاية

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

رؤوس الطلب

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

جسم الطلب

الحقلالنوعمطلوبالوصف
imageUrlstring✅ نعمURL صورة المصدر لعرضها
promptstring❌ اختياريموجه نصي إضافي لإرشاد أسلوب أو محتوى العرض
modelTypestring❌ اختيارينوع جودة النموذج. التعداد: Flash، Base، Pro. الافتراضي هو Flash
renderDegreeinteger❌ اختياريمستوى كثافة العرض. النطاق: 1 (الأخف) – 6 (الأقوى). الافتراضي هو 3. فعّال فقط عندما يكون modelType هو Flash
renderModestring❌ اختياريوضع العرض. التعداد: default، creativeMode. الافتراضي هو default
refImageUrlstring❌ اختياريURL صورة أسلوب مرجعية لإرشاد ناتج العرض

⚠️ ملاحظة: renderDegree يعمل فقط عندما يكون modelType مضبوطًا إلى Flash. إذا لم يتم تحديد modelType، يُستخدم Flash بشكل افتراضي.

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


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

القيمةالوصف
Flashالافتراضي. أسرع سرعة إنشاء، جودة قياسية. يدعم التحكم في renderDegree
Baseتوازن بين السرعة والجودة. renderDegree يتم تجاهله
Proأعلى جودة، إنشاء أبطأ. renderDegree يتم تجاهله

أوضاع العرض

القيمةالوصف
defaultالوضع الافتراضي. يحافظ على نسيج وهيكل الصورة الأصلية أثناء العرض (وضع الحفاظ على الملمس)
creativeModeالوضع الإبداعي — يطبق تحويلات عرض أكثر فنية وأسلوبية

درجة العرض

القيمةالوصف
1أخف عرض — أقل تحول
25كثافة عرض تدريجية
6أقوى عرض — أقصى تحول

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

cURL
bash
# Using Flash model with renderDegree (texture preservation mode)
curl -X POST "https://api.ideal.house/api/v1/ai3dRendering/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "modelType": "Flash",
    "renderDegree": 4,
    "renderMode": "default"
  }'

# Using Flash model with creative mode, prompt and a reference image
curl -X POST "https://api.ideal.house/api/v1/ai3dRendering/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "prompt": "A modern minimalist living room with wooden floor",
    "modelType": "Flash",
    "renderDegree": 5,
    "renderMode": "creativeMode",
    "refImageUrl": "https://example.com/style-reference.jpg"
  }'

# Using Pro model (renderDegree is ignored)
curl -X POST "https://api.ideal.house/api/v1/ai3dRendering/generate" \
  -H "APIKEY: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "imageUrl": "https://example.com/room.jpg",
    "modelType": "Pro",
    "renderMode": "default"
  }'
Java (OkHttp)
java
import okhttp3.*;
import java.io.IOException;

public class Ai3dRenderingApiExample {

    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 model with renderDegree (renderDegree only works with Flash)
        String requestBody = """
            {
                "imageUrl": "https://example.com/room.jpg",
                "modelType": "Flash",
                "renderDegree": 4,
                "renderMode": "default"
            }
            """;

        // Pro model example (renderDegree is ignored)
        // String requestBody = """
        //     {
        //         "imageUrl": "https://example.com/room.jpg",
        //         "modelType": "Pro",
        //         "renderMode": "default"
        //     }
        //     """;

        Request request = new Request.Builder()
            .url(BASE_URL + "/api/v1/ai3dRendering/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 model — renderDegree takes effect (default texture preservation mode)
payload = {
    "imageUrl": "https://example.com/room.jpg",
    "modelType": "Flash",
    "renderDegree": 4,
    "renderMode": "default"
}

# Flash model with creative mode, prompt and reference image
# payload = {
#     "imageUrl": "https://example.com/room.jpg",
#     "prompt": "A modern minimalist living room with wooden floor",
#     "modelType": "Flash",
#     "renderDegree": 5,
#     "renderMode": "creativeMode",
#     "refImageUrl": "https://example.com/style-reference.jpg"
# }

# Pro model — renderDegree is ignored
# payload = {
#     "imageUrl": "https://example.com/room.jpg",
#     "modelType": "Pro",
#     "renderMode": "default"
# }

response = requests.post(
    f"{BASE_URL}/api/v1/ai3dRendering/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 createRenderingTask() {
  try {
    const response = await axios.post(
      `${BASE_URL}/api/v1/ai3dRendering/generate`,
      {
        // Flash model — renderDegree takes effect
        imageUrl: 'https://example.com/room.jpg',
        modelType: 'Flash',
        renderDegree: 4,
        renderMode: 'default'

        // Flash model with creative mode:
        // prompt: 'A modern minimalist living room with wooden floor',
        // modelType: 'Flash',
        // renderDegree: 5,
        // renderMode: 'creativeMode',
        // refImageUrl: 'https://example.com/style-reference.jpg'

        // Pro model — renderDegree is ignored:
        // imageUrl: 'https://example.com/room.jpg',
        // modelType: 'Pro',
        // renderMode: 'default'
      },
      {
        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);
  }
}

createRenderingTask();

📤 الاستجابة#

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

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

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

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

نقطة النهاية

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

رؤوس الطلب

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

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

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

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

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

public class Ai3dRenderingResultExample {

    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/ai3dRendering/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/ai3dRendering/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/ai3dRendering/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);
      } 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",
      "modelType": "Flash",
      "renderDegree": 4,
      "renderMode": "default"
    },
    "output": {
      "resultUrl": "https://cdn.ideal.house/output/rendered_result.jpg",
      "width": 1024,
      "height": 1024
    }
  }
}

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

json
{
  "code": 0,
  "message": "success",
  "data": {
    "id": 1234567890123456789,
    "status": "Processing",
    "waitNumber": 1,
    "percentage": 50,
    "input": {
      "imageUrl": "https://example.com/room.jpg",
      "modelType": "Flash",
      "renderDegree": 4,
      "renderMode": "default"
    },
    "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",
      "renderDegree": 4,
      "renderMode": "default"
    },
    "output": null
  }
}

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

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

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

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

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


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

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

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

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

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

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