Remover um fundo à mão leva alguns minutos por foto. Fazer isso em cada upload de produto, foto de perfil ou thumbnail do seu app exige uma API para remover fundo: entra uma requisição HTTP, sai um recorte pronto.
Este guia mostra como integrar uma do jeito certo. Você terá código funcional em cURL, Python e JavaScript, as opções de saída que vale conhecer, como lidar com imagens lentas e jobs em massa, e como repetir requisições sem pagar duas vezes. Os exemplos usam o removebackground.dev, nosso produto irmão, mas os padrões valem para qualquer provedor.
Como funciona uma API para remover fundo
Você envia uma imagem, o provedor executa um modelo de segmentação que separa o objeto principal do fundo, e você recebe uma nova imagem. O núcleo do resultado é um canal alfa: um valor por pixel que diz quanto de cada pixel pertence ao objeto principal. Pixels totalmente opacos são o objeto, pixels totalmente transparentes são fundo, e os valores intermediários cuidam de bordas suaves como cabelo, pelos e vidro.
A partir dessa máscara, a API pode devolver várias coisas:
- Um recorte transparente, geralmente um PNG ou WebP sem o fundo
- O objeto sobre uma cor sólida, achatado em um JPG para marketplaces que exigem fundo branco
- A própria máscara, uma imagem em tons de cinza que você pode usar no seu próprio pipeline de composição
- Uma versão recortada ou redimensionada, ajustada ao objeto e a um tamanho exato
A requisição é a parte fácil. Uma integração em produção também precisa lidar com imagens que demoram mais que o normal, lotes grandes, limites de taxa, retries e manter a chave de API longe dos usuários.
O que avaliar em uma API para remover fundo
Antes de escrever código, confira estes pontos com suas próprias imagens e seu tráfego.
| Critério | O que verificar | Por que importa |
|---|---|---|
| Qualidade das bordas | Cabelo, pelos, objetos transparentes e fundos poluídos em 20 a 50 das suas próprias imagens | A diferença entre provedores aparece nos casos difíceis |
| Métodos de entrada | Upload de arquivo, URL pública, base64, bytes brutos | Define se você pode chamar a API de um worker de fila sem baixar as imagens antes |
| Opções de saída | Formato, cor de fundo, recorte, margem, tamanho exato, saída de máscara | Evita uma segunda etapa de processamento de imagem do seu lado |
| Imagens lentas | O que acontece quando uma imagem demora mais que seu timeout HTTP | Sem um id de job você pode pagar duas vezes ao repetir |
| Processamento em massa | Endpoint de lote, tamanho do lote, como falhas parciais são informadas | Define como você processa importações de catálogo |
| Cobrança | Cobrança por sucesso ou por requisição, assinatura ou créditos, se os créditos expiram | Imagens com falha e retries se acumulam em grande volume |
| Limites | Tamanho de arquivo, resolução, limite de taxa, tempo de armazenamento do resultado | Define o desenho da sua fila e do seu armazenamento |
| Privacidade | Por quanto tempo uploads e resultados são guardados, se as imagens treinam modelos | Muitas vezes é uma exigência obrigatória dos clientes |
Passo 1: Crie uma chave de API
Cadastre-se no removebackground.dev e crie uma chave na página da sua conta. Contas novas ganham 50 créditos grátis, o suficiente para rodar os exemplos abaixo e testar com suas próprias imagens.
Guarde a chave em uma variável de ambiente no seu servidor:
export REMOVEBG_API_KEY="your_api_key"
Toda chamada envia a chave no header x-api-key, e toda chamada gasta os créditos daquela conta. Crie uma chave separada por app ou ambiente para poder revogar uma sem quebrar as outras.
Passo 2: Remova um fundo com cURL
O endpoint em tempo real é POST https://removebackground.dev/v1/remove. O teste mais rápido é um upload de arquivo:
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
A maioria das imagens avulsas volta pronta na mesma resposta, normalmente em poucos segundos, como PNG transparente em resolução total.
O endpoint aceita a imagem de quatro formas. Envie uma delas:
| Entrada | Como enviar |
|---|---|
| image_file | Dados de formulário multipart. JPG, PNG ou WebP, até 25 MB |
| image_url | Uma URL http(s) pública. A API baixa a imagem, seguindo até 3 redirecionamentos, com timeout de 15 segundos |
| image_file_b64 | Base64 em um corpo JSON, com ou sem prefixo data:image, até 25 MB após decodificar |
| Corpo bruto | Os bytes da imagem com Content-Type image/jpeg, image/png, image/webp ou application/octet-stream |
Se uma requisição trouxer várias, image_file vence, depois image_file_b64, depois image_url e por fim o corpo bruto. As opções podem ser enviadas como campos de formulário, chaves JSON ou valores de query string.
Um ponto de atenção: -o salva o corpo qualquer que seja o status. Se a chave estiver errada ou a imagem for inválida, seu "PNG" na verdade é um erro em JSON. Verifique o código de status antes de confiar no arquivo.
Passo 3: Trate 200, 202 e erros em Python
Uma API para remover fundo não pode prometer que toda imagem termine dentro de uma única requisição HTTP. Quando a fila está mais cheia que o normal e uma imagem leva mais de uns 55 segundos, o removebackground.dev responde 202 Accepted com um id de job em vez da imagem. O job continua rodando, e você busca o resultado com o id.
| 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 com id, status, status_url e result_url | Espere alguns segundos e faça um GET do resultado. Não envie a imagem de novo |
| 4xx ou 5xx | JSON: {"error": {"code", "message"}} | Leia o código. Não salve o corpo como imagem |
A regra principal: nunca reenvie a imagem depois de um 202. Isso inicia um segundo job e pode custar um segundo crédito. Aqui está uma versão completa em Python que envia a imagem uma única vez e só repete as chamadas 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: a retry with the same key returns the same job, never a second charge.
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 is the image; anything else raises
# 202: still processing. Wait for the same job.
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 /v1/jobs/{job_id} later.")
print(remove_background("https://example.com/photo.jpg"))
Ela precisa de Python 3 e requests (pip install requests). Dois detalhes passam fácil despercebidos. Primeiro, parar o script não para o job: ele ainda pode terminar e ser cobrado, e o resultado aparece no Studio da sua conta. Segundo, GET /v1/jobs/:id/result responde 409 not_ready enquanto o job está rodando, então trate isso como "aguarde", não como falha.
O mesmo fluxo em JavaScript (Node.js)
O mesmo fluxo em Node.js 18 ou mais recente, usando fetch, FormData e Blob nativos, com upload de um arquivo local:
import { readFile, writeFile } from "node:fs/promises"
import { randomUUID } from "node:crypto"
const API = "https://removebackground.dev"
const KEY = process.env.REMOVEBG_API_KEY // server side only
const EXT = { "image/png": ".png", "image/jpeg": ".jpg", "image/webp": ".webp" }
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
async function save(res, stem) {
const mime = (res.headers.get("content-type") || "").split(";")[0]
if (res.status !== 200 || !EXT[mime]) {
throw new Error("HTTP " + res.status + ": " + (await res.text()).slice(0, 500))
}
const path = stem + EXT[mime]
await writeFile(path, Buffer.from(await res.arrayBuffer()))
return path
}
export async function removeBackground(filePath, stem = "result", maxWaitMs = 300000) {
const form = new FormData()
form.append("image_file", new Blob([await readFile(filePath)]), "upload")
form.append("format", "png")
const res = await fetch(API + "/v1/remove", {
method: "POST",
// Reuse the same Idempotency-Key if you retry this POST.
headers: { "x-api-key": KEY, "Idempotency-Key": randomUUID() },
body: form,
})
if (res.status !== 202) return save(res, stem)
const { id } = await res.json()
const deadline = Date.now() + maxWaitMs
while (Date.now() < deadline) {
await sleep(2000)
const result = await fetch(API + "/v1/jobs/" + id + "/result", {
headers: { "x-api-key": KEY },
})
if (result.status === 409) {
const body = await result.json()
if (body.error && body.error.code === "not_ready") continue
throw new Error("Job " + id + ": " + body.error.code)
}
return save(result, stem)
}
throw new Error("Job " + id + " is still running. Check /v1/jobs/" + id + " later.")
}
console.log(await removeBackground("photo.jpg"))
A API aceita requisições CORS, o que ajuda em ferramentas e testes. Isso não torna seguro chamá-la de uma página web com sua chave dentro. Mais sobre isso na seção de segurança abaixo.
Passo 4: Controle a saída
A maioria dos apps não quer um recorte bruto em resolução total. Quer uma imagem de produto quadrada sobre branco, uma prévia pequena ou uma máscara. Pedir à API o arquivo final poupa uma segunda etapa de processamento. Estas são as opções de /v1/remove:
| Parâmetro | Valores | O que faz |
|---|---|---|
| format | png, jpg, webp | Formato de saída. Padrão png. JPG não tem transparência e é achatado sobre bg_color, ou branco |
| bg_color | Hex (ffffff, #fff), rgb(255, 255, 255) ou um nome de cor | Preenche o fundo. Padrão transparente |
| size | preview, medium, hd, full | Limite de megapixels mantendo a proporção, nunca amplia: preview até 0,25 MP, medium 1,5 MP, hd 4 MP, full é o original (até 25 MP) |
| crop | true, false ou uma proporção como 1:1, 4:5, 16:9 | Recorta no objeto. Com uma proporção, a área é ampliada para essa proporção em volta do objeto |
| padding | Pixels, uma fração ou uma porcentagem | Margem adicionada em volta do objeto ao recortar, até 500 px |
| channels | rgba, rgb, alpha | Recorte transparente (padrão), imagem opaca ou máscara em tons de cinza com o objeto em branco |
| width, height | 1 a 6000 | Tamanho de saída exato em pixels, aplicado depois do recorte. Nunca esticado |
| fit | contain, cover, scale-down | Como a imagem se ajusta quando você define width e height |
| roi | x1 y1 x2 y2 em px ou % | Só o objeto dentro dessa região é mantido |
Toda opção custa o mesmo 1 crédito, e parâmetros desconhecidos são ignorados em silêncio, então um erro de digitação não vai gerar erro. Uma imagem quadrada para marketplace com o produto centralizado e 10% de margem fica assim:
curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_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
Uma resposta bem-sucedida também traz headers úteis. X-Credits-Remaining mostra seu saldo depois da imagem. X-Matte-Confidence (0 a 1) diz o quão definida é a máscara, e X-Matte-Ambiguous-Ratio dá a proporção de pixels suaves, como cabelo, vidro ou desfoque de movimento. Registrar esses dois valores permite sinalizar recortes de baixa confiança para revisão humana em vez de conferir cada imagem.
Passo 5: Processe imagens em lote
Para importações de catálogo e reprocessamentos, não dispare centenas de requisições avulsas. POST /v1/batch coloca na fila até 100 URLs públicas de imagens como um único job, com as mesmas opções de /v1/remove, e responde 202 na hora:
import os
import time
import uuid
import requests
API = "https://removebackground.dev"
s = requests.Session()
s.headers["x-api-key"] = os.environ["REMOVEBG_API_KEY"]
urls = ["https://example.com/front.jpg", "https://example.com/back.jpg"]
job = s.post(f"{API}/v1/batch",
json={"image_urls": urls, "format": "png", "size": "hd"},
headers={"Idempotency-Key": str(uuid.uuid4())}, timeout=30)
job.raise_for_status()
job_id = job.json()["id"] # save it: it's how you resume after a restart
while True:
time.sleep(3)
status = s.get(f"{API}/v1/jobs/{job_id}", timeout=30).json()
if status["done"]:
break
print(status["status"], "credits charged:", status["credits_charged"])
for item in status["items"]:
if item["status"] != "succeeded":
print("failed:", item["input"], item.get("error"))
continue
img = s.get(item["result_url"], timeout=60)
with open(f"out-{item['position']}.{item['format']}", "wb") as f:
f.write(img.content)
Algumas regras da documentação para levar em conta:
- O status do job termina como succeeded, partial (algumas imagens falharam) ou failed. Cada item em
itemstem seu próprio status e, em caso de falha, um código de erro. - Entradas que não são URLs http(s) e URLs repetidas são descartadas e nunca cobradas. Quando alguma dessas contagens for maior que 0, associe os resultados por
inputem vez de pela posição. - Você pode ter no máximo 3 jobs de lote abertos por conta. Um lote deixa de contar quando
doneé true. - Se os créditos acabarem no meio do lote, as imagens concluídas continuam pagas e o restante é marcado como ignorado com out_of_credits, sem custo.
- A API não tem endpoint de cancelamento, webhooks nem download em ZIP, então o padrão é fazer polling. Ler um job é grátis e não tem limite de taxa.
Prefere um script pronto para rodar? O guia de lotes com Python mostra um fluxo completo de pasta para pasta.
Passo 6: Repita com segurança e mantenha a cobrança previsível
Timeouts de rede são a origem das cobranças em dobro. Seu cliente desiste, tenta de novo e agora existem dois jobs para uma imagem. A solução é um header Idempotency-Key: qualquer string única com até 255 caracteres, como um UUID, uma por imagem ou lote. Se você enviar a mesma requisição de novo com a mesma chave, recebe o job criado pela primeira, com o header Idempotent-Replayed: true, e sem nova cobrança. Reutilizar uma chave para outra imagem retorna 409 idempotency_key_reused.
| Resposta | O que fazer |
|---|---|
| Erro de rede, timeout ou 500 no POST | Reenvie a mesma requisição com a mesma Idempotency-Key |
| 429 rate_limited | Espere os segundos indicados em Retry-After e reenvie com a mesma chave |
| 429 too_many_batches | Espere até um dos seus 3 lotes abertos terminar |
| 400, 413 ou 422 | Corrija a requisição ou a imagem. Reenviar sem mudanças dá a mesma resposta |
| 401 ou 402 | Corrija a chave ou recarregue créditos. Não fique em loop |
| 409 not_ready em um resultado | Espere 2 segundos e pergunte de novo. Não reenvie a imagem |
| 410 result_unavailable | O resultado armazenado foi apagado. Processar de novo é um novo job e custa 1 crédito |
| 502 no POST | Esse job falhou e não foi cobrado. Uma nova tentativa é um novo job |
A cobrança segue uma regra simples: 1 crédito quando a imagem dá certo, nada quando falha. Requisições rejeitadas antes do processamento, imagens ilegíveis e falhas depois dos retries do próprio provedor são gratuitas, e baixar de novo um resultado pronto é grátis enquanto ele estiver armazenado.
Limites para considerar no projeto
| Limite | Valor |
|---|---|
| Arquivo de imagem | 25 MB, JPG, PNG ou WebP, detectado pelos bytes do arquivo |
| Resolução de entrada | Imagens acima de 25 MP são reduzidas para 25 MP antes do processamento |
| Tamanho de saída | Largura e altura de 1 a 6000 px cada |
| Download de image_url | Apenas http(s), timeout de 15 segundos, até 3 redirecionamentos. Endereços privados e de loopback são recusados |
| Espera no POST /v1/remove | Cerca de 55 segundos, depois 202 com um id de job |
| Tamanho do lote | 100 URLs de imagens por requisição |
| Lotes abertos | 3 por conta |
| Taxa de requisições | 60 requisições por minuto por conta somando os endpoints POST. Um lote conta uma vez, seja qual for o tamanho |
| Armazenamento do resultado | 48 horas, depois é apagado |
Se você precisa de mais de 60 imagens por minuto, a resposta é o endpoint de lote: uma requisição cobre até 100 imagens. Guarde os resultados no seu próprio bucket assim que baixá-los, porque depois de 48 horas os links de resultado respondem 410. Segundo a documentação do provedor, as imagens enviadas não são usadas para treinar modelos.
Migrando da API do remove.bg
O site independente e a API self-service do remove.bg terminam em 1º de dezembro de 2026, às 09:00 CET. A API vai para a Leonardo.Ai, o que exige mudar sua integração. Se você prefere não reescrever nada, o removebackground.dev tem um endpoint compatível com o remove.bg, e a migração é uma linha:
| Antes | Depois |
|---|---|
| https://api.remove.bg/v1.0/removebg | https://removebackground.dev/v1.0/removebg |
Você mantém o mesmo header X-Api-Key (com uma chave do removebackground.dev), os mesmos nomes de parâmetros, os mesmos headers de resposta e o mesmo formato de erros:
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
Conheça as diferenças antes de trocar:
- Sem 202. O endpoint compatível espera até 110 segundos e depois retorna um timeout 503. O job continua rodando e é cobrado se der certo, então repetir essa requisição às cegas inicia um segundo job.
- Sem chaves de idempotência neste endpoint. Se você precisa de retries seguros, migre para
/v1/removecom o tempo. - Algumas opções são aceitas mas ignoradas: type e type_level (o objeto é detectado automaticamente), semitransparency e as opções de sombra (nenhuma sombra é adicionada).
- O tamanho sempre custa 1 crédito, inclusive a resolução total.
O guia de migração traz código de antes e depois para cURL, Python, Node e PHP, além de passos para Zapier, Make e n8n.
Mantenha sua chave de API fora do cliente
Esse é o erro que custa dinheiro de verdade. Se sua chave está em uma página web, um app mobile, um repositório público ou uma URL, qualquer pessoa pode lê-la e gastar seus créditos.
- Para permitir que seus usuários removam fundos, envie as imagens deles pelo seu backend e chame a API a partir dele.
- Adicione seu próprio login e limites de gasto por usuário nesse backend.
- Use uma chave por app ou ambiente.
- Se uma chave vazar, revogue-a na página da conta. Ela para de funcionar na hora. O provedor guarda apenas um hash de cada chave, então crie uma nova em vez de tentar recuperar a antiga.
Exemplo: recortes para thumbnails do YouTube
Se você cria ferramentas para criadores, thumbnails são um uso óbvio. Uma thumbnail é vista quase sempre em tamanho pequeno, então o recorte precisa segurá-la: um rosto ou produto, grande, com borda nítida sobre um fundo simples. O YouTube recomenda 3840 x 2160 px em 16:9 com largura mínima de 640 px, e aceita JPG ou PNG de até 50 MB pelo computador, mas só 2 MB pelo app mobile.
Do lado da API, é uma única chamada que devolve um PNG transparente recortado no objeto, pronto para colocar em uma tela 16:9:
curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_API_KEY" \
-F 'image_file=@me.jpg' \
-F 'crop=true' -F 'padding=5%' \
-o me-cutout.png
Tire uma foto de verdade para o recorte em vez de capturar um frame do vídeo, já que frames costumam ter desfoque de movimento, e deixe o canto inferior direito livre, porque o YouTube mostra a duração do vídeo ali. A página de thumbnails do YouTube cobre a parte de design, e nosso guia para conseguir seus primeiros 1.000 inscritos explica por que as thumbnails importam tanto.
Removendo fundos pelo ChatGPT, Claude ou Cursor
Nem todo trabalho precisa de código. O removebackground.dev também roda um servidor MCP em https://removebackground.dev/mcp, então você pode enviar uma foto no ChatGPT, Claude, Cursor, VS Code ou n8n e pedir para remover o fundo. No Claude Code, é um comando:
claude mcp add --transport http removebackground https://removebackground.dev/mcp
Depois digite /mcp no Claude Code para fazer login. O servidor oferece três ferramentas: remove_background, get_job para remoções que demoram mais que alguns segundos, e check_credits. Cada imagem custa 1 crédito, o mesmo que pela API.
Quanto custa
O removebackground.dev é pré-pago por uso, sem assinatura. Os créditos nunca expiram, imagens com falha são gratuitas e contas novas ganham 50 créditos grátis. Pela API, 1 crédito equivale a uma remoção de fundo bem-sucedida em resolução total.
| Pacote | Créditos | Preço | Por imagem |
|---|---|---|---|
| Starter | 4.000 | US$ 17 | US$ 0,0043 |
| Pro | 15.000 | US$ 49 | US$ 0,0033 |
| Scale | 40.000 | US$ 99 | US$ 0,0025 |
Os preços são em USD, e créditos não usados podem ser reembolsados em até 30 dias. Preços por volume acima do Scale estão disponíveis sob consulta. Veja a página de preços para os detalhes atuais.
Conclusão
Uma boa integração para remover fundo se resume a alguns hábitos: mantenha a chave no seu servidor, verifique o status antes de salvar o corpo, espere o job em vez de reenviar depois de um 202, envie um Idempotency-Key em cada POST e use o endpoint de lote para trabalho em massa.
A referência completa, incluindo a especificação OpenAPI 3.1, está na documentação da API. Se você trabalha com vídeo além de imagens, nossa comparação de APIs de transcrição do YouTube e nosso guia de integração de voz para texto usam os mesmos padrões de produção para texto.
Perguntas frequentes
O que é uma API para remover fundo de imagens?+
É um endpoint HTTP que recebe uma imagem e devolve a mesma imagem sem o fundo, normalmente como PNG com fundo transparente. Você envia um arquivo, uma URL ou base64, e o provedor executa o modelo de segmentação para você.
Como removo o fundo de uma imagem em Python?+
Use a biblioteca requests para fazer um POST da imagem para a API com sua chave em um header e salve o corpo da resposta em um arquivo quando o status for 200. Se a API puder responder 202 para imagens lentas, consulte a URL de resultado do job em vez de reenviar a imagem. O exemplo em Python deste guia trata os dois casos.
Quanto custa uma API para remover fundo?+
Depende do provedor. O removebackground.dev cobra 1 crédito por imagem processada com sucesso, com pacotes de créditos de US$ 17 por 4.000 créditos (US$ 0,0043 por imagem) a US$ 99 por 40.000 créditos (US$ 0,0025 por imagem). Não há assinatura, os créditos nunca expiram, imagens com falha são gratuitas e contas novas ganham 50 créditos grátis.
Posso continuar usando meu código do remove.bg depois que a API do remove.bg for desativada?+
A API self-service do remove.bg termina em 1º de dezembro de 2026, às 09:00 CET. O removebackground.dev tem um endpoint compatível com o remove.bg, então você troca a URL de https://api.remove.bg/v1.0/removebg para https://removebackground.dev/v1.0/removebg e usa uma chave do removebackground.dev no mesmo header X-Api-Key.
Posso chamar uma API para remover fundo direto do navegador?+
Não deveria. Qualquer pessoa consegue ler uma chave de API que vai junto com uma página web ou um app. Envie as imagens pelo seu próprio backend, mantenha a chave lá e adicione seu próprio login e limites de gasto para seus usuários.
Como consigo um PNG transparente em vez de um fundo branco?+
Peça saída em PNG ou WebP e não defina a cor de fundo. JPG não armazena transparência, então um resultado em JPG é sempre achatado sobre uma cor sólida.