Realtime API

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)
1 Je afbeelding2 Eén HTTP-request3 PNG in het antwoord

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.png

Je 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.png

Multipart 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.

StatusBodyWat je doet
200De afbeelding (image/png, image/jpeg of image/webp)Sla hem op. Gebruik de Content-Type om de bestandsextensie te kiezen.
202JSON: { 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 / 5xxJSON: { "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.

ParameterTypeBeschrijving
image_filefileDe afbeelding (JPG, PNG of WebP), als multipart form data.
image_file_b64stringDe afbeelding als base64, met of zonder prefix data:image/…;base64, (25 MB na decoderen). Handig vanuit JSON.
image_urlstringEen 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.
formatpng | jpg | webpUitvoerformaat. Standaard png. JPG heeft geen transparantie: de afbeelding wordt samengevoegd op bg_color, of wit.
bg_colorkleurVul de achtergrond: hex (ffffff, #fff), rgb(255, 255, 255), of white, black, red, green, blue, yellow, gray / grey. transparent (standaard) houdt hem transparant.
sizepreview | medium | hd | fullMaximum 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.
croptrue | false | W:HBijsnijden 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.
paddingpx | 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.
channelsrgba | rgb | alphargba (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 / height1–6000Exact uitvoerformaat in pixels, toegepast na crop (gaat voor size). Met maar één van beide volgt de andere de beeldverhouding. Nooit uitgerekt.
roix1 y1 x2 y2Interessegebied, 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.
fitcontain | cover | scale-downMet 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.jpg

Voorbeeld: 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.jpg

Voorbeeld: 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.png

200 OK

De bytes van de afbeelding, met deze headers:

HeaderBetekenis
X-Image-Width / X-Image-HeightFormaat van het resultaat in pixels (ook verstuurd als X-Width / X-Height).
X-Request-IDJe X-Request-ID als je die hebt meegestuurd, anders een gegenereerde id. Noem hem als je contact opneemt met support.
X-Processing-Time-MsTijd besteed aan het request (ook X-Processing-Ms).
X-Matte-Confidence0–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-RatioAandeel pixels met een alfa strikt tussen 0,1 en 0,9 (haar, glas, bewegingsonscherpte). Handig om afbeeldingen te markeren voor controle.
X-Credits-RemainingJe saldo na deze afbeelding.
X-Removal-IdId van het opgeslagen resultaat.
X-Job-IdId 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.

VeldBetekenis
statusqueued, processing, succeeded, partial, failed of canceled
donetrue zodra er niets meer te verwerken is
total, succeeded, failed, skippedaantallen afbeeldingen
credits_chargedcredits die deze job heeft gebruikt (1 per geslaagde afbeelding)
status_url, result_urlwaar 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.

ParameterStatusOpmerkingen
image_file / image_file_b64 / image_urlOndersteundMultipart-, urlencoded- of JSON-body's. JPG, PNG of WebP tot 25 MB.
sizeOndersteundauto, 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.
formatOndersteundauto (PNG als er transparantie is, anders JPG), png, jpg, webp en zip (color.jpg + alpha.png).
crop / crop_marginOndersteundpx of % van het onderwerp, 1–4 waarden in CSS-stijl ("10% 20%" = verticaal, horizontaal); maximaal 500px of 50% per zijde.
roiOndersteund"x1 y1 x2 y2" in px of %: alleen het onderwerp binnen het gebied blijft behouden.
scale / positionOndersteundscale 10%–100% of original; position center, original of "x% y%".
channelsOndersteundrgba (uitsnede) of alpha (masker in grijstinten).
bg_colorOndersteundHex 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_fileOndersteundDe uitsnede wordt over je achtergrondafbeelding gelegd, passend gemaakt (cover) op het uitvoerformaat.
Accept: application/jsonOndersteundGeeft { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } } terug.
type / type_levelGeaccepteerd, genegeerdHet onderwerp wordt automatisch herkend; X-Type is altijd "other".
semitransparencyGeaccepteerd, genegeerdZachte randen en halfdoorzichtige delen komen ongewijzigd uit de matte van het model.
shadow_type / shadow_opacity / add_shadowGeaccepteerd, genegeerdEr worden geen schaduwen toegevoegd.
Langlopende requestsVerschilWe 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/removebg

Response-headers

HeaderBetekenis
X-Width / X-HeightFormaat van het resultaat in pixels.
X-Credits-ChargedCredits die deze afbeelding heeft gebruikt: altijd 1 (mislukte afbeeldingen kosten 0).
X-TypeAltijd "other" (het onderwerp wordt automatisch herkend).
X-Foreground-Top / -Left / -Width / -HeightKader rond het onderwerp in het resultaat, in pixels.
X-Request-IDGeeft je X-Request-ID terug, of een gegenereerde id. Extra.
X-Matte-Confidence / X-Matte-Ambiguous-RatioHoe schoon het masker is (0–1), en het aandeel zachte pixels. Extra: handig om afbeeldingen te markeren voor controle.

Fouten

StatusBetekenis
400Ongeldige parameter of afbeelding (codes zoals invalid_size, invalid_crop_margin, missing_source, file_too_large, unknown_foreground).
402insufficient_credits: vul aan op de prijspagina.
403auth_failed: X-Api-Key ontbreekt of is ongeldig.
429rate_limit_exceeded.
500 / 503De 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.

StatusCodesBetekenis
400missing_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_imagesHet request of de afbeeldings-URL is niet bruikbaar.
401unauthorizedx-api-key ontbreekt, is onjuist of is ingetrokken.
402insufficient_credits, out_of_creditsJe saldo is leeg. Vul aan op de prijspagina.
404not_foundDeze job bestaat niet (of is niet van jou).
409not_ready, canceled, idempotency_key_reusedGET …/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.
410result_unavailableHet resultaat is verwijderd of verlopen.
413too_largeDe afbeelding is groter dan 25 MB.
422processing_failed, invalid_image, missing_uploadHet bestand is geen leesbare afbeelding. Niet in rekening gebracht.
429rate_limited, too_many_batchesBoven de limiet voor requests per account (wacht de Retry-After af), of je hebt al 3 batchjobs lopen.
502model_unavailable, upstream_error, …We konden de afbeelding na herhaalde pogingen niet verwerken. Niet in rekening gebracht.
503server_paused, unavailableDe 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 done true 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.png

Wat een credit kost

SituatieKosten
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 lukt1 credit, één keer afgeschreven, als het lukt. Onze eigen interne herhaalde pogingen kosten niets extra.
Je krijgt een 202Nog 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 wachtenDe 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-KeyEén job, maximaal 1 credit. De herhaling krijgt dezelfde job (header Idempotent-Replayed: true).
Je stuurt dezelfde afbeelding twee keer zonder sleutelTwee aparte jobs; elke job die lukt, kost 1 credit.
Je downloadt een kant-en-klaar resultaat opnieuwGratis, zo vaak je wilt zolang het is opgeslagen.
Een batch lukt gedeeltelijk1 credit per geslaagde afbeelding; credits_charged in de job toont het totaal.
Een batch bevat dezelfde URL twee keerHerhalingen 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 batchAfbeeldingen 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 gebeurdeWat 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_readyWacht de Retry-After af (2 s) en vraag het opnieuw. Stuur de afbeelding niet opnieuw in.
GET …/result antwoordt 410 result_unavailableHet opgeslagen resultaat is verwijderd. De afbeelding opnieuw verwerken is een nieuwe job en kost 1 credit.
POST antwoordt 400, 413 of 422Pas eerst het request of de afbeelding aan; ongewijzigd opnieuw sturen geeft hetzelfde antwoord.
POST antwoordt 401 of 402Herstel de sleutel of vul aan. Niet blijven herhalen.
POST antwoordt 429 rate_limitedWacht 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_batchesWacht 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 502Die 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 500Met 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_reusedDie sleutel is al gebruikt voor een andere afbeelding of andere opties. Maak voor elke nieuwe afbeelding een nieuwe sleutel.

Limieten en opslag

LimietWaardeFout bij overschrijding
Afbeeldingsbestand25 MB (25 × 1024 × 1024 bytes); JPG, PNG of WebP, herkend aan de bytes van het bestand413 too_large · 422 processing_failed
Base64- / JSON-body25 MB na decoderen (de request-body mag ongeveer een derde groter zijn)413 too_large
InvoerresolutieAfbeeldingen boven 25 MP worden vóór verwerking verkleind tot 25 MP—
Uitvoerformaatbreedte en hoogte elk 1–6000 px400 invalid_width / invalid_height
Download via image_urlalleen http(s), time-out van 15 s, maximaal 3 redirects; privé-, loopback- en link-local-adressen worden geweigerd, bij elke redirect400 invalid_url · fetch_failed · fetch_timeout
Wachten in POST /v1/removeOngeveer 55 s, daarna 202 met de job-id202
Batchgrootte100 afbeeldings-URL's per POST /v1/batch400 too_many_images
Open batches3 onvoltooide jobs met meerdere afbeeldingen per account (losse afbeeldingen tellen niet mee)429 too_many_batches
Aantal requests60 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 onbeperkt429 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

SymptoomWat er aan de hand is
Mijn PNG gaat niet openDe 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 StudioDe 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 afbeeldingHij 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 ophalenDe 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 halverwegeBekijk 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 doenOnbekende 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 transparantJPG kan niet transparant zijn. Gebruik format=png of webp en laat bg_color leeg.
De resultaatlink geeft 410Het opgeslagen resultaat is verwijderd. Opnieuw verwerken kost 1 credit.