API voor achtergrond verwijderen: één request erin, kant-en-klare PNG eruit.
Upload een bestand, stuur een openbare afbeeldings-URL of lever base64 aan. De meeste losse afbeeldingen komen kant-en-klaar terug in hetzelfde HTTP-antwoord, meestal binnen enkele seconden. Duurt er een langer, dan krijg je een job-id om het resultaat op te halen, zonder de afbeelding opnieuw te sturen. Voor bulk is er een batch-endpoint.
1 credit per geslaagde afbeelding · mislukte afbeeldingen zijn gratis · sleutels in je account
$ curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_API_KEY" \
-F 'image_file=@dog.jpg' -o dog.png
← 200 OK · image/png · meestal binnen enkele seconden
dog.png opgeslagen (transparant, volledige resolutie)Snel aan de slag
Kopieer, plak en vervang YOUR_API_KEY. Elk voorbeeld slaat het resultaat direct op in een bestand, en de voorbeelden in JavaScript en Python wachten ook op een 202.
curl -X POST https://removebackground.dev/v1/remove \
-H 'x-api-key: YOUR_API_KEY' \
-F 'image_file=@photo.jpg' \
-o photo-no-bg.pngJe afbeelding versturen
POST /v1/remove accepteert de afbeelding op vier manieren. Stuur er één; bevat een request er meerdere, dan gaat image_file voor, dan image_file_b64, dan image_url en dan de ruwe body. Deze voorbeelden lezen je sleutel uit de omgevingsvariabele REMOVEBG_API_KEY (stel die in met export REMOVEBG_API_KEY=…); let op de dubbele aanhalingstekens, waardoor de shell de waarde invult.
curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_API_KEY" \
-F 'image_file=@photo.jpg' \
-o photo-no-bg.pngMultipart form data, veld image_file. JPG, PNG of WebP, tot 25 MB.
Elk voorbeeld slaat de body op in een bestand. Dat bestand is alleen een afbeelding als de status 200 is; zie Het antwoord verwerken.
Het antwoord verwerken
De meeste losse afbeeldingen komen kant-en-klaar terug in hetzelfde antwoord. Is de wachtrij uitzonderlijk druk en duurt een afbeelding langer dan ongeveer 55 seconden, dan krijg je in plaats daarvan 202 Accepted met een job-id. De job loopt door: haal het resultaat op met de id. Als je de afbeelding opnieuw stuurt, start je een tweede job die een tweede credit kan kosten.
| Status | Body | Wat je doet |
|---|---|---|
200 | De afbeelding (image/png, image/jpeg of image/webp) | Sla hem op. Gebruik de Content-Type om de bestandsextensie te kiezen. |
202 | JSON: { id, status, status_url, result_url } | Geen afbeelding. Wacht een paar seconden en doe dan een GET op result_url. Stuur de afbeelding niet opnieuw. |
4xx / 5xx | JSON: { "error": { "code", "message" } } | Geen afbeelding. Lees de code (zie Fouten) en sla de body niet op als afbeelding. |
Een volledig voorbeeld
Verwerkt de kant-en-klare afbeelding, een 202, een job die mislukt en een lokale tijdslimiet. Het stuurt de afbeelding één keer en herhaalt alleen de veilige statuscontroles.
import os
import time
import uuid
import requests
API = "https://removebackground.dev"
KEY = os.environ["REMOVEBG_API_KEY"] # keep the key on your server
EXT = {"image/png": ".png", "image/jpeg": ".jpg", "image/webp": ".webp"}
def save(res, stem):
"""Save an image response with the right extension; raise on anything else."""
mime = res.headers.get("Content-Type", "").split(";")[0]
if res.status_code != 200 or mime not in EXT:
raise RuntimeError(f"HTTP {res.status_code}: {res.text[:500]}")
path = stem + EXT[mime]
with open(path, "wb") as f:
f.write(res.content)
return path
def remove_background(image_url, stem="result", max_wait=300):
s = requests.Session()
s.headers["x-api-key"] = KEY
# One key per image: resending with the same key returns the same job, never a second
# charge, so this POST is safe to retry after a timeout or a dropped connection.
idem = {"Idempotency-Key": str(uuid.uuid4())}
for attempt in range(3):
try:
res = s.post(f"{API}/v1/remove", data={"image_url": image_url}, headers=idem, timeout=(10, 120))
break
except requests.ConnectionError:
if attempt == 2:
raise
time.sleep(2)
if res.status_code != 202:
return save(res, stem) # 200 = the image; anything else raises
# 202: still processing. Wait for the same job; never send the image again.
job_id = res.json()["id"]
deadline = time.monotonic() + max_wait
while time.monotonic() < deadline:
time.sleep(2) # the API sends Retry-After: 2
res = s.get(f"{API}/v1/jobs/{job_id}/result", timeout=30)
if res.status_code == 409 and res.json()["error"]["code"] == "not_ready":
continue
return save(res, stem) # the image, or the job's own error
raise TimeoutError(f"Job {job_id} is still running. Check it later at /v1/jobs/{job_id}.")
print(remove_background("https://example.com/photo.jpg"))Vereist Python 3 en requests (pip install requests).
- Als je je script stopt, stopt de job niet; die kan nog steeds klaar zijn en in rekening worden gebracht. Het resultaat verschijnt in je Studio.
- De tijdslimieten kies je zelf, het is geen belofte van ons; de meeste afbeeldingen zijn binnen een paar seconden klaar.
- Het remove.bg-compatibele endpoint werkt anders: het antwoordt nooit met 202 (zie hieronder).
Authenticatie
Stuur je API-sleutel mee in de header x-api-key. Maak sleutels aan en trek ze in op je accountpagina; elke aanroep gebruikt de credits van dat account. Alle endpoints staan onder https://removebackground.dev en accepteren CORS-requests, maar CORS maakt een sleutel niet veilig om in een webpagina te zetten: bewaar hem op je server (zie Beveiliging). Fouten zijn JSON: { "error": { "code": "…", "message": "…" } }.
Het volledige contract is gepubliceerd als OpenAPI 3.1 (openapi.json), voor clientgenerators, Postman of tests; AI-programmeerassistenten kunnen beginnen bij llms.txt.
POST /v1/remove
Realtime. Verwijder de achtergrond van één afbeelding. Meestal is de kant-en-klare afbeelding de response-body (image/png, image/jpeg of image/webp), doorgaans na enkele seconden. Parameters kunnen formuliervelden, JSON-sleutels of querystringwaarden zijn; je kunt ook de ruwe bytes van de afbeelding POSTen met Content-Type: image/jpeg, image/png, image/webp of application/octet-stream. Maximaal 25 MB. Zie Je afbeelding versturen voor elke invoermethode.
| Parameter | Type | Beschrijving |
|---|---|---|
image_file | file | De afbeelding (JPG, PNG of WebP), als multipart form data. |
image_file_b64 | string | De afbeelding als base64, met of zonder prefix data:image/…;base64, (25 MB na decoderen). Handig vanuit JSON. |
image_url | string | Een openbare http(s)-URL van de afbeelding. Wij downloaden hem (maximaal 3 redirects, 15 s). Worden er meerdere gestuurd, dan gaat image_file voor, dan image_file_b64, dan image_url en dan de ruwe body. |
format | png | jpg | webp | Uitvoerformaat. Standaard png. JPG heeft geen transparantie: de afbeelding wordt samengevoegd op bg_color, of wit. |
bg_color | kleur | Vul de achtergrond: hex (ffffff, #fff), rgb(255, 255, 255), of white, black, red, green, blue, yellow, gray / grey. transparent (standaard) houdt hem transparant. |
size | preview | medium | hd | full | Maximum aantal megapixels, beeldverhouding blijft behouden, nooit vergroot: preview ≤ 0,25 MP, medium ≤ 1,5 MP, hd ≤ 4 MP, full (standaard) de originele resolutie (tot 25 MP). Genegeerd als width of height is ingesteld. |
crop | true | false | W:H | Bijsnijden tot het kader rond het onderwerp. Met een beeldverhouding (1:1, 4:5, 4:3, 16:9…) wordt het kader daarna rond het onderwerp vergroot (nooit verkleind) tot die verhouding; het deel buiten de foto is transparant (of bg_color). Standaard false. |
padding | px | fractie | % | Met crop: marge die aan elke zijde wordt toegevoegd. 0.1 of 10% = een tiende van de breedte (links/rechts) en hoogte (boven/onder) van het onderwerp; "10%,7.5%" stelt horizontaal en verticaal apart in; 24px (of een kaal geheel getal boven 1) is in pixels, tot 500. Standaard 0. |
channels | rgba | rgb | alpha | rgba (standaard): transparante uitsnede. rgb: ondoorzichtig, samengevoegd op bg_color of wit. alpha: PNG-masker in grijstinten (wit = onderwerp), met hetzelfde formaat en dezelfde uitsnede als de uitsnede. type=mask werkt nog steeds als alias van alpha. |
width / height | 1–6000 | Exact uitvoerformaat in pixels, toegepast na crop (gaat voor size). Met maar één van beide volgt de andere de beeldverhouding. Nooit uitgerekt. |
roi | x1 y1 x2 y2 | Interessegebied, in px of % (bijv. 0% 0% 50% 100%). Alleen het onderwerp daarbinnen blijft behouden; alles daarbuiten wordt achtergrond. Coördinaten verwijzen naar de originele afbeelding. Standaard: de hele afbeelding. |
fit | contain | cover | scale-down | Met width en height. contain (standaard): binnen het kader passen, gecentreerd, de rest transparant (of bg_color). cover: het kader vullen en wat uitsteekt rond het onderwerp bijsnijden. scale-down: zoals contain, maar nooit vergroot. |
Opties worden in deze volgorde toegepast: roi, size (of later width/height), crop + padding + beeldverhouding, width/height + fit, dan channels of achtergrondkleur, en dan het formaat. Elke optie kost dezelfde 1 credit. Onbekende parameters worden genegeerd.
Voorbeeld: HD-JPG op wit, bijgesneden tot het onderwerp met 40 px marge
curl -X POST https://removebackground.dev/v1/remove \
-H 'x-api-key: YOUR_API_KEY' \
-F 'image_file=@product.jpg' \
-F 'bg_color=ffffff' \
-F 'format=jpg' \
-F 'size=hd' \
-F 'crop=true' \
-F 'padding=40' \
-o product-no-bg.jpgVoorbeeld: vierkante afbeelding voor een marktplaats, onderwerp gecentreerd met 10% marge
curl -X POST https://removebackground.dev/v1/remove \
-H 'x-api-key: YOUR_API_KEY' \
-F 'image_file=@product.jpg' \
-F 'crop=1:1' -F 'padding=10%' \
-F 'width=1000' -F 'height=1000' \
-F 'format=jpg' -F 'bg_color=white' \
-o product-square.jpgVoorbeeld: base64 erin, alfamasker eruit
printf '{"image_file_b64":"%s","channels":"alpha"}' "$(base64 < portrait.jpg | tr -d '\n')" > request.json
curl -X POST https://removebackground.dev/v1/remove \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
--data-binary @request.json \
-o portrait-mask.png200 OK
De bytes van de afbeelding, met deze headers:
| Header | Betekenis |
|---|---|
X-Image-Width / X-Image-Height | Formaat van het resultaat in pixels (ook verstuurd als X-Width / X-Height). |
X-Request-ID | Je X-Request-ID als je die hebt meegestuurd, anders een gegenereerde id. Noem hem als je contact opneemt met support. |
X-Processing-Time-Ms | Tijd besteed aan het request (ook X-Processing-Ms). |
X-Matte-Confidence | 0–1: hoe uitgesproken het masker is (gemiddelde van |2a − 1| over de pixels, a = alfa). Dicht bij 1 is een schone uitsnede; lagere waarden betekenen veel zachte of onzekere randen. |
X-Matte-Ambiguous-Ratio | Aandeel pixels met een alfa strikt tussen 0,1 en 0,9 (haar, glas, bewegingsonscherpte). Handig om afbeeldingen te markeren voor controle. |
X-Credits-Remaining | Je saldo na deze afbeelding. |
X-Removal-Id | Id van het opgeslagen resultaat. |
X-Job-Id | Id van de job achter het request (te gebruiken met /v1/jobs/:id). |
202 Accepted (terugval bij lange wachtrijen)
Is de afbeelding niet binnen ongeveer 55 seconden klaar, bijvoorbeeld als de wachtrij uitzonderlijk druk is, dan krijg je 202 met JSON { id, status, status_url, result_url } (plus Location en Retry-After: 2). Poll status_url tot done true is en download dan result_url. Je betaalt één keer, alleen als de afbeelding lukt. Stuur de afbeelding niet opnieuw zonder Idempotency-Key: dan start je een tweede job. Zie Het antwoord verwerken voor een volledig voorbeeld.
GET /v1/jobs/:id
Status van een job die is aangemaakt door /v1/remove of /v1/batch. Dezelfde sleutel; je ziet alleen je eigen jobs.
| Veld | Betekenis |
|---|---|
status | queued, processing, succeeded, partial, failed of canceled |
done | true zodra er niets meer te verwerken is |
total, succeeded, failed, skipped | aantallen afbeeldingen |
credits_charged | credits die deze job heeft gebruikt (1 per geslaagde afbeelding) |
status_url, result_url | waar je pollt en waar je downloadt |
items[] | per afbeelding: position, input, status, error { code, message }, en bij succes removal_id, width, height, format, result_url |
GET /v1/jobs/:id/result
De bytes van de afbeelding van een voltooide job, met dezelfde headers als /v1/remove. ?item=N kiest een afbeelding uit een batchjob (standaard 0). Antwoordt 409 not_ready met Retry-After: 2 zolang de job nog loopt, of met de eigen fout van de afbeelding als die mislukt is.
POST /v1/batch
Zet tot 100 afbeeldings-URL's als één job in de wachtrij: JSON { "image_urls": ["https://…", …], "format": "jpg", "bg_color": "ffffff", "size": "hd", "crop": "1:1", "padding": "10%" }, met dezelfde opties als /v1/remove (ook channels, width, height en fit). Antwoordt meteen met 202 en { id, status, total, invalid, duplicates, status_url }. Poll de job en haal dan de result_url van elk item op. 1 credit per geslaagde afbeelding; maximaal 3 open batchjobs per account. Een uitgewerkt voorbeeld met antwoorden staat in Batches van begin tot eind.
remove.bg-compatibel endpoint
De self-service API van remove.bg stopt op 1 December 2026, 09:00 CET (aankondiging). Bestaande remove.bg-integraties werken hier door één regel te veranderen: https://api.remove.bg/v1.0/removebg → https://removebackground.dev/v1.0/removebg, met een sleutel van removebackground.dev in dezelfde header X-Api-Key. Dezelfde wachtrij, dezelfde 1 credit per geslaagde afbeelding, dezelfde uitvoerkwaliteit als /v1/remove. Migratiegids.
POST /v1.0/removebg
Multipart-, urlencoded- of JSON-body met de parameternamen van remove.bg. Antwoordt met de bytes van de afbeelding en de headers van remove.bg, of met { "data": { "result_b64", "foreground_top", "foreground_left", "foreground_width", "foreground_height" } } als je Accept: application/json meestuurt. Fouten gebruiken de structuur van remove.bg: { "errors": [{ "title", "code", "detail" }] }. Anders dan /v1/remove antwoordt het nooit met 202: het wacht maximaal 110 seconden en geeft dan een 503-time-out. De job loopt door en wordt in rekening gebracht als hij lukt, dus als je dat request opnieuw stuurt, start je een tweede job.
| Parameter | Status | Opmerkingen |
|---|---|---|
image_file / image_file_b64 / image_url | Ondersteund | Multipart-, urlencoded- of JSON-body's. JPG, PNG of WebP tot 25 MB. |
size | Ondersteund | auto, full, 4k en 50MP geven de originele resolutie (tot 25 MP); preview, small en regular ≈ 0,25 MP; medium 1,5 MP; hd 4 MP. Altijd 1 credit. |
format | Ondersteund | auto (PNG als er transparantie is, anders JPG), png, jpg, webp en zip (color.jpg + alpha.png). |
crop / crop_margin | Ondersteund | px of % van het onderwerp, 1–4 waarden in CSS-stijl ("10% 20%" = verticaal, horizontaal); maximaal 500px of 50% per zijde. |
roi | Ondersteund | "x1 y1 x2 y2" in px of %: alleen het onderwerp binnen het gebied blijft behouden. |
scale / position | Ondersteund | scale 10%–100% of original; position center, original of "x% y%". |
channels | Ondersteund | rgba (uitsnede) of alpha (masker in grijstinten). |
bg_color | Ondersteund | Hex met of zonder # (81d4fa), of een kleurnaam. Bij een hexcode van 8 tekens blijft de kleur behouden en vervalt de alfawaarde. |
bg_image_url / bg_image_file | Ondersteund | De uitsnede wordt over je achtergrondafbeelding gelegd, passend gemaakt (cover) op het uitvoerformaat. |
Accept: application/json | Ondersteund | Geeft { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } } terug. |
type / type_level | Geaccepteerd, genegeerd | Het onderwerp wordt automatisch herkend; X-Type is altijd "other". |
semitransparency | Geaccepteerd, genegeerd | Zachte randen en halfdoorzichtige delen komen ongewijzigd uit de matte van het model. |
shadow_type / shadow_opacity / add_shadow | Geaccepteerd, genegeerd | Er worden geen schaduwen toegevoegd. |
Langlopende requests | Verschil | We wachten maximaal 110 seconden; is een afbeelding dan nog niet klaar, dan krijg je een 503 die je opnieuw kunt proberen (niet in rekening gebracht, tenzij hij toch klaar was). |
Voorbeeld
curl -H "X-Api-Key: $REMOVEBG_API_KEY" \
-F 'image_file=@photo.jpg' -F 'size=auto' \
-F 'crop=true' -F 'crop_margin=10%' -F 'bg_color=ffffff' \
-o no-bg.jpg https://removebackground.dev/v1.0/removebgResponse-headers
| Header | Betekenis |
|---|---|
X-Width / X-Height | Formaat van het resultaat in pixels. |
X-Credits-Charged | Credits die deze afbeelding heeft gebruikt: altijd 1 (mislukte afbeeldingen kosten 0). |
X-Type | Altijd "other" (het onderwerp wordt automatisch herkend). |
X-Foreground-Top / -Left / -Width / -Height | Kader rond het onderwerp in het resultaat, in pixels. |
X-Request-ID | Geeft je X-Request-ID terug, of een gegenereerde id. Extra. |
X-Matte-Confidence / X-Matte-Ambiguous-Ratio | Hoe schoon het masker is (0–1), en het aandeel zachte pixels. Extra: handig om afbeeldingen te markeren voor controle. |
Fouten
| Status | Betekenis |
|---|---|
400 | Ongeldige parameter of afbeelding (codes zoals invalid_size, invalid_crop_margin, missing_source, file_too_large, unknown_foreground). |
402 | insufficient_credits: vul aan op de prijspagina. |
403 | auth_failed: X-Api-Key ontbreekt of is ongeldig. |
429 | rate_limit_exceeded. |
500 / 503 | De verwerking is mislukt, duurde te lang of de dienst is even niet beschikbaar. Probeer het opnieuw; mislukte afbeeldingen zijn gratis. |
GET /v1.0/account
Je saldo in de accountstructuur van remove.bg: { "data": { "attributes": { "credits": { "total", "subscription": 0, "payg", "enterprise": 0 }, "api": { "free_calls": 0, "sizes": "all" } } } }. Alle credits zijn losse tegoeden die nooit verlopen, dus total is gelijk aan payg. GET https://removebackground.dev/v1.0/account met je X-Api-Key.
Fouten (/v1-endpoints)
Mislukte afbeeldingen worden nooit in rekening gebracht.
| Status | Codes | Betekenis |
|---|---|---|
400 | missing_image, invalid_url, invalid_body, invalid_json, invalid_image_b64, invalid_format, invalid_bg_color, invalid_size, invalid_crop, invalid_padding, invalid_type, invalid_channels, invalid_width, invalid_height, invalid_fit, invalid_roi, fetch_failed, fetch_timeout, rejected, too_many_images, invalid_images | Het request of de afbeeldings-URL is niet bruikbaar. |
401 | unauthorized | x-api-key ontbreekt, is onjuist of is ingetrokken. |
402 | insufficient_credits, out_of_credits | Je saldo is leeg. Vul aan op de prijspagina. |
404 | not_found | Deze job bestaat niet (of is niet van jou). |
409 | not_ready, canceled, idempotency_key_reused | GET …/result terwijl de job nog loopt (probeer het na 2 s opnieuw), de job is geannuleerd, of een Idempotency-Key is opnieuw gebruikt voor een ander request. |
410 | result_unavailable | Het resultaat is verwijderd of verlopen. |
413 | too_large | De afbeelding is groter dan 25 MB. |
422 | processing_failed, invalid_image, missing_upload | Het bestand is geen leesbare afbeelding. Niet in rekening gebracht. |
429 | rate_limited, too_many_batches | Boven de limiet voor requests per account (wacht de Retry-After af), of je hebt al 3 batchjobs lopen. |
502 | model_unavailable, upstream_error, … | We konden de afbeelding na herhaalde pogingen niet verwerken. Niet in rekening gebracht. |
503 | server_paused, unavailable | De API is gepauzeerd (vóór de lancering) of even niet beschikbaar. Probeer het later opnieuw. |
Batches van begin tot eind
1. Indienen
curl -X POST https://removebackground.dev/v1/batch \
-H "x-api-key: $REMOVEBG_API_KEY" \
-H 'Content-Type: application/json' \
-d '{ "image_urls": ["https://example.com/front.jpg", "https://example.com/back.jpg"], "format": "png", "size": "hd" }'Maximaal 100 openbare afbeeldings-URL's plus alle opties van /v1/remove. De twee placeholder-URL's hierboven zouden tot 2 credits kosten als het echte afbeeldingen waren. Het antwoord komt meteen:
202 Accepted
{
"id": "3f6c2a9e-8d1b-4c7a-9e2f-5b8d0a1c4e77",
"status": "queued",
"total": 2,
"invalid": 0,
"duplicates": 0,
"status_url": "https://removebackground.dev/v1/jobs/3f6c2a9e-8d1b-4c7a-9e2f-5b8d0a1c4e77"
}invalid telt items die geen http(s)-URL zijn en duplicates telt herhalingen; beide worden weggelaten en nooit in rekening gebracht. Bewaar de id: daarmee pak je de job weer op na een herstart.
2. De job pollen
GET /v1/jobs/:id om de paar seconden tot done true is. status gaat van queued naar processing en eindigt als succeeded, partial (sommige afbeeldingen mislukt) of failed. Een item dat opnieuw wordt geprobeerd, toont retrying.
{
"id": "3f6c2a9e-…",
"status": "partial",
"done": true,
"total": 2, "succeeded": 1, "failed": 1, "skipped": 0,
"credits_charged": 1,
"items": [
{ "position": 0, "input": "https://example.com/front.jpg", "status": "succeeded",
"removal_id": "…", "width": 1600, "height": 1200, "format": "png",
"result_url": "https://removebackground.dev/v1/jobs/3f6c2a9e-…/result?item=0" },
{ "position": 1, "input": "https://example.com/back.jpg", "status": "failed",
"error": { "code": "fetch_failed", "message": "…" } }
]
}3. Elk resultaat downloaden
GET /v1/jobs/:id/result?item=N voor elk geslaagd item (of gebruik de result_url ervan). item is de position, vanaf nul geteld. Posities volgen je lijst nadat ongeldige en herhaalde URL's zijn verwijderd; is een van beide tellingen hoger dan 0, koppel resultaten dan aan input in plaats van aan de index.
- Een batch telt niet meer mee voor de limiet van 3 open batches zodra
donetrue is. - De API heeft geen endpoint om te annuleren, geen webhooks en geen ZIP-download. Batches die je op de Bulk-pagina start, kun je daar annuleren of als ZIP downloaden.
Opnieuw proberen, dubbele requests en kosten
Stuur een Idempotency-Key mee, dan kunnen herhaalde pogingen nooit dubbel kosten. Voeg een header Idempotency-Key toe (elke unieke string tot 255 tekens, zoals een UUID) aan POST /v1/remove of POST /v1/batch, één sleutel per afbeelding of batch. Stuur je hetzelfde request opnieuw met dezelfde sleutel, dan krijg je de job die het eerste request heeft gemaakt, met Idempotent-Replayed: true: geen nieuwe job en geen nieuwe kosten, ook als het eerste request nog loopt. Dezelfde sleutel met een andere afbeelding of andere opties geeft 409 idempotency_key_reused. Sleutels horen bij je account en verlopen niet.
Zonder sleutel maakt elke POST een nieuwe job, en elke geslaagde job kost 1 credit (het remove.bg-compatibele POST /v1.0/removebg heeft geen sleutels). Een job uitlezen (GET /v1/jobs/…) is altijd gratis en veilig om te herhalen.
IDEMPOTENCY_KEY=$(uuidgen) # one per image; send the same one on every retry
curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_API_KEY" \
-H "Idempotency-Key: $IDEMPOTENCY_KEY" \
-F 'image_file=@photo.jpg' \
-o photo-no-bg.pngWat een credit kost
| Situatie | Kosten |
|---|---|
| Request geweigerd vóór verwerking (verkeerde sleutel, verkeerde optie, te groot, geen credits) | Gratis. |
| De afbeelding kan niet worden verwerkt (422 ongeldige afbeelding, 502 na onze herhaalde pogingen) | Gratis. |
| De afbeelding lukt | 1 credit, één keer afgeschreven, als het lukt. Onze eigen interne herhaalde pogingen kosten niets extra. |
| Je krijgt een 202 | Nog niets. De job loopt door en kost alleen 1 credit als hij lukt. |
| Je client krijgt een time-out of verbreekt de verbinding tijdens het wachten | De job loopt door en wordt in rekening gebracht als hij lukt. Het resultaat verschijnt in je Studio. |
| Je stuurt hetzelfde request twee keer met dezelfde Idempotency-Key | Eén job, maximaal 1 credit. De herhaling krijgt dezelfde job (header Idempotent-Replayed: true). |
| Je stuurt dezelfde afbeelding twee keer zonder sleutel | Twee aparte jobs; elke job die lukt, kost 1 credit. |
| Je downloadt een kant-en-klaar resultaat opnieuw | Gratis, zo vaak je wilt zolang het is opgeslagen. |
| Een batch lukt gedeeltelijk | 1 credit per geslaagde afbeelding; credits_charged in de job toont het totaal. |
| Een batch bevat dezelfde URL twee keer | Herhalingen binnen één batch worden vóór het in de wachtrij zetten weggelaten en nooit in rekening gebracht. Identieke URL's in verschillende batches zijn aparte jobs. |
| Credits raken op tijdens een batch | Afbeeldingen die al klaar zijn, blijven betaald; de rest wordt gemarkeerd als skipped (out_of_credits) en is gratis. Koop credits en stuur de resterende URL's als nieuwe batch. |
Wanneer je opnieuw probeert
| Wat er gebeurde | Wat je doet |
|---|---|
| GET /v1/jobs/:id of …/result mislukt (netwerkfout, 5xx) | Veilig om opnieuw te proberen: een job uitlezen maakt nooit werk aan en kost nooit iets. Wacht steeds iets langer tussen pogingen. |
| GET …/result antwoordt 409 not_ready | Wacht de Retry-After af (2 s) en vraag het opnieuw. Stuur de afbeelding niet opnieuw in. |
| GET …/result antwoordt 410 result_unavailable | Het opgeslagen resultaat is verwijderd. De afbeelding opnieuw verwerken is een nieuwe job en kost 1 credit. |
| POST antwoordt 400, 413 of 422 | Pas eerst het request of de afbeelding aan; ongewijzigd opnieuw sturen geeft hetzelfde antwoord. |
| POST antwoordt 401 of 402 | Herstel de sleutel of vul aan. Niet blijven herhalen. |
| POST antwoordt 429 rate_limited | Wacht het aantal seconden in Retry-After en stuur het dan opnieuw (met dezelfde Idempotency-Key). Meer dan 60 afbeeldingen per minuut? Gebruik POST /v1/batch: één request voor maximaal 100. |
| POST /v1/batch antwoordt 429 too_many_batches | Wacht tot een van je 3 open batches klaar is (poll hem) en dien dan in. |
| POST /v1/… antwoordt 503 (unavailable, server_paused) | Er is geen job aangemaakt. Probeer het na even wachten opnieuw. (Het remove.bg-compatibele endpoint werkt anders: daar betekent een 503-time-out dat de job nog loopt.) |
| POST /v1/remove antwoordt 502 | Die job is mislukt en niet in rekening gebracht. Opnieuw proberen is een nieuwe job. |
| POST krijgt een time-out, de verbinding valt weg of je krijgt 500 | Met een Idempotency-Key: stuur hetzelfde request opnieuw met dezelfde sleutel; je krijgt de oorspronkelijke job. Zonder sleutel bestaat de job misschien al en wordt hij misschien in rekening gebracht: kijk eerst in je Studio. |
| POST antwoordt 409 idempotency_key_reused | Die sleutel is al gebruikt voor een andere afbeelding of andere opties. Maak voor elke nieuwe afbeelding een nieuwe sleutel. |
Limieten en opslag
| Limiet | Waarde | Fout bij overschrijding |
|---|---|---|
| Afbeeldingsbestand | 25 MB (25 × 1024 × 1024 bytes); JPG, PNG of WebP, herkend aan de bytes van het bestand | 413 too_large · 422 processing_failed |
| Base64- / JSON-body | 25 MB na decoderen (de request-body mag ongeveer een derde groter zijn) | 413 too_large |
| Invoerresolutie | Afbeeldingen boven 25 MP worden vóór verwerking verkleind tot 25 MP | — |
| Uitvoerformaat | breedte en hoogte elk 1–6000 px | 400 invalid_width / invalid_height |
| Download via image_url | alleen http(s), time-out van 15 s, maximaal 3 redirects; privé-, loopback- en link-local-adressen worden geweigerd, bij elke redirect | 400 invalid_url · fetch_failed · fetch_timeout |
| Wachten in POST /v1/remove | Ongeveer 55 s, daarna 202 met de job-id | 202 |
| Batchgrootte | 100 afbeeldings-URL's per POST /v1/batch | 400 too_many_images |
| Open batches | 3 onvoltooide jobs met meerdere afbeeldingen per account (losse afbeeldingen tellen niet mee) | 429 too_many_batches |
| Aantal requests | 60 requests per minuut per account, samen voor POST /v1/remove, /v1/batch en /v1.0/removebg. Een batch telt één keer, ongeacht de grootte. Jobs uitlezen is onbeperkt | 429 rate_limited (met Retry-After) |
Hoe lang resultaten worden bewaard
Elk resultaat wordt na het maken 48 uur privé in je account bewaard en daarna verwijderd. Tot dan kun je het gratis opnieuw downloaden met GET /v1/jobs/:id/result of vanuit je Studio. Daarna antwoorden resultaatlinks met 410 result_unavailable; de afbeelding opnieuw verwerken is een nieuwe job. Statusgegevens van jobs blijven leesbaar nadat de afbeelding weg is. In het privacybeleid lees je hoe uploads worden behandeld; we gebruiken je afbeeldingen niet om modellen te trainen.
Beveiliging
Bewaar je API-sleutel op een server die je zelf beheert. Zet hem niet in browsercode, mobiele apps, openbare repositories of URL's. Wil je je eigen gebruikers achtergronden laten verwijderen, stuur hun afbeeldingen dan via je backend en voeg daar je eigen login en bestedingslimieten toe.
- De API staat CORS toe, zodat hij werkt vanuit tools en servercode. Dat maakt het niet veilig om een sleutel in een webpagina te zetten: daar kan iedereen hem lezen.
- Alle sleutels op een account gebruiken hetzelfde creditsaldo. Maak op je accountpagina een aparte sleutel per app of omgeving, zodat je er een kunt intrekken zonder de andere te breken.
- Lekt een sleutel uit, trek hem dan meteen in op de accountpagina (hij werkt direct niet meer) en maak een nieuwe aan. We bewaren alleen een hash van elke sleutel, dus we kunnen hem niet opnieuw tonen.
Problemen oplossen
| Symptoom | Wat er aan de hand is |
|---|---|
| Mijn PNG gaat niet open | De body was JSON (een 202-job of een fout), geen afbeelding. Controleer de HTTP-status en Content-Type voordat je opslaat. |
| Mijn script kreeg een time-out, maar de afbeelding staat wel in Studio | De job liep door nadat je stopte met wachten. Haal hem op met de job-id in plaats van hem opnieuw te sturen. |
| Ik heb twee keer betaald voor één afbeelding | Hij is twee keer verstuurd zonder Idempotency-Key (vaak een automatische nieuwe poging na een time-out). Stuur één sleutel per afbeelding mee en gebruik die opnieuw bij herhaalde pogingen. |
| De URL opent in mijn browser, maar de API kan hem niet ophalen | De host vereist misschien cookies of een login, blokkeert servers, stuurt meer dan 3 keer door of doet er langer dan 15 s over, of de ondertekende URL is verlopen. Upload in plaats daarvan het bestand. |
| Mijn batch stopte halverwege | Bekijk items[] in de job: mislukte items hebben een foutcode; overgeslagen items met out_of_credits betekenen dat het saldo op was. |
| Een optie lijkt niets te doen | Onbekende parameternamen worden zonder melding genegeerd. Controleer de spelling aan de hand van de parametertabel. Op /v1.0/removebg worden sommige remove.bg-opties geaccepteerd maar genegeerd (zie die tabel). |
| De achtergrond is niet transparant | JPG kan niet transparant zijn. Gebruik format=png of webp en laat bg_color leeg. |
| De resultaatlink geeft 410 | Het opgeslagen resultaat is verwijderd. Opnieuw verwerken kost 1 credit. |