The RemovalForge API founding access

Everything the free tool does, callable from your scripts, spreadsheets and listing pipelines, plus something a browser cannot do. Two endpoints now: one cleans a product photo onto a marketplace-ready background, the other reads a photo and tells you whether it carries writing, so an automated pipeline can drop or clean supplier images on its own. Flat monthly pricing, never credits, never expiry, never a watermark. Founding keys are being issued now and activate within 24 hours of your order.

Starter

$9/month
  • 1,500 images every month
  • All marketplace presets
  • Full resolution, no watermark
  • Unused volume never expires mid-month
Get Starter key

Forge

$19/month
  • 6,000 images every month
  • Priority processing lane
  • Custom sizes and backgrounds
  • Email support from the builders
Get Forge key

Scale

$49/month
  • 25,000 images every month
  • Highest rate limits
  • Custom integration help
  • Invoice billing available
Get Scale key

Ordering takes one email, your key and payment details come back the same day, and the key activates within 24 hours. We take card, PayPal, Revolut and Wise. Cancel any month, keep the month you paid for. The API is the one paid thing here, because the server it runs on is the one thing that costs us money; the browser tool stays free forever.

Flat, not creditsPer-image credits punish bulk sellers. Here a plan is a number per month, and heavy Sundays cost the same as quiet Tuesdays.
Real photo outThe API returns your product photograph on a flat color. No generated pixels, nothing to label under the EU AI Act.
Built by sellersWe run nine storefronts on this exact pipeline. The API exists because our own listings needed it first.
Eyes, not just handsThe API can read a photo and flag foreign writing, size stamps and watermarks, so your pipeline cleans or drops supplier images before they ever reach a listing.

One honest note before you integrate anything. The browser tool needs no API and never will: it runs the neural network on your own device, free, unlimited, up to 100 photos per batch. The API exists for a different job, the one a browser cannot do: unattended automation. Nightly listing pipelines, spreadsheet scripts, server workflows, apps of your own.

The endpoint

POST https://api.removalforge.com/v1/remove
Header: X-API-Key: your_key
Body:   multipart/form-data
FieldTypeMeaning
filebinary, requiredJPEG, PNG or WebP up to 40 MB
presetstringallegro_2560, allegro_1600, allegro_grey_2560, amazon_2000, ebay_1600, etsy_2000, instagram_1080, facebook_1200, youtube_1280, transparent_png. Default allegro_2560
width, heightintegerCustom canvas 100 to 4000 px, overrides preset size
backgroundstringHex color like FFFFFF, or "transparent"
paddingnumber0 to 0.2, margin around the product. Default 0.07
formatstringjpeg or png. Default follows the preset

The response is the finished image itself, binary, with content type image/jpeg or image/png. No JSON envelope to unwrap, no second download request. Errors come back as JSON with an explanation: 401 bad key, 413 file too large, 422 unreadable image, 429 rate limited, 500 processing failure.

curl

curl -X POST https://api.removalforge.com/v1/remove \
  -H "X-API-Key: your_key" \
  -F "file=@product.jpg" \
  -F "preset=allegro_2560" \
  -o product_white.jpg

JavaScript

const form = new FormData();
form.append("file", fileBlob, "product.jpg");
form.append("preset", "allegro_2560");
const res = await fetch("https://api.removalforge.com/v1/remove", {
  method: "POST",
  headers: { "X-API-Key": "your_key" },
  body: form
});
if (!res.ok) throw new Error(await res.text());
const cleanImage = await res.blob();

Python

import requests

with open("product.jpg", "rb") as f:
    r = requests.post(
        "https://api.removalforge.com/v1/remove",
        headers={"X-API-Key": "your_key"},
        files={"file": f},
        data={"preset": "allegro_2560"},
        timeout=60,
    )
r.raise_for_status()
with open("product_white.jpg", "wb") as out:
    out.write(r.content)

Google Apps Script

function removeBackground(fileBlob) {
  var res = UrlFetchApp.fetch("https://api.removalforge.com/v1/remove", {
    method: "post",
    headers: { "X-API-Key": "your_key" },
    payload: { file: fileBlob, preset: "allegro_2560" },
    muteHttpExceptions: true
  });
  if (res.getResponseCode() !== 200) throw new Error(res.getContentText());
  return res.getBlob();
}

Second endpoint: read the writing on a photo new

Supplier photos arrive covered in text: foreign marketing overlays, size stamps, watermarks. Before a photo goes into a listing you want to know which images carry writing, so you can drop them or clean them. This endpoint reads a photo and answers in plain JSON. It runs on the same server as the remover and is included with every key. Send it a link to the image, or the image bytes as base64.

POST https://api.removalforge.com/v1/detect_writing
Header: X-API-Key: your_key
Body:   application/json
FieldTypeMeaning
urlstringA link to the image to read. Send this OR b64.
b64stringThe image as base64, if you would rather send the bytes directly.

The response is JSON, not an image:

{
  "ok": true,
  "has_writing": true,
  "cjk": true,
  "latin": false,
  "digits_only": false,
  "items": [{ "text": "...", "score": 0.98 }],
  "engine": "rapidocr",
  "ms": 740
}
FieldMeaning
has_writingtrue if any readable text was found on the photo.
cjktrue if Chinese, Japanese or Korean characters are present. The flag that catches supplier overlays.
latintrue if Latin letters are present.
digits_onlytrue when the only text is numbers and marks like "15 cm", so a plain size stamp is not treated as writing.
itemsevery text block found, each with a confidence score.

Errors come back as JSON: 401 bad key, 400 no image sent, 500 read failure.

curl

curl -X POST https://api.removalforge.com/v1/detect_writing \
  -H "X-API-Key: your_key" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/photo.jpg"}'

Python

import requests

info = requests.post(
    "https://api.removalforge.com/v1/detect_writing",
    headers={"X-API-Key": "your_key"},
    json={"url": "https://example.com/photo.jpg"},
    timeout=60,
).json()

if info["cjk"]:
    pass  # foreign writing found: drop or clean this photo

Recipe: clean a whole listing automatically

The two endpoints combine into the exact workflow a cross-border seller needs. Read every photo, and if any carries writing, put them all on white for a consistent set. Then read the cleaned photos again and drop any where writing was printed on the product itself and survived. What is left is a clean, uniform listing gallery, with no human step.

import requests
KEY = {"X-API-Key": "your_key"}

def has_writing(url):
    return requests.post("https://api.removalforge.com/v1/detect_writing",
                         headers=KEY, json={"url": url}, timeout=60).json()

def to_white(url):
    img = requests.get(url, timeout=60).content
    return requests.post("https://api.removalforge.com/v1/remove",
                         headers=KEY, files={"file": img},
                         data={"preset": "allegro_2560"}, timeout=60).content

photos = ["https://.../1.jpg", "https://.../2.jpg", "https://.../3.jpg"]

# 1. does any photo carry writing?
dirty = any(has_writing(u)["has_writing"] for u in photos)

# 2. if so, clean every photo to white for a consistent gallery
# 3. re-check each cleaned image and keep only those with no writing left
# 4. only the surviving clean photos go into the listing

Why flat pricing

Per-image credits punish the exact person this tool is for: the seller who lists in bulk. Photograph forty products on a Sunday and a credit meter turns your best workday into your most expensive one. The API ships with a flat monthly plan sized for real listing volume, and the free browser tool stays free forever regardless.

Building a listing pipeline today? The browser tool already batch-processes 100 photos into one ZIP for free: open the tool. The API answers the same presets over HTTP right now, and reads the writing on a photo too.