API de suppression d’arrière-plan : une requête en entrée, un PNG final en sortie.
Envoyez un fichier, l’URL publique d’une image ou du base64. La plupart des images uniques reviennent terminées dans la même réponse HTTP, en général en quelques secondes. Si l’une d’elles prend plus de temps, vous recevez un identifiant de tâche pour récupérer le résultat, sans renvoyer l’image. Un endpoint de lot couvre le traitement en masse.
1 crédit par image réussie · images en échec gratuites · clés dans votre compte
$ 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 · généralement quelques secondes
dog.png enregistré (transparent, pleine résolution)Démarrage rapide
Copiez, collez, remplacez YOUR_API_KEY. Chaque exemple enregistre directement le résultat dans un fichier, et les exemples JavaScript et Python gèrent aussi l’attente en cas de 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.pngEnvoyer votre image
POST /v1/remove accepte l’image de quatre façons. Utilisez-en une seule ; si une requête en contient plusieurs, image_file l’emporte, puis image_file_b64, puis image_url, puis le corps brut. Ces exemples lisent votre clé dans la variable d’environnement REMOVEBG_API_KEY (définissez-la avec export REMOVEBG_API_KEY=…) ; notez les guillemets doubles, qui permettent au shell de la remplacer.
curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_API_KEY" \
-F 'image_file=@photo.jpg' \
-o photo-no-bg.pngFormulaire multipart, champ image_file. JPG, PNG ou WebP, jusqu’à 25 MB.
Chaque exemple enregistre le corps de la réponse dans un fichier. Ce fichier n’est une image que si le statut est 200 ; voir Traiter la réponse.
Traiter la réponse
La plupart des images uniques reviennent terminées dans la même réponse. Quand la file est exceptionnellement chargée et qu’une image prend plus de 55 secondes environ, vous recevez à la place 202 Accepted avec un identifiant de tâche. La tâche continue de tourner : récupérez son résultat grâce à l’identifiant. Renvoyer l’image lancerait une deuxième tâche et pourrait coûter un deuxième crédit.
| Statut | Corps | Que faire |
|---|---|---|
200 | L’image (image/png, image/jpeg ou image/webp) | Enregistrez-la. Utilisez le Content-Type pour choisir l’extension du fichier. |
202 | JSON : { id, status, status_url, result_url } | Ce n’est pas une image. Attendez quelques secondes, puis faites un GET sur result_url. Ne renvoyez pas l’image. |
4xx / 5xx | JSON : { "error": { "code", "message" } } | Ce n’est pas une image. Lisez le code (voir Erreurs) et n’enregistrez pas le corps comme une image. |
Un exemple complet
Gère l’image finale, un 202, une tâche en échec et un délai maximal côté client. L’image n’est envoyée qu’une fois, et seules les vérifications de statut, sans risque, sont relancées.
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"))Nécessite Python 3 et requests (pip install requests).
- Arrêter votre script n’arrête pas la tâche : elle peut quand même se terminer et être facturée. Son résultat apparaît dans votre Studio.
- Les délais sont à votre choix, pas une promesse de notre part ; la plupart des images sont traitées en quelques secondes.
- L’endpoint compatible remove.bg se comporte différemment : il ne répond jamais 202 (voir ci-dessous).
Authentification
Envoyez votre clé API dans l’en-tête x-api-key. Créez et révoquez vos clés sur votre page de compte ; chaque appel utilise les crédits de ce compte. Tous les endpoints se trouvent sous https://removebackground.dev et acceptent les requêtes CORS, mais CORS ne rend pas sûr le fait de placer une clé dans une page web : gardez-la sur votre serveur (voir Sécurité). Les erreurs sont au format JSON : { "error": { "code": "…", "message": "…" } }.
Le contrat complet est publié au format OpenAPI 3.1 (openapi.json), pour les générateurs de clients, Postman ou les tests ; les assistants de code IA peuvent partir de llms.txt.
POST /v1/remove
Temps réel. Supprime l’arrière-plan d’une image. En général, l’image finale constitue le corps de la réponse (image/png, image/jpeg ou image/webp), après quelques secondes. Les paramètres peuvent être des champs de formulaire, des clés JSON ou des paramètres de query string ; vous pouvez aussi envoyer en POST les octets bruts de l’image avec Content-Type: image/jpeg, image/png, image/webp ou application/octet-stream. 25 MB maximum. Voir Envoyer votre image pour chaque méthode d’envoi.
| Paramètre | Type | Description |
|---|---|---|
image_file | file | L’image (JPG, PNG ou WebP), en formulaire multipart. |
image_file_b64 | string | L’image en base64, avec ou sans préfixe data:image/…;base64, (25 MB après décodage). Pratique depuis du JSON. |
image_url | string | Une URL http(s) publique de l’image. Nous la téléchargeons (3 redirections maximum, 15 s). Si plusieurs sont envoyées, image_file l’emporte, puis image_file_b64, puis image_url, puis le corps brut. |
format | png | jpg | webp | Format de sortie. png par défaut. Le JPG ne gère pas la transparence : l’image est aplatie sur bg_color, ou sur du blanc. |
bg_color | couleur | Remplit l’arrière-plan : hexadécimal (ffffff, #fff), rgb(255, 255, 255), ou white, black, red, green, blue, yellow, gray / grey. transparent (par défaut) le laisse transparent. |
size | preview | medium | hd | full | Plafond en mégapixels, proportions conservées, jamais agrandi : preview ≤ 0,25 MP, medium ≤ 1,5 MP, hd ≤ 4 MP, full (par défaut) la résolution d’origine (jusqu’à 25 MP). Ignoré si width ou height est défini. |
crop | true | false | W:H | Recadre sur le cadre englobant du sujet. Avec un format d’image (1:1, 4:5, 4:3, 16:9…), le cadre est ensuite agrandi (jamais réduit) à ce format autour du sujet ; la zone hors de la photo est transparente (ou bg_color). false par défaut. |
padding | px | fraction | % | Avec crop : marge ajoutée de chaque côté. 0.1 ou 10% = un dixième de la largeur (gauche/droite) et de la hauteur (haut/bas) du sujet ; "10%,7.5%" définit séparément l’horizontal et le vertical ; 24px (ou un nombre entier supérieur à 1 sans unité) est en pixels, jusqu’à 500. 0 par défaut. |
channels | rgba | rgb | alpha | rgba (par défaut) : détourage transparent. rgb : opaque, aplati sur bg_color ou sur du blanc. alpha : masque PNG en niveaux de gris (blanc = sujet), de même taille et même recadrage que le détourage. type=mask fonctionne toujours comme alias de alpha. |
width / height | 1–6000 | Taille de sortie exacte en pixels, appliquée après crop (remplace size). Si un seul est indiqué, l’autre suit les proportions. Jamais étiré. |
roi | x1 y1 x2 y2 | Zone d’intérêt, en px ou en % (p. ex. 0% 0% 50% 100%). Seul le sujet à l’intérieur est conservé ; tout le reste devient arrière-plan. Les coordonnées se rapportent à l’image d’origine. Par défaut : l’image entière. |
fit | contain | cover | scale-down | Avec width et height. contain (par défaut) : ajusté à l’intérieur, centré, le reste transparent (ou bg_color). cover : remplit le cadre en recadrant le débordement autour du sujet. scale-down : comme contain, mais jamais agrandi. |
Les options s’appliquent dans cet ordre : roi, size (ou width/height plus tard), crop + padding + format d’image, width/height + fit, puis channels ou couleur d’arrière-plan, puis le format. Chaque option coûte le même 1 crédit. Les paramètres inconnus sont ignorés.
Exemple : JPG HD sur fond blanc, recadré sur le sujet avec une marge de 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.jpgExemple : image carrée pour marketplace, sujet centré avec 10 % de 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.jpgExemple : base64 en entrée, masque alpha en sortie
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
Les octets de l’image, avec ces en-têtes :
| En-tête | Signification |
|---|---|
X-Image-Width / X-Image-Height | Taille du résultat en pixels (également envoyée dans X-Width / X-Height). |
X-Request-ID | Votre X-Request-ID si vous en avez envoyé un, sinon un identifiant généré. Indiquez-le si vous contactez l’assistance. |
X-Processing-Time-Ms | Temps passé sur la requête (également dans X-Processing-Ms). |
X-Matte-Confidence | 0–1 : netteté du masque (moyenne de |2a − 1| sur les pixels, a = alpha). Proche de 1 : détourage net ; des valeurs plus basses signalent beaucoup de contours doux ou incertains. |
X-Matte-Ambiguous-Ratio | Proportion de pixels dont l’alpha est strictement compris entre 0.1 et 0.9 (cheveux, verre, flou de mouvement). Pratique pour signaler les images à vérifier. |
X-Credits-Remaining | Votre solde après cette image. |
X-Removal-Id | Identifiant du résultat stocké. |
X-Job-Id | Identifiant de la tâche derrière la requête (utilisable avec /v1/jobs/:id). |
202 Accepted (solution de repli quand la file est longue)
Si l’image n’est pas terminée en 55 secondes environ, par exemple quand la file est exceptionnellement chargée, vous recevez 202 avec le JSON { id, status, status_url, result_url } (ainsi que Location et Retry-After: 2). Interrogez status_url jusqu’à ce que done vaille true, puis téléchargez result_url. Vous n’êtes facturé qu’une fois, et seulement si l’image réussit. Ne renvoyez pas l’image sans Idempotency-Key : cela lancerait une deuxième tâche. Voir Traiter la réponse pour un exemple complet.
GET /v1/jobs/:id
Statut d’une tâche créée par /v1/remove ou /v1/batch. Même clé ; vous ne voyez que vos propres tâches.
| Champ | Signification |
|---|---|
status | queued, processing, succeeded, partial, failed ou canceled |
done | true dès qu’il ne reste plus rien à traiter |
total, succeeded, failed, skipped | nombres d’images |
credits_charged | crédits utilisés par cette tâche (1 par image réussie) |
status_url, result_url | où interroger, et où télécharger |
items[] | par image : position, input, status, error { code, message }, et en cas de réussite removal_id, width, height, format, result_url |
GET /v1/jobs/:id/result
Les octets de l’image d’une tâche terminée, avec les mêmes en-têtes que /v1/remove. ?item=N sélectionne une image d’un lot (0 par défaut). Répond 409 not_ready avec Retry-After: 2 tant que le traitement est en cours, ou l’erreur propre à l’image en cas d’échec.
POST /v1/batch
Placez jusqu’à 100 URL d’images en file dans une seule tâche : JSON { "image_urls": ["https://…", …], "format": "jpg", "bg_color": "ffffff", "size": "hd", "crop": "1:1", "padding": "10%" }, avec les mêmes options que /v1/remove (y compris channels, width, height et fit). Répond immédiatement 202 avec { id, status, total, invalid, duplicates, status_url }. Interrogez la tâche, puis récupérez le result_url de chaque élément. 1 crédit par image réussie ; 3 lots ouverts maximum par compte. Guide pas à pas avec exemples de réponses dans Les lots de A à Z.
Endpoint compatible remove.bg
L’API en libre-service de remove.bg prend fin le 1 December 2026, 09:00 CET (annonce). Les intégrations remove.bg existantes fonctionnent ici en changeant une seule ligne : https://api.remove.bg/v1.0/removebg → https://removebackground.dev/v1.0/removebg, avec une clé removebackground.dev dans le même en-tête X-Api-Key. Même file, même tarif de 1 crédit par image réussie, même qualité de sortie que /v1/remove. Guide de migration.
POST /v1.0/removebg
Corps multipart, urlencoded ou JSON avec les noms de paramètres de remove.bg. Répond avec les octets de l’image et les en-têtes de remove.bg, ou { "data": { "result_b64", "foreground_top", "foreground_left", "foreground_width", "foreground_height" } } si vous envoyez Accept: application/json. Les erreurs suivent le format de remove.bg : { "errors": [{ "title", "code", "detail" }] }. Contrairement à /v1/remove, il ne répond jamais 202 : il attend jusqu’à 110 secondes, puis renvoie un 503 timeout. La tâche continue et est facturée si elle réussit : relancer cette requête démarre donc une deuxième tâche.
| Paramètre | Statut | Remarques |
|---|---|---|
image_file / image_file_b64 / image_url | Pris en charge | Corps multipart, urlencoded ou JSON. JPG, PNG ou WebP jusqu’à 25 MB. |
size | Pris en charge | auto, full, 4k et 50MP donnent la résolution d’origine (jusqu’à 25 MP) ; preview, small et regular ≈ 0,25 MP ; medium 1,5 MP ; hd 4 MP. Toujours 1 crédit. |
format | Pris en charge | auto (PNG si transparent, sinon JPG), png, jpg, webp et zip (color.jpg + alpha.png). |
crop / crop_margin | Pris en charge | px ou % du sujet, 1 à 4 valeurs à la manière du CSS ("10% 20%" = vertical, horizontal) ; 500px ou 50 % au maximum par côté. |
roi | Pris en charge | "x1 y1 x2 y2" en px ou en % : seul le sujet à l’intérieur de la zone est conservé. |
scale / position | Pris en charge | scale de 10% à 100% ou original ; position center, original ou "x% y%". |
channels | Pris en charge | rgba (détourage) ou alpha (masque en niveaux de gris). |
bg_color | Pris en charge | Hexadécimal avec ou sans # (81d4fa), ou un nom de couleur. Un hexadécimal à 8 chiffres conserve la couleur et ignore sa transparence. |
bg_image_url / bg_image_file | Pris en charge | Le détourage est superposé à votre image d’arrière-plan, ajustée en mode cover à la taille de sortie. |
Accept: application/json | Pris en charge | Renvoie { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } }. |
type / type_level | Accepté, ignoré | Le sujet est détecté automatiquement ; X-Type vaut toujours "other". |
semitransparency | Accepté, ignoré | Les contours doux et les zones semi-transparentes proviennent tels quels du masque du modèle. |
shadow_type / shadow_opacity / add_shadow | Accepté, ignoré | Aucune ombre n’est ajoutée. |
Requêtes longues | Différence | Nous attendons jusqu’à 110 secondes ; si une image n’est pas prête d’ici là, vous recevez une erreur 503 que vous pouvez relancer (non facturée sauf si le traitement a abouti). |
Exemple
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/removebgEn-têtes de réponse
| En-tête | Signification |
|---|---|
X-Width / X-Height | Taille du résultat en pixels. |
X-Credits-Charged | Crédits utilisés par cette image : toujours 1 (les images en échec coûtent 0). |
X-Type | Toujours "other" (la détection du sujet est automatique). |
X-Foreground-Top / -Left / -Width / -Height | Cadre englobant du sujet dans le résultat, en pixels. |
X-Request-ID | Reprend votre X-Request-ID, ou un identifiant généré. En plus. |
X-Matte-Confidence / X-Matte-Ambiguous-Ratio | Netteté du masque (0–1) et proportion de pixels doux. En plus : pratique pour signaler les images à vérifier. |
Erreurs
| Statut | Signification |
|---|---|
400 | Paramètre ou image non valide (codes tels que invalid_size, invalid_crop_margin, missing_source, file_too_large, unknown_foreground). |
402 | insufficient_credits : rechargez sur la page des tarifs. |
403 | auth_failed : X-Api-Key manquant ou non valide. |
429 | rate_limit_exceeded. |
500 / 503 | Le traitement a échoué, a dépassé le délai ou le service est momentanément indisponible. Réessayez ; les images en échec sont gratuites. |
GET /v1.0/account
Votre solde au format de compte de remove.bg : { "data": { "attributes": { "credits": { "total", "subscription": 0, "payg", "enterprise": 0 }, "api": { "free_calls": 0, "sizes": "all" } } } }. Tous les crédits sont à l’usage et n’expirent jamais : total est donc égal à payg. GET https://removebackground.dev/v1.0/account avec votre X-Api-Key.
Erreurs (endpoints /v1)
Les images en échec ne sont jamais facturées.
| Statut | Codes | Signification |
|---|---|---|
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 requête ou l’URL de l’image est inutilisable. |
401 | unauthorized | x-api-key manquant, incorrect ou révoqué. |
402 | insufficient_credits, out_of_credits | Votre solde est vide. Rechargez sur la page des tarifs. |
404 | not_found | Tâche introuvable (ou elle ne vous appartient pas). |
409 | not_ready, canceled, idempotency_key_reused | GET …/result alors que la tâche est encore en cours (réessayez après 2 s), la tâche a été annulée, ou une Idempotency-Key a été réutilisée pour une autre requête. |
410 | result_unavailable | Le résultat a été supprimé ou a expiré. |
413 | too_large | L’image dépasse 25 MB. |
422 | processing_failed, invalid_image, missing_upload | Le fichier n’est pas une image lisible. Non facturé. |
429 | rate_limited, too_many_batches | Limite de requêtes du compte dépassée (attendez la durée de Retry-After), ou vous avez déjà 3 lots en cours. |
502 | model_unavailable, upstream_error, … | Nous n’avons pas pu traiter l’image malgré nos nouvelles tentatives. Non facturé. |
503 | server_paused, unavailable | L’API est en pause (avant le lancement) ou momentanément indisponible. Réessayez plus tard. |
Les lots de A à Z
1. Envoyer
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" }'Jusqu’à 100 URL d’images publiques, avec n’importe quelle option de /v1/remove. Les deux URL d’exemple ci-dessus coûteraient jusqu’à 2 crédits s’il s’agissait de vraies images. La réponse arrive immédiatement :
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 compte les entrées qui ne sont pas des URL http(s) et duplicates les doublons ; les deux sont écartés et jamais facturés. Conservez l’id : il permet de reprendre la tâche après un redémarrage.
2. Interroger la tâche
GET /v1/jobs/:id toutes les quelques secondes jusqu’à ce que done vaille true. status passe de queued à processing, puis se termine en succeeded, partial (certaines images ont échoué) ou failed. Un élément en cours de nouvelle tentative affiche 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. Télécharger chaque résultat
GET /v1/jobs/:id/result?item=N pour chaque élément réussi (ou utilisez son result_url). item est la position, comptée à partir de zéro. Les positions suivent votre liste une fois les URL invalides et en double retirées : si l’un de ces compteurs est supérieur à 0, associez les résultats par input plutôt que par indice.
- Un lot ne compte plus dans la limite de 3 lots ouverts dès que
donevaut true. - L’API n’a ni endpoint d’annulation, ni webhooks, ni téléchargement ZIP. Les lots lancés depuis la page Bulk peuvent y être annulés ou téléchargés en ZIP.
Nouvelles tentatives, doublons et facturation
Envoyez une Idempotency-Key et les nouvelles tentatives ne peuvent pas facturer deux fois. Ajoutez un en-tête Idempotency-Key (n’importe quelle chaîne unique de 255 caractères maximum, comme un UUID) à POST /v1/remove ou POST /v1/batch, une clé par image ou par lot. Si vous renvoyez la même requête avec la même clé, vous obtenez la tâche créée par la première, avec Idempotent-Replayed: true : aucune nouvelle tâche ni nouvelle facturation, même si la première requête est encore en cours. La même clé avec une image ou des options différentes répond 409 idempotency_key_reused. Les clés sont liées à votre compte et n’expirent pas.
Sans clé, chaque POST crée une nouvelle tâche, et chaque tâche réussie coûte 1 crédit (le POST /v1.0/removebg compatible remove.bg n’accepte pas de clés). La lecture d’une tâche (GET /v1/jobs/…) est toujours gratuite et peut être répétée sans risque.
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.pngCe qui coûte un crédit
| Situation | Facturation |
|---|---|
| Requête refusée avant traitement (clé invalide, option invalide, fichier trop volumineux, crédits épuisés) | Gratuit. |
| L’image ne peut pas être traitée (422 image invalide, 502 après nos nouvelles tentatives) | Gratuit. |
| L’image est traitée avec succès | 1 crédit, facturé une seule fois, en cas de réussite. Nos propres nouvelles tentatives internes n’ajoutent aucun frais. |
| Vous recevez un 202 | Rien pour l’instant. La tâche continue et n’est facturée 1 crédit qu’en cas de réussite. |
| Votre client expire ou se déconnecte pendant l’attente | La tâche continue et est facturée en cas de réussite. Le résultat apparaît dans votre Studio. |
| Vous envoyez deux fois la même requête avec la même Idempotency-Key | Une seule tâche, 1 crédit maximum. La répétition renvoie la même tâche (en-tête Idempotent-Replayed: true). |
| Vous envoyez deux fois la même image sans clé | Deux tâches distinctes ; chacune coûte 1 crédit si elle réussit. |
| Vous téléchargez à nouveau un résultat terminé | Gratuit, autant de fois que vous le souhaitez tant qu’il est stocké. |
| Un lot réussit partiellement | 1 crédit par image réussie ; le champ credits_charged de la tâche indique le total. |
| Un lot contient deux fois la même URL | Les doublons d’un même lot sont écartés avant la mise en file et jamais facturés. Des URL identiques dans des lots différents sont des tâches distinctes. |
| Les crédits s’épuisent pendant un lot | Les images déjà terminées restent facturées ; les autres sont marquées skipped (out_of_credits) et sont gratuites. Achetez des crédits, puis envoyez les URL restantes dans un nouveau lot. |
Quand réessayer
| Ce qui s’est passé | Que faire |
|---|---|
| GET /v1/jobs/:id ou …/result échoue (erreur réseau, 5xx) | Vous pouvez réessayer sans risque : lire une tâche ne crée jamais de traitement ni de facturation. Espacez un peu les tentatives. |
| GET …/result répond 409 not_ready | Attendez la durée de Retry-After (2 s) et redemandez. Ne renvoyez pas l’image. |
| GET …/result répond 410 result_unavailable | Le résultat stocké a été supprimé. Traiter à nouveau l’image crée une nouvelle tâche et coûte 1 crédit. |
| POST répond 400, 413 ou 422 | Corrigez d’abord la requête ou l’image ; la renvoyer telle quelle donnera la même réponse. |
| POST répond 401 ou 402 | Corrigez la clé ou rechargez vos crédits. Ne bouclez pas. |
| POST répond 429 rate_limited | Attendez le nombre de secondes indiqué dans Retry-After, puis renvoyez la requête (avec la même Idempotency-Key). Plus de 60 images par minute ? Utilisez POST /v1/batch : une seule requête pour 100 images maximum. |
| POST /v1/batch répond 429 too_many_batches | Attendez qu’un de vos 3 lots ouverts soit terminé (interrogez-le), puis envoyez. |
| POST /v1/… répond 503 (unavailable, server_paused) | Aucune tâche n’a été créée. Réessayez après une courte attente. (L’endpoint compatible remove.bg est différent : son 503 timeout signifie que la tâche est toujours en cours.) |
| POST /v1/remove répond 502 | Cette tâche a échoué et n’a pas été facturée. Une nouvelle tentative crée une nouvelle tâche. |
| POST expire, la connexion est coupée, ou vous recevez un 500 | Avec une Idempotency-Key : renvoyez la même requête avec la même clé ; vous obtenez la tâche d’origine. Sans clé, la tâche existe peut-être déjà et peut être facturée : vérifiez d’abord votre Studio. |
| POST répond 409 idempotency_key_reused | Cette clé a déjà servi pour une autre image ou d’autres options. Créez une nouvelle clé pour chaque nouvelle image. |
Limites et stockage
| Limite | Valeur | Erreur en cas de dépassement |
|---|---|---|
| Fichier image | 25 MB (25 × 1024 × 1024 octets) ; JPG, PNG ou WebP, détecté d’après le contenu du fichier | 413 too_large · 422 processing_failed |
| Corps base64 / JSON | 25 MB après décodage (le corps de la requête peut être environ un tiers plus volumineux) | 413 too_large |
| Résolution d’entrée | Les images de plus de 25 MP sont réduites à 25 MP avant traitement | — |
| Taille de sortie | largeur et hauteur chacune entre 1 et 6000 px | 400 invalid_width / invalid_height |
| Téléchargement de image_url | http(s) uniquement, délai de 15 s, 3 redirections maximum ; les adresses privées, loopback et link-local sont refusées, à chaque redirection | 400 invalid_url · fetch_failed · fetch_timeout |
| Attente dans POST /v1/remove | Environ 55 s, puis 202 avec l’identifiant de tâche | 202 |
| Taille d’un lot | 100 URL d’images par POST /v1/batch | 400 too_many_images |
| Lots ouverts | 3 tâches multi-images non terminées par compte (les images uniques ne comptent pas) | 429 too_many_batches |
| Débit de requêtes | 60 requêtes par minute et par compte, tous endpoints confondus parmi POST /v1/remove, /v1/batch et /v1.0/removebg. Un lot compte pour une requête, quelle que soit sa taille. La lecture des tâches n’est pas limitée | 429 rate_limited (avec Retry-After) |
Durée de conservation des résultats
Chaque résultat est stocké de manière privée dans votre compte pendant 48 heures après sa création, puis supprimé. D’ici là, vous pouvez le télécharger à nouveau gratuitement avec GET /v1/jobs/:id/result ou depuis votre Studio. Ensuite, les liens de résultat répondent 410 result_unavailable ; traiter à nouveau l’image crée une nouvelle tâche. Les statuts des tâches restent consultables après la suppression de l’image. Consultez la politique de confidentialité pour savoir comment les fichiers importés sont traités ; nous n’utilisons pas vos images pour entraîner des modèles.
Sécurité
Gardez votre clé API sur un serveur que vous contrôlez. Ne la placez pas dans du code exécuté dans le navigateur, des applications mobiles, des dépôts publics ou des URL. Pour permettre à vos propres utilisateurs de supprimer des arrière-plans, faites transiter leurs images par votre backend, et ajoutez-y votre propre authentification et vos propres limites de dépenses.
- L’API autorise CORS pour fonctionner depuis des outils et du code côté serveur. Cela ne rend pas pour autant sûr le fait de placer une clé dans une page web : n’importe qui pourrait l’y lire.
- Toutes les clés d’un compte puisent dans le même solde de crédits. Créez une clé distincte par application ou par environnement sur votre page de compte, pour pouvoir en révoquer une sans casser les autres.
- Si une clé fuite, révoquez-la immédiatement sur la page de compte (elle cesse aussitôt de fonctionner) et créez-en une nouvelle. Nous ne conservons qu’une empreinte (hash) de chaque clé : nous ne pouvons donc pas vous la réafficher.
Dépannage
| Symptôme | Explication |
|---|---|
| Mon PNG ne s’ouvre pas | Le corps était du JSON (une tâche 202 ou une erreur), pas une image. Vérifiez le statut HTTP et le Content-Type avant d’enregistrer. |
| Mon script a expiré, mais l’image apparaît dans le Studio | La tâche a continué après que vous avez cessé d’attendre. Récupérez-la avec son identifiant au lieu de la renvoyer. |
| J’ai été facturé deux fois pour une seule image | Elle a été envoyée deux fois sans Idempotency-Key (souvent une nouvelle tentative automatique après un délai dépassé). Utilisez une clé par image et réutilisez-la lors des nouvelles tentatives. |
| L’URL s’ouvre dans mon navigateur, mais l’API ne parvient pas à la récupérer | L’hébergeur exige peut-être des cookies ou une connexion, bloque les serveurs, redirige plus de 3 fois, met plus de 15 s à répondre, ou l’URL signée a expiré. Envoyez plutôt le fichier. |
| Mon lot s’est arrêté à mi-chemin | Consultez items[] dans la tâche : les éléments en échec ont un code d’erreur ; les éléments skipped avec out_of_credits signifient que le solde était épuisé. |
| Une option semble sans effet | Les noms de paramètres inconnus sont ignorés sans avertissement. Vérifiez l’orthographe dans le tableau des paramètres. Sur /v1.0/removebg, certaines options de remove.bg sont acceptées mais ignorées (voir ce tableau). |
| L’arrière-plan n’est pas transparent | Le JPG ne gère pas la transparence. Utilisez format=png ou webp et ne définissez pas bg_color. |
| Le lien du résultat renvoie 410 | Le résultat stocké a été supprimé. Un nouveau traitement coûte 1 crédit. |