API w czasie rzeczywistym

API do usuwania tła: jedno żądanie, gotowy PNG w odpowiedzi.

Prześlij plik, podaj publiczny URL obrazu lub dane base64. Większość pojedynczych zdjęć wraca gotowa w tej samej odpowiedzi HTTP, zwykle po kilku sekundach. Jeśli któreś trwa dłużej, dostajesz identyfikator zadania, by pobrać wynik bez ponownego wysyłania zdjęcia. Do przetwarzania hurtowego służy endpoint wsadowy.

1 kredyt za udane zdjęcie · nieudane są darmowe · klucze na twoim koncie

$ 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 · zwykle kilka sekund
  zapisano dog.png (przezroczyste tło, pełna rozdzielczość)
1 Twoje zdjęcie2 Jedno żądanie HTTP3 PNG w odpowiedzi

Szybki start

Skopiuj, wklej, zamień YOUR_API_KEY. Każdy przykład zapisuje wynik od razu do pliku, a przykłady w JavaScript i Pythonie obsługują też odpowiedź 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

Wysyłanie zdjęcia

POST /v1/remove przyjmuje zdjęcie na cztery sposoby. Wyślij jeden z nich; jeśli żądanie zawiera kilka, pierwszeństwo ma image_file, potem image_file_b64, potem image_url, a na końcu surowa treść. Przykłady odczytują klucz ze zmiennej środowiskowej REMOVEBG_API_KEY (ustaw ją przez export REMOVEBG_API_KEY=…); zwróć uwagę na podwójne cudzysłowy, dzięki którym powłoka wstawi wartość.

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, pole image_file. JPG, PNG lub WebP, do 25 MB.

Każdy przykład zapisuje treść odpowiedzi do pliku. Ten plik jest obrazem tylko przy statusie 200; zobacz Obsługa odpowiedzi.

Obsługa odpowiedzi

Większość pojedynczych zdjęć wraca gotowa w tej samej odpowiedzi. Gdy kolejka jest wyjątkowo obciążona, a zdjęcie trwa dłużej niż około 55 sekund, dostajesz zamiast tego 202 Accepted z identyfikatorem zadania. Zadanie dalej działa: pobierz jego wynik po identyfikatorze. Ponowne wysłanie zdjęcia uruchomiłoby drugie zadanie i mogłoby kosztować drugi kredyt.

StatusTreśćCo zrobić
200Obraz (image/png, image/jpeg lub image/webp)Zapisz go. Rozszerzenie pliku dobierz na podstawie Content-Type.
202JSON: { id, status, status_url, result_url }To nie jest obraz. Odczekaj kilka sekund, a potem wykonaj GET na result_url. Nie wysyłaj zdjęcia ponownie.
4xx / 5xxJSON: { "error": { "code", "message" } }To nie jest obraz. Odczytaj kod (zobacz Błędy) i nie zapisuj treści jako obrazu.

Kompletny przykład

Obsługuje gotowy obraz, odpowiedź 202, nieudane zadanie i lokalny limit czasu. Wysyła zdjęcie raz i ponawia tylko bezpieczne sprawdzenia statusu.

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"))

Wymaga Pythona 3 i requests (pip install requests).

  • Zatrzymanie skryptu nie zatrzymuje zadania; może się ono zakończyć i zostać rozliczone. Jego wynik pojawi się w twoim Studio.
  • Limity czasu wybierasz sam, to nie jest nasza obietnica; większość zdjęć jest gotowa w kilka sekund.
  • Endpoint zgodny z remove.bg działa inaczej: nigdy nie zwraca 202 (zobacz niżej).

Uwierzytelnianie

Wyślij klucz API w nagłówku x-api-key. Klucze tworzysz i unieważniasz na stronie konta; każde wywołanie zużywa kredyty tego konta. Wszystkie endpointy znajdują się pod https://removebackground.dev i akceptują żądania CORS, ale CORS nie sprawia, że klucz można bezpiecznie umieścić na stronie internetowej: trzymaj go na swoim serwerze (zobacz Bezpieczeństwo). Błędy są w formacie JSON: { "error": { "code": "…", "message": "…" } }.

Pełna specyfikacja jest opublikowana jako OpenAPI 3.1 (openapi.json), dla generatorów klientów, Postmana lub testów; asystenci AI do programowania mogą zacząć od llms.txt.

POST /v1/remove

W czasie rzeczywistym. Usuwa tło z jednego zdjęcia. Zwykle gotowy obraz jest treścią odpowiedzi (image/png, image/jpeg lub image/webp), najczęściej po kilku sekundach. Parametry mogą być polami formularza, kluczami JSON lub wartościami query stringu; możesz też wysłać surowe bajty obrazu przez POST z Content-Type: image/jpeg, image/png, image/webp lub application/octet-stream. Maksymalnie 25 MB. Każdy sposób przesłania opisuje sekcja Wysyłanie zdjęcia.

ParametrTypOpis
image_filefileObraz (JPG, PNG lub WebP) jako multipart form data.
image_file_b64stringObraz jako base64, z prefiksem data:image/…;base64, lub bez niego (25 MB po zdekodowaniu). Przydatne przy JSON.
image_urlstringPubliczny adres http(s) obrazu. Pobieramy go (maksymalnie 3 przekierowania, 15 s). Jeśli wysłano kilka, pierwszeństwo ma image_file, potem image_file_b64, potem image_url, a na końcu surowa treść.
formatpng | jpg | webpFormat wyjściowy. Domyślnie png. JPG nie ma przezroczystości: jest spłaszczany na bg_color lub białe tło.
bg_colorkolorWypełnienie tła: hex (ffffff, #fff), rgb(255, 255, 255) lub white, black, red, green, blue, yellow, gray / grey. transparent (domyślnie) zachowuje przezroczystość.
sizepreview | medium | hd | fullLimit megapikseli, z zachowaniem proporcji, bez powiększania: preview ≤ 0,25 MP, medium ≤ 1,5 MP, hd ≤ 4 MP, full (domyślnie) oryginalna rozdzielczość (do 25 MP). Ignorowany, gdy ustawiono width lub height.
croptrue | false | W:HPrzycina do ramki obiektu. Z proporcjami (1:1, 4:5, 4:3, 16:9…) ramka jest następnie rozszerzana (nigdy zmniejszana) do tych proporcji wokół obiektu; obszar poza zdjęciem jest przezroczysty (lub w kolorze bg_color). Domyślnie false.
paddingpx | ułamek | %Z crop: margines dodawany z każdej strony. 0.1 lub 10% = jedna dziesiąta szerokości obiektu (lewo/prawo) i wysokości (góra/dół); "10%,7.5%" ustawia osobno poziomy i pionowy; 24px (lub sama liczba całkowita większa od 1) to piksele, maksymalnie 500. Domyślnie 0.
channelsrgba | rgb | alphargba (domyślnie): przezroczysty wycięty obiekt. rgb: nieprzezroczysty, spłaszczony na bg_color lub białe tło. alpha: maska PNG w skali szarości (białe = obiekt), tego samego rozmiaru i przycięcia co wycięty obiekt. type=mask nadal działa jako alias alpha.
width / height1–6000Dokładny rozmiar wyniku w pikselach, stosowany po crop (nadpisuje size). Przy podaniu tylko jednego wymiaru drugi wynika z proporcji. Bez rozciągania.
roix1 y1 x2 y2Obszar zainteresowania w px lub % (np. 0% 0% 50% 100%). Zachowywany jest tylko obiekt wewnątrz niego; wszystko poza nim staje się tłem. Współrzędne odnoszą się do oryginalnego obrazu. Domyślnie: cały obraz.
fitcontain | cover | scale-downZ width i height. contain (domyślnie): zmieszczenie w ramce, wyśrodkowane, reszta przezroczysta (lub bg_color). cover: wypełnienie ramki z przycięciem nadmiaru wokół obiektu. scale-down: jak contain, ale bez powiększania.

Opcje są stosowane w tej kolejności: roi, size (lub później width/height), crop + padding + proporcje, width/height + fit, potem channels lub kolor tła, a na końcu format. Każda opcja kosztuje ten sam 1 kredyt. Nieznane parametry są ignorowane.

Przykład: JPG w HD na białym tle, przycięty do obiektu z marginesem 40 px

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

Przykład: kwadratowe zdjęcie na marketplace, obiekt wyśrodkowany z marginesem 10%

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

Przykład: base64 na wejściu, maska alfa na wyjściu

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

Bajty obrazu z tymi nagłówkami:

NagłówekZnaczenie
X-Image-Width / X-Image-HeightRozmiar wyniku w pikselach (wysyłany też jako X-Width / X-Height).
X-Request-IDTwój X-Request-ID, jeśli został wysłany, w przeciwnym razie wygenerowany identyfikator. Podaj go, kontaktując się z pomocą.
X-Processing-Time-MsCzas obsługi żądania (także X-Processing-Ms).
X-Matte-Confidence0–1: jak zdecydowana jest maska (średnia |2a − 1| z pikseli, a = alfa). Blisko 1 to czyste wycięcie; niższe wartości oznaczają dużo miękkich lub niepewnych krawędzi.
X-Matte-Ambiguous-RatioOdsetek pikseli z alfą ściśle między 0,1 a 0,9 (włosy, szkło, rozmycie ruchu). Przydatne do oznaczania zdjęć do sprawdzenia.
X-Credits-RemainingTwoje saldo po tym zdjęciu.
X-Removal-IdIdentyfikator zapisanego wyniku.
X-Job-IdIdentyfikator zadania stojącego za żądaniem (do użycia z /v1/jobs/:id).

202 Accepted (rezerwa dla długich kolejek)

Jeśli zdjęcie nie będzie gotowe w ciągu około 55 sekund, na przykład gdy kolejka jest wyjątkowo obciążona, dostajesz 202 z JSON { id, status, status_url, result_url } (plus Location i Retry-After: 2). Odpytuj status_url, aż done będzie true, a potem pobierz result_url. Opłata jest naliczana raz, tylko gdy zdjęcie się uda. Nie wysyłaj zdjęcia ponownie bez Idempotency-Key: to uruchomi drugie zadanie. Kompletny przykład znajdziesz w sekcji Obsługa odpowiedzi.

GET /v1/jobs/:id

Status zadania utworzonego przez /v1/remove lub /v1/batch. Ten sam klucz; widzisz tylko własne zadania.

PoleZnaczenie
statusqueued, processing, succeeded, partial, failed lub canceled
donetrue, gdy nie zostało nic do wykonania
total, succeeded, failed, skippedliczba zdjęć
credits_chargedkredyty zużyte przez zadanie (1 za udane zdjęcie)
status_url, result_urlgdzie odpytywać i gdzie pobierać
items[]dla każdego zdjęcia: position, input, status, error { code, message }, a po sukcesie removal_id, width, height, format, result_url

GET /v1/jobs/:id/result

Bajty obrazu gotowego zadania, z tymi samymi nagłówkami co /v1/remove. ?item=N wybiera zdjęcie z zadania wsadowego (domyślnie 0). Zwraca 409 not_ready z Retry-After: 2, dopóki zadanie trwa, lub błąd samego zdjęcia, jeśli się nie udało.

POST /v1/batch

Kolejkuje do 100 adresów URL obrazów jako jedno zadanie: JSON { "image_urls": ["https://…", …], "format": "jpg", "bg_color": "ffffff", "size": "hd", "crop": "1:1", "padding": "10%" }, z tymi samymi opcjami co /v1/remove (także channels, width, height i fit). Od razu zwraca 202 z { id, status, total, invalid, duplicates, status_url }. Odpytuj zadanie, a potem pobierz result_url każdego elementu. 1 kredyt za każde udane zdjęcie; maksymalnie 3 otwarte zadania wsadowe na konto. Opis krok po kroku z przykładowymi odpowiedziami w sekcji Partie od początku do końca.

Endpoint zgodny z remove.bg

Samoobsługowe API remove.bg kończy działanie 1 December 2026, 09:00 CET (ogłoszenie). Istniejące integracje z remove.bg działają tutaj po zmianie jednej linijki: https://api.remove.bg/v1.0/removebg → https://removebackground.dev/v1.0/removebg, z kluczem removebackground.dev w tym samym nagłówku X-Api-Key. Ta sama kolejka, ten sam 1 kredyt za udane zdjęcie, ta sama jakość co /v1/remove. Przewodnik migracji.

POST /v1.0/removebg

Treść multipart, urlencoded lub JSON z nazwami parametrów remove.bg. Zwraca bajty obrazu z nagłówkami remove.bg albo { "data": { "result_b64", "foreground_top", "foreground_left", "foreground_width", "foreground_height" } }, gdy wyślesz Accept: application/json. Błędy mają format remove.bg: { "errors": [{ "title", "code", "detail" }] }. W przeciwieństwie do /v1/remove nigdy nie zwraca 202: czeka do 110 sekund, a potem zwraca 503 timeout. Zadanie dalej działa i jest rozliczane, jeśli się uda, więc ponowienie tego żądania uruchamia drugie zadanie.

ParametrStatusUwagi
image_file / image_file_b64 / image_urlObsługiwanyTreść multipart, urlencoded lub JSON. JPG, PNG lub WebP do 25 MB.
sizeObsługiwanyauto, full, 4k i 50MP dają oryginalną rozdzielczość (do 25 MP); preview, small i regular ≈ 0,25 MP; medium 1,5 MP; hd 4 MP. Zawsze 1 kredyt.
formatObsługiwanyauto (PNG, jeśli jest przezroczystość, w przeciwnym razie JPG), png, jpg, webp i zip (color.jpg + alpha.png).
crop / crop_marginObsługiwanypx lub % obiektu, 1–4 wartości w stylu CSS ("10% 20%" = pionowo, poziomo); maksymalnie 500px lub 50% na stronę.
roiObsługiwany"x1 y1 x2 y2" w px lub %: zachowywany jest tylko obiekt wewnątrz obszaru.
scale / positionObsługiwanyscale 10%–100% lub original; position center, original lub "x% y%".
channelsObsługiwanyrgba (wycięty obiekt) lub alpha (maska w skali szarości).
bg_colorObsługiwanyHex z # lub bez (81d4fa) albo nazwa koloru. 8-cyfrowy hex zachowuje kolor i pomija jego kanał alfa.
bg_image_url / bg_image_fileObsługiwanyWycięty obiekt jest nakładany na twój obraz tła, dopasowany (cover) do rozmiaru wyniku.
Accept: application/jsonObsługiwanyZwraca { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } }.
type / type_levelAkceptowany, ignorowanyObiekt jest wykrywany automatycznie; X-Type ma zawsze wartość "other".
semitransparencyAkceptowany, ignorowanyMiękkie krawędzie i półprzezroczyste obszary pochodzą wprost z maski modelu.
shadow_type / shadow_opacity / add_shadowAkceptowany, ignorowanyCienie nie są dodawane.
Długie żądaniaRóżnicaCzekamy do 110 sekund. Jeśli zdjęcie nie będzie wtedy gotowe, dostaniesz błąd 503, który można ponowić (bez opłaty, chyba że przetwarzanie się zakończyło).

Przykład

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

Nagłówki odpowiedzi

NagłówekZnaczenie
X-Width / X-HeightRozmiar wyniku w pikselach.
X-Credits-ChargedKredyty zużyte przez to zdjęcie: zawsze 1 (nieudane kosztują 0).
X-TypeZawsze "other" (obiekt jest wykrywany automatycznie).
X-Foreground-Top / -Left / -Width / -HeightRamka obiektu w wyniku, w pikselach.
X-Request-IDPowtarza twój X-Request-ID lub wygenerowany identyfikator. Dodatkowy.
X-Matte-Confidence / X-Matte-Ambiguous-RatioJak czysta jest maska (0–1) i udział miękkich pikseli. Dodatkowy: przydaje się do oznaczania zdjęć do sprawdzenia.

Błędy

StatusZnaczenie
400Nieprawidłowy parametr lub obraz (kody takie jak invalid_size, invalid_crop_margin, missing_source, file_too_large, unknown_foreground).
402insufficient_credits: doładuj konto na stronie cennika.
403auth_failed: brak lub nieprawidłowy X-Api-Key.
429rate_limit_exceeded.
500 / 503Przetwarzanie nie powiodło się, przekroczono czas lub usługa jest chwilowo niedostępna. Ponów próbę; nieudane zdjęcia są darmowe.

GET /v1.0/account

Twoje saldo w formacie konta remove.bg: { "data": { "attributes": { "credits": { "total", "subscription": 0, "payg", "enterprise": 0 }, "api": { "free_calls": 0, "sizes": "all" } } } }. Wszystkie kredyty są typu pay-as-you-go i nigdy nie wygasają, więc total równa się payg. GET https://removebackground.dev/v1.0/account z twoim X-Api-Key.

Błędy (endpointy /v1)

Nieudane zdjęcia nigdy nie są rozliczane.

StatusKodyZnaczenie
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_imagesNie można użyć żądania lub adresu URL obrazu.
401unauthorizedBrak, błędny lub unieważniony x-api-key.
402insufficient_credits, out_of_creditsTwoje saldo jest puste. Doładuj konto na stronie cennika.
404not_foundNie ma takiego zadania (lub nie należy do ciebie).
409not_ready, canceled, idempotency_key_reusedGET …/result, gdy zadanie wciąż trwa (ponów po 2 s), zadanie zostało anulowane albo Idempotency-Key użyto ponownie dla innego żądania.
410result_unavailableWynik został usunięty lub wygasł.
413too_largeObraz jest większy niż 25 MB.
422processing_failed, invalid_image, missing_uploadPlik nie jest czytelnym obrazem. Bez opłaty.
429rate_limited, too_many_batchesPrzekroczono limit żądań na konto (odczekaj czas z Retry-After) lub masz już 3 działające zadania wsadowe.
502model_unavailable, upstream_error, …Nie udało się przetworzyć obrazu mimo ponowień. Bez opłaty.
503server_paused, unavailableAPI jest wstrzymane (przed startem) lub chwilowo niedostępne. Spróbuj później.

Partie od początku do końca

1. Wyślij

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" }'

Do 100 publicznych adresów URL obrazów plus dowolne opcje /v1/remove. Dwa przykładowe adresy URL powyżej kosztowałyby do 2 kredytów, gdyby były prawdziwymi obrazami. Odpowiedź przychodzi od razu:

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 liczy wpisy, które nie są adresami http(s), a duplicates liczy powtórzenia; oba są pomijane i nigdy nie są rozliczane. Zapisz id: dzięki niemu podejmiesz zadanie ponownie po restarcie.

2. Odpytuj zadanie

GET /v1/jobs/:id co kilka sekund, aż done będzie true. status przechodzi z queued do processing, a kończy się jako succeeded, partial (część zdjęć się nie udała) lub failed. Element, który jest ponawiany, ma status 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. Pobierz każdy wynik

GET /v1/jobs/:id/result?item=N dla każdego udanego elementu (albo użyj jego result_url). item to liczona od zera position. Pozycje odpowiadają twojej liście po usunięciu nieprawidłowych i powtórzonych adresów URL, więc gdy któraś z tych liczb jest większa od 0, dopasowuj wyniki po input, a nie po indeksie.

  • Partia przestaje się liczyć do limitu 3 otwartych partii, gdy done ma wartość true.
  • API nie ma endpointu anulowania, webhooków ani pobierania ZIP. Partie uruchomione na stronie Bulk można tam anulować lub pobrać jako ZIP.

Ponowienia, duplikaty i rozliczenia

Wyślij Idempotency-Key, a ponowienia nie naliczą opłaty dwa razy. Dodaj nagłówek Idempotency-Key (dowolny unikalny ciąg do 255 znaków, np. UUID) do POST /v1/remove lub POST /v1/batch, jeden klucz na zdjęcie lub partię. Jeśli wyślesz to samo żądanie ponownie z tym samym kluczem, dostaniesz zadanie utworzone przez pierwsze, z nagłówkiem Idempotent-Replayed: true: bez nowego zadania i bez nowej opłaty, nawet jeśli pierwsze żądanie wciąż trwa. Ten sam klucz z innym zdjęciem lub opcjami zwraca 409 idempotency_key_reused. Klucze należą do twojego konta i nie wygasają.

Bez klucza każde POST tworzy nowe zadanie, a każde udane zadanie kosztuje 1 kredyt (zgodny z remove.bg POST /v1.0/removebg nie obsługuje kluczy). Odczyt zadania (GET /v1/jobs/…) jest zawsze darmowy i można go bezpiecznie powtarzać.

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

Za co płacisz kredytem

SytuacjaOpłata
Żądanie odrzucone przed przetworzeniem (zły klucz, zła opcja, za duży plik, brak kredytów)Darmowe.
Zdjęcia nie da się przetworzyć (422 nieprawidłowy obraz, 502 po naszych ponowieniach)Darmowe.
Zdjęcie się udaje1 kredyt, naliczony raz, gdy się uda. Nasze wewnętrzne ponowienia nie dodają opłat.
Dostajesz 202Na razie nic. Zadanie dalej działa i kosztuje 1 kredyt tylko wtedy, gdy się uda.
Twój klient przekracza limit czasu lub rozłącza się podczas oczekiwaniaZadanie dalej działa i jest rozliczane, jeśli się uda. Wynik pojawi się w twoim Studio.
Wysyłasz to samo żądanie dwa razy z tym samym Idempotency-KeyJedno zadanie, maksymalnie 1 kredyt. Powtórzenie dostaje to samo zadanie (nagłówek Idempotent-Replayed: true).
Wysyłasz to samo zdjęcie dwa razy bez kluczaDwa osobne zadania; każde udane kosztuje 1 kredyt.
Ponownie pobierasz gotowy wynikDarmowe, dowolnie często, dopóki wynik jest przechowywany.
Partia udaje się częściowo1 kredyt za każde udane zdjęcie; credits_charged w zadaniu pokazuje sumę.
Partia zawiera ten sam URL dwa razyPowtórzenia w jednej partii są usuwane przed kolejkowaniem i nigdy nie są rozliczane. Identyczne adresy URL w różnych partiach to osobne zadania.
Kredyty kończą się w trakcie partiiGotowe zdjęcia pozostają opłacone; pozostałe są oznaczane jako pominięte (out_of_credits) i są darmowe. Kup kredyty, a potem wyślij pozostałe adresy URL jako nową partię.

Kiedy ponawiać

Co się stałoCo zrobić
GET /v1/jobs/:id lub …/result kończy się błędem (błąd sieci, 5xx)Można bezpiecznie ponowić: odczyt zadania nigdy nie tworzy pracy ani opłat. Rób krótkie przerwy między próbami.
GET …/result zwraca 409 not_readyOdczekaj czas z Retry-After (2 s) i zapytaj ponownie. Nie wysyłaj zdjęcia jeszcze raz.
GET …/result zwraca 410 result_unavailableZapisany wynik został usunięty. Ponowne przetworzenie zdjęcia to nowe zadanie i kosztuje 1 kredyt.
POST zwraca 400, 413 lub 422Najpierw popraw żądanie lub zdjęcie; wysłanie go bez zmian da tę samą odpowiedź.
POST zwraca 401 lub 402Popraw klucz lub doładuj konto. Nie ponawiaj w pętli.
POST zwraca 429 rate_limitedOdczekaj liczbę sekund z Retry-After, a potem wyślij ponownie (z tym samym Idempotency-Key). Więcej niż 60 zdjęć na minutę? Użyj POST /v1/batch: jedno żądanie dla maksymalnie 100.
POST /v1/batch zwraca 429 too_many_batchesPoczekaj, aż jedna z twoich 3 otwartych partii się zakończy (odpytuj ją), a potem wyślij.
POST /v1/… zwraca 503 (unavailable, server_paused)Żadne zadanie nie zostało utworzone. Ponów po krótkiej przerwie. (Endpoint zgodny z remove.bg działa inaczej: jego 503 timeout oznacza, że zadanie wciąż trwa.)
POST /v1/remove zwraca 502To zadanie się nie udało i nie zostało rozliczone. Ponowienie to nowe zadanie.
POST przekracza limit czasu, połączenie zostaje zerwane lub dostajesz 500Z Idempotency-Key: wyślij to samo żądanie z tym samym kluczem, a dostaniesz pierwotne zadanie. Bez klucza zadanie może już istnieć i zostać rozliczone: najpierw sprawdź Studio.
POST zwraca 409 idempotency_key_reusedTen klucz został już użyty dla innego zdjęcia lub innych opcji. Twórz nowy klucz dla każdego nowego zdjęcia.

Limity i przechowywanie

LimitWartośćBłąd po przekroczeniu
Plik obrazu25 MB (25 × 1024 × 1024 bajtów); JPG, PNG lub WebP, rozpoznawane po bajtach pliku413 too_large · 422 processing_failed
Base64 / treść JSON25 MB po zdekodowaniu (treść żądania może być o około jedną trzecią większa)413 too_large
Rozdzielczość wejściowaObrazy powyżej 25 MP są zmniejszane do 25 MP przed przetworzeniem—
Rozmiar wynikuszerokość i wysokość po 1–6000 px400 invalid_width / invalid_height
Pobieranie image_urltylko http(s), limit czasu 15 s, maksymalnie 3 przekierowania; adresy prywatne, loopback i link-local są odrzucane przy każdym przekierowaniu400 invalid_url · fetch_failed · fetch_timeout
Oczekiwanie w POST /v1/removeOkoło 55 s, potem 202 z identyfikatorem zadania202
Rozmiar partii100 adresów URL obrazów na POST /v1/batch400 too_many_images
Otwarte partie3 niezakończonych zadań wieloobrazowych na konto (pojedyncze zdjęcia się nie liczą)429 too_many_batches
Częstotliwość żądań60 żądań na minutę na konto, łącznie dla POST /v1/remove, /v1/batch i /v1.0/removebg. Partia liczy się raz, niezależnie od rozmiaru. Odczyt zadań nie jest limitowany429 rate_limited (z Retry-After)

Jak długo przechowujemy wyniki

Każdy wynik jest przechowywany prywatnie na twoim koncie przez 48 godz. od utworzenia, a potem usuwany. Do tego czasu możesz go pobrać ponownie za darmo przez GET /v1/jobs/:id/result lub ze Studio. Potem linki do wyniku zwracają 410 result_unavailable; ponowne przetworzenie zdjęcia to nowe zadanie. Rekordy statusu zadań można odczytywać także po usunięciu obrazu. Jak postępujemy z przesłanymi plikami, opisuje polityka prywatności; nie używamy twoich zdjęć do trenowania modeli.

Bezpieczeństwo

Trzymaj klucz API na serwerze, nad którym masz kontrolę. Nie umieszczaj go w kodzie przeglądarki, aplikacjach mobilnych, publicznych repozytoriach ani adresach URL. Aby twoi użytkownicy mogli usuwać tło, przesyłaj ich zdjęcia przez swój backend i dodaj tam własne logowanie oraz limity wydatków.

  • API zezwala na CORS, więc działa z narzędzi i kodu po stronie serwera. Nie oznacza to, że można bezpiecznie umieścić klucz na stronie internetowej: każdy może go tam odczytać.
  • Wszystkie klucze na koncie korzystają z tego samego salda kredytów. Utwórz osobny klucz dla każdej aplikacji lub środowiska na stronie konta, aby móc unieważnić jeden bez psucia pozostałych.
  • Jeśli klucz wycieknie, od razu unieważnij go na stronie konta (natychmiast przestaje działać) i utwórz nowy. Przechowujemy tylko skrót każdego klucza, więc nie możemy pokazać ci go ponownie.

Rozwiązywanie problemów

ObjawCo się dzieje
Mój PNG się nie otwieraTreść była JSON-em (zadanie 202 lub błąd), a nie obrazem. Przed zapisaniem sprawdź status HTTP i Content-Type.
Mój skrypt przekroczył limit czasu, ale zdjęcie pojawia się w StudioZadanie działało dalej, gdy skrypt przestał czekać. Pobierz je po identyfikatorze zadania zamiast wysyłać ponownie.
Opłata za jedno zdjęcie została naliczona dwa razyZostało wysłane dwa razy bez Idempotency-Key (często przez automatyczne ponowienie po przekroczeniu czasu). Wysyłaj jeden klucz na zdjęcie i używaj go ponownie przy ponowieniach.
URL otwiera się w mojej przeglądarce, ale API nie może go pobraćSerwer może wymagać plików cookie lub logowania, blokować serwery, przekierowywać więcej niż 3 razy, odpowiadać dłużej niż 15 s albo podpisany URL wygasł. Zamiast tego prześlij plik.
Moja partia zatrzymała się w połowieSprawdź items[] w zadaniu: nieudane elementy mają kod błędu; pominięte elementy z out_of_credits oznaczają, że skończyło się saldo.
Opcja wydaje się nic nie robićNieznane nazwy parametrów są po cichu ignorowane. Sprawdź pisownię w tabeli parametrów. W /v1.0/removebg niektóre opcje remove.bg są akceptowane, ale ignorowane (zobacz tamtą tabelę).
Tło nie jest przezroczysteJPG nie obsługuje przezroczystości. Użyj format=png lub webp i nie ustawiaj bg_color.
Link do wyniku zwraca 410Zapisany wynik został usunięty. Ponowne przetworzenie kosztuje 1 kredyt.