API per la rimozione dello sfondo: una richiesta in entrata, un PNG finito in uscita.
Carica un file, invia l’URL pubblico di un’immagine o fornisci un base64. La maggior parte delle immagini singole torna finita nella stessa risposta HTTP, di solito in pochi secondi. Se una richiede più tempo, ricevi un id del job con cui recuperare il risultato, senza inviare di nuovo l’immagine. Un endpoint batch copre l’elaborazione in blocco.
1 credito per immagine riuscita · immagini non riuscite gratis · chiavi nel tuo 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 · di solito pochi secondi
dog.png salvato (trasparente, piena risoluzione)Guida rapida
Copia, incolla, sostituisci YOUR_API_KEY. Ogni esempio salva il risultato direttamente in un file, e quelli JavaScript e Python gestiscono anche l’attesa in caso di 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.pngInvia l’immagine
POST /v1/remove accetta l’immagine in quattro modi. Usane uno; se una richiesta ne contiene più di uno, vince image_file, poi image_file_b64, poi image_url, poi il body grezzo. Questi esempi leggono la chiave dalla variabile d’ambiente REMOVEBG_API_KEY (impostala con export REMOVEBG_API_KEY=…); nota le virgolette doppie, che permettono alla shell di sostituirla.
curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_API_KEY" \
-F 'image_file=@photo.jpg' \
-o photo-no-bg.pngForm data multipart, campo image_file. JPG, PNG o WebP, fino a 25 MB.
Ogni esempio salva il body in un file. Quel file è un’immagine solo se lo stato è 200; vedi Gestisci la risposta.
Gestisci la risposta
La maggior parte delle immagini singole torna finita nella stessa risposta. Quando la coda è insolitamente piena e un’immagine richiede più di circa 55 secondi, ricevi invece 202 Accepted con un id del job. Il job continua: recupera il risultato con l’id. Inviare di nuovo l’immagine avvierebbe un secondo job e potrebbe costare un secondo credito.
| Stato | Body | Cosa fare |
|---|---|---|
200 | L’immagine (image/png, image/jpeg o image/webp) | Salvala. Usa il Content-Type per scegliere l’estensione del file. |
202 | JSON: { id, status, status_url, result_url } | Non è un’immagine. Attendi un paio di secondi, poi fai una GET su result_url. Non inviare di nuovo l’immagine. |
4xx / 5xx | JSON: { "error": { "code", "message" } } | Non è un’immagine. Leggi il codice (vedi Errori) e non salvare il body come immagine. |
Un esempio completo
Gestisce l’immagine finita, un 202, un job non riuscito e un limite di tempo locale. Invia l’immagine una sola volta e ripete solo i controlli di stato, che sono sicuri.
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"))Richiede Python 3 e requests (pip install requests).
- Interrompere lo script non interrompe il job: potrebbe comunque terminare ed essere addebitato. Il risultato compare nel tuo Studio.
- I limiti di tempo li scegli tu, non sono una nostra promessa; la maggior parte delle immagini termina in pochi secondi.
- L’endpoint compatibile con remove.bg si comporta diversamente: non risponde mai 202 (vedi sotto).
Autenticazione
Invia la tua chiave API nell’header x-api-key. Crea e revoca le chiavi nella pagina dell’account; ogni chiamata consuma i crediti di quell’account. Tutti gli endpoint si trovano sotto https://removebackground.dev e accettano richieste CORS, ma CORS non rende sicuro inserire una chiave in una pagina web: tienila sul tuo server (vedi Sicurezza). Gli errori sono in JSON: { "error": { "code": "…", "message": "…" } }.
Il contratto completo è pubblicato come OpenAPI 3.1 (openapi.json), per generatori di client, Postman o test; gli assistenti di programmazione IA possono partire da llms.txt.
POST /v1/remove
Tempo reale. Rimuove lo sfondo da un’immagine. Di solito l’immagine finita è il body della risposta (image/png, image/jpeg o image/webp), in genere dopo pochi secondi. I parametri possono essere campi di form, chiavi JSON o valori nella query string; puoi anche inviare in POST i byte grezzi dell’immagine con Content-Type: image/jpeg, image/png, image/webp o application/octet-stream. Massimo 25 MB. Vedi Invia l’immagine per ogni metodo di invio.
| Parametro | Tipo | Descrizione |
|---|---|---|
image_file | file | L’immagine (JPG, PNG o WebP), come form data multipart. |
image_file_b64 | string | L’immagine in base64, con o senza prefisso data:image/…;base64, (25 MB dopo la decodifica). Comodo da JSON. |
image_url | string | Un URL http(s) pubblico dell’immagine. La scarichiamo noi (fino a 3 redirect, 15 s). Se ne vengono inviati più di uno, vince image_file, poi image_file_b64, poi image_url, poi il body grezzo. |
format | png | jpg | webp | Formato di output. Predefinito png. Il JPG non ha trasparenza: viene appiattito su bg_color, o sul bianco. |
bg_color | colore | Riempie lo sfondo: esadecimale (ffffff, #fff), rgb(255, 255, 255), oppure white, black, red, green, blue, yellow, gray / grey. transparent (predefinito) lo lascia trasparente. |
size | preview | medium | hd | full | Limite in megapixel, proporzioni mantenute, mai ingrandita: preview ≤ 0,25 MP, medium ≤ 1,5 MP, hd ≤ 4 MP, full (predefinito) la risoluzione originale (fino a 25 MP). Ignorato se è impostato width o height. |
crop | true | false | W:H | Ritaglia sul riquadro di delimitazione del soggetto. Con delle proporzioni (1:1, 4:5, 4:3, 16:9…), il riquadro viene poi espanso (mai ridotto) a quelle proporzioni attorno al soggetto; l’area fuori dalla foto è trasparente (o bg_color). Predefinito false. |
padding | px | frazione | % | Con crop: margine aggiunto su ogni lato. 0.1 o 10% = un decimo della larghezza (sinistra/destra) e dell’altezza (sopra/sotto) del soggetto; "10%,7.5%" imposta separatamente orizzontale e verticale; 24px (o un numero intero maggiore di 1 senza unità) è in pixel, fino a 500. Predefinito 0. |
channels | rgba | rgb | alpha | rgba (predefinito): scontorno trasparente. rgb: opaco, appiattito su bg_color o sul bianco. alpha: maschera PNG in scala di grigi (bianco = soggetto), con le stesse dimensioni e lo stesso ritaglio dello scontorno. type=mask funziona ancora come alias di alpha. |
width / height | 1–6000 | Dimensioni di output esatte in pixel, applicate dopo crop (sostituisce size). Se ne indichi solo una, l’altra segue le proporzioni. Mai deformata. |
roi | x1 y1 x2 y2 | Area di interesse, in px o % (ad es. 0% 0% 50% 100%). Viene mantenuto solo il soggetto al suo interno; tutto il resto diventa sfondo. Le coordinate si riferiscono all’immagine originale. Predefinito: l’intera immagine. |
fit | contain | cover | scale-down | Con width e height. contain (predefinito): adattata all’interno, centrata, il resto trasparente (o bg_color). cover: riempie il riquadro, ritagliando l’eccedenza attorno al soggetto. scale-down: come contain, ma mai ingrandita. |
Le opzioni si applicano in questo ordine: roi, size (o width/height più avanti), crop + padding + proporzioni, width/height + fit, poi channels o colore di sfondo, infine il formato. Ogni opzione costa lo stesso 1 credito. I parametri sconosciuti vengono ignorati.
Esempio: JPG HD su bianco, ritagliato sul soggetto con 40 px di margine
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.jpgEsempio: immagine quadrata per marketplace, soggetto centrato con il 10% di margine
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.jpgEsempio: base64 in entrata, maschera alfa in uscita
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
I byte dell’immagine, con questi header:
| Header | Significato |
|---|---|
X-Image-Width / X-Image-Height | Dimensioni del risultato in pixel (inviate anche come X-Width / X-Height). |
X-Request-ID | Il tuo X-Request-ID se ne hai inviato uno, altrimenti un id generato. Indicalo quando contatti l’assistenza. |
X-Processing-Time-Ms | Tempo impiegato per la richiesta (anche X-Processing-Ms). |
X-Matte-Confidence | 0–1: quanto è netta la maschera (media di |2a − 1| sui pixel, a = alfa). Vicino a 1 è uno scontorno pulito; valori più bassi indicano molti bordi morbidi o incerti. |
X-Matte-Ambiguous-Ratio | Frazione di pixel con alfa strettamente compreso tra 0.1 e 0.9 (capelli, vetro, mosso). Utile per segnalare immagini da controllare. |
X-Credits-Remaining | Il tuo saldo dopo questa immagine. |
X-Removal-Id | Id del risultato salvato. |
X-Job-Id | Id del job dietro la richiesta (utilizzabile con /v1/jobs/:id). |
202 Accepted (ripiego per code lunghe)
Se l’immagine non è pronta entro circa 55 secondi, ad esempio quando la coda è insolitamente piena, ricevi 202 con il JSON { id, status, status_url, result_url } (più Location e Retry-After: 2). Interroga status_url finché done non è true, poi scarica result_url. L’addebito avviene una sola volta, solo se l’immagine riesce. Non inviare di nuovo l’immagine senza una Idempotency-Key: avvieresti un secondo job. Vedi Gestisci la risposta per un esempio completo.
GET /v1/jobs/:id
Stato di un job creato da /v1/remove o /v1/batch. Stessa chiave; vedi solo i tuoi job.
| Campo | Significato |
|---|---|
status | queued, processing, succeeded, partial, failed o canceled |
done | true quando non resta nulla da elaborare |
total, succeeded, failed, skipped | conteggi delle immagini |
credits_charged | crediti usati da questo job (1 per immagine riuscita) |
status_url, result_url | dove interrogare e dove scaricare |
items[] | per immagine: position, input, status, error { code, message } e, se riuscita, removal_id, width, height, format, result_url |
GET /v1/jobs/:id/result
I byte dell’immagine di un job completato, con gli stessi header di /v1/remove. ?item=N seleziona un’immagine di un job batch (predefinito 0). Risponde 409 not_ready con Retry-After: 2 mentre è ancora in corso, oppure con l’errore dell’immagine se non è riuscita.
POST /v1/batch
Metti in coda fino a 100 URL di immagini come un unico job: JSON { "image_urls": ["https://…", …], "format": "jpg", "bg_color": "ffffff", "size": "hd", "crop": "1:1", "padding": "10%" }, con le stesse opzioni di /v1/remove (inclusi channels, width, height e fit). Risponde subito 202 con { id, status, total, invalid, duplicates, status_url }. Interroga il job, poi recupera il result_url di ogni elemento. 1 credito per immagine riuscita; al massimo 3 job batch aperti per account. Guida passo passo con risposte di esempio in I lotti, dall’inizio alla fine.
Endpoint compatibile con remove.bg
L’API self-service di remove.bg termina il 1 December 2026, 09:00 CET (annuncio). Le integrazioni remove.bg esistenti funzionano qui cambiando una riga: https://api.remove.bg/v1.0/removebg → https://removebackground.dev/v1.0/removebg, con una chiave removebackground.dev nello stesso header X-Api-Key. Stessa coda, stesso costo di 1 credito per immagine riuscita, stessa qualità di output di /v1/remove. Guida alla migrazione.
POST /v1.0/removebg
Body multipart, urlencoded o JSON con i nomi dei parametri di remove.bg. Risponde con i byte dell’immagine e gli header di remove.bg, oppure { "data": { "result_b64", "foreground_top", "foreground_left", "foreground_width", "foreground_height" } } se invii Accept: application/json. Gli errori usano la struttura di remove.bg: { "errors": [{ "title", "code", "detail" }] }. A differenza di /v1/remove non risponde mai 202: attende fino a 110 secondi, poi restituisce un 503 timeout. Il job continua e viene addebitato se riesce, quindi ripetere quella richiesta avvia un secondo job.
| Parametro | Stato | Note |
|---|---|---|
image_file / image_file_b64 / image_url | Supportato | Body multipart, urlencoded o JSON. JPG, PNG o WebP fino a 25 MB. |
size | Supportato | auto, full, 4k e 50MP restituiscono la risoluzione originale (fino a 25 MP); preview, small e regular ≈ 0,25 MP; medium 1,5 MP; hd 4 MP. Sempre 1 credito. |
format | Supportato | auto (PNG se trasparente, altrimenti JPG), png, jpg, webp e zip (color.jpg + alpha.png). |
crop / crop_margin | Supportato | px o % del soggetto, da 1 a 4 valori in stile CSS ("10% 20%" = verticale, orizzontale); al massimo 500px o 50% per lato. |
roi | Supportato | "x1 y1 x2 y2" in px o %: viene mantenuto solo il soggetto all’interno dell’area. |
scale / position | Supportato | scale dal 10% al 100% oppure original; position center, original o "x% y%". |
channels | Supportato | rgba (scontorno) o alpha (maschera in scala di grigi). |
bg_color | Supportato | Esadecimale con o senza # (81d4fa), oppure il nome di un colore. Un esadecimale a 8 cifre mantiene il colore e ne ignora l’alfa. |
bg_image_url / bg_image_file | Supportato | Lo scontorno viene sovrapposto alla tua immagine di sfondo, adattata in modalità cover alle dimensioni di output. |
Accept: application/json | Supportato | Restituisce { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } }. |
type / type_level | Accettato, ignorato | Il soggetto viene rilevato automaticamente; X-Type è sempre "other". |
semitransparency | Accettato, ignorato | Bordi morbidi e aree semitrasparenti provengono così come sono dalla maschera del modello. |
shadow_type / shadow_opacity / add_shadow | Accettato, ignorato | Non vengono aggiunte ombre. |
Richieste lunghe | Differenza | Attendiamo fino a 110 secondi; se un’immagine non è pronta entro quel tempo ricevi un 503 da ripetere (non addebitato a meno che l’elaborazione non sia terminata). |
Esempio
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/removebgHeader di risposta
| Header | Significato |
|---|---|
X-Width / X-Height | Dimensioni del risultato in pixel. |
X-Credits-Charged | Crediti usati da questa immagine: sempre 1 (le immagini non riuscite costano 0). |
X-Type | Sempre "other" (il rilevamento del soggetto è automatico). |
X-Foreground-Top / -Left / -Width / -Height | Riquadro di delimitazione del soggetto nel risultato, in pixel. |
X-Request-ID | Riporta il tuo X-Request-ID, oppure un id generato. Extra. |
X-Matte-Confidence / X-Matte-Ambiguous-Ratio | Quanto è pulita la maschera (0–1) e la quota di pixel morbidi. Extra: utile per segnalare immagini da controllare. |
Errori
| Stato | Significato |
|---|---|
400 | Parametro o immagine non validi (codici come invalid_size, invalid_crop_margin, missing_source, file_too_large, unknown_foreground). |
402 | insufficient_credits: ricarica dalla pagina dei prezzi. |
403 | auth_failed: X-Api-Key mancante o non valido. |
429 | rate_limit_exceeded. |
500 / 503 | Elaborazione non riuscita, tempo scaduto o servizio momentaneamente non disponibile. Riprova; le immagini non riuscite sono gratuite. |
GET /v1.0/account
Il tuo saldo nella struttura account di remove.bg: { "data": { "attributes": { "credits": { "total", "subscription": 0, "payg", "enterprise": 0 }, "api": { "free_calls": 0, "sizes": "all" } } } }. Tutti i crediti sono a consumo e non scadono mai, quindi total è uguale a payg. GET https://removebackground.dev/v1.0/account con la tua X-Api-Key.
Errori (endpoint /v1)
Le immagini non riuscite non vengono mai addebitate.
| Stato | Codici | Significato |
|---|---|---|
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 | La richiesta o l’URL dell’immagine non sono utilizzabili. |
401 | unauthorized | x-api-key mancante, errata o revocata. |
402 | insufficient_credits, out_of_credits | Il saldo è esaurito. Ricarica dalla pagina dei prezzi. |
404 | not_found | Job inesistente (o non è tuo). |
409 | not_ready, canceled, idempotency_key_reused | GET …/result mentre il job è ancora in corso (riprova dopo 2 s), il job è stato annullato, oppure una Idempotency-Key è stata riutilizzata per una richiesta diversa. |
410 | result_unavailable | Il risultato è stato eliminato o è scaduto. |
413 | too_large | L’immagine supera 25 MB. |
422 | processing_failed, invalid_image, missing_upload | Il file non è un’immagine leggibile. Non addebitato. |
429 | rate_limited, too_many_batches | Superato il limite di richieste per account (attendi Retry-After), oppure hai già 3 job batch in corso. |
502 | model_unavailable, upstream_error, … | Non siamo riusciti a elaborare l’immagine dopo vari tentativi. Non addebitato. |
503 | server_paused, unavailable | L’API è in pausa (prima del lancio) o momentaneamente non disponibile. Riprova più tardi. |
I lotti, dall’inizio alla fine
1. Invia
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" }'Fino a 100 URL pubblici di immagini, più qualsiasi opzione di /v1/remove. I due URL di esempio qui sopra costerebbero fino a 2 crediti se fossero immagini reali. La risposta arriva subito:
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 conta le voci che non sono URL http(s) e duplicates conta le ripetizioni; entrambe vengono scartate e mai addebitate. Salva l’id: ti serve per riprendere il job dopo un riavvio.
2. Interroga il job
GET /v1/jobs/:id ogni pochi secondi finché done non è true. status passa da queued a processing, poi termina come succeeded, partial (alcune immagini non sono riuscite) o failed. Un elemento in fase di nuovo tentativo mostra 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. Scarica ogni risultato
GET /v1/jobs/:id/result?item=N per ogni elemento riuscito (oppure usa il suo result_url). item è la position, contata da zero. Le posizioni seguono la tua lista dopo la rimozione degli URL non validi e ripetuti, quindi quando uno dei due conteggi è maggiore di 0 abbina i risultati tramite input anziché tramite indice.
- Un lotto smette di contare nel limite di 3 lotti aperti appena
doneè true. - L’API non ha endpoint di annullamento, webhook né download ZIP. I lotti avviati dalla pagina Bulk possono essere annullati o scaricati come ZIP da lì.
Nuovi tentativi, duplicati e fatturazione
Invia una Idempotency-Key e i nuovi tentativi non potranno addebitarti due volte. Aggiungi un header Idempotency-Key (qualsiasi stringa univoca fino a 255 caratteri, ad esempio un UUID) a POST /v1/remove o POST /v1/batch, una chiave per immagine o per lotto. Se invii di nuovo la stessa richiesta con la stessa chiave, ricevi il job creato dalla prima, con Idempotent-Replayed: true: nessun nuovo job e nessun nuovo addebito, anche se la prima richiesta è ancora in corso. La stessa chiave con un’immagine o opzioni diverse risponde 409 idempotency_key_reused. Le chiavi appartengono al tuo account e non scadono.
Senza chiave, ogni POST crea un nuovo job e ogni job riuscito costa 1 credito (il POST /v1.0/removebg compatibile con remove.bg non supporta le chiavi). Leggere un job (GET /v1/jobs/…) è sempre gratuito e si può ripetere senza rischi.
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.pngCosa costa un credito
| Situazione | Addebito |
|---|---|
| Richiesta rifiutata prima dell’elaborazione (chiave errata, opzione errata, file troppo grande, crediti esauriti) | Gratis. |
| L’immagine non può essere elaborata (422 immagine non valida, 502 dopo i nostri tentativi) | Gratis. |
| L’immagine riesce | 1 credito, addebitato una sola volta, quando riesce. I nostri tentativi interni non aggiungono addebiti. |
| Ricevi un 202 | Ancora nulla. Il job continua e viene addebitato 1 credito solo se riesce. |
| Il tuo client va in timeout o si disconnette durante l’attesa | Il job continua e viene addebitato se riesce. Il risultato compare nel tuo Studio. |
| Invii due volte la stessa richiesta con la stessa Idempotency-Key | Un solo job, al massimo 1 credito. La ripetizione riceve lo stesso job (header Idempotent-Replayed: true). |
| Invii due volte la stessa immagine senza chiave | Due job separati; ognuno che riesce costa 1 credito. |
| Scarichi di nuovo un risultato già pronto | Gratis, quante volte vuoi finché è conservato. |
| Un lotto riesce in parte | 1 credito per ogni immagine riuscita; credits_charged nel job mostra il totale. |
| Un lotto contiene due volte lo stesso URL | Le ripetizioni all’interno di un lotto vengono scartate prima della coda e mai addebitate. URL identici in lotti diversi sono job separati. |
| I crediti finiscono durante un lotto | Le immagini già completate restano pagate; le altre vengono segnate come skipped (out_of_credits) e sono gratuite. Acquista crediti, poi invia gli URL rimanenti in un nuovo lotto. |
Quando riprovare
| Cosa è successo | Cosa fare |
|---|---|
| GET /v1/jobs/:id o …/result non riesce (errore di rete, 5xx) | Puoi riprovare senza rischi: leggere un job non crea mai lavoro né addebiti. Attendi un po’ tra un tentativo e l’altro. |
| GET …/result risponde 409 not_ready | Attendi il tempo indicato in Retry-After (2 s) e chiedi di nuovo. Non inviare di nuovo l’immagine. |
| GET …/result risponde 410 result_unavailable | Il risultato salvato è stato eliminato. Elaborare di nuovo l’immagine è un nuovo job e costa 1 credito. |
| POST risponde 400, 413 o 422 | Correggi prima la richiesta o l’immagine; inviarla invariata dà la stessa risposta. |
| POST risponde 401 o 402 | Correggi la chiave o ricarica i crediti. Non ripetere in loop. |
| POST risponde 429 rate_limited | Attendi i secondi indicati in Retry-After, poi inviala di nuovo (con la stessa Idempotency-Key). Più di 60 immagini al minuto? Usa POST /v1/batch: una richiesta per un massimo di 100. |
| POST /v1/batch risponde 429 too_many_batches | Attendi che uno dei tuoi 3 lotti aperti sia completato (interrogalo), poi invia. |
| POST /v1/… risponde 503 (unavailable, server_paused) | Non è stato creato alcun job. Riprova dopo una breve attesa. (L’endpoint compatibile con remove.bg è diverso: il suo 503 timeout significa che il job è ancora in corso.) |
| POST /v1/remove risponde 502 | Quel job non è riuscito e non è stato addebitato. Un nuovo tentativo è un nuovo job. |
| POST va in timeout, la connessione cade o ricevi un 500 | Con una Idempotency-Key: invia di nuovo la stessa richiesta con la stessa chiave e ricevi il job originale. Senza, il job potrebbe esistere già ed essere addebitato: controlla prima il tuo Studio. |
| POST risponde 409 idempotency_key_reused | Quella chiave è già stata usata per un’immagine o opzioni diverse. Crea una nuova chiave per ogni nuova immagine. |
Limiti e archiviazione
| Limite | Valore | Errore se superato |
|---|---|---|
| File immagine | 25 MB (25 × 1024 × 1024 byte); JPG, PNG o WebP, rilevato dai byte del file | 413 too_large · 422 processing_failed |
| Body base64 / JSON | 25 MB dopo la decodifica (il body della richiesta può essere circa un terzo più grande) | 413 too_large |
| Risoluzione di input | Le immagini oltre i 25 MP vengono ridotte a 25 MP prima dell’elaborazione | — |
| Dimensioni di output | larghezza e altezza ciascuna da 1 a 6000 px | 400 invalid_width / invalid_height |
| Download di image_url | solo http(s), timeout di 15 s, fino a 3 redirect; gli indirizzi privati, loopback e link-local vengono rifiutati, a ogni redirect | 400 invalid_url · fetch_failed · fetch_timeout |
| Attesa in POST /v1/remove | Circa 55 s, poi 202 con l’id del job | 202 |
| Dimensione del lotto | 100 URL di immagini per POST /v1/batch | 400 too_many_images |
| Lotti aperti | 3 job multi-immagine non completati per account (le immagini singole non contano) | 429 too_many_batches |
| Frequenza delle richieste | 60 richieste al minuto per account, sommando POST /v1/remove, /v1/batch e /v1.0/removebg. Un lotto conta una volta, qualunque sia la sua dimensione. La lettura dei job non è limitata | 429 rate_limited (con Retry-After) |
Per quanto tempo vengono conservati i risultati
Ogni risultato viene conservato in modo privato nel tuo account per 48 ore dalla creazione, poi viene eliminato. Fino ad allora puoi scaricarlo di nuovo gratis con GET /v1/jobs/:id/result o dal tuo Studio. Dopo di che, i link ai risultati rispondono 410 result_unavailable; elaborare di nuovo l’immagine è un nuovo job. Gli stati dei job restano consultabili anche dopo l’eliminazione dell’immagine. Consulta l’informativa sulla privacy per sapere come vengono gestiti i caricamenti; non usiamo le tue immagini per addestrare modelli.
Sicurezza
Tieni la tua chiave API su un server che controlli. Non inserirla nel codice del browser, in app mobili, in repository pubblici o negli URL. Per permettere ai tuoi utenti di rimuovere gli sfondi, fai passare le loro immagini dal tuo backend e aggiungi lì il tuo sistema di accesso e i tuoi limiti di spesa.
- L’API consente CORS per funzionare da strumenti e codice lato server. Questo non rende sicuro inserire una chiave in una pagina web: chiunque potrebbe leggerla.
- Tutte le chiavi di un account consumano lo stesso saldo di crediti. Crea una chiave separata per ogni app o ambiente nella pagina dell’account, così puoi revocarne una senza bloccare le altre.
- Se una chiave viene esposta, revocala subito nella pagina dell’account (smette di funzionare immediatamente) e creane una nuova. Conserviamo solo un hash di ogni chiave, quindi non possiamo mostrartela di nuovo.
Risoluzione dei problemi
| Sintomo | Cosa succede |
|---|---|
| Il mio PNG non si apre | Il body era JSON (un job 202 o un errore), non un’immagine. Controlla lo stato HTTP e il Content-Type prima di salvare. |
| Il mio script è andato in timeout ma l’immagine compare nello Studio | Il job è proseguito dopo che hai smesso di attendere. Recuperalo con il suo id invece di inviarlo di nuovo. |
| Mi è stata addebitata due volte la stessa immagine | È stata inviata due volte senza Idempotency-Key (spesso un nuovo tentativo automatico dopo un timeout). Usa una chiave per immagine e riutilizzala nei nuovi tentativi. |
| L’URL si apre nel browser ma l’API non riesce a recuperarlo | L’host potrebbe richiedere cookie o un accesso, bloccare i server, fare più di 3 redirect o impiegare più di 15 s, oppure l’URL firmato è scaduto. Carica invece il file. |
| Il mio lotto si è fermato a metà | Guarda items[] nel job: gli elementi non riusciti hanno un codice di errore; gli elementi skipped con out_of_credits indicano che il saldo è esaurito. |
| Un’opzione sembra non avere effetto | I nomi di parametro sconosciuti vengono ignorati senza avvisi. Controlla l’ortografia nella tabella dei parametri. Su /v1.0/removebg alcune opzioni di remove.bg sono accettate ma ignorate (vedi quella tabella). |
| Lo sfondo non è trasparente | Il JPG non supporta la trasparenza. Usa format=png o webp e non impostare bg_color. |
| Il link al risultato restituisce 410 | Il risultato salvato è stato eliminato. Una nuova elaborazione costa 1 credito. |