API temps réel

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)
1 Votre image2 Une requête HTTP3 Le PNG dans la réponse

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

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

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

StatutCorpsQue faire
200L’image (image/png, image/jpeg ou image/webp)Enregistrez-la. Utilisez le Content-Type pour choisir l’extension du fichier.
202JSON : { 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 / 5xxJSON : { "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ètreTypeDescription
image_filefileL’image (JPG, PNG ou WebP), en formulaire multipart.
image_file_b64stringL’image en base64, avec ou sans préfixe data:image/…;base64, (25 MB après décodage). Pratique depuis du JSON.
image_urlstringUne 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.
formatpng | jpg | webpFormat 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_colorcouleurRemplit 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.
sizepreview | medium | hd | fullPlafond 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.
croptrue | false | W:HRecadre 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.
paddingpx | 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.
channelsrgba | rgb | alphargba (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 / height1–6000Taille de sortie exacte en pixels, appliquée après crop (remplace size). Si un seul est indiqué, l’autre suit les proportions. Jamais étiré.
roix1 y1 x2 y2Zone 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.
fitcontain | cover | scale-downAvec 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.jpg

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

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

200 OK

Les octets de l’image, avec ces en-têtes :

En-têteSignification
X-Image-Width / X-Image-HeightTaille du résultat en pixels (également envoyée dans X-Width / X-Height).
X-Request-IDVotre 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-MsTemps passé sur la requête (également dans X-Processing-Ms).
X-Matte-Confidence0–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-RatioProportion 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-RemainingVotre solde après cette image.
X-Removal-IdIdentifiant du résultat stocké.
X-Job-IdIdentifiant 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.

ChampSignification
statusqueued, processing, succeeded, partial, failed ou canceled
donetrue dès qu’il ne reste plus rien à traiter
total, succeeded, failed, skippednombres d’images
credits_chargedcrédits utilisés par cette tâche (1 par image réussie)
status_url, result_urloù 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ètreStatutRemarques
image_file / image_file_b64 / image_urlPris en chargeCorps multipart, urlencoded ou JSON. JPG, PNG ou WebP jusqu’à 25 MB.
sizePris en chargeauto, 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.
formatPris en chargeauto (PNG si transparent, sinon JPG), png, jpg, webp et zip (color.jpg + alpha.png).
crop / crop_marginPris en chargepx ou % du sujet, 1 à 4 valeurs à la manière du CSS ("10% 20%" = vertical, horizontal) ; 500px ou 50 % au maximum par côté.
roiPris en charge"x1 y1 x2 y2" en px ou en % : seul le sujet à l’intérieur de la zone est conservé.
scale / positionPris en chargescale de 10% à 100% ou original ; position center, original ou "x% y%".
channelsPris en chargergba (détourage) ou alpha (masque en niveaux de gris).
bg_colorPris en chargeHexadé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_filePris en chargeLe détourage est superposé à votre image d’arrière-plan, ajustée en mode cover à la taille de sortie.
Accept: application/jsonPris en chargeRenvoie { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } }.
type / type_levelAccepté, ignoréLe sujet est détecté automatiquement ; X-Type vaut toujours "other".
semitransparencyAccepté, ignoréLes contours doux et les zones semi-transparentes proviennent tels quels du masque du modèle.
shadow_type / shadow_opacity / add_shadowAccepté, ignoréAucune ombre n’est ajoutée.
Requêtes longuesDifférenceNous 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/removebg

En-têtes de réponse

En-têteSignification
X-Width / X-HeightTaille du résultat en pixels.
X-Credits-ChargedCrédits utilisés par cette image : toujours 1 (les images en échec coûtent 0).
X-TypeToujours "other" (la détection du sujet est automatique).
X-Foreground-Top / -Left / -Width / -HeightCadre englobant du sujet dans le résultat, en pixels.
X-Request-IDReprend votre X-Request-ID, ou un identifiant généré. En plus.
X-Matte-Confidence / X-Matte-Ambiguous-RatioNetteté du masque (0–1) et proportion de pixels doux. En plus : pratique pour signaler les images à vérifier.

Erreurs

StatutSignification
400Paramètre ou image non valide (codes tels que invalid_size, invalid_crop_margin, missing_source, file_too_large, unknown_foreground).
402insufficient_credits : rechargez sur la page des tarifs.
403auth_failed : X-Api-Key manquant ou non valide.
429rate_limit_exceeded.
500 / 503Le 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.

StatutCodesSignification
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_imagesLa requête ou l’URL de l’image est inutilisable.
401unauthorizedx-api-key manquant, incorrect ou révoqué.
402insufficient_credits, out_of_creditsVotre solde est vide. Rechargez sur la page des tarifs.
404not_foundTâche introuvable (ou elle ne vous appartient pas).
409not_ready, canceled, idempotency_key_reusedGET …/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.
410result_unavailableLe résultat a été supprimé ou a expiré.
413too_largeL’image dépasse 25 MB.
422processing_failed, invalid_image, missing_uploadLe fichier n’est pas une image lisible. Non facturé.
429rate_limited, too_many_batchesLimite de requêtes du compte dépassée (attendez la durée de Retry-After), ou vous avez déjà 3 lots en cours.
502model_unavailable, upstream_error, …Nous n’avons pas pu traiter l’image malgré nos nouvelles tentatives. Non facturé.
503server_paused, unavailableL’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 done vaut 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.png

Ce qui coûte un crédit

SituationFacturation
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ès1 crédit, facturé une seule fois, en cas de réussite. Nos propres nouvelles tentatives internes n’ajoutent aucun frais.
Vous recevez un 202Rien 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’attenteLa 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-KeyUne 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 partiellement1 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 URLLes 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 lotLes 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_readyAttendez la durée de Retry-After (2 s) et redemandez. Ne renvoyez pas l’image.
GET …/result répond 410 result_unavailableLe 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 422Corrigez d’abord la requête ou l’image ; la renvoyer telle quelle donnera la même réponse.
POST répond 401 ou 402Corrigez la clé ou rechargez vos crédits. Ne bouclez pas.
POST répond 429 rate_limitedAttendez 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_batchesAttendez 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 502Cette 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 500Avec 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_reusedCette 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

LimiteValeurErreur en cas de dépassement
Fichier image25 MB (25 × 1024 × 1024 octets) ; JPG, PNG ou WebP, détecté d’après le contenu du fichier413 too_large · 422 processing_failed
Corps base64 / JSON25 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éeLes images de plus de 25 MP sont réduites à 25 MP avant traitement—
Taille de sortielargeur et hauteur chacune entre 1 et 6000 px400 invalid_width / invalid_height
Téléchargement de image_urlhttp(s) uniquement, délai de 15 s, 3 redirections maximum ; les adresses privées, loopback et link-local sont refusées, à chaque redirection400 invalid_url · fetch_failed · fetch_timeout
Attente dans POST /v1/removeEnviron 55 s, puis 202 avec l’identifiant de tâche202
Taille d’un lot100 URL d’images par POST /v1/batch400 too_many_images
Lots ouverts3 tâches multi-images non terminées par compte (les images uniques ne comptent pas)429 too_many_batches
Débit de requêtes60 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ée429 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ômeExplication
Mon PNG ne s’ouvre pasLe 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 StudioLa 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 imageElle 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érerL’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-cheminConsultez 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 effetLes 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 transparentLe 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 410Le résultat stocké a été supprimé. Un nouveau traitement coûte 1 crédit.