Developer Guides·Published May 1, 2026·Updated October 3, 2026·8 min read

Migrating from the remove.bg API Before December 2026

On December 1, 2026, api.remove.bg stops accepting requests. Every integration still pointing at that endpoint breaks. This guide is the migration path for developers who need a working replacement without a signup process.

By Remova Technical Team

What is actually changing

Remove.bg was acquired by Canva in 2021. For several years the standalone product continued operating alongside Canva's own background removal features. That ends on December 1, 2026.

Traffic to the API is being redirected to Leonardo.Ai, which is a separate generative AI platform with its own authentication, pricing, and rate limits. If you migrate to Leonardo, you are rebuilding your integration from scratch.

The alternative is to migrate to a different provider entirely. This guide covers migration to Remova, which is free on the public tier and requires no signup.

The three changes

First, the URL. api.remove.bg/v1.0/removebg becomes removatool.com/api/process/image.

Second, the authentication. Remove the X-Api-Key header. The public tier does not require a key.

Third, the parameter names. image_file becomes file. size=auto becomes max_size=1200. bg_color is replaced by transparent=true or false.

Everything else stays the same. The request is still a multipart POST. The response is still a binary image blob.

Python migration

The before code uses the requests library with an API key header. The after code drops the header and changes the field name.

Before: requests.post("https://api.remove.bg/v1.0/removebg", files={"image_file": open("photo.jpg", "rb")}, headers={"X-Api-Key": "YOUR_KEY"})

After: requests.post("https://removatool.com/api/process/image", files={"file": open("photo.jpg", "rb")}, params={"transparent": "true", "max_size": "1200"})

The response handling is identical. Both return binary data that you write to a file.

JavaScript migration

The fetch call changes the URL, drops the headers object, and renames the form field.

Before: fetch("https://api.remove.bg/v1.0/removebg", { method: "POST", headers: { "X-Api-Key": key }, body: form })

After: fetch("https://removatool.com/api/process/image?transparent=true&max_size=1200", { method: "POST", body: form })

The form field name changes from image_file to file. The blob handling in the response is unchanged.

cURL migration

The cURL command drops the -H flag and renames the -F field.

Before: curl -X POST https://api.remove.bg/v1.0/removebg -H "X-Api-Key: KEY" -F image_file=@photo.jpg -o result.png

After: curl -X POST "https://removatool.com/api/process/image?transparent=true" -F file=@photo.jpg -o result.png

If your shell script parses the response, nothing changes. The response body is still the raw PNG bytes.

Environment variables

Most production integrations keep the URL in a config file or environment variable. Find the line pointing at api.remove.bg and update it.

The API key line can be deleted entirely. There is nothing to replace it with on the public tier.

If your code reads the key from a secrets manager, remove that dependency. It is no longer needed.

Common questions

Can I keep my code and just change the URL?

Almost. You also need to rename image_file to file and delete the auth header. Those are the only code changes.

What if I want to migrate to Leonardo.Ai instead?

Leonardo is the official successor. It requires a new account, new authentication, and new pricing. The migration takes longer because there is no direct mapping between the request shapes.

Is there a compatibility shim?

No. The request shape is close enough that a shim would add complexity without saving much. Change the three things and you are done.

Does the free tier have a rate limit?

Thirty requests per minute per IP. That is enough for most applications. If you need more, the feedback button on the site is the contact point.

Try it now

Open the tool