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ść)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.pngWysył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.pngMultipart 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.
| Status | Treść | Co zrobić |
|---|---|---|
200 | Obraz (image/png, image/jpeg lub image/webp) | Zapisz go. Rozszerzenie pliku dobierz na podstawie Content-Type. |
202 | JSON: { 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 / 5xx | JSON: { "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.
| Parametr | Typ | Opis |
|---|---|---|
image_file | file | Obraz (JPG, PNG lub WebP) jako multipart form data. |
image_file_b64 | string | Obraz jako base64, z prefiksem data:image/…;base64, lub bez niego (25 MB po zdekodowaniu). Przydatne przy JSON. |
image_url | string | Publiczny 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ść. |
format | png | jpg | webp | Format wyjściowy. Domyślnie png. JPG nie ma przezroczystości: jest spłaszczany na bg_color lub białe tło. |
bg_color | kolor | Wypełnienie tła: hex (ffffff, #fff), rgb(255, 255, 255) lub white, black, red, green, blue, yellow, gray / grey. transparent (domyślnie) zachowuje przezroczystość. |
size | preview | medium | hd | full | Limit 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. |
crop | true | false | W:H | Przycina 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. |
padding | px | 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. |
channels | rgba | rgb | alpha | rgba (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 / height | 1–6000 | Dokładny rozmiar wyniku w pikselach, stosowany po crop (nadpisuje size). Przy podaniu tylko jednego wymiaru drugi wynika z proporcji. Bez rozciągania. |
roi | x1 y1 x2 y2 | Obszar 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. |
fit | contain | cover | scale-down | Z 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.jpgPrzykł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.jpgPrzykł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.png200 OK
Bajty obrazu z tymi nagłówkami:
| Nagłówek | Znaczenie |
|---|---|
X-Image-Width / X-Image-Height | Rozmiar wyniku w pikselach (wysyłany też jako X-Width / X-Height). |
X-Request-ID | Twój X-Request-ID, jeśli został wysłany, w przeciwnym razie wygenerowany identyfikator. Podaj go, kontaktując się z pomocą. |
X-Processing-Time-Ms | Czas obsługi żądania (także X-Processing-Ms). |
X-Matte-Confidence | 0–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-Ratio | Odsetek 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-Remaining | Twoje saldo po tym zdjęciu. |
X-Removal-Id | Identyfikator zapisanego wyniku. |
X-Job-Id | Identyfikator 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.
| Pole | Znaczenie |
|---|---|
status | queued, processing, succeeded, partial, failed lub canceled |
done | true, gdy nie zostało nic do wykonania |
total, succeeded, failed, skipped | liczba zdjęć |
credits_charged | kredyty zużyte przez zadanie (1 za udane zdjęcie) |
status_url, result_url | gdzie 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.
| Parametr | Status | Uwagi |
|---|---|---|
image_file / image_file_b64 / image_url | Obsługiwany | Treść multipart, urlencoded lub JSON. JPG, PNG lub WebP do 25 MB. |
size | Obsługiwany | auto, 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. |
format | Obsługiwany | auto (PNG, jeśli jest przezroczystość, w przeciwnym razie JPG), png, jpg, webp i zip (color.jpg + alpha.png). |
crop / crop_margin | Obsługiwany | px lub % obiektu, 1–4 wartości w stylu CSS ("10% 20%" = pionowo, poziomo); maksymalnie 500px lub 50% na stronę. |
roi | Obsługiwany | "x1 y1 x2 y2" w px lub %: zachowywany jest tylko obiekt wewnątrz obszaru. |
scale / position | Obsługiwany | scale 10%–100% lub original; position center, original lub "x% y%". |
channels | Obsługiwany | rgba (wycięty obiekt) lub alpha (maska w skali szarości). |
bg_color | Obsługiwany | Hex z # lub bez (81d4fa) albo nazwa koloru. 8-cyfrowy hex zachowuje kolor i pomija jego kanał alfa. |
bg_image_url / bg_image_file | Obsługiwany | Wycięty obiekt jest nakładany na twój obraz tła, dopasowany (cover) do rozmiaru wyniku. |
Accept: application/json | Obsługiwany | Zwraca { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } }. |
type / type_level | Akceptowany, ignorowany | Obiekt jest wykrywany automatycznie; X-Type ma zawsze wartość "other". |
semitransparency | Akceptowany, ignorowany | Miękkie krawędzie i półprzezroczyste obszary pochodzą wprost z maski modelu. |
shadow_type / shadow_opacity / add_shadow | Akceptowany, ignorowany | Cienie nie są dodawane. |
Długie żądania | Różnica | Czekamy 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/removebgNagłówki odpowiedzi
| Nagłówek | Znaczenie |
|---|---|
X-Width / X-Height | Rozmiar wyniku w pikselach. |
X-Credits-Charged | Kredyty zużyte przez to zdjęcie: zawsze 1 (nieudane kosztują 0). |
X-Type | Zawsze "other" (obiekt jest wykrywany automatycznie). |
X-Foreground-Top / -Left / -Width / -Height | Ramka obiektu w wyniku, w pikselach. |
X-Request-ID | Powtarza twój X-Request-ID lub wygenerowany identyfikator. Dodatkowy. |
X-Matte-Confidence / X-Matte-Ambiguous-Ratio | Jak czysta jest maska (0–1) i udział miękkich pikseli. Dodatkowy: przydaje się do oznaczania zdjęć do sprawdzenia. |
Błędy
| Status | Znaczenie |
|---|---|
400 | Nieprawidłowy parametr lub obraz (kody takie jak invalid_size, invalid_crop_margin, missing_source, file_too_large, unknown_foreground). |
402 | insufficient_credits: doładuj konto na stronie cennika. |
403 | auth_failed: brak lub nieprawidłowy X-Api-Key. |
429 | rate_limit_exceeded. |
500 / 503 | Przetwarzanie 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.
| Status | Kody | Znaczenie |
|---|---|---|
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 | Nie można użyć żądania lub adresu URL obrazu. |
401 | unauthorized | Brak, błędny lub unieważniony x-api-key. |
402 | insufficient_credits, out_of_credits | Twoje saldo jest puste. Doładuj konto na stronie cennika. |
404 | not_found | Nie ma takiego zadania (lub nie należy do ciebie). |
409 | not_ready, canceled, idempotency_key_reused | GET …/result, gdy zadanie wciąż trwa (ponów po 2 s), zadanie zostało anulowane albo Idempotency-Key użyto ponownie dla innego żądania. |
410 | result_unavailable | Wynik został usunięty lub wygasł. |
413 | too_large | Obraz jest większy niż 25 MB. |
422 | processing_failed, invalid_image, missing_upload | Plik nie jest czytelnym obrazem. Bez opłaty. |
429 | rate_limited, too_many_batches | Przekroczono limit żądań na konto (odczekaj czas z Retry-After) lub masz już 3 działające zadania wsadowe. |
502 | model_unavailable, upstream_error, … | Nie udało się przetworzyć obrazu mimo ponowień. Bez opłaty. |
503 | server_paused, unavailable | API 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
donema 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.pngZa co płacisz kredytem
| Sytuacja | Opł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ę udaje | 1 kredyt, naliczony raz, gdy się uda. Nasze wewnętrzne ponowienia nie dodają opłat. |
| Dostajesz 202 | Na 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 oczekiwania | Zadanie 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-Key | Jedno zadanie, maksymalnie 1 kredyt. Powtórzenie dostaje to samo zadanie (nagłówek Idempotent-Replayed: true). |
| Wysyłasz to samo zdjęcie dwa razy bez klucza | Dwa osobne zadania; każde udane kosztuje 1 kredyt. |
| Ponownie pobierasz gotowy wynik | Darmowe, dowolnie często, dopóki wynik jest przechowywany. |
| Partia udaje się częściowo | 1 kredyt za każde udane zdjęcie; credits_charged w zadaniu pokazuje sumę. |
| Partia zawiera ten sam URL dwa razy | Powtó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 partii | Gotowe 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ło | Co 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_ready | Odczekaj czas z Retry-After (2 s) i zapytaj ponownie. Nie wysyłaj zdjęcia jeszcze raz. |
| GET …/result zwraca 410 result_unavailable | Zapisany wynik został usunięty. Ponowne przetworzenie zdjęcia to nowe zadanie i kosztuje 1 kredyt. |
| POST zwraca 400, 413 lub 422 | Najpierw popraw żądanie lub zdjęcie; wysłanie go bez zmian da tę samą odpowiedź. |
| POST zwraca 401 lub 402 | Popraw klucz lub doładuj konto. Nie ponawiaj w pętli. |
| POST zwraca 429 rate_limited | Odczekaj 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_batches | Poczekaj, 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 502 | To zadanie się nie udało i nie zostało rozliczone. Ponowienie to nowe zadanie. |
| POST przekracza limit czasu, połączenie zostaje zerwane lub dostajesz 500 | Z 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_reused | Ten 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
| Limit | Wartość | Błąd po przekroczeniu |
|---|---|---|
| Plik obrazu | 25 MB (25 × 1024 × 1024 bajtów); JPG, PNG lub WebP, rozpoznawane po bajtach pliku | 413 too_large · 422 processing_failed |
| Base64 / treść JSON | 25 MB po zdekodowaniu (treść żądania może być o około jedną trzecią większa) | 413 too_large |
| Rozdzielczość wejściowa | Obrazy powyżej 25 MP są zmniejszane do 25 MP przed przetworzeniem | — |
| Rozmiar wyniku | szerokość i wysokość po 1–6000 px | 400 invalid_width / invalid_height |
| Pobieranie image_url | tylko http(s), limit czasu 15 s, maksymalnie 3 przekierowania; adresy prywatne, loopback i link-local są odrzucane przy każdym przekierowaniu | 400 invalid_url · fetch_failed · fetch_timeout |
| Oczekiwanie w POST /v1/remove | Około 55 s, potem 202 z identyfikatorem zadania | 202 |
| Rozmiar partii | 100 adresów URL obrazów na POST /v1/batch | 400 too_many_images |
| Otwarte partie | 3 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 limitowany | 429 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
| Objaw | Co się dzieje |
|---|---|
| Mój PNG się nie otwiera | Treść 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 Studio | Zadanie 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 razy | Został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łowie | Sprawdź 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 przezroczyste | JPG nie obsługuje przezroczystości. Użyj format=png lub webp i nie ustawiaj bg_color. |
| Link do wyniku zwraca 410 | Zapisany wynik został usunięty. Ponowne przetworzenie kosztuje 1 kredyt. |