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
- 1,500 images every month
- All marketplace presets
- Full resolution, no watermark
- Unused volume never expires mid-month
Forge
- 6,000 images every month
- Priority processing lane
- Custom sizes and backgrounds
- Email support from the builders
Scale
- 25,000 images every month
- Highest rate limits
- Custom integration help
- Invoice billing available
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.
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
| Field | Type | Meaning |
|---|---|---|
| file | binary, required | JPEG, PNG or WebP up to 40 MB |
| preset | string | allegro_2560, allegro_1600, allegro_grey_2560, amazon_2000, ebay_1600, etsy_2000, instagram_1080, facebook_1200, youtube_1280, transparent_png. Default allegro_2560 |
| width, height | integer | Custom canvas 100 to 4000 px, overrides preset size |
| background | string | Hex color like FFFFFF, or "transparent" |
| padding | number | 0 to 0.2, margin around the product. Default 0.07 |
| format | string | jpeg 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
| Field | Type | Meaning |
|---|---|---|
| url | string | A link to the image to read. Send this OR b64. |
| b64 | string | The 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
}
| Field | Meaning |
|---|---|
| has_writing | true if any readable text was found on the photo. |
| cjk | true if Chinese, Japanese or Korean characters are present. The flag that catches supplier overlays. |
| latin | true if Latin letters are present. |
| digits_only | true when the only text is numbers and marks like "15 cm", so a plain size stamp is not treated as writing. |
| items | every 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.