API في الوقت الفعلي

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 (شفافة، بالدقة الكاملة)
1 صورتك2 طلب HTTP واحد3 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 لاختيار امتداد الملف.
202JSON: { id, status, status_url, result_url }ليست صورة. انتظر ثانيتين، ثم نفّذ GET على result_url. لا ترسل الصورة مرة أخرى.
4xx / 5xxJSON: { "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_filefileالصورة (JPG أو PNG أو WebP)، كبيانات نموذج multipart.
image_file_b64stringالصورة بترميز Base64، مع البادئة data:image/…;base64, أو بدونها (25 MB بعد فك الترميز). مفيد عند الإرسال من JSON.
image_urlstringرابط http(s) عام للصورة. نقوم بتنزيلها (حتى 3 عمليات إعادة توجيه، 15 s). إذا أُرسل أكثر من مصدر، تكون الأولوية لـ image_file، ثم image_file_b64، ثم image_url، ثم جسم الطلب الخام.
formatpng | jpg | webpصيغة الإخراج. الافتراضية png. صيغة JPG لا تدعم الشفافية: تُدمج فوق bg_color أو الأبيض.
bg_colorلونتعبئة الخلفية: hex (ffffff، #fff)، أو rgb(255, 255, 255)، أو white أو black أو red أو green أو blue أو yellow أو gray / grey. القيمة transparent (الافتراضية) تُبقيها شفافة.
sizepreview | medium | hd | fullحد أقصى بالميغابكسل، مع الحفاظ على نسبة الأبعاد ودون تكبير أبدًا: preview ≤ 0.25 MP، وmedium ≤ 1.5 MP، وhd ≤ 4 MP، وfull (الافتراضية) الدقة الأصلية (حتى 25 MP). يتم تجاهله عند تعيين width أو height.
croptrue | false | W:Hالقص إلى المربع المحيط بالعنصر. مع نسبة أبعاد (1:1، 4:5، 4:3، 16:9…)، يُوسَّع المربع بعد ذلك (دون تصغير أبدًا) إلى تلك النسبة حول العنصر؛ وتكون المساحة خارج الصورة شفافة (أو bg_color). الافتراضي false.
paddingpx | كسر | %مع crop: هامش يُضاف إلى كل جانب. 0.1 أو 10% = عُشر عرض العنصر (يسار/يمين) وارتفاعه (أعلى/أسفل)؛ و"10%,7.5%" يحدد الأفقي والرأسي كلًّا على حدة؛ و24px (أو عدد صحيح مجرد أكبر من 1) بالبكسل، حتى 500. الافتراضي 0.
channelsrgba | rgb | alphargba (الافتراضي): صورة مقصوصة شفافة. rgb: معتمة، مدمجة فوق bg_color أو الأبيض. alpha: قناع PNG بتدرج رمادي (الأبيض = العنصر)، بالحجم والقص نفسيهما للصورة المقصوصة. ولا يزال type=mask يعمل كاسم بديل لـ alpha.
width / height1–6000حجم إخراج دقيق بالبكسل، يُطبَّق بعد crop (ويتجاوز size). عند تحديد أحدهما فقط، يتبع الآخر نسبة الأبعاد. دون تمديد أبدًا.
roix1 y1 x2 y2منطقة الاهتمام، بوحدة px أو % (مثل 0% 0% 50% 100%). لا يُحتفظ إلا بالعنصر الواقع داخلها؛ ويصبح كل ما خارجها خلفية. تشير الإحداثيات إلى الصورة الأصلية. الافتراضي: الصورة كاملة.
fitcontain | 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.png

200 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-Confidence0–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. بالمفتاح نفسه؛ ولا ترى إلا مهامك.

الحقلالمعنى
statusqueued أو processing أو succeeded أو partial أو failed أو canceled
donetrue عندما لا يتبقى شيء للتشغيل
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).
402insufficient_credits: اشحن رصيدك من صفحة الأسعار.
403auth_failed: الترويسة X-Api-Key مفقودة أو غير صالحة.
429rate_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)

الصور الفاشلة لا تُحتسب أبدًا.

الحالةالرموزالمعنى
400missing_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لا يمكن استخدام الطلب أو رابط الصورة.
401unauthorizedx-api-key مفقود أو خاطئ أو ملغى.
402insufficient_credits, out_of_creditsرصيدك فارغ. اشحن رصيدك من صفحة الأسعار.
404not_foundلا توجد مهمة كهذه (أو أنها ليست لك).
409not_ready, canceled, idempotency_key_reusedGET …/result بينما المهمة ما زالت قيد التشغيل (أعد المحاولة بعد 2 s)، أو أُلغيت المهمة، أو أُعيد استخدام Idempotency-Key لطلب مختلف.
410result_unavailableحُذفت النتيجة أو انتهت صلاحيتها.
413too_largeالصورة أكبر من 25 MB.
422processing_failed, invalid_image, missing_uploadالملف ليس صورة قابلة للقراءة. لا يُحتسب.
429rate_limited, too_many_batchesتجاوزت حد الطلبات لكل حساب (انتظر مدة Retry-After)، أو لديك بالفعل 3 مهام دفعات قيد التشغيل.
502model_unavailable, upstream_error, …تعذّرت علينا معالجة الصورة بعد إعادة المحاولة. لا يُحتسب.
503server_paused, unavailableAPI متوقف مؤقتًا (قبل الإطلاق) أو غير متاح لفترة وجيزة. أعد المحاولة لاحقًا.

الدفعات من البداية إلى النهاية

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 / جسم JSON25 MB بعد فك الترميز (قد يكون جسم الطلب أكبر بنحو الثلث)413 too_large
دقة الإدخالتُصغَّر الصور التي تتجاوز 25 MP إلى 25 MP قبل المعالجة—
حجم الإخراجالعرض والارتفاع كلٌّ منهما بين 1 و6000 px400 invalid_width / invalid_height
تنزيل image_urlhttp(s) فقط، مهلة 15 s، حتى 3 عمليات إعادة توجيه؛ وتُرفض العناوين الخاصة وعناوين loopback وlink-local، عند كل إعادة توجيه400 invalid_url · fetch_failed · fetch_timeout
الانتظار في POST /v1/removeنحو 55 s، ثم 202 مع معرّف المهمة202
حجم الدفعة100 رابط صورة لكل POST /v1/batch400 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حُذفت النتيجة المخزّنة. وإعادة المعالجة تكلّف رصيدًا واحدًا.