توثيق API للعرض التصويري 3D بالذكاء الاصطناعي#
URL الأساسي:
https://api.ideal.house
الإصدار: v1
آخر تحديث: 2026-03-06
📖 نظرة عامة#
تتيح لك API العرض التصويري 3D بالذكاء الاصطناعي إرسال مهمة عرض تصويري 3D انطلاقًا من صورة مصدر، مع تحكم دقيق في شدة العرض ووضعه، وتوجيه نصي اختياري، وصور مرجعية للنمط. سير العمل غير متزامن ويتكون من خطوتين:
- إنشاء مهمة — قدم معاملات الإدخال واحصل على
taskId. - التحقق من النتائج — استخدم
taskIdللاستعلام عن حالة المهمة واسترداد الناتج المنشأ.
🔐 المصادقة#
يجب مصادقة جميع طلبات API باستخدام مفتاح API.
تضمّن مفتاح API في رأس الطلب:
| الرأس | القيمة |
|---|---|
APIKEY | your_api_key_here |
⚠️ احفظ مفتاح API بأمان. لا تعرضه في كود الواجهة الأمامية أو المستودعات العامة.
💰 خصم الرصيد#
[!WARNING] 🪙 يتم خصم الرصيد بناءً على
modelTypeالمُحدد عند نجاح إنشاء المهمة. إذا فشلت المهمة في النهاية، فسيتم إرجاع الرصيد المخصوم تلقائيًا إلى حسابك.
سيعيد نقص الرصيد رمز الخطأ9051. 📄 اطّلِع على مرجع خصم الرصيد.
النموذج (modelType) | الرصيد المخصوم |
|---|---|
Flash | 1 رصيد |
Base | 3 رصيد |
Pro | 10 رصيد |
📌 نقاط نهاية API#
1. إنشاء مهمة عرض 3D#
ينشئ مهمة جديدة للعرض التصويري 3D بالذكاء الاصطناعي ويعيد taskId فريدًا للاستعلام الدوري عن النتائج.
نقطة النهاية
POST /api/v1/ai3dRendering/generate
رؤوس الطلب
| الرأس | مطلوب | الوصف |
|---|---|---|
APIKEY | ✅ نعم | مفتاح مصادقة API الخاص بك |
Content-Type | ✅ نعم | application/json |
جسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
imageUrl | string | ✅ نعم | URL صورة المصدر لعرضها |
prompt | string | ❌ اختياري | موجه نصي إضافي لإرشاد أسلوب أو محتوى العرض |
modelType | string | ❌ اختياري | نوع جودة النموذج. التعداد: Flash، Base، Pro. الافتراضي هو Flash |
renderDegree | integer | ❌ اختياري | مستوى كثافة العرض. النطاق: 1 (الأخف) – 6 (الأقوى). الافتراضي هو 3. فعّال فقط عندما يكون modelType هو Flash |
renderMode | string | ❌ اختياري | وضع العرض. التعداد: default، creativeMode. الافتراضي هو default |
refImageUrl | string | ❌ اختياري | 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 | أخف عرض — أقل تحول |
2 – 5 | كثافة عرض تدريجية |
6 | أقوى عرض — أقصى تحول |
📥 أمثلة الطلب#
cURL
# 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)
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)
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)
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();
📤 الاستجابة#
استجابة النجاح
{
"code": 0,
"message": "success",
"data": 1234567890123456789
}
| الحقل | النوع | الوصف |
|---|---|---|
code | integer | يشير 0 إلى النجاح |
message | string | رسالة الاستجابة |
data | long | معرف المهمة الفريد للاستعلام عن النتائج |
2. استرداد نتيجة المهمة#
يستحضر الحالة الحالية والإخراج لمهمة عرض سابقة تم إنشاؤها.
نقطة النهاية
GET /api/v1/ai3dRendering/result
رؤوس الطلب
| الرأس | مطلوب | الوصف |
|---|---|---|
APIKEY | ✅ نعم | مفتاح مصادقة API الخاص بك |
معاملات الاستعلام
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
taskId | long | ✅ نعم | معرف المهمة الذي تمت إعادته من نقطة النهاية لإنشاء المهمة |
📥 أمثلة الطلب#
cURL
curl -X GET "https://api.ideal.house/api/v1/ai3dRendering/result?taskId=1234567890123456789" \
-H "APIKEY: your_api_key_here"
Java (OkHttp)
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)
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)
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);
📤 الاستجابة#
استجابة النجاح (اكتمال المهمة)
{
"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
}
}
}
استجابة (معالجة المهمة / في الطابور)
{
"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
}
}
استجابة (فشل المهمة)
{
"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
}
}
حقول الاستجابة
| الحقل | النوع | الوصف |
|---|---|---|
id | long | معرّف المهمة الفريد |
status | string | حالة المهمة الحالية (اطّلِع على حالة المهمة) |
waitNumber | integer | عدد المهام التي تسبق هذه المهمة في الطابور (يعني 0 المعالجة حاليًا) |
percentage | integer | نسبة اكتمال المهمة (0–100) |
input | object | معاملات الإدخال الأصلية للمهمة |
input.imageUrl | string | URL صورة المصدر (إذا تم توفيره) |
input.prompt | string | النص الأصلي للموجه (إذا تم توفيره) |
input.modelType | string | نوع النموذج المستخدم |
input.renderDegree | integer | مستوى كثافة العرض المستخدم (1–6) |
input.renderMode | string | وضع العرض المستخدم (default أو creativeMode) |
input.refImageUrl | string | URL صورة أسلوب مرجعية (إذا تم توفيره) |
output | object | نتيجة التوليد (متاحة فقط عندما يكون status هو Success) |
output.resultUrl | string | URL إلى صورة الإخراج المعروضة |
output.width | integer | عرض الإخراج بالبكسل |
output.height | integer | ارتفاع الإخراج بالبكسل |
📊 حالة المهمة#
| الحالة | الوصف |
|---|---|
Unprocessed | تم إنشاء المهمة ولكن لم تبدأ بعد |
Processing | تتم معالجة المهمة حاليًا |
Success | اكتملت المهمة بنجاح — الإخراج متاح |
Failed | فشلت المهمة بسبب خطأ |
استعلم كل 3-5 ثوانٍ. اطّلِع على حد مهمات API.
❌ استجابات الخطأ#
تتشارك جميع استجابات الخطأ نفس هيكل JSON:
{
"code": 5002,
"message": "Invalid API Key",
"data": null
}
مرجع رموز الخطأ#
| الرمز | الاسم | الوصف | الإجراء المقترح |
|---|---|---|---|
1001 | FAILED | فشل الطلب (خطأ عام) | تحقق من حقل message للحصول على تفاصيل الخطأ المحددة |
1003 | INTERNAL_ERROR | خطأ داخلي في الخادم | أعد المحاولة بعد فترة انتظار قصيرة; تواصل مع الدعم إذا استمر |
1011 | PARAM_ERROR | خطأ معامل الطلب | تحقق من توفير جميع المعاملات المطلوبة وتنسيقها بشكل صحيح |
5002 | API_KEY_INVALID | مفتاح API غير صالح أو مفقود | تأكد من وجود رأس APIKEY وأن القيمة صحيحة |
9010 | SCAN_TEXT_ERROR | فشل مراجعة محتوى مطالبة النص | عدّل المطالبة لإزالة أي محتوى حساس أو محظور |
9038 | PROHIBITED_CONTENT | تحتوي صورة الإخراج المُولَّدة على محتوى محظور | عدّل التوجيه النصي/النمط/الإدخالات وأعد المحاولة |
9051 | COINS_NOT_ENOUGH | رصيد غير كافٍ / اعتمادات | قم بتعبئة رصيد حسابك وحاول مرة أخرى |
📄 للحصول على القائمة الكاملة لرموز خطأ API الشائعة، راجع مرجع رموز الخطأ.