Workflow Guides·Published February 18, 2026·Updated October 3, 2026·8 min read

Bulk Background Removal: A Workflow for Photographers and Sellers

Processing ten images one at a time is fine. Processing a thousand is a problem, and the way to solve it depends on whether you are a person with a catalog or a developer with a pipeline.

By Remova Technical Team

For sellers and photographers: the browser workflow

The web tool accepts up to 20 images in a single batch. For a catalog of 200, that is ten batches. For a catalog of 2000, that is a hundred batches, which is not practical to do by hand.

The right approach depends on catalog size. Under 200 images, the browser batch is fast enough. Between 200 and 1000, split the work across sessions. Above 1000, you want the API.

The browser batch outputs a single ZIP file. Download it, unzip it, and move on to the next batch. There is no daily limit, but the rate limit is 30 requests per minute per IP. Twenty images in a batch counts as one request if the batch endpoint is used.

For developers: the scripted approach

The API endpoint accepts a single image or a batch. For automated processing, use the batch endpoint with 20 files per request and loop over your catalog.

A minimal Python loop that processes a directory and writes results to an output directory:

import os, requests, glob INPUT = "input/" OUTPUT = "output/" API = "https://removatool.com/api/process/bulk?transparent=true&max_size=1200" files = sorted(glob.glob(INPUT + "*.jpg")) batch_size = 20 for i in range(0, len(files), batch_size): batch = files[i:i+batch_size] files_payload = [("files", (os.path.basename(f), open(f, "rb"), "image/jpeg")) for f in batch] r = requests.post(API, files=files_payload, timeout=300) if r.status_code == 200: zip_path = f"{OUTPUT}batch_{i//batch_size}.zip" with open(zip_path, "wb") as fh: fh.write(r.content) print(f"Wrote {zip_path}") else: print(f"Batch {i//batch_size} failed: {r.status_code}") for _, (_, fh, _) in files_payload: fh.close()

The rate limit is 30 requests per minute. Twenty files per request means 600 files per minute at full throughput. That is enough for most pipelines.

Add error handling for the 503 case. That status means the inference backend is waking up from a cold start. Retry after a short delay and the request will succeed.

Quality consistency across a batch

The most common quality problem in bulk work is inconsistency. One image looks slightly different from the next because the model chose a different router path.

To eliminate this, force the same model for every image in the batch. Pass model=birefnet-general-lite or the model of your choice as a query parameter. The router is disabled when a specific model is named.

The second source of inconsistency is source lighting. If some photos are shot in the morning and others in the afternoon, the mask edges will differ slightly. This is a photography problem, not a processing problem, and the fix is to reshoot in a single session.

Handling failures in a large run

Not every image will process cleanly. Products with translucent materials, thin wires, or very fine details can confuse the segmentation model.

Log the filename of every failed or low-quality result. The API returns an X-Quality-Label header with each single-image response. Use it to flag results for manual review.

Reprocess the failures individually with a different model or with hair preservation enabled. Ten percent of a large catalog will need this second pass. Budget for it.

Common questions

What is the actual rate limit?

30 requests per minute per IP. Batches count as one request. There is no daily cap.

Does the batch endpoint support video?

No. Video uses a separate pipeline. Process videos individually through the tool or the frames endpoint.

What is the largest single batch?

20 images per batch request. Split larger runs into batches.

Can I run this from a server without a browser?

Yes. The endpoints are standard HTTP. Any language that can POST multipart form data works.

Try it now

Open the tool