remove.bg Is Shutting Down on 1 December 2026: Migrate Your API Integration in 10 Minutes
remove.bg's own site now carries the notice: the standalone website will no longer be available from 1 December 2026 at 9:00 CET, background removal moves to Leonardo.Ai (part of Canva), and pay-as-you-go credits expire on the same date. If your app, store or pipeline calls api.remove.bg, you have a deadline. The good news: the remove.bg request format is simple, and bgclear's API accepts the same field names, so the migration is a URL, a header and a test — not a rewrite.
In this guide
What is actually changing, and when
Three things are on the remove.bg site as of September 2026. The standalone website (and with it the API you call today) stops on 1 December 2026 at 9:00am CET. Background removal "moves to Leonardo.Ai, also part of Canva", with a migration helper pointing you at Leonardo's API — a different product, with its own request shape and its own pricing. And the pricing page says plainly that credits expire on 1 December 2026, 9:00 CET.
So the decision is not whether to move, only where. Leonardo is a full generative toolkit (upscaling, scene generation, video), which is more than a background-removal endpoint and priced accordingly. If all you need is "image in, cutout out", a compatible API is the smaller change: keep your field names, swap the base URL and the auth header, and ship.
Do this first, today: grep your codebase for api.remove.bg and X-Api-Key, list every service that calls it (the checkout image pipeline, the CMS plugin, that one cron job), and note which parameters each one uses. Most integrations use four: image_file or image_url, size, format and occasionally bg_color. That is the whole migration surface.
Field-by-field: remove.bg → bgclear
bgclear's public API was designed as a drop-in for remove.bg's request format. The mapping:
Endpoint: POST https://api.remove.bg/v1.0/removebg → POST https://www.bgclear.ai/api/v1/remove
Auth: header X-Api-Key: KEY → header Authorization: Bearer bgc_live_KEY
Input: image_file (multipart), image_url, image_file_b64 → identical names, identical semantics. Send exactly one.
Size: size=auto → size=auto. remove.bg's preview/regular → preview (free, ≤800 px). full, hd, 4k, 50MP → full (native resolution, 1 credit).
Format: png, jpg, webp → same. remove.bg's zip (colour + alpha pair) is not offered; use png or webp for transparency.
Background colour: bg_color=ffffff → same (hex, with or without #; transparent is the default).
Crop to subject: crop=true → same.
Not supported (silently ignored): type, type_level, roi, scale, position, add_shadow, semitransparency. The model auto-detects the subject, so type is unnecessary; if you relied on roi, crop before sending.
Response: image bytes by default, as before. Headers: remove.bg's X-Credits-Charged exists on bgclear too, plus X-Credits-Remaining, X-RateLimit-Limit/Remaining/Reset and X-Job-Id. Send Accept: application/json to get metadata and a hosted result URL instead of bytes.
Errors: remove.bg returns {"errors":[{"title":…,"code":…}]}; bgclear returns {"error":{"code":…,"message":…,"docs":…}}. Status codes line up where it matters: 400 for bad input, 402 for insufficient credits, 429 for rate limit.
The three-line change: curl, Python, Node
The before/after in each language. Nothing else in your code changes.
# before
curl -H 'X-Api-Key: REMOVE_BG_KEY' \
-F '[email protected]' -F 'size=auto' \
https://api.remove.bg/v1.0/removebg -o no-bg.png
# after
curl -H 'Authorization: Bearer bgc_live_YOUR_KEY' \
-F '[email protected]' -F 'size=auto' \
https://www.bgclear.ai/api/v1/remove -o no-bg.pngimport requests
# before: url = "https://api.remove.bg/v1.0/removebg"; headers = {"X-Api-Key": KEY}
url = "https://www.bgclear.ai/api/v1/remove"
headers = {"Authorization": f"Bearer {KEY}"}
r = requests.post(url, headers=headers,
files={"image_file": open("photo.jpg", "rb")},
data={"size": "auto", "format": "png"})
r.raise_for_status()
open("no-bg.png", "wb").write(r.content)
print("credits left:", r.headers["X-Credits-Remaining"])import fs from "node:fs";
const form = new FormData();
form.append("image_file", new Blob([fs.readFileSync("photo.jpg")]), "photo.jpg");
form.append("size", "auto");
// before: fetch("https://api.remove.bg/v1.0/removebg", { headers: { "X-Api-Key": KEY }, ... })
const res = await fetch("https://www.bgclear.ai/api/v1/remove", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BGCLEAR_KEY}` },
body: form,
});
if (!res.ok) throw new Error(await res.text());
fs.writeFileSync("no-bg.png", Buffer.from(await res.arrayBuffer()));If you use one of the community SDKs (the Python remove.bg package, Node removd, the Ruby gem), they hard-code api.remove.bg. Replace the call with the plain HTTP snippet above — it is shorter than the SDK call anyway.
Test with free previews before you switch traffic
Create a key on the API dashboard — the first key comes with 10 free full-resolution credits, and size=preview (up to 800 px) is free without limit. Run your real images through preview mode first to check edge quality on your product category, then flip size to full or auto.
Two habits worth adopting during the switch. First, send an Idempotency-Key header (any unique string per image) so a retried request never charges twice — the cached result is returned for 24 hours. Second, read X-Credits-Remaining on every response and alert below a threshold; a 402 insufficient_credits at checkout time is the failure mode you want to avoid.
Rate limit is 60 requests per minute per key; a 429 carries X-RateLimit-Reset. Sync requests over 4 megapixels at full size are rejected with a message telling you to use jobs, which brings us to bulk.
Large images and bulk: use jobs
POST /api/v1/jobs takes the same inputs and parameters, returns 202 {"job_id": …} immediately, and processes up to 50 MP. Poll GET /api/v1/jobs/{id} (statuses queued, processing, done with a result url, or failed), or pass an X-Callback-Url header and receive a POST when the job completes. POST /api/v1/jobs/batch accepts up to 50 image_urls in one JSON call. Results stay downloadable for 24 hours, and failed jobs are never charged. The bulk guide has the full pattern with polling and callback code.
Pricing after the switch
As listed on the respective pricing pages in September 2026. remove.bg's subscription is 40 credits per month (₹599 in India, roughly $0.18 per image) and pay-as-you-go starts at 3 credits for ₹200 — about $0.79 per image — with the note that credits expire on 1 December 2026. Leonardo's pricing is credit-based across many generative features rather than per removal; check their page for your volume.
bgclear sells credit packs with no subscription: 100 credits for $9 ($0.09 per image), 500 for $39 ($0.078) and 2,000 for $129 (about $0.065). Credits never expire, previews are free, failed jobs are not charged, and the same key covers sync, async, batch and callbacks. Full pricing.
If cost per image is your only criterion, note that Photoroom's Basic plan works out at $0.02 per image on a $20/month subscription, and there are budget APIs advertising $0.001 per image. We have not benchmarked their edge quality against ours; run your own images through the free previews and decide on results.
Migration checklist
1. Inventory every caller of api.remove.bg and the parameters each uses.
2. Create a bgclear key; store it as BGCLEAR_API_KEY next to your old key.
3. Swap the base URL and the auth header; drop type/roi/zip if present.
4. Run 20 representative images in size=preview; compare edges.
5. Add Idempotency-Key to the request and a low-credit alert on X-Credits-Remaining.
6. Route images over 4 MP to /jobs.
7. Buy a credit pack sized to a month of traffic; credits do not expire, so over-buying is safe.
8. Use up or write off your remove.bg credits before 1 December 2026 — they will not carry over anywhere.
Frequently asked questions
Will my remove.bg credits carry over?
No. remove.bg's pricing page states that credits expire on 1 December 2026 at 9:00 CET. Use them before then; nothing transfers to another provider.
Is bgclear a true drop-in replacement for the remove.bg API?
For the common parameters, yes: image_file, image_url, image_file_b64, size, format, bg_color and crop keep their names and meaning. You change the base URL and the auth header. Not supported: the zip output format and the type, roi, scale, position and add_shadow parameters.
Do I need a subscription?
No. bgclear sells credit packs from $9 for 100 images; credits never expire and there is no monthly fee. Preview-size results are free.
What if I use the remove.bg Python or Node SDK?
Those libraries hard-code api.remove.bg. Replace the SDK call with a plain HTTP request — the snippets above are 6–10 lines — or fork the library and change its base URL and header.