API لإزالة الخلفية: طلب واحد، وصورة PNG جاهزة.
ارفع ملفًا، أو أرسل رابط صورة عامًا، أو قدّم Base64. تعود معظم الصور الفردية جاهزة في استجابة HTTP نفسها، عادةً خلال ثوانٍ قليلة. وإذا استغرقت إحداها وقتًا أطول، تحصل على معرّف مهمة (job id) لجلب النتيجة به، دون إرسال الصورة مرة أخرى. وتتولى نقطة نهاية الدفعات المعالجة المجمّعة.
رصيد واحد لكل صورة ناجحة · الصور الفاشلة مجانية · المفاتيح في حسابك
$ curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_API_KEY" \
-F 'image_file=@dog.jpg' -o dog.png
← 200 OK · image/png · عادةً خلال ثوانٍ قليلة
تم حفظ dog.png (شفافة، بالدقة الكاملة)بداية سريعة
انسخ، والصق، واستبدل YOUR_API_KEY. يحفظ كل مثال النتيجة مباشرةً في ملف، ومثالا JavaScript وPython ينتظران أيضًا في حال الاستجابة 202.
curl -X POST https://removebackground.dev/v1/remove \
-H 'x-api-key: YOUR_API_KEY' \
-F 'image_file=@photo.jpg' \
-o photo-no-bg.pngأرسل صورتك
يقبل POST /v1/remove الصورة بأي من أربع طرق. أرسل واحدة منها؛ وإذا تضمّن الطلب أكثر من واحدة، تكون الأولوية لـ image_file، ثم image_file_b64، ثم image_url، ثم جسم الطلب الخام. تقرأ هذه الأمثلة مفتاحك من متغير البيئة REMOVEBG_API_KEY (عيّنه بـ export REMOVEBG_API_KEY=…)؛ لاحظ علامات الاقتباس المزدوجة، التي تتيح للصدفة (shell) تعويض قيمته.
curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_API_KEY" \
-F 'image_file=@photo.jpg' \
-o photo-no-bg.pngبيانات نموذج multipart، الحقل image_file. صور JPG أو PNG أو WebP، حتى 25 MB.
يحفظ كل مثال جسم الاستجابة في ملف. ولا يكون هذا الملف صورة إلا عندما تكون الحالة 200؛ راجع التعامل مع الاستجابة.
التعامل مع الاستجابة
تعود معظم الصور الفردية جاهزة في الاستجابة نفسها. وعندما تكون قائمة الانتظار مزدحمة على غير العادة وتستغرق صورة أكثر من 55 ثانية تقريبًا، تتلقى بدلًا من ذلك 202 Accepted مع معرّف مهمة. تستمر المهمة في العمل: اجلب نتيجتها باستخدام المعرّف. أما إرسال الصورة مرة أخرى فسيبدأ مهمة ثانية وقد يكلّف رصيدًا ثانيًا.
| الحالة | جسم الاستجابة | ما يجب فعله |
|---|---|---|
200 | الصورة (image/png أو image/jpeg أو image/webp) | احفظها. استخدم Content-Type لاختيار امتداد الملف. |
202 | JSON: { id, status, status_url, result_url } | ليست صورة. انتظر ثانيتين، ثم نفّذ GET على result_url. لا ترسل الصورة مرة أخرى. |
4xx / 5xx | JSON: { "error": { "code", "message" } } | ليست صورة. اقرأ الرمز (راجع الأخطاء) ولا تحفظ جسم الاستجابة كصورة. |
مثال كامل
يتعامل مع الصورة الجاهزة، والاستجابة 202، والمهمة الفاشلة، وحدّ زمني محلي. يرسل الصورة مرة واحدة ولا يعيد المحاولة إلا في فحوص الحالة الآمنة.
import os
import time
import uuid
import requests
API = "https://removebackground.dev"
KEY = os.environ["REMOVEBG_API_KEY"] # keep the key on your server
EXT = {"image/png": ".png", "image/jpeg": ".jpg", "image/webp": ".webp"}
def save(res, stem):
"""Save an image response with the right extension; raise on anything else."""
mime = res.headers.get("Content-Type", "").split(";")[0]
if res.status_code != 200 or mime not in EXT:
raise RuntimeError(f"HTTP {res.status_code}: {res.text[:500]}")
path = stem + EXT[mime]
with open(path, "wb") as f:
f.write(res.content)
return path
def remove_background(image_url, stem="result", max_wait=300):
s = requests.Session()
s.headers["x-api-key"] = KEY
# One key per image: resending with the same key returns the same job, never a second
# charge, so this POST is safe to retry after a timeout or a dropped connection.
idem = {"Idempotency-Key": str(uuid.uuid4())}
for attempt in range(3):
try:
res = s.post(f"{API}/v1/remove", data={"image_url": image_url}, headers=idem, timeout=(10, 120))
break
except requests.ConnectionError:
if attempt == 2:
raise
time.sleep(2)
if res.status_code != 202:
return save(res, stem) # 200 = the image; anything else raises
# 202: still processing. Wait for the same job; never send the image again.
job_id = res.json()["id"]
deadline = time.monotonic() + max_wait
while time.monotonic() < deadline:
time.sleep(2) # the API sends Retry-After: 2
res = s.get(f"{API}/v1/jobs/{job_id}/result", timeout=30)
if res.status_code == 409 and res.json()["error"]["code"] == "not_ready":
continue
return save(res, stem) # the image, or the job's own error
raise TimeoutError(f"Job {job_id} is still running. Check it later at /v1/jobs/{job_id}.")
print(remove_background("https://example.com/photo.jpg"))يتطلب Python 3 ومكتبة requests (pip install requests).
- إيقاف السكربت لا يوقف المهمة؛ فقد تكتمل وتُحتسب. وتظهر نتيجتها في الاستوديو.
- الحدود الزمنية من اختيارك، وليست وعدًا منا؛ تكتمل معظم الصور خلال ثوانٍ قليلة.
- نقطة النهاية المتوافقة مع remove.bg تتصرف بشكل مختلف: فهي لا ترد بـ 202 أبدًا (انظر أدناه).
المصادقة
أرسل مفتاح API في الترويسة x-api-key. أنشئ المفاتيح وألغِها من صفحة الحساب؛ كل استدعاء يستهلك من رصيد ذلك الحساب. تقع جميع نقاط النهاية تحت https://removebackground.dev وتقبل طلبات CORS، لكن CORS لا يجعل وضع المفتاح في صفحة ويب آمنًا: احتفظ به على خادمك (راجع الأمان). الأخطاء بصيغة JSON: { "error": { "code": "…", "message": "…" } }.
العقد الكامل منشور بصيغة OpenAPI 3.1 (openapi.json)، لمولّدات العملاء أو Postman أو الاختبارات؛ ويمكن لمساعدي البرمجة بالذكاء الاصطناعي البدء من llms.txt.
POST /v1/remove
في الوقت الفعلي. إزالة الخلفية من صورة واحدة. عادةً تكون الصورة النهائية هي جسم الاستجابة (image/png أو image/jpeg أو image/webp)، غالبًا بعد ثوانٍ قليلة. يمكن أن تكون المعاملات حقول نموذج أو مفاتيح JSON أو قيمًا في سلسلة الاستعلام؛ ويمكنك أيضًا إرسال بايتات الصورة الخام عبر POST مع Content-Type: image/jpeg أو image/png أو image/webp أو application/octet-stream. الحد الأقصى 25 MB. راجع أرسل صورتك لكل طريقة إدخال.
| المعامل | النوع | الوصف |
|---|---|---|
image_file | file | الصورة (JPG أو PNG أو WebP)، كبيانات نموذج multipart. |
image_file_b64 | string | الصورة بترميز Base64، مع البادئة data:image/…;base64, أو بدونها (25 MB بعد فك الترميز). مفيد عند الإرسال من JSON. |
image_url | string | رابط http(s) عام للصورة. نقوم بتنزيلها (حتى 3 عمليات إعادة توجيه، 15 s). إذا أُرسل أكثر من مصدر، تكون الأولوية لـ image_file، ثم image_file_b64، ثم image_url، ثم جسم الطلب الخام. |
format | png | jpg | webp | صيغة الإخراج. الافتراضية png. صيغة JPG لا تدعم الشفافية: تُدمج فوق bg_color أو الأبيض. |
bg_color | لون | تعبئة الخلفية: hex (ffffff، #fff)، أو rgb(255, 255, 255)، أو white أو black أو red أو green أو blue أو yellow أو gray / grey. القيمة transparent (الافتراضية) تُبقيها شفافة. |
size | preview | medium | hd | full | حد أقصى بالميغابكسل، مع الحفاظ على نسبة الأبعاد ودون تكبير أبدًا: preview ≤ 0.25 MP، وmedium ≤ 1.5 MP، وhd ≤ 4 MP، وfull (الافتراضية) الدقة الأصلية (حتى 25 MP). يتم تجاهله عند تعيين width أو height. |
crop | true | false | W:H | القص إلى المربع المحيط بالعنصر. مع نسبة أبعاد (1:1، 4:5، 4:3، 16:9…)، يُوسَّع المربع بعد ذلك (دون تصغير أبدًا) إلى تلك النسبة حول العنصر؛ وتكون المساحة خارج الصورة شفافة (أو bg_color). الافتراضي false. |
padding | px | كسر | % | مع crop: هامش يُضاف إلى كل جانب. 0.1 أو 10% = عُشر عرض العنصر (يسار/يمين) وارتفاعه (أعلى/أسفل)؛ و"10%,7.5%" يحدد الأفقي والرأسي كلًّا على حدة؛ و24px (أو عدد صحيح مجرد أكبر من 1) بالبكسل، حتى 500. الافتراضي 0. |
channels | rgba | rgb | alpha | rgba (الافتراضي): صورة مقصوصة شفافة. rgb: معتمة، مدمجة فوق bg_color أو الأبيض. alpha: قناع PNG بتدرج رمادي (الأبيض = العنصر)، بالحجم والقص نفسيهما للصورة المقصوصة. ولا يزال type=mask يعمل كاسم بديل لـ alpha. |
width / height | 1–6000 | حجم إخراج دقيق بالبكسل، يُطبَّق بعد crop (ويتجاوز size). عند تحديد أحدهما فقط، يتبع الآخر نسبة الأبعاد. دون تمديد أبدًا. |
roi | x1 y1 x2 y2 | منطقة الاهتمام، بوحدة px أو % (مثل 0% 0% 50% 100%). لا يُحتفظ إلا بالعنصر الواقع داخلها؛ ويصبح كل ما خارجها خلفية. تشير الإحداثيات إلى الصورة الأصلية. الافتراضي: الصورة كاملة. |
fit | contain | cover | scale-down | مع width وheight. contain (الافتراضي): ملاءمة داخل الإطار، في المنتصف، والباقي شفاف (أو bg_color). cover: ملء الإطار، مع قص الفائض حول العنصر. scale-down: مثل contain، لكن دون تكبير أبدًا. |
تُطبَّق الخيارات بهذا الترتيب: roi، ثم size (أو width/height لاحقًا)، ثم crop + padding + نسبة الأبعاد، ثم width/height + fit، ثم channels أو لون الخلفية، ثم الصيغة. كل خيار بالتكلفة نفسها: رصيد واحد. ويتم تجاهل المعاملات غير المعروفة.
مثال: JPG بدقة HD على خلفية بيضاء، مقصوصة حول العنصر بهامش 40 px
curl -X POST https://removebackground.dev/v1/remove \
-H 'x-api-key: YOUR_API_KEY' \
-F 'image_file=@product.jpg' \
-F 'bg_color=ffffff' \
-F 'format=jpg' \
-F 'size=hd' \
-F 'crop=true' \
-F 'padding=40' \
-o product-no-bg.jpgمثال: صورة مربعة لمتجر إلكتروني، العنصر في المنتصف بهامش 10%
curl -X POST https://removebackground.dev/v1/remove \
-H 'x-api-key: YOUR_API_KEY' \
-F 'image_file=@product.jpg' \
-F 'crop=1:1' -F 'padding=10%' \
-F 'width=1000' -F 'height=1000' \
-F 'format=jpg' -F 'bg_color=white' \
-o product-square.jpgمثال: إدخال Base64، وإخراج قناع ألفا
printf '{"image_file_b64":"%s","channels":"alpha"}' "$(base64 < portrait.jpg | tr -d '\n')" > request.json
curl -X POST https://removebackground.dev/v1/remove \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
--data-binary @request.json \
-o portrait-mask.png200 OK
بايتات الصورة، مع هذه الترويسات:
| الترويسة | المعنى |
|---|---|
X-Image-Width / X-Image-Height | حجم النتيجة بالبكسل (يُرسل أيضًا كـ X-Width / X-Height). |
X-Request-ID | قيمة X-Request-ID الخاصة بك إن أرسلتها، وإلا فمعرّف مُنشأ. اذكره عند التواصل مع الدعم. |
X-Processing-Time-Ms | الوقت المستغرق في الطلب (وأيضًا X-Processing-Ms). |
X-Matte-Confidence | 0–1: مدى حسم القناع (متوسط |2a − 1| على البكسلات، حيث a = alpha). القيمة القريبة من 1 تعني قصًّا نظيفًا؛ والقيم الأقل تعني حوافًا ناعمة أو غير مؤكدة كثيرة. |
X-Matte-Ambiguous-Ratio | نسبة البكسلات التي تقع قيمة alpha فيها بين 0.1 و0.9 حصرًا (الشعر، الزجاج، ضبابية الحركة). مفيد لتمييز الصور التي تحتاج إلى مراجعة. |
X-Credits-Remaining | رصيدك بعد هذه الصورة. |
X-Removal-Id | معرّف النتيجة المخزّنة. |
X-Job-Id | معرّف المهمة وراء الطلب (قابل للاستخدام مع /v1/jobs/:id). |
202 Accepted (بديل عند طول قائمة الانتظار)
إذا لم تكتمل الصورة خلال 55 ثانية تقريبًا، مثلًا عندما تكون قائمة الانتظار مزدحمة على غير العادة، تتلقى 202 مع JSON بالشكل { id, status, status_url, result_url } (بالإضافة إلى Location وRetry-After: 2). استعلم عن status_url إلى أن تصبح done بقيمة true، ثم نزّل result_url. يُخصم منك مرة واحدة فقط عند نجاح الصورة. لا ترسل الصورة مرة أخرى بدون Idempotency-Key: فذلك يبدأ مهمة ثانية. راجع التعامل مع الاستجابة للاطلاع على مثال كامل.
GET /v1/jobs/:id
حالة مهمة أنشأها /v1/remove أو /v1/batch. بالمفتاح نفسه؛ ولا ترى إلا مهامك.
| الحقل | المعنى |
|---|---|
status | queued أو processing أو succeeded أو partial أو failed أو canceled |
done | true عندما لا يتبقى شيء للتشغيل |
total, succeeded, failed, skipped | أعداد الصور |
credits_charged | الرصيد الذي استهلكته هذه المهمة (رصيد واحد لكل صورة ناجحة) |
status_url, result_url | مكان الاستعلام، ومكان التنزيل |
items[] | لكل صورة: position وinput وstatus وerror { code, message }، وعند النجاح removal_id وwidth وheight وformat وresult_url |
GET /v1/jobs/:id/result
بايتات الصورة لمهمة مكتملة، بالترويسات نفسها التي يرسلها /v1/remove. يختار ?item=N صورة من مهمة دفعة (الافتراضي 0). يرد بـ 409 not_ready مع Retry-After: 2 ما دامت قيد التشغيل، أو بخطأ الصورة نفسها إذا فشلت.
POST /v1/batch
أدرج حتى 100 رابط صورة في قائمة الانتظار كمهمة واحدة: JSON بالشكل { "image_urls": ["https://…", …], "format": "jpg", "bg_color": "ffffff", "size": "hd", "crop": "1:1", "padding": "10%" }، مع الخيارات نفسها المتاحة في /v1/remove (بما فيها channels وwidth وheight وfit). يرد فورًا بـ 202 مع { id, status, total, invalid, duplicates, status_url }. استعلم عن المهمة، ثم اجلب result_url لكل عنصر. رصيد واحد لكل صورة ناجحة؛ وبحد أقصى 3 مهام دفعات مفتوحة لكل حساب. شرح مفصّل مع أمثلة على الاستجابات في الدفعات من البداية إلى النهاية.
نقطة نهاية متوافقة مع remove.bg
تتوقف خدمة API الذاتية من remove.bg في 1 December 2026, 09:00 CET (الإعلان). تعمل تكاملات remove.bg الحالية هنا بتغيير سطر واحد: https://api.remove.bg/v1.0/removebg → https://removebackground.dev/v1.0/removebg، مع مفتاح removebackground.dev في الترويسة X-Api-Key نفسها. قائمة الانتظار نفسها، ورصيد واحد لكل صورة ناجحة، وجودة الإخراج نفسها التي يقدمها /v1/remove. دليل الانتقال.
POST /v1.0/removebg
جسم طلب بصيغة multipart أو urlencoded أو JSON بأسماء معاملات remove.bg. يرد ببايتات الصورة وترويسات remove.bg، أو بـ { "data": { "result_b64", "foreground_top", "foreground_left", "foreground_width", "foreground_height" } } عند إرسال Accept: application/json. تستخدم الأخطاء بنية remove.bg: { "errors": [{ "title", "code", "detail" }] }. وعلى عكس /v1/remove لا يرد بـ 202 أبدًا: بل ينتظر حتى 110 ثوانٍ، ثم يعيد خطأ انتهاء المهلة 503. تستمر المهمة في العمل وتُحتسب إذا نجحت، لذا فإن إعادة محاولة ذلك الطلب تبدأ مهمة ثانية.
| المعامل | الحالة | ملاحظات |
|---|---|---|
image_file / image_file_b64 / image_url | مدعوم | أجسام طلبات بصيغة multipart أو urlencoded أو JSON. صور JPG أو PNG أو WebP حتى 25 MB. |
size | مدعوم | القيم auto وfull و4k و50MP تعطي الدقة الأصلية (حتى 25 MP)؛ وpreview وsmall وregular ≈ 0.25 MP؛ وmedium 1.5 MP؛ وhd 4 MP. دائمًا رصيد واحد. |
format | مدعوم | auto (PNG إذا كانت شفافة، وإلا JPG)، وpng وjpg وwebp وzip (color.jpg + alpha.png). |
crop / crop_margin | مدعوم | px أو % من العنصر، من 1 إلى 4 قيم بأسلوب CSS ("10% 20%" = رأسي، أفقي)؛ بحد أقصى 500px أو 50% لكل جانب. |
roi | مدعوم | "x1 y1 x2 y2" بوحدة px أو %: لا يُحتفظ إلا بالعنصر الواقع داخل المنطقة. |
scale / position | مدعوم | scale من 10% إلى 100% أو original؛ وposition بقيمة center أو original أو "x% y%". |
channels | مدعوم | rgba (صورة مقصوصة) أو alpha (قناع بتدرج رمادي). |
bg_color | مدعوم | قيمة Hex مع # أو بدونها (81d4fa)، أو اسم لون. القيمة Hex المكونة من 8 خانات تحتفظ باللون وتتجاهل قناة ألفا. |
bg_image_url / bg_image_file | مدعوم | تُدمج الصورة المقصوصة فوق صورة الخلفية الخاصة بك، بملاءمة cover لحجم الإخراج. |
Accept: application/json | مدعوم | يعيد { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } }. |
type / type_level | مقبول، ويتم تجاهله | يُكتشف العنصر تلقائيًا؛ وقيمة X-Type دائمًا "other". |
semitransparency | مقبول، ويتم تجاهله | الحواف الناعمة والمناطق شبه الشفافة تأتي من قناع النموذج كما هي. |
shadow_type / shadow_opacity / add_shadow | مقبول، ويتم تجاهله | لا تُضاف أي ظلال. |
الطلبات الطويلة | اختلاف | ننتظر حتى 110 ثوانٍ؛ وإذا لم تكن الصورة جاهزة بحلول ذلك الوقت، تتلقى الخطأ 503 القابل لإعادة المحاولة (ولا يُحتسب إلا إذا اكتملت المعالجة). |
مثال
curl -H "X-Api-Key: $REMOVEBG_API_KEY" \
-F 'image_file=@photo.jpg' -F 'size=auto' \
-F 'crop=true' -F 'crop_margin=10%' -F 'bg_color=ffffff' \
-o no-bg.jpg https://removebackground.dev/v1.0/removebgترويسات الاستجابة
| الترويسة | المعنى |
|---|---|
X-Width / X-Height | حجم النتيجة بالبكسل. |
X-Credits-Charged | الرصيد الذي استهلكته هذه الصورة: دائمًا 1 (الصور الفاشلة تكلّف 0). |
X-Type | دائمًا "other" (اكتشاف العنصر تلقائي). |
X-Foreground-Top / -Left / -Width / -Height | المربع المحيط بالعنصر في النتيجة، بالبكسل. |
X-Request-ID | يعيد قيمة X-Request-ID الخاصة بك، أو معرّفًا مُنشأً. إضافي. |
X-Matte-Confidence / X-Matte-Ambiguous-Ratio | مدى نظافة القناع (0–1)، ونسبة البكسلات الناعمة. إضافي: مفيد لتمييز الصور التي تحتاج إلى مراجعة. |
الأخطاء
| الحالة | المعنى |
|---|---|
400 | معامل أو صورة غير صالحة (رموز مثل invalid_size وinvalid_crop_margin وmissing_source وfile_too_large وunknown_foreground). |
402 | insufficient_credits: اشحن رصيدك من صفحة الأسعار. |
403 | auth_failed: الترويسة X-Api-Key مفقودة أو غير صالحة. |
429 | rate_limit_exceeded. |
500 / 503 | فشلت المعالجة، أو انتهت مهلتها، أو أن الخدمة غير متاحة مؤقتًا. أعد المحاولة؛ الصور الفاشلة مجانية. |
GET /v1.0/account
رصيدك ببنية حساب remove.bg: { "data": { "attributes": { "credits": { "total", "subscription": 0, "payg", "enterprise": 0 }, "api": { "free_calls": 0, "sizes": "all" } } } }. كل الرصيد حسب الاستخدام ولا تنتهي صلاحيته، لذا فإن total يساوي payg. نفّذ GET https://removebackground.dev/v1.0/account مع X-Api-Key الخاص بك.
الأخطاء (نقاط نهاية /v1)
الصور الفاشلة لا تُحتسب أبدًا.
| الحالة | الرموز | المعنى |
|---|---|---|
400 | missing_image, invalid_url, invalid_body, invalid_json, invalid_image_b64, invalid_format, invalid_bg_color, invalid_size, invalid_crop, invalid_padding, invalid_type, invalid_channels, invalid_width, invalid_height, invalid_fit, invalid_roi, fetch_failed, fetch_timeout, rejected, too_many_images, invalid_images | لا يمكن استخدام الطلب أو رابط الصورة. |
401 | unauthorized | x-api-key مفقود أو خاطئ أو ملغى. |
402 | insufficient_credits, out_of_credits | رصيدك فارغ. اشحن رصيدك من صفحة الأسعار. |
404 | not_found | لا توجد مهمة كهذه (أو أنها ليست لك). |
409 | not_ready, canceled, idempotency_key_reused | GET …/result بينما المهمة ما زالت قيد التشغيل (أعد المحاولة بعد 2 s)، أو أُلغيت المهمة، أو أُعيد استخدام Idempotency-Key لطلب مختلف. |
410 | result_unavailable | حُذفت النتيجة أو انتهت صلاحيتها. |
413 | too_large | الصورة أكبر من 25 MB. |
422 | processing_failed, invalid_image, missing_upload | الملف ليس صورة قابلة للقراءة. لا يُحتسب. |
429 | rate_limited, too_many_batches | تجاوزت حد الطلبات لكل حساب (انتظر مدة Retry-After)، أو لديك بالفعل 3 مهام دفعات قيد التشغيل. |
502 | model_unavailable, upstream_error, … | تعذّرت علينا معالجة الصورة بعد إعادة المحاولة. لا يُحتسب. |
503 | server_paused, unavailable | API متوقف مؤقتًا (قبل الإطلاق) أو غير متاح لفترة وجيزة. أعد المحاولة لاحقًا. |
الدفعات من البداية إلى النهاية
1. الإرسال
curl -X POST https://removebackground.dev/v1/batch \
-H "x-api-key: $REMOVEBG_API_KEY" \
-H 'Content-Type: application/json' \
-d '{ "image_urls": ["https://example.com/front.jpg", "https://example.com/back.jpg"], "format": "png", "size": "hd" }'حتى 100 رابط صورة عام، مع أي من خيارات /v1/remove. سيكلّف الرابطان النموذجيان أعلاه حتى رصيدين لو كانا صورتين حقيقيتين. وتصل الإجابة فورًا:
202 Accepted
{
"id": "3f6c2a9e-8d1b-4c7a-9e2f-5b8d0a1c4e77",
"status": "queued",
"total": 2,
"invalid": 0,
"duplicates": 0,
"status_url": "https://removebackground.dev/v1/jobs/3f6c2a9e-8d1b-4c7a-9e2f-5b8d0a1c4e77"
}يعدّ invalid المدخلات التي ليست روابط http(s)، ويعدّ duplicates المدخلات المكررة؛ ويُستبعد كلاهما ولا يُحتسب أبدًا. احفظ id: فهو وسيلتك لاستئناف متابعة المهمة بعد إعادة التشغيل.
2. استعلم عن المهمة
نفّذ GET /v1/jobs/:id كل بضع ثوانٍ إلى أن تصبح قيمة done هي true. تنتقل status من queued إلى processing، ثم تنتهي بـ succeeded أو partial (فشلت بعض الصور) أو failed. ويظهر العنصر الجاري إعادة محاولته بالحالة retrying.
{
"id": "3f6c2a9e-…",
"status": "partial",
"done": true,
"total": 2, "succeeded": 1, "failed": 1, "skipped": 0,
"credits_charged": 1,
"items": [
{ "position": 0, "input": "https://example.com/front.jpg", "status": "succeeded",
"removal_id": "…", "width": 1600, "height": 1200, "format": "png",
"result_url": "https://removebackground.dev/v1/jobs/3f6c2a9e-…/result?item=0" },
{ "position": 1, "input": "https://example.com/back.jpg", "status": "failed",
"error": { "code": "fetch_failed", "message": "…" } }
]
}3. نزّل كل نتيجة
نفّذ GET /v1/jobs/:id/result?item=N لكل عنصر ناجح (أو استخدم result_url الخاص به). item هو position بدءًا من الصفر. تتبع المواضع قائمتك بعد استبعاد الروابط غير الصالحة والمكررة، لذا عندما يكون أي من العددين أكبر من 0، طابِق النتائج حسب input وليس حسب الترتيب.
- تتوقف الدفعة عن الاحتساب ضمن حد الدفعات المفتوحة البالغ 3 بمجرد أن تصبح
doneبقيمة true. - لا يوفر API نقطة نهاية للإلغاء ولا webhooks ولا تنزيل ZIP. ويمكن إلغاء الدفعات التي بدأت من صفحة المعالجة المجمّعة أو تنزيلها كملف ZIP من هناك.
إعادة المحاولة والتكرار والفوترة
أرسل Idempotency-Key ولن تؤدي إعادة المحاولة إلى خصم مزدوج. أضف الترويسة Idempotency-Key (أي سلسلة فريدة حتى 255 حرفًا، مثل UUID) إلى POST /v1/remove أو POST /v1/batch، بمفتاح واحد لكل صورة أو دفعة. إذا أرسلت الطلب نفسه مرة أخرى بالمفتاح نفسه، تحصل على المهمة التي أنشأها الطلب الأول، مع Idempotent-Replayed: true: لا مهمة جديدة ولا خصم جديد، حتى لو كان الطلب الأول ما زال قيد التشغيل. أما المفتاح نفسه مع صورة أو خيارات مختلفة فيرد بـ 409 idempotency_key_reused. المفاتيح خاصة بحسابك ولا تنتهي صلاحيتها.
بدون مفتاح، ينشئ كل POST مهمة جديدة، وكل مهمة تنجح تكلّف رصيدًا واحدًا (نقطة النهاية المتوافقة مع remove.bg POST /v1.0/removebg لا تدعم المفاتيح). أما قراءة مهمة (GET /v1/jobs/…) فهي مجانية دائمًا وآمنة للتكرار.
IDEMPOTENCY_KEY=$(uuidgen) # one per image; send the same one on every retry
curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_API_KEY" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-F 'image_file=@photo.jpg' \
-o photo-no-bg.pngما الذي يستهلك رصيدًا
| الحالة | الخصم |
|---|---|
| رُفض الطلب قبل المعالجة (مفتاح خاطئ، خيار خاطئ، حجم كبير جدًا، نفاد الرصيد) | مجاني. |
| تعذّرت معالجة الصورة (422 صورة غير صالحة، 502 بعد محاولاتنا المتكررة) | مجاني. |
| نجحت معالجة الصورة | رصيد واحد، يُخصم مرة واحدة عند النجاح. ولا تضيف إعادة المحاولة الداخلية لدينا أي خصم. |
| تلقيت 202 | لا شيء حتى الآن. تستمر المهمة في العمل ولا يُخصم رصيد واحد إلا إذا نجحت. |
| انتهت مهلة العميل لديك أو انقطع الاتصال أثناء الانتظار | تستمر المهمة في العمل وتُحتسب إذا نجحت. وتظهر النتيجة في الاستوديو. |
| أرسلت الطلب نفسه مرتين بـ Idempotency-Key نفسه | مهمة واحدة، برصيد واحد كحد أقصى. ويحصل الطلب المكرر على المهمة نفسها (الترويسة Idempotent-Replayed: true). |
| أرسلت الصورة نفسها مرتين بدون مفتاح | مهمتان منفصلتان؛ كل مهمة تنجح تكلّف رصيدًا واحدًا. |
| نزّلت نتيجة جاهزة مرة أخرى | مجاني، بقدر ما تشاء ما دامت مخزّنة. |
| نجحت دفعة جزئيًا | رصيد واحد لكل صورة ناجحة؛ ويعرض credits_charged في المهمة الإجمالي. |
| تتضمن دفعة الرابط نفسه مرتين | تُستبعد التكرارات داخل الدفعة الواحدة قبل إدراجها في قائمة الانتظار ولا تُحتسب أبدًا. أما الروابط المتطابقة في دفعات مختلفة فهي مهام منفصلة. |
| نفد الرصيد أثناء دفعة | تبقى الصور المكتملة مدفوعة؛ ويُعلَّم الباقي بأنه تم تخطيه (out_of_credits) ويكون مجانيًا. اشترِ رصيدًا، ثم أرسل الروابط المتبقية كدفعة جديدة. |
متى تعيد المحاولة
| ما حدث | ما يجب فعله |
|---|---|
| فشل GET /v1/jobs/:id أو …/result (خطأ في الشبكة، 5xx) | إعادة المحاولة آمنة: قراءة مهمة لا تنشئ عملًا ولا تخصم رصيدًا. انتظر قليلًا بين المحاولات. |
| يرد GET …/result بـ 409 not_ready | انتظر مدة Retry-After (2 s) واسأل مرة أخرى. لا تُعِد إرسال الصورة. |
| يرد GET …/result بـ 410 result_unavailable | حُذفت النتيجة المخزّنة. معالجة الصورة مرة أخرى مهمة جديدة وتكلّف رصيدًا واحدًا. |
| يرد POST بـ 400 أو 413 أو 422 | أصلح الطلب أو الصورة أولًا؛ فإرسالهما دون تغيير يعطي الإجابة نفسها. |
| يرد POST بـ 401 أو 402 | أصلح المفتاح أو اشحن رصيدك. لا تكرر الطلب في حلقة. |
| يرد POST بـ 429 rate_limited | انتظر عدد الثواني المذكور في Retry-After، ثم أرسله مرة أخرى (بـ Idempotency-Key نفسه). أكثر من 60 صورة في الدقيقة؟ استخدم POST /v1/batch: طلب واحد لما يصل إلى 100 صورة. |
| يرد POST /v1/batch بـ 429 too_many_batches | انتظر حتى تكتمل إحدى دفعاتك المفتوحة البالغ عددها 3 (استعلم عنها)، ثم أرسل. |
| يرد POST /v1/… بـ 503 (unavailable، server_paused) | لم تُنشأ أي مهمة. أعد المحاولة بعد انتظار قصير. (نقطة النهاية المتوافقة مع remove.bg مختلفة: فخطأ انتهاء المهلة 503 لديها يعني أن المهمة ما زالت قيد التشغيل.) |
| يرد POST /v1/remove بـ 502 | فشلت تلك المهمة ولم تُحتسب. وإعادة المحاولة مرة واحدة تعني مهمة جديدة. |
| انتهت مهلة POST، أو انقطع الاتصال، أو تلقيت 500 | مع Idempotency-Key: أعد إرسال الطلب نفسه بالمفتاح نفسه؛ وستحصل على المهمة الأصلية. وبدونه، قد تكون المهمة موجودة بالفعل وقد تُحتسب: تحقّق من الاستوديو أولًا. |
| يرد POST بـ 409 idempotency_key_reused | سبق استخدام هذا المفتاح لصورة أو خيارات مختلفة. أنشئ مفتاحًا جديدًا لكل صورة جديدة. |
الحدود والتخزين
| الحد | القيمة | الخطأ عند التجاوز |
|---|---|---|
| ملف الصورة | 25 MB (25 × 1024 × 1024 بايت)؛ JPG أو PNG أو WebP، يُكتشف النوع من بايتات الملف | 413 too_large · 422 processing_failed |
| Base64 / جسم JSON | 25 MB بعد فك الترميز (قد يكون جسم الطلب أكبر بنحو الثلث) | 413 too_large |
| دقة الإدخال | تُصغَّر الصور التي تتجاوز 25 MP إلى 25 MP قبل المعالجة | — |
| حجم الإخراج | العرض والارتفاع كلٌّ منهما بين 1 و6000 px | 400 invalid_width / invalid_height |
| تنزيل image_url | http(s) فقط، مهلة 15 s، حتى 3 عمليات إعادة توجيه؛ وتُرفض العناوين الخاصة وعناوين loopback وlink-local، عند كل إعادة توجيه | 400 invalid_url · fetch_failed · fetch_timeout |
| الانتظار في POST /v1/remove | نحو 55 s، ثم 202 مع معرّف المهمة | 202 |
| حجم الدفعة | 100 رابط صورة لكل POST /v1/batch | 400 too_many_images |
| الدفعات المفتوحة | 3 مهام غير مكتملة متعددة الصور لكل حساب (الصور الفردية لا تُحتسب) | 429 too_many_batches |
| معدّل الطلبات | 60 طلبًا في الدقيقة لكل حساب، عبر POST /v1/remove و/v1/batch و/v1.0/removebg. وتُحتسب الدفعة مرة واحدة مهما كان حجمها. ولا حدّ لقراءة المهام | 429 rate_limited (مع Retry-After) |
مدة الاحتفاظ بالنتائج
تُخزَّن كل نتيجة بشكل خاص في حسابك لمدة 48 ساعة بعد إنشائها، ثم تُحذف. وحتى ذلك الحين يمكنك تنزيلها مرة أخرى مجانًا عبر GET /v1/jobs/:id/result أو من الاستوديو. بعد ذلك، ترد روابط النتائج بـ 410 result_unavailable؛ ومعالجة الصورة مرة أخرى مهمة جديدة. وتبقى سجلات حالة المهام قابلة للقراءة بعد حذف الصورة. راجع سياسة الخصوصية لمعرفة كيفية التعامل مع الملفات المرفوعة؛ ونحن لا نستخدم صورك لتدريب النماذج.
الأمان
احتفظ بمفتاح API على خادم تتحكم فيه. لا تضعه في كود المتصفح أو تطبيقات الجوال أو المستودعات العامة أو الروابط. ولتمكين مستخدميك من إزالة الخلفيات، مرّر صورهم عبر الواجهة الخلفية لديك، وأضف هناك تسجيل الدخول وحدود الإنفاق الخاصة بك.
- يسمح API بـ CORS ليعمل من الأدوات والكود على جانب الخادم. لكن هذا لا يجعل وضع المفتاح في صفحة ويب آمنًا: إذ يمكن لأي شخص قراءته هناك.
- تستهلك كل مفاتيح الحساب الرصيد نفسه. أنشئ مفتاحًا منفصلًا لكل تطبيق أو بيئة من صفحة الحساب، لتتمكن من إلغاء أحدها دون تعطيل البقية.
- إذا تسرّب مفتاح، فألغِه فورًا من صفحة الحساب (يتوقف عن العمل في الحال) وأنشئ مفتاحًا جديدًا. لا نخزّن إلا قيمة مجزّأة (hash) لكل مفتاح، لذا لا يمكننا عرضه لك مرة أخرى.
حل المشكلات
| المشكلة | ما الذي يحدث |
|---|---|
| ملف PNG لا يفتح | كان جسم الاستجابة JSON (مهمة 202 أو خطأ)، وليس صورة. تحقّق من حالة HTTP وContent-Type قبل الحفظ. |
| انتهت مهلة السكربت لكن الصورة ظهرت في الاستوديو | استمرت المهمة في العمل بعد أن توقفت عن الانتظار. اجلبها بمعرّف المهمة بدلًا من إعادة الإرسال. |
| خُصم مني مرتين لصورة واحدة | أُرسلت مرتين بدون Idempotency-Key (غالبًا بسبب إعادة محاولة تلقائية بعد انتهاء المهلة). أرسل مفتاحًا واحدًا لكل صورة وأعد استخدامه عند إعادة المحاولة. |
| الرابط يفتح في متصفحي لكن API لا يستطيع جلبه | قد يتطلب الخادم المستضيف ملفات تعريف ارتباط أو تسجيل دخول، أو يحظر الخوادم، أو يعيد التوجيه أكثر من 3 مرات، أو يستغرق أكثر من 15 s، أو انتهت صلاحية الرابط الموقَّع. ارفع الملف بدلًا من ذلك. |
| توقفت الدفعة في منتصفها | اطّلع على items[] في المهمة: العناصر الفاشلة لها رمز خطأ؛ والعناصر المتخطاة بـ out_of_credits تعني أن الرصيد نفد. |
| يبدو أن خيارًا ما لا يفعل شيئًا | يتم تجاهل أسماء المعاملات غير المعروفة بصمت. تحقّق من الإملاء مقارنةً بجدول المعاملات. وفي /v1.0/removebg، تُقبل بعض خيارات remove.bg ويتم تجاهلها (راجع ذلك الجدول). |
| الخلفية ليست شفافة | صيغة JPG لا تدعم الشفافية. استخدم format=png أو webp واترك bg_color دون تعيين. |
| رابط النتيجة يعطي 410 | حُذفت النتيجة المخزّنة. وإعادة المعالجة تكلّف رصيدًا واحدًا. |