توثيق API إزالة العناصر#
URL الأساسي:
https://api.ideal.house
الإصدار: v1
آخر تحديث: 2026-03-06
📖 نظرة عامة#
تتيح لك API إزالة العناصر إزالة الأشياء أو الأثاث غير المرغوب فيه من الصور الداخلية باستخدام الذكاء الاصطناعي. يدعم وضعين:
single_furniture— إزالة قطعة أثاث محددة عن طريق توفير صورة قناع تحدد المنطقة المستهدفة. يقوم الذكاء الاصطناعي بملء المنطقة التي أُزيل منها العنصر بشكل ذكي لإنتاج نتيجة نظيفة وطبيعية المظهر.whole_house— إزالة جميع الأثاث من الغرفة بأكملها تلقائياً دون الحاجة إلى قناع.
سير العمل غير متزامن ويتكون من خطوتين:
- إنشاء مهمة — قدّم صورة المصدر والقناع والمعاملات، ثم احصل على
taskId. - استفسار عن النتائج دورياً — استخدم
taskIdلاستعلام حالة المهمة واسترجاع صورة النتيجة.
🔐 المصادقة#
يجب مصادقة جميع طلبات API باستخدام مفتاح API.
تضمّن مفتاح API في رأس الطلب:
| الرأس | القيمة |
|---|---|
APIKEY | your_api_key_here |
⚠️ احفظ مفتاح API بأمان. لا تعرضه في كود الواجهة الأمامية أو المستودعات العامة.
💰 خصم الرصيد#
[!WARNING] 🪙 تخصم كل مهمة 1 رصيد من حسابك عند إنشائها بنجاح. إذا فشلت المهمة في النهاية، تُعاد الأرصدة المخصومة إلى حسابك تلقائيًا.
سيعيد نقص الرصيد رمز الخطأ9051. 📄 اطّلِع على مرجع خصم الرصيد.
🖼️ تنسيق صورة القناع#
تحدد صورة القناع المنطقة المراد إزالتها من صورة المصدر.
قواعد القناع:
| اللون | المعنى |
|---|---|
| ⬛ أسود | منطقة الإزالة (الشيء / المنطقة لحذفها) |
| ⬜ أبيض | منطقة الحفظ (الخلفية للإبقاء عليها) |
⚠️ يجب أن تتطابق أبعاد صورة القناع مع نفس أبعاد صورة المصدر (
imageUrl).
مثال على القناع:
يحدد المنطقة السوداء في القناع الأثاث المراد إزالته؛ بينما يمثل الأبيض الخلفية المراد حفظها.
📌 نقاط نهاية API#
1. إنشاء مهمة إزالة العناصر#
ينشئ مهمة جديدة لإزالة الأشياء بالذكاء الاصطناعي ويعيد taskId فريد لاستعلامه.
نقطة النهاية
POST /api/v1/objectRemover/generate
رؤوس الطلب
| الرأس | مطلوب | الوصف |
|---|---|---|
APIKEY | ✅ نعم | مفتاح مصادقة API الخاص بك |
Content-Type | ✅ نعم | application/json |
جسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
imageUrl | string | ✅ مطلوب | URL صورة المصدر |
emptyType | string | ✅ مطلوب | وضع الإزالة. القيم: whole_house، single_furniture. يتحكم في كيفية ملء الذكاء الاصطناعي للمنطقة المزالة |
maskUrl | string | ⚠️ مطلوب عندما emptyType=single_furniture | URL صورة القناع. المناطق السوداء سيتم إزالتها؛ والمناطق البيضاء سيتم حفظها. لا يسري إلا في وضع single_furniture |
maskBase64 | string | ⚠️ مطلوب عندما emptyType=single_furniture | صورة قناع مشفرة بـ Base64 (يوصى بتنسيق PNG). بديل لـ maskUrl. لا يسري إلا في وضع single_furniture |
⚠️ متطلب القناع حسب الوضع:
single_furniture— يجب توفير واحد على الأقل منmaskUrlأوmaskBase64. إذا أُرسل كلاهما، تكون الأولوية لـmaskUrl.whole_house— يتم تجاهل حقول القناع. يقوم الذكاء الاصطناعي بإزالة جميع الأثاث من الغرفة بأكملها تلقائياً.
🖼️ متطلبات الصور: يجب أن تستخدم صورة المصدر والقناع JPG/JPEG أو PNG أو WebP. يجب ألا يزيد حجم كل صورة عن 20 ميجابايت، وأن تكون الأبعاد من 128 × 128 بكسل إلى 6,000 × 6,000 بكسل (ضمن النطاق). يتم تصغير الصور التي تتجاوز الحد الأقصى لأبعاد البكسل تلقائياً بنسب متساوية لتناسب 6,000 × 6,000 بكسل قبل المعالجة. يجب أن تكون URLs الصور قابلة للوصول مباشرة من قبل خادم الـ API. تخضع صورة القناع بـ Base64 لنفس حدود الصورة المفكوك ويجب ألا تتضمن بادئة data-URL.
خيارات وضع الإزالة
| القيمة | مطلوب قناع | الوصف |
|---|---|---|
single_furniture | ✅ نعم | يزيل قطعة أثاث محددة محددة بواسطة القناع ويملأ المنطقة بشكل طبيعي |
whole_house | ❌ لا | يزيل جميع الأثاث من الغرفة بأكملها تلقائياً — لا يحتاج إلى قناع |
📥 أمثلة الطلب#
cURL
# single_furniture mode — mask required (using maskUrl)
curl -X POST "https://api.ideal.house/api/v1/objectRemover/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"imageUrl": "https://example.com/room.jpg",
"emptyType": "single_furniture",
"maskUrl": "https://example.com/mask.png"
}'
# single_furniture mode — mask required (using maskBase64)
curl -X POST "https://api.ideal.house/api/v1/objectRemover/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"imageUrl": "https://example.com/room.jpg",
"emptyType": "single_furniture",
"maskBase64": "iVBORw0KGgoAAAANSUhEUgAA..."
}'
# whole_house mode — no mask needed
curl -X POST "https://api.ideal.house/api/v1/objectRemover/generate" \
-H "APIKEY: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"imageUrl": "https://example.com/room.jpg",
"emptyType": "whole_house"
}'
Java (OkHttp)
import okhttp3.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;
public class ObjectRemoverApiExample {
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",
"maskUrl": "https://example.com/mask.png",
"emptyType": "single_furniture"
}
""";
// 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",
// "maskBase64": "%s",
// "emptyType": "single_furniture"
// }
// """.formatted(maskBase64);
Request request = new Request.Builder()
.url(BASE_URL + "/api/v1/objectRemover/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
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",
"maskUrl": "https://example.com/mask.png",
"emptyType": "single_furniture"
}
# 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",
# "maskBase64": mask_base64,
# "emptyType": "single_furniture"
# }
response = requests.post(
f"{BASE_URL}/api/v1/objectRemover/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 fs = require('fs');
const BASE_URL = 'https://api.ideal.house';
const API_KEY = 'your_api_key_here';
async function createObjectRemoverTask() {
try {
// Option 1: Use maskUrl
const payload = {
imageUrl: 'https://example.com/room.jpg',
maskUrl: 'https://example.com/mask.png',
emptyType: 'single_furniture'
};
// 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',
// maskBase64: maskBase64,
// emptyType: 'single_furniture'
// };
const response = await axios.post(
`${BASE_URL}/api/v1/objectRemover/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);
}
}
createObjectRemoverTask();
📤 الاستجابة#
استجابة النجاح
{
"code": 0,
"message": "success",
"data": 1234567890123456789
}
| الحقل | النوع | الوصف |
|---|---|---|
code | integer | يشير 0 إلى النجاح |
message | string | رسالة الاستجابة |
data | long | معرف المهمة الفريد للاستعلام عن النتائج |
2. استرداد نتيجة المهمة#
يسترجع الحالة الحالية والمخرجات لمهمة إزالة العناصر تم إنشاؤها سابقاً.
نقطة النهاية
GET /api/v1/objectRemover/result
رؤوس الطلب
| الرأس | مطلوب | الوصف |
|---|---|---|
APIKEY | ✅ نعم | مفتاح مصادقة API الخاص بك |
معاملات الاستعلام
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
taskId | long | ✅ نعم | معرف المهمة الذي تمت إعادته من نقطة النهاية لإنشاء المهمة |
📥 أمثلة الطلب#
cURL
curl -X GET "https://api.ideal.house/api/v1/objectRemover/result?taskId=1234567890123456789" \
-H "APIKEY: your_api_key_here"
Java (OkHttp)
import okhttp3.*;
import java.io.IOException;
public class ObjectRemoverResultExample {
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/objectRemover/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/objectRemover/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/objectRemover/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);
📤 الاستجابة#
استجابة النجاح (اكتمال المهمة)
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Success",
"waitNumber": 0,
"percentage": 100,
"input": {
"imageUrl": "https://example.com/room.jpg",
"maskUrl": "https://example.com/mask.png",
"emptyType": "single_furniture"
},
"output": {
"resultUrl": "https://cdn.ideal.house/output/object_remover_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",
"maskUrl": "https://example.com/mask.png",
"emptyType": "single_furniture"
},
"output": null
}
}
استجابة (فشل المهمة)
{
"code": 0,
"message": "success",
"data": {
"id": 1234567890123456789,
"status": "Failed",
"waitNumber": 0,
"percentage": 0,
"input": {
"imageUrl": "https://example.com/room.jpg",
"maskUrl": "https://example.com/mask.png",
"emptyType": "single_furniture"
},
"output": null
}
}
حقول الاستجابة
| الحقل | النوع | الوصف |
|---|---|---|
id | long | معرّف المهمة الفريد |
status | string | حالة المهمة الحالية (اطّلِع على حالة المهمة) |
waitNumber | integer | عدد المهام التي تسبق هذه المهمة في الطابور (يعني 0 المعالجة حاليًا) |
percentage | integer | نسبة اكتمال المهمة (0–100) |
input | object | معاملات الإدخال الأصلية للمهمة |
input.imageUrl | string | URL صورة المصدر |
input.maskUrl | string | URL صورة القناع (إذا تم تقديمها عبر maskUrl) |
input.emptyType | string | وضع الإزالة المستخدم (single_furniture أو whole_house) |
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 | خطأ في معاملات الطلب — مثلًا، كلٍ من maskUrl و maskBase64 مفقودان | تأكد من توفير حقل قناع واحد على الأقل |
5002 | API_KEY_INVALID | مفتاح API غير صالح أو مفقود | تأكد من وجود رأس APIKEY وأن القيمة صحيحة |
9038 | PROHIBITED_CONTENT | تحتوي صورة الإخراج المُولَّدة على محتوى محظور | عدّل التوجيه النصي/النمط/الإدخالات وأعد المحاولة |
9051 | COINS_NOT_ENOUGH | رصيد / عملات غير كافية | قم بشحن رصيد حسابك وأعد المحاولة |
📄 للحصول على القائمة الكاملة لرموز خطأ API الشائعة، راجع مرجع رموز الخطأ.
