API de remoção de fundo: uma requisição de ida, o PNG pronto de volta.
Envie um arquivo, a URL pública de uma imagem ou base64. A maioria das imagens avulsas volta pronta na mesma resposta HTTP, normalmente em poucos segundos. Se alguma demorar mais, você recebe um id de job para buscar o resultado, sem enviar a imagem de novo. Um endpoint de lote cuida do processamento em massa.
1 crédito por imagem processada com sucesso · imagens com falha são grátis · chaves na sua conta
$ 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 · normalmente poucos segundos
dog.png salvo (transparente, resolução máxima)Início rápido
Copie, cole e substitua YOUR_API_KEY. Cada exemplo salva o resultado direto em um arquivo, e os de JavaScript e Python também aguardam quando recebem um 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.pngEnvie sua imagem
POST /v1/remove aceita a imagem de quatro formas. Envie uma delas; se uma requisição trouxer várias, image_file tem prioridade, depois image_file_b64, depois image_url e por último o corpo bruto. Estes exemplos leem sua chave da variável de ambiente REMOVEBG_API_KEY (defina com export REMOVEBG_API_KEY=…); repare nas aspas duplas, que deixam o shell preencher o valor.
curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_API_KEY" \
-F 'image_file=@photo.jpg' \
-o photo-no-bg.pngDados de formulário multipart, campo image_file. JPG, PNG ou WebP, até 25 MB.
Todos os exemplos salvam o corpo em um arquivo. Esse arquivo só é uma imagem quando o status é 200; veja Trate a resposta.
Trate a resposta
A maioria das imagens avulsas volta pronta na mesma resposta. Quando a fila está muito movimentada e uma imagem demora mais de uns 55 segundos, você recebe 202 Accepted com um id de job. O job continua rodando: busque o resultado com o id. Enviar a imagem de novo iniciaria um segundo job e poderia custar um segundo crédito.
| Status | Corpo | O que fazer |
|---|---|---|
200 | A imagem (image/png, image/jpeg ou image/webp) | Salve. Use o Content-Type para escolher a extensão do arquivo. |
202 | JSON: { id, status, status_url, result_url } | Não é uma imagem. Espere alguns segundos e faça GET em result_url. Não envie a imagem de novo. |
4xx / 5xx | JSON: { "error": { "code", "message" } } | Não é uma imagem. Leia o código (veja Erros) e não salve o corpo como imagem. |
Um exemplo completo
Trata a imagem pronta, um 202, um job que falha e um limite de tempo local. Envia a imagem uma única vez e só repete as consultas de status, que são seguras.
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"))Requer Python 3 e requests (pip install requests).
- Parar seu script não para o job; ele ainda pode terminar e ser cobrado. O resultado aparece no seu Studio.
- Os limites de tempo são escolha sua, não uma promessa nossa; a maioria das imagens fica pronta em poucos segundos.
- O endpoint compatível com o remove.bg se comporta de outro jeito: ele nunca responde 202 (veja abaixo).
Autenticação
Envie sua chave de API no header x-api-key. Crie e revogue chaves na página da sua conta; cada chamada usa os créditos dessa conta. Todos os endpoints ficam em https://removebackground.dev e aceitam requisições CORS, mas o CORS não torna seguro colocar uma chave em uma página web: mantenha-a no seu servidor (veja Segurança). Os erros são JSON: { "error": { "code": "…", "message": "…" } }.
O contrato completo está publicado como OpenAPI 3.1 (openapi.json), para geradores de clientes, Postman ou testes; assistentes de programação com IA podem começar pelo llms.txt.
POST /v1/remove
Em tempo real. Remove o fundo de uma imagem. Normalmente a imagem pronta é o corpo da resposta (image/png, image/jpeg ou image/webp), em geral após poucos segundos. Os parâmetros podem ser campos de formulário, chaves JSON ou valores na query string; você também pode fazer POST dos bytes brutos da imagem com Content-Type: image/jpeg, image/png, image/webp ou application/octet-stream. Máximo de 25 MB. Veja Envie sua imagem para cada forma de envio.
| Parâmetro | Tipo | Descrição |
|---|---|---|
image_file | file | A imagem (JPG, PNG ou WebP), como dados de formulário multipart. |
image_file_b64 | string | A imagem em base64, com ou sem o prefixo data:image/…;base64, (25 MB depois de decodificada). Prático a partir de JSON. |
image_url | string | Uma URL pública http(s) da imagem. Nós fazemos o download (até 3 redirecionamentos, 15 s). Se várias forem enviadas, image_file tem prioridade, depois image_file_b64, depois image_url e por último o corpo bruto. |
format | png | jpg | webp | Formato de saída. Padrão: png. JPG não tem transparência: ele é achatado sobre bg_color ou sobre branco. |
bg_color | cor | Preenche o fundo: hex (ffffff, #fff), rgb(255, 255, 255) ou white, black, red, green, blue, yellow, gray / grey. transparent (padrão) mantém transparente. |
size | preview | medium | hd | full | Limite de megapixels, mantém a proporção e nunca amplia: preview ≤ 0,25 MP, medium ≤ 1,5 MP, hd ≤ 4 MP, full (padrão) a resolução original (até 25 MP). Ignorado quando width ou height é definido. |
crop | true | false | W:H | Recorta na caixa delimitadora do objeto. Com uma proporção (1:1, 4:5, 4:3, 16:9…), a caixa é então expandida (nunca reduzida) para essa proporção ao redor do objeto; a área fora da foto fica transparente (ou com bg_color). Padrão: false. |
padding | px | fração | % | Com crop: margem adicionada em cada lado. 0.1 ou 10% = um décimo da largura (esquerda/direita) e da altura (topo/base) do objeto; "10%,7.5%" define horizontal e vertical separadamente; 24px (ou um número inteiro maior que 1, sem unidade) é em pixels, até 500. Padrão: 0. |
channels | rgba | rgb | alpha | rgba (padrão): recorte transparente. rgb: opaco, achatado sobre bg_color ou branco. alpha: máscara PNG em tons de cinza (branco = objeto), com o mesmo tamanho e recorte do recorte normal. type=mask continua funcionando como alias de alpha. |
width / height | 1–6000 | Tamanho de saída exato em pixels, aplicado depois do crop (substitui size). Com só um deles, o outro segue a proporção. Nunca estica. |
roi | x1 y1 x2 y2 | Região de interesse, em px ou % (ex.: 0% 0% 50% 100%). Só o objeto dentro dela é mantido; tudo fora vira fundo. As coordenadas se referem à imagem original. Padrão: a imagem inteira. |
fit | contain | cover | scale-down | Com width e height. contain (padrão): encaixa dentro, centralizado, e o resto fica transparente (ou com bg_color). cover: preenche a caixa, cortando o excesso ao redor do objeto. scale-down: como contain, mas nunca amplia. |
As opções são aplicadas nesta ordem: roi, size (ou width/height mais adiante), crop + padding + proporção, width/height + fit, depois channels ou a cor de fundo e, por fim, o formato. Todas as opções custam o mesmo 1 crédito. Parâmetros desconhecidos são ignorados.
Exemplo: JPG em HD sobre branco, recortado no objeto com 40 px de margem
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.jpgExemplo: imagem quadrada para marketplace, objeto centralizado com 10% de margem
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.jpgExemplo: entrada em base64, saída em máscara alfa
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
Os bytes da imagem, com estes headers:
| Header | Significado |
|---|---|
X-Image-Width / X-Image-Height | Tamanho do resultado em pixels (também enviado como X-Width / X-Height). |
X-Request-ID | Seu X-Request-ID, se você enviou um; caso contrário, um id gerado. Informe-o ao falar com o suporte. |
X-Processing-Time-Ms | Tempo gasto na requisição (também X-Processing-Ms). |
X-Matte-Confidence | 0–1: o quão definida é a máscara (média de |2a − 1| sobre os pixels, a = alfa). Perto de 1 é um recorte limpo; valores menores indicam muitas bordas suaves ou incertas. |
X-Matte-Ambiguous-Ratio | Fração de pixels com alfa estritamente entre 0,1 e 0,9 (cabelo, vidro, desfoque de movimento). Útil para sinalizar imagens para revisão. |
X-Credits-Remaining | Seu saldo depois desta imagem. |
X-Removal-Id | Id do resultado armazenado. |
X-Job-Id | Id do job por trás da requisição (pode ser usado com /v1/jobs/:id). |
202 Accepted (alternativa para filas longas)
Se a imagem não ficar pronta em cerca de 55 segundos, por exemplo quando a fila está muito movimentada, você recebe 202 com o JSON { id, status, status_url, result_url } (mais Location e Retry-After: 2). Consulte status_url até done ser true e depois baixe result_url. Você é cobrado uma única vez, só quando a imagem dá certo. Não envie a imagem de novo sem uma Idempotency-Key: isso inicia um segundo job. Veja Trate a resposta para um exemplo completo.
GET /v1/jobs/:id
Status de um job criado por /v1/remove ou /v1/batch. Mesma chave; você só vê os seus próprios jobs.
| Campo | Significado |
|---|---|
status | queued, processing, succeeded, partial, failed ou canceled |
done | true quando não resta mais nada para processar |
total, succeeded, failed, skipped | contagem de imagens |
credits_charged | créditos usados por este job (1 por imagem processada com sucesso) |
status_url, result_url | onde consultar o status e onde baixar |
items[] | por imagem: position, input, status, error { code, message } e, em caso de sucesso, removal_id, width, height, format, result_url |
GET /v1/jobs/:id/result
Os bytes da imagem de um job concluído, com os mesmos headers de /v1/remove. ?item=N escolhe uma imagem de um job em lote (padrão 0). Responde 409 not_ready com Retry-After: 2 enquanto ainda está rodando, ou com o próprio erro da imagem se ela falhou.
POST /v1/batch
Coloque até 100 URLs de imagens na fila como um único job: JSON { "image_urls": ["https://…", …], "format": "jpg", "bg_color": "ffffff", "size": "hd", "crop": "1:1", "padding": "10%" }, com as mesmas opções de /v1/remove (inclusive channels, width, height e fit). Responde 202 na hora com { id, status, total, invalid, duplicates, status_url }. Consulte o job e depois busque a result_url de cada item. 1 crédito por imagem que der certo; no máximo 3 jobs em lote abertos por conta. Passo a passo com respostas de exemplo em Lotes, do início ao fim.
Endpoint compatível com o remove.bg
A API self-service do remove.bg acaba em 1 December 2026, 09:00 CET (anúncio). Integrações existentes com o remove.bg funcionam aqui mudando uma linha: https://api.remove.bg/v1.0/removebg → https://removebackground.dev/v1.0/removebg, com uma chave do removebackground.dev no mesmo header X-Api-Key. Mesma fila, o mesmo 1 crédito por imagem processada com sucesso e a mesma qualidade de resultado de /v1/remove. Guia de migração.
POST /v1.0/removebg
Corpo multipart, urlencoded ou JSON com os nomes de parâmetros do remove.bg. Responde com os bytes da imagem e os headers do remove.bg, ou com { "data": { "result_b64", "foreground_top", "foreground_left", "foreground_width", "foreground_height" } } quando você envia Accept: application/json. Os erros usam o formato do remove.bg: { "errors": [{ "title", "code", "detail" }] }. Ao contrário de /v1/remove, ele nunca responde 202: espera até 110 segundos e então retorna um 503 de tempo limite. O job continua rodando e é cobrado se der certo, então repetir essa requisição inicia um segundo job.
| Parâmetro | Status | Observações |
|---|---|---|
image_file / image_file_b64 / image_url | Compatível | Corpos multipart, urlencoded ou JSON. JPG, PNG ou WebP de até 25 MB. |
size | Compatível | auto, full, 4k e 50MP dão a resolução original (até 25 MP); preview, small e regular ≈ 0,25 MP; medium 1,5 MP; hd 4 MP. Sempre 1 crédito. |
format | Compatível | auto (PNG se houver transparência, senão JPG), png, jpg, webp e zip (color.jpg + alpha.png). |
crop / crop_margin | Compatível | px ou % do objeto, de 1 a 4 valores no estilo CSS ("10% 20%" = vertical, horizontal); no máximo 500px ou 50% por lado. |
roi | Compatível | "x1 y1 x2 y2" em px ou %: só o objeto dentro da região é mantido. |
scale / position | Compatível | scale de 10% a 100% ou original; position center, original ou "x% y%". |
channels | Compatível | rgba (recorte) ou alpha (máscara em tons de cinza). |
bg_color | Compatível | Hex com ou sem # (81d4fa), ou o nome de uma cor. Um hex de 8 dígitos mantém a cor e descarta o alfa. |
bg_image_url / bg_image_file | Compatível | O recorte é sobreposto à sua imagem de fundo, ajustada em modo cover ao tamanho de saída. |
Accept: application/json | Compatível | Retorna { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } }. |
type / type_level | Aceito, ignorado | O objeto é detectado automaticamente; X-Type é sempre "other". |
semitransparency | Aceito, ignorado | Bordas suaves e áreas semitransparentes vêm da máscara do modelo do jeito que estão. |
shadow_type / shadow_opacity / add_shadow | Aceito, ignorado | Nenhuma sombra é adicionada. |
Requisições demoradas | Diferença | Esperamos até 110 segundos; se a imagem não estiver pronta até lá, você recebe um 503 que pode ser repetido (sem cobrança, a menos que tenha terminado). |
Exemplo
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/removebgHeaders de resposta
| Header | Significado |
|---|---|
X-Width / X-Height | Tamanho do resultado em pixels. |
X-Credits-Charged | Créditos usados por esta imagem: sempre 1 (imagens com falha custam 0). |
X-Type | Sempre "other" (a detecção do objeto é automática). |
X-Foreground-Top / -Left / -Width / -Height | Caixa delimitadora do objeto no resultado, em pixels. |
X-Request-ID | Repete o seu X-Request-ID, ou um id gerado. Extra. |
X-Matte-Confidence / X-Matte-Ambiguous-Ratio | O quão limpa está a máscara (0–1) e a proporção de pixels suaves. Extra: útil para sinalizar imagens para revisão. |
Erros
| Status | Significado |
|---|---|
400 | Parâmetro ou imagem inválidos (códigos como invalid_size, invalid_crop_margin, missing_source, file_too_large, unknown_foreground). |
402 | insufficient_credits: recarregue na página de preços. |
403 | auth_failed: X-Api-Key ausente ou inválida. |
429 | rate_limit_exceeded. |
500 / 503 | O processamento falhou, excedeu o tempo limite ou o serviço está indisponível por um momento. Tente de novo; imagens com falha são grátis. |
GET /v1.0/account
Seu saldo no formato de conta do remove.bg: { "data": { "attributes": { "credits": { "total", "subscription": 0, "payg", "enterprise": 0 }, "api": { "free_calls": 0, "sizes": "all" } } } }. Todos os créditos são pré-pagos e nunca expiram, então total é igual a payg. GET https://removebackground.dev/v1.0/account com o seu X-Api-Key.
Erros (endpoints /v1)
Imagens com falha nunca são cobradas.
| Status | Códigos | Significado |
|---|---|---|
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 | A requisição ou a URL da imagem não pode ser usada. |
401 | unauthorized | x-api-key ausente, incorreta ou revogada. |
402 | insufficient_credits, out_of_credits | Seu saldo está zerado. Recarregue na página de preços. |
404 | not_found | Esse job não existe (ou não é seu). |
409 | not_ready, canceled, idempotency_key_reused | GET …/result enquanto o job ainda está rodando (tente de novo após 2 s), o job foi cancelado ou uma Idempotency-Key foi reutilizada em outra requisição. |
410 | result_unavailable | O resultado foi apagado ou expirou. |
413 | too_large | A imagem tem mais de 25 MB. |
422 | processing_failed, invalid_image, missing_upload | O arquivo não é uma imagem legível. Sem cobrança. |
429 | rate_limited, too_many_batches | Acima do limite de requisições por conta (espere o Retry-After), ou você já tem 3 jobs em lote rodando. |
502 | model_unavailable, upstream_error, … | Não conseguimos processar a imagem após várias tentativas. Sem cobrança. |
503 | server_paused, unavailable | A API está pausada (antes do lançamento) ou indisponível por um momento. Tente de novo mais tarde. |
Lotes, do início ao fim
1. Enviar
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" }'Até 100 URLs públicas de imagens, mais qualquer uma das opções de /v1/remove. As duas URLs de exemplo acima custariam até 2 créditos se fossem imagens reais. A resposta vem na hora:
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 as entradas que não são URLs http(s) e duplicates conta as repetidas; ambas são descartadas e nunca cobradas. Guarde o id: é com ele que você retoma o job depois de uma reinicialização.
2. Consulte o job
GET /v1/jobs/:id a cada poucos segundos até done ser true. status passa de queued para processing e termina como succeeded, partial (algumas imagens falharam) ou failed. Um item que está sendo tentado de novo 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. Baixe cada resultado
GET /v1/jobs/:id/result?item=N para cada item bem-sucedido (ou use a result_url dele). item é a position, começando em zero. As posições seguem a sua lista depois que as URLs inválidas e repetidas são removidas, então, quando algum desses contadores for maior que 0, associe os resultados pelo input, e não pelo índice.
- Um lote deixa de contar para o limite de 3 lotes abertos assim que
doneé true. - A API não tem endpoint de cancelamento, webhooks nem download em ZIP. Lotes iniciados na página do Bulk podem ser cancelados ou baixados em ZIP por lá.
Novas tentativas, duplicatas e cobrança
Envie uma Idempotency-Key e as novas tentativas não cobram duas vezes. Adicione um header Idempotency-Key (qualquer string única de até 255 caracteres, como um UUID) em POST /v1/remove ou POST /v1/batch, uma chave por imagem ou lote. Se você enviar a mesma requisição de novo com a mesma chave, recebe o job criado pela primeira, com Idempotent-Replayed: true: nenhum job novo e nenhuma cobrança nova, mesmo que a primeira requisição ainda esteja rodando. A mesma chave com outra imagem ou outras opções responde 409 idempotency_key_reused. As chaves pertencem à sua conta e não expiram.
Sem chave, cada POST cria um job novo, e cada job bem-sucedido custa 1 crédito (o endpoint compatível com o remove.bg POST /v1.0/removebg não aceita chaves). Consultar um job (GET /v1/jobs/…) é sempre grátis e pode ser repetido sem risco.
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.pngO que custa um crédito
| Situação | Cobrança |
|---|---|
| Requisição recusada antes do processamento (chave inválida, opção inválida, grande demais, sem créditos) | Grátis. |
| A imagem não pode ser processada (422 imagem inválida, 502 após nossas novas tentativas) | Grátis. |
| A imagem dá certo | 1 crédito, cobrado uma única vez, quando dá certo. Nossas novas tentativas internas não geram cobranças extras. |
| Você recebe um 202 | Nada por enquanto. O job continua rodando e só é cobrado 1 crédito se der certo. |
| Seu cliente excede o tempo limite ou se desconecta enquanto espera | O job continua rodando e é cobrado se der certo. O resultado aparece no seu Studio. |
| Você envia a mesma requisição duas vezes com a mesma Idempotency-Key | Um único job, no máximo 1 crédito. A repetição recebe o mesmo job (header Idempotent-Replayed: true). |
| Você envia a mesma imagem duas vezes sem chave | Dois jobs separados; cada um que der certo custa 1 crédito. |
| Você baixa de novo um resultado pronto | Grátis, quantas vezes quiser enquanto estiver armazenado. |
| Um lote dá certo em parte | 1 crédito por imagem que deu certo; credits_charged no job mostra o total. |
| Um lote traz a mesma URL duas vezes | Repetições dentro de um mesmo lote são descartadas antes de entrar na fila e nunca cobradas. URLs idênticas em lotes diferentes são jobs separados. |
| Os créditos acabam durante um lote | As imagens já concluídas continuam pagas; o resto é marcado como ignorado (out_of_credits) e sai grátis. Compre créditos e envie as URLs restantes em um novo lote. |
Quando tentar de novo
| O que aconteceu | O que fazer |
|---|---|
| GET /v1/jobs/:id ou …/result falha (erro de rede, 5xx) | Pode tentar de novo sem risco: consultar um job nunca cria trabalho nem gera cobrança. Espere um pouco entre as tentativas. |
| GET …/result responde 409 not_ready | Espere o Retry-After (2 s) e consulte de novo. Não reenvie a imagem. |
| GET …/result responde 410 result_unavailable | O resultado armazenado foi apagado. Processar a imagem de novo é um job novo e custa 1 crédito. |
| POST responde 400, 413 ou 422 | Corrija primeiro a requisição ou a imagem; enviar sem mudanças dá a mesma resposta. |
| POST responde 401 ou 402 | Corrija a chave ou recarregue créditos. Não fique repetindo em loop. |
| POST responde 429 rate_limited | Espere os segundos indicados em Retry-After e envie de novo (com a mesma Idempotency-Key). Mais de 60 imagens por minuto? Use POST /v1/batch: uma requisição para até 100. |
| POST /v1/batch responde 429 too_many_batches | Espere um dos seus 3 lotes abertos terminar (consulte o status) e depois envie. |
| POST /v1/… responde 503 (unavailable, server_paused) | Nenhum job foi criado. Tente de novo depois de um tempo. (O endpoint compatível com o remove.bg é diferente: o 503 de tempo limite dele significa que o job ainda está rodando.) |
| POST /v1/remove responde 502 | Esse job falhou e não foi cobrado. Uma nova tentativa é um job novo. |
| O POST excede o tempo limite, a conexão cai ou você recebe 500 | Com Idempotency-Key: reenvie a mesma requisição com a mesma chave; você recebe o job original. Sem ela, o job talvez já exista e seja cobrado: confira seu Studio primeiro. |
| POST responde 409 idempotency_key_reused | Essa chave já foi usada com outra imagem ou outras opções. Gere uma chave nova para cada imagem nova. |
Limites e armazenamento
| Limite | Valor | Erro ao exceder |
|---|---|---|
| Arquivo de imagem | 25 MB (25 × 1024 × 1024 bytes); JPG, PNG ou WebP, detectado pelos bytes do arquivo | 413 too_large · 422 processing_failed |
| Corpo em Base64 / JSON | 25 MB depois de decodificado (o corpo da requisição pode ser cerca de um terço maior) | 413 too_large |
| Resolução de entrada | Imagens acima de 25 MP são reduzidas para 25 MP antes do processamento | — |
| Tamanho de saída | width e height, cada um de 1 a 6000 px | 400 invalid_width / invalid_height |
| Download de image_url | só http(s), tempo limite de 15 s, até 3 redirecionamentos; endereços privados, de loopback e link-local são recusados, em cada redirecionamento | 400 invalid_url · fetch_failed · fetch_timeout |
| Espera em POST /v1/remove | Cerca de 55 s; depois, 202 com o id do job | 202 |
| Tamanho do lote | 100 URLs de imagens por POST /v1/batch | 400 too_many_images |
| Lotes abertos | 3 jobs de várias imagens não concluídos por conta (imagens avulsas não contam) | 429 too_many_batches |
| Taxa de requisições | 60 requisições por minuto por conta, somando POST /v1/remove, /v1/batch e /v1.0/removebg. Um lote conta uma vez, seja qual for o tamanho. Consultar jobs não tem limite | 429 rate_limited (com Retry-After) |
Por quanto tempo os resultados ficam guardados
Cada resultado fica guardado de forma privada na sua conta por 48 horas depois de criado e depois é apagado. Até lá, você pode baixá-lo de novo, de graça, com GET /v1/jobs/:id/result ou pelo seu Studio. Depois disso, os links de resultado respondem 410 result_unavailable; processar a imagem de novo é um job novo. Os registros de status do job continuam disponíveis depois que a imagem é apagada. Veja a política de privacidade para saber como os envios são tratados; não usamos suas imagens para treinar modelos.
Segurança
Mantenha sua chave de API em um servidor que você controla. Não coloque a chave em código de navegador, apps de celular, repositórios públicos ou URLs. Para deixar seus próprios usuários removerem fundos, envie as imagens deles pelo seu backend e adicione lá o seu próprio login e limites de gasto.
- A API permite CORS para funcionar a partir de ferramentas e código no servidor. Isso não torna seguro colocar uma chave em uma página web: qualquer pessoa pode lê-la ali.
- Todas as chaves de uma conta usam o mesmo saldo de créditos. Crie uma chave separada por app ou ambiente na página da sua conta, para poder revogar uma sem quebrar as outras.
- Se uma chave vazar, revogue-a imediatamente na página da conta (ela para de funcionar na hora) e crie uma nova. Guardamos só um hash de cada chave, então não conseguimos mostrá-la de novo.
Solução de problemas
| Sintoma | O que está acontecendo |
|---|---|
| Meu PNG não abre | O corpo era JSON (um job 202 ou um erro), não uma imagem. Confira o status HTTP e o Content-Type antes de salvar. |
| Meu script excedeu o tempo limite, mas a imagem aparece no Studio | O job continuou rodando depois que você parou de esperar. Busque o resultado pelo id do job em vez de reenviar. |
| Fui cobrado duas vezes por uma imagem | Ela foi enviada duas vezes sem Idempotency-Key (muitas vezes por uma nova tentativa automática após um tempo limite). Use uma chave por imagem e reutilize-a nas novas tentativas. |
| A URL abre no meu navegador, mas a API não consegue baixá-la | O site pode exigir cookies ou login, bloquear servidores, redirecionar mais de 3 vezes ou demorar mais de 15 s, ou a URL assinada expirou. Envie o arquivo em vez disso. |
| Meu lote parou no meio | Veja items[] no job: itens com falha têm um código de erro; itens ignorados com out_of_credits indicam que o saldo acabou. |
| Uma opção parece não fazer nada | Nomes de parâmetros desconhecidos são ignorados sem aviso. Confira a grafia na tabela de parâmetros. Em /v1.0/removebg, algumas opções do remove.bg são aceitas, mas ignoradas (veja aquela tabela). |
| O fundo não está transparente | JPG não tem transparência. Use format=png ou webp e não defina bg_color. |
| O link do resultado retorna 410 | O resultado armazenado foi apagado. Processar de novo custa 1 crédito. |