रियल-टाइम API

बैकग्राउंड रिमूवल API: एक रिक्वेस्ट भेजें, तैयार PNG पाएँ।

फ़ाइल अपलोड करें, कोई पब्लिक इमेज URL भेजें, या base64 दें। ज़्यादातर सिंगल इमेज उसी HTTP रिस्पॉन्स में तैयार होकर वापस आती हैं, आम तौर पर कुछ ही सेकंड में। अगर किसी में ज़्यादा समय लगे, तो आपको एक job id मिलती है जिससे आप इमेज दोबारा भेजे बिना रिज़ल्ट ले सकते हैं। बल्क के लिए एक batch एंडपॉइंट है।

हर सफल इमेज पर 1 क्रेडिट · फ़ेल हुई इमेज मुफ़्त · कुंजियाँ आपके अकाउंट में

$ 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, फिर raw बॉडी को प्राथमिकता मिलती है। ये उदाहरण आपकी कुंजी REMOVEBG_API_KEY एनवायरनमेंट वेरिएबल से पढ़ते हैं (इसे export REMOVEBG_API_KEY=… से सेट करें); डबल कोट्स पर ध्यान दें, इनसे शेल वैल्यू भर पाता है।

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 सेकंड से ज़्यादा लगे, तो आपको उसकी जगह job id के साथ 202 Accepted मिलता है। जॉब चलता रहता है: id से उसका रिज़ल्ट लें। इमेज दोबारा भेजने से दूसरा जॉब शुरू होगा और दूसरा क्रेडिट लग सकता है।

स्टेटसबॉडीक्या करें
200इमेज (image/png, image/jpeg या image/webp)इसे सेव करें। फ़ाइल एक्सटेंशन चुनने के लिए Content-Type इस्तेमाल करें।
202JSON: { id, status, status_url, result_url }यह इमेज नहीं है। कुछ सेकंड रुकें, फिर result_url को GET करें। इमेज दोबारा न भेजें।
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-compatible एंडपॉइंट अलग तरह से काम करता है: वह कभी 202 नहीं लौटाता (नीचे देखें)।

ऑथेंटिकेशन

अपनी API कुंजी x-api-key हेडर में भेजें। अपने अकाउंट पेज पर कुंजियाँ बनाएँ और रद्द करें; हर कॉल उस अकाउंट के क्रेडिट ख़र्च करती है। सभी एंडपॉइंट https://removebackground.dev के तहत हैं और CORS रिक्वेस्ट स्वीकार करते हैं, लेकिन CORS की वजह से कुंजी को वेब पेज में डालना सुरक्षित नहीं हो जाता: उसे अपने सर्वर पर रखें (देखें सुरक्षा)। एरर JSON में होते हैं: { "error": { "code": "…", "message": "…" } }।

पूरा कॉन्ट्रैक्ट OpenAPI 3.1 (openapi.json) के रूप में प्रकाशित है, क्लाइंट जेनरेटर, Postman या टेस्ट के लिए; AI कोडिंग असिस्टेंट llms.txt से शुरू कर सकते हैं।

POST /v1/remove

रियल-टाइम। एक इमेज का बैकग्राउंड हटाएँ। आम तौर पर तैयार इमेज ही रिस्पॉन्स बॉडी होती है (image/png, image/jpeg या image/webp), आम तौर पर कुछ सेकंड बाद। पैरामीटर फ़ॉर्म फ़ील्ड, JSON keys या query-string वैल्यू हो सकते हैं; आप Content-Type: image/jpeg, image/png, image/webp या application/octet-stream के साथ raw इमेज बाइट्स भी POST कर सकते हैं। अधिकतम 25 MB। हर इनपुट तरीके के लिए अपनी इमेज भेजें देखें।

पैरामीटरटाइपविवरण
image_filefileइमेज (JPG, PNG या WebP), multipart फ़ॉर्म डेटा के रूप में।
image_file_b64stringbase64 के रूप में इमेज, data:image/…;base64, प्रीफ़िक्स के साथ या बिना (डिकोड के बाद 25 MB)। JSON से भेजने में आसान।
image_urlstringइमेज का पब्लिक http(s) URL। हम उसे डाउनलोड करते हैं (अधिकतम 3 रीडायरेक्ट, 15 s)। अगर कई भेजे जाएँ, तो पहले image_file, फिर image_file_b64, फिर image_url, फिर raw बॉडी को प्राथमिकता मिलती है।
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 | fraction | %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-downwidth और height के साथ। contain (डिफ़ॉल्ट): अंदर फ़िट, बीच में, बाकी ट्रांसपेरेंट (या bg_color)। cover: बॉक्स भरें, सब्जेक्ट के आसपास ज़्यादा हिस्सा क्रॉप करके। scale-down: contain जैसा, लेकिन कभी बड़ा नहीं किया जाता।

विकल्प इस क्रम में लागू होते हैं: roi, size (या बाद में width/height), crop + padding + आस्पेक्ट रेशियो, width/height + fit, फिर channels या बैकग्राउंड का रंग, फिर format। हर विकल्प पर वही 1 क्रेडिट लगता है। अनजान पैरामीटर अनदेखा कर दिए जाते हैं।

उदाहरण: सफ़ेद पर HD JPG, 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 भेजा है तो वही, नहीं तो एक जेनरेट की गई 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स्टोर किए गए रिज़ल्ट की id।
X-Job-Idरिक्वेस्ट के पीछे के जॉब की id (/v1/jobs/:id के साथ इस्तेमाल योग्य)।

202 Accepted (लंबी कतार के लिए फ़ॉलबैक)

अगर इमेज लगभग 55 सेकंड में पूरी न हो, जैसे जब कतार असामान्य रूप से व्यस्त हो, तो आपको JSON { id, status, status_url, result_url } के साथ 202 मिलता है (साथ में Location और Retry-After: 2)। done true होने तक status_url पोल करें, फिर result_url डाउनलोड करें। चार्ज एक बार लगता है, सिर्फ़ इमेज सफल होने पर। Idempotency-Key के बिना इमेज दोबारा न भेजें: इससे दूसरा जॉब शुरू होता है। पूरे उदाहरण के लिए रिस्पॉन्स संभालें देखें।

GET /v1/jobs/:id

/v1/remove या /v1/batch से बने जॉब का स्टेटस। वही कुंजी; आप सिर्फ़ अपने जॉब देखते हैं।

फ़ील्डमतलब
statusqueued, processing, succeeded, partial, failed या canceled
doneकुछ भी बाकी न रहने पर true
total, succeeded, failed, skippedइमेज की गिनती
credits_chargedइस जॉब में लगे क्रेडिट (हर सफल इमेज पर 1)
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)। जॉब चलते रहने तक Retry-After: 2 के साथ 409 not_ready लौटाता है, या फ़ेल होने पर इमेज का अपना एरर।

POST /v1/batch

100 तक इमेज URL को एक जॉब के रूप में कतार में डालें: JSON { "image_urls": ["https://…", …], "format": "jpg", "bg_color": "ffffff", "size": "hd", "crop": "1:1", "padding": "10%" }, /v1/remove जैसे ही विकल्पों के साथ (channels, width, height और fit भी)। तुरंत { id, status, total, invalid, duplicates, status_url } के साथ 202 लौटाता है। जॉब पोल करें, फिर हर आइटम का result_url लें। हर सफल इमेज पर 1 क्रेडिट; हर अकाउंट पर अधिकतम 3 बैच जॉब खुले। उदाहरण रिस्पॉन्स के साथ पूरी जानकारी बैच, शुरू से अंत तक में।

remove.bg-compatible एंडपॉइंट

remove.bg का सेल्फ़-सर्व API 1 December 2026, 09:00 CET को बंद हो रहा है (घोषणा)। मौजूदा remove.bg इंटीग्रेशन यहाँ सिर्फ़ एक लाइन बदलकर काम करते हैं: https://api.remove.bg/v1.0/removebg → https://removebackground.dev/v1.0/removebg, उसी X-Api-Key हेडर में removebackground.dev कुंजी के साथ। वही कतार, हर सफल इमेज पर वही 1 क्रेडिट, /v1/remove जैसी ही आउटपुट क्वालिटी। माइग्रेशन गाइड।

POST /v1.0/removebg

remove.bg के पैरामीटर नामों के साथ Multipart, urlencoded या JSON बॉडी। इमेज बाइट्स और remove.bg के हेडर के साथ जवाब देता है, या जब आप Accept: application/json भेजते हैं तो { "data": { "result_b64", "foreground_top", "foreground_left", "foreground_width", "foreground_height" } }। एरर remove.bg के फ़ॉर्मेट में होते हैं: { "errors": [{ "title", "code", "detail" }] }। /v1/remove के उलट यह कभी 202 नहीं लौटाता: यह 110 सेकंड तक इंतज़ार करता है, फिर 503 timeout लौटाता है। जॉब चलता रहता है और सफल होने पर चार्ज लगता है, इसलिए वह रिक्वेस्ट दोबारा भेजने से दूसरा जॉब शुरू होता है।

पैरामीटरस्टेटसनोट्स
image_file / image_file_b64 / image_urlसपोर्टेडMultipart, urlencoded या JSON बॉडी। 25 MB तक की JPG, PNG या WebP।
sizeसपोर्टेडauto, full, 4k और 50MP ओरिजिनल रिज़ॉल्यूशन देते हैं (25 MP तक); preview, small और regular ≈ 0.25 MP; medium 1.5 MP; hd 4 MP। हमेशा 1 क्रेडिट।
formatसपोर्टेडauto (ट्रांसपेरेंट हो तो PNG, वरना JPG), png, jpg, webp और zip (color.jpg + alpha.png)।
crop / crop_marginसपोर्टेडसब्जेक्ट का px या %, 1–4 CSS-स्टाइल वैल्यू ("10% 20%" = वर्टिकल, हॉरिज़ॉन्टल); हर साइड पर अधिकतम 500px या 50%।
roiसपोर्टेडpx या % में "x1 y1 x2 y2": सिर्फ़ इस क्षेत्र के अंदर का सब्जेक्ट रखा जाता है।
scale / positionसपोर्टेडscale 10%–100% या original; position center, original या "x% y%"।
channelsसपोर्टेडrgba (कट-आउट) या alpha (ग्रेस्केल मास्क)।
bg_colorसपोर्टेड# के साथ या बिना Hex (81d4fa), या रंग का नाम। 8 अंकों वाला hex रंग रखता है और उसका alpha हटा देता है।
bg_image_url / bg_image_fileसपोर्टेडकट-आउट को आपकी बैकग्राउंड इमेज पर रखा जाता है, जो आउटपुट साइज़ में cover-fit होती है।
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 लौटाता है, या एक जेनरेट की गई 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" } } } }। सभी क्रेडिट pay-as-you-go हैं और कभी एक्सपायर नहीं होते, इसलिए total बराबर है payg के। अपनी X-Api-Key के साथ GET https://removebackground.dev/v1.0/account।

एरर (/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रिक्वेस्ट या इमेज URL इस्तेमाल नहीं हो सकता।
401unauthorizedx-api-key नहीं है, ग़लत है या रद्द हो चुकी है।
402insufficient_credits, out_of_creditsआपका बैलेंस ख़ाली है। कीमतों वाले पेज पर टॉप-अप करें।
404not_foundऐसा कोई जॉब नहीं (या वह आपका नहीं है)।
409not_ready, canceled, idempotency_key_reusedजॉब चलते रहने के दौरान GET …/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 तक पब्लिक इमेज URL, साथ में /v1/remove के कोई भी विकल्प। ऊपर दिए दो प्लेसहोल्डर URL अगर असली इमेज होते, तो 2 क्रेडिट तक लगते। जवाब तुरंत आता है:

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) URL नहीं हैं और 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 है। अमान्य और दोहराए गए URL हटाने के बाद पोज़िशन आपकी सूची के क्रम में होती हैं, इसलिए जब इनमें से कोई भी गिनती 0 से ज़्यादा हो, तो रिज़ल्ट को इंडेक्स के बजाय input से मिलाएँ।

  • done true होते ही बैच 3 खुले बैच की सीमा में गिना जाना बंद हो जाता है।
  • API में कोई cancel एंडपॉइंट, webhooks या ZIP डाउनलोड नहीं है। बल्क पेज से शुरू किए गए बैच वहीं रद्द किए जा सकते हैं या ZIP में डाउनलोड किए जा सकते हैं।

दोबारा कोशिश, डुप्लिकेट और बिलिंग

Idempotency-Key भेजें, ताकि दोबारा कोशिश करने पर दो बार चार्ज न लगे। POST /v1/remove या POST /v1/batch में एक Idempotency-Key हेडर जोड़ें (255 अक्षरों तक की कोई भी यूनिक स्ट्रिंग, जैसे UUID), हर इमेज या बैच के लिए एक कुंजी। अगर आप वही रिक्वेस्ट उसी कुंजी के साथ फिर भेजते हैं, तो आपको पहली रिक्वेस्ट से बना जॉब ही मिलता है, Idempotent-Replayed: true के साथ: न नया जॉब, न नया चार्ज, भले ही पहली रिक्वेस्ट अभी चल रही हो। उसी कुंजी के साथ अलग इमेज या विकल्प भेजने पर जवाब 409 idempotency_key_reused होता है। कुंजियाँ आपके अकाउंट की होती हैं और एक्सपायर नहीं होतीं।

कुंजी के बिना, हर POST एक नया जॉब बनाता है, और हर सफल जॉब पर 1 क्रेडिट लगता है (remove.bg-compatible 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)मुफ़्त।
इमेज सफल होती है1 क्रेडिट, सफल होने पर एक बार। हमारी अपनी अंदरूनी कोशिशों से चार्ज नहीं बढ़ता।
आपको 202 मिलता हैअभी कुछ नहीं। जॉब चलता रहता है और सिर्फ़ सफल होने पर 1 क्रेडिट लगता है।
इंतज़ार करते समय आपके क्लाइंट का टाइमआउट हो जाता है या कनेक्शन टूट जाता हैजॉब चलता रहता है और सफल होने पर चार्ज लगता है। रिज़ल्ट आपके स्टूडियो में दिखता है।
आप वही रिक्वेस्ट उसी Idempotency-Key के साथ दो बार भेजते हैंएक जॉब, अधिकतम 1 क्रेडिट। दोहराई गई रिक्वेस्ट को वही जॉब मिलता है (हेडर Idempotent-Replayed: true)।
आप वही इमेज बिना कुंजी के दो बार भेजते हैंदो अलग जॉब; हर सफल जॉब पर 1 क्रेडिट।
आप तैयार रिज़ल्ट दोबारा डाउनलोड करते हैंमुफ़्त, जितनी बार चाहें, जब तक वह स्टोर है।
बैच आंशिक रूप से सफल होता हैहर सफल इमेज पर 1 क्रेडिट; जॉब का credits_charged कुल दिखाता है।
बैच में एक ही URL दो बार हैएक बैच के अंदर दोहराव कतार में डालने से पहले हटा दिए जाते हैं और उनका कभी चार्ज नहीं लगता। अलग-अलग बैच में एक जैसे URL अलग जॉब होते हैं।
बैच के दौरान क्रेडिट ख़त्म हो जाते हैंजो इमेज पूरी हो चुकी हैं, उनका भुगतान रहता है; बाकी skipped (out_of_credits) मार्क होती हैं और मुफ़्त हैं। क्रेडिट खरीदें, फिर बचे हुए URL नए बैच के रूप में भेजें।

कब दोबारा कोशिश करें

क्या हुआक्या करें
GET /v1/jobs/:id या …/result फ़ेल होता है (नेटवर्क एरर, 5xx)दोबारा कोशिश करना सुरक्षित है: जॉब पढ़ने से न कोई काम बनता है न चार्ज लगता है। कोशिशों के बीच थोड़ा रुकें।
GET …/result का जवाब 409 not_ready हैRetry-After (2 s) तक रुकें और फिर पूछें। इमेज दोबारा सबमिट न करें।
GET …/result का जवाब 410 result_unavailable हैस्टोर किया गया रिज़ल्ट डिलीट हो चुका है। इमेज को फिर से प्रोसेस करना नया जॉब है और उस पर 1 क्रेडिट लगता है।
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-compatible एंडपॉइंट अलग है: उसके 503 timeout का मतलब है कि जॉब अभी चल रहा है।)
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 तक छोटी कर दी जाती हैं—
आउटपुट साइज़width और height दोनों 1–6000 px400 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, फिर job id के साथ 202202
बैच साइज़हर POST /v1/batch में 100 इमेज URL400 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 कुंजी अपने नियंत्रण वाले सर्वर पर रखें। इसे ब्राउज़र कोड, मोबाइल ऐप, पब्लिक रिपॉज़िटरी या URL में न डालें। अपने यूज़र्स को बैकग्राउंड हटाने देने के लिए, उनकी इमेज अपने बैकएंड से भेजें, और वहीं अपना साइन-इन और ख़र्च की सीमाएँ जोड़ें।

  • API, CORS की अनुमति देता है ताकि यह टूल और सर्वर-साइड कोड से काम करे। इसका मतलब यह नहीं कि कुंजी को वेब पेज में डालना सुरक्षित है: वहाँ कोई भी उसे पढ़ सकता है।
  • एक अकाउंट की सभी कुंजियाँ एक ही क्रेडिट बैलेंस ख़र्च करती हैं। अपने अकाउंट पेज पर हर ऐप या एनवायरनमेंट के लिए अलग कुंजी बनाएँ, ताकि आप दूसरों को प्रभावित किए बिना एक को रद्द कर सकें।
  • अगर कोई कुंजी लीक हो जाए, तो उसे तुरंत अकाउंट पेज पर रद्द करें (वह उसी समय काम करना बंद कर देती है) और नई बनाएँ। हम हर कुंजी का सिर्फ़ हैश स्टोर करते हैं, इसलिए उसे आपको दोबारा नहीं दिखा सकते।

समस्या निवारण

लक्षणक्या हो रहा है
मेरी PNG नहीं खुल रहीबॉडी JSON थी (202 जॉब या एरर), इमेज नहीं। सेव करने से पहले HTTP स्टेटस और Content-Type जाँचें।
मेरी स्क्रिप्ट का टाइमआउट हो गया लेकिन इमेज स्टूडियो में दिख रही हैआपके इंतज़ार बंद करने के बाद भी जॉब चलता रहा। दोबारा भेजने के बजाय उसे job id से लें।
एक इमेज के लिए मुझसे दो बार चार्ज लिया गयाउसे Idempotency-Key के बिना दो बार भेजा गया (अक्सर टाइमआउट के बाद अपने-आप हुई दोबारा कोशिश)। हर इमेज के लिए एक कुंजी भेजें और दोबारा कोशिश में वही इस्तेमाल करें।
URL मेरे ब्राउज़र में खुलता है लेकिन API उसे नहीं ले पाताहो सकता है होस्ट को कुकीज़ या लॉगिन चाहिए, वह सर्वर को ब्लॉक करता हो, 3 से ज़्यादा बार रीडायरेक्ट करता हो, 15 s से ज़्यादा लेता हो, या साइन किया गया URL एक्सपायर हो गया हो। इसके बजाय फ़ाइल अपलोड करें।
मेरा बैच आधे में रुक गयाजॉब में items[] देखें: फ़ेल हुए आइटम में एरर कोड होता है; out_of_credits वाले skipped आइटम का मतलब है कि बैलेंस ख़त्म हो गया।
कोई विकल्प कुछ करता नहीं दिखताअनजान पैरामीटर नाम चुपचाप अनदेखा कर दिए जाते हैं। पैरामीटर टेबल से स्पेलिंग मिलाएँ। /v1.0/removebg पर, remove.bg के कुछ विकल्प स्वीकार होते हैं पर अनदेखा कर दिए जाते हैं (वह टेबल देखें)।
बैकग्राउंड ट्रांसपेरेंट नहीं हैJPG ट्रांसपेरेंट नहीं हो सकता। format=png या webp इस्तेमाल करें और bg_color सेट न करें।
रिज़ल्ट लिंक 410 देता हैस्टोर किया गया रिज़ल्ट डिलीट हो चुका है। फिर से प्रोसेस करने पर 1 क्रेडिट लगता है।