API real-time

API hapus background: satu request masuk, PNG jadi keluar.

Unggah file, kirim URL gambar publik, atau berikan base64. Sebagian besar gambar tunggal kembali dalam keadaan jadi di respons HTTP yang sama, biasanya dalam beberapa detik. Jika ada yang butuh waktu lebih lama, Anda menerima job id untuk mengambil hasilnya, tanpa mengirim ulang gambar. Endpoint batch tersedia untuk pemrosesan bulk.

1 kredit per gambar yang berhasil · gambar yang gagal gratis · key ada di akun Anda

$ 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 · biasanya beberapa detik
  dog.png tersimpan (transparan, resolusi penuh)
1 Gambar Anda2 Satu request HTTP3 PNG dalam respons

Mulai cepat

Salin, tempel, ganti YOUR_API_KEY. Setiap contoh langsung menyimpan hasilnya ke file, dan contoh JavaScript serta Python juga menunggu jika menerima 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

Kirim gambar Anda

POST /v1/remove menerima gambar dengan salah satu dari empat cara. Kirim salah satunya; jika sebuah request membawa beberapa sekaligus, image_file yang dipakai, lalu image_file_b64, lalu image_url, lalu raw body. Contoh-contoh ini membaca key Anda dari environment variable REMOVEBG_API_KEY (atur dengan export REMOVEBG_API_KEY=…); perhatikan tanda kutip ganda, yang membuat shell mengisinya.

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

Multipart form data, field image_file. JPG, PNG, atau WebP, hingga 25 MB.

Setiap contoh menyimpan body ke file. File itu hanya berupa gambar jika statusnya 200; lihat Tangani respons.

Tangani respons

Sebagian besar gambar tunggal kembali dalam keadaan jadi di respons yang sama. Saat antrean sedang sangat sibuk dan sebuah gambar butuh lebih dari sekitar 55 detik, Anda menerima 202 Accepted dengan job id sebagai gantinya. Job tetap berjalan: ambil hasilnya dengan id tersebut. Mengirim ulang gambar akan memulai job kedua dan bisa memakai kredit kedua.

StatusBodyYang harus dilakukan
200Gambar (image/png, image/jpeg, atau image/webp)Simpan. Gunakan Content-Type untuk memilih ekstensi file.
202JSON: { id, status, status_url, result_url }Bukan gambar. Tunggu beberapa detik, lalu lakukan GET ke result_url. Jangan kirim ulang gambarnya.
4xx / 5xxJSON: { "error": { "code", "message" } }Bukan gambar. Baca kodenya (lihat Error) dan jangan simpan body sebagai gambar.

Contoh lengkap

Menangani gambar yang sudah jadi, 202, job yang gagal, dan batas waktu lokal. Contoh ini mengirim gambar sekali dan hanya mengulang pengecekan status yang aman.

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"))

Butuh Python 3 dan requests (pip install requests).

  • Menghentikan skrip Anda tidak menghentikan job; job masih bisa selesai dan dikenai biaya. Hasilnya muncul di Studio Anda.
  • Batas waktu itu pilihan Anda, bukan janji dari kami; sebagian besar gambar selesai dalam beberapa detik.
  • Endpoint yang kompatibel dengan remove.bg berperilaku berbeda: endpoint itu tidak pernah membalas 202 (lihat di bawah).

Autentikasi

Kirim API key Anda di header x-api-key. Buat dan cabut key di halaman akun Anda; setiap panggilan memakai kredit akun tersebut. Semua endpoint berada di bawah https://removebackground.dev dan menerima request CORS, tetapi CORS tidak membuat key aman ditaruh di halaman web: simpan di server Anda (lihat Keamanan). Error berupa JSON: { "error": { "code": "…", "message": "…" } }.

Kontrak lengkapnya dipublikasikan sebagai OpenAPI 3.1 (openapi.json), untuk generator client, Postman, atau pengujian; asisten coding AI bisa memulai dari llms.txt.

POST /v1/remove

Real-time. Hapus background dari satu gambar. Biasanya gambar yang sudah jadi menjadi body respons (image/png, image/jpeg, atau image/webp), umumnya setelah beberapa detik. Parameter bisa berupa field form, key JSON, atau nilai query string; Anda juga bisa melakukan POST raw byte gambar dengan Content-Type: image/jpeg, image/png, image/webp, atau application/octet-stream. Maksimal 25 MB. Lihat Kirim gambar Anda untuk setiap metode input.

ParameterTipeDeskripsi
image_filefileGambar (JPG, PNG, atau WebP), sebagai multipart form data.
image_file_b64stringGambar dalam base64, dengan atau tanpa prefix data:image/…;base64, (25 MB setelah didekode). Praktis dari JSON.
image_urlstringURL http(s) publik dari gambar. Kami mengunduhnya (maksimal 3 redirect, 15 detik). Jika beberapa dikirim, image_file yang dipakai, lalu image_file_b64, lalu image_url, lalu raw body.
formatpng | jpg | webpFormat output. Default png. JPG tidak punya transparansi: gambar diratakan ke bg_color, atau putih.
bg_colorwarnaIsi background: hex (ffffff, #fff), rgb(255, 255, 255), atau white, black, red, green, blue, yellow, gray / grey. transparent (default) membiarkannya transparan.
sizepreview | medium | hd | fullBatas megapiksel, rasio aspek dipertahankan, tidak pernah diperbesar: preview ≤ 0,25 MP, medium ≤ 1,5 MP, hd ≤ 4 MP, full (default) resolusi asli (hingga 25 MP). Diabaikan jika width atau height diatur.
croptrue | false | W:HPotong ke kotak pembatas objek. Dengan rasio aspek (1:1, 4:5, 4:3, 16:9…), kotak itu lalu diperluas (tidak pernah dipersempit) ke rasio tersebut di sekitar objek; area di luar foto menjadi transparan (atau bg_color). Default false.
paddingpx | pecahan | %Dengan crop: margin yang ditambahkan ke setiap sisi. 0.1 atau 10% = sepersepuluh lebar objek (kiri/kanan) dan tingginya (atas/bawah); "10%,7.5%" mengatur horizontal dan vertikal secara terpisah; 24px (atau bilangan bulat di atas 1 tanpa satuan) berarti piksel, hingga 500. Default 0.
channelsrgba | rgb | alphargba (default): potongan transparan. rgb: tidak transparan, diratakan ke bg_color atau putih. alpha: mask PNG grayscale (putih = objek), dengan ukuran dan potongan yang sama seperti hasil potongan. type=mask tetap berfungsi sebagai alias dari alpha.
width / height1–6000Ukuran output persis dalam piksel, diterapkan setelah crop (menggantikan size). Jika hanya satu yang diisi, yang lain mengikuti rasio aspek. Tidak pernah direnggangkan.
roix1 y1 x2 y2Area fokus (region of interest), dalam px atau % (mis. 0% 0% 50% 100%). Hanya objek di dalamnya yang dipertahankan; semua di luar menjadi background. Koordinat mengacu pada gambar asli. Default: seluruh gambar.
fitcontain | cover | scale-downDengan width dan height. contain (default): muat di dalam, di tengah, sisanya transparan (atau bg_color). cover: isi kotak, memotong bagian yang berlebih di sekitar objek. scale-down: seperti contain, tetapi tidak pernah diperbesar.

Opsi diterapkan dengan urutan ini: roi, size (atau width/height nanti), crop + padding + rasio aspek, width/height + fit, lalu channels atau warna background, lalu format. Setiap opsi memakai biaya yang sama, yaitu 1 kredit. Parameter yang tidak dikenal diabaikan.

Contoh: JPG HD dengan background putih, dipotong sesuai objek dengan padding 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

Contoh: gambar persegi untuk marketplace, objek di tengah dengan padding 10%

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

Contoh: input base64, output alpha mask

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

Byte gambar, dengan header berikut:

HeaderArti
X-Image-Width / X-Image-HeightUkuran hasil dalam piksel (juga dikirim sebagai X-Width / X-Height).
X-Request-IDX-Request-ID Anda jika Anda mengirimnya, jika tidak, id yang dibuat otomatis. Sebutkan saat menghubungi tim bantuan.
X-Processing-Time-MsWaktu yang dihabiskan untuk request (juga X-Processing-Ms).
X-Matte-Confidence0–1: seberapa tegas mask-nya (rata-rata |2a − 1| di semua piksel, a = alpha). Mendekati 1 berarti potongan bersih; nilai lebih rendah berarti banyak tepi yang lembut atau tidak pasti.
X-Matte-Ambiguous-RatioProporsi piksel dengan alpha di antara 0,1 dan 0,9 (rambut, kaca, motion blur). Berguna untuk menandai gambar yang perlu ditinjau.
X-Credits-RemainingSaldo Anda setelah gambar ini.
X-Removal-IdId hasil yang disimpan.
X-Job-IdId job di balik request (bisa dipakai dengan /v1/jobs/:id).

202 Accepted (cadangan untuk antrean panjang)

Jika gambar belum selesai dalam sekitar 55 detik, misalnya saat antrean sedang sangat sibuk, Anda menerima 202 dengan JSON { id, status, status_url, result_url } (ditambah Location dan Retry-After: 2). Lakukan poll ke status_url sampai done bernilai true, lalu unduh result_url. Anda ditagih sekali, hanya jika gambar berhasil. Jangan kirim ulang gambar tanpa Idempotency-Key: itu akan memulai job kedua. Lihat Tangani respons untuk contoh lengkap.

GET /v1/jobs/:id

Status job yang dibuat oleh /v1/remove atau /v1/batch. Key yang sama; Anda hanya melihat job milik Anda sendiri.

FieldArti
statusqueued, processing, succeeded, partial, failed, atau canceled
donetrue setelah tidak ada lagi yang perlu dijalankan
total, succeeded, failed, skippedjumlah gambar
credits_chargedkredit yang dipakai job ini (1 per gambar yang berhasil)
status_url, result_urltempat untuk poll, dan tempat untuk mengunduh
items[]per gambar: position, input, status, error { code, message }, dan jika berhasil removal_id, width, height, format, result_url

GET /v1/jobs/:id/result

Byte gambar dari job yang sudah selesai, dengan header yang sama seperti /v1/remove. ?item=N memilih satu gambar dari job batch (default 0). Membalas 409 not_ready dengan Retry-After: 2 selama masih berjalan, atau error gambar itu sendiri jika gagal.

POST /v1/batch

Masukkan hingga 100 URL gambar ke antrean sebagai satu job: JSON { "image_urls": ["https://…", …], "format": "jpg", "bg_color": "ffffff", "size": "hd", "crop": "1:1", "padding": "10%" }, dengan opsi yang sama seperti /v1/remove (termasuk channels, width, height, dan fit). Langsung membalas 202 dengan { id, status, total, invalid, duplicates, status_url }. Lakukan poll ke job, lalu ambil result_url setiap item. 1 kredit per gambar yang berhasil; maksimal 3 job batch terbuka per akun. Panduan dengan contoh respons ada di Batch, dari awal sampai akhir.

Endpoint yang kompatibel dengan remove.bg

API self-serve remove.bg berakhir 1 December 2026, 09:00 CET (pengumuman). Integrasi remove.bg yang sudah ada bisa berjalan di sini dengan mengubah satu baris: https://api.remove.bg/v1.0/removebg → https://removebackground.dev/v1.0/removebg, dengan key removebackground.dev di header X-Api-Key yang sama. Antrean yang sama, 1 kredit per gambar yang berhasil, kualitas output yang sama seperti /v1/remove. Panduan migrasi.

POST /v1.0/removebg

Body multipart, urlencoded, atau JSON dengan nama parameter remove.bg. Membalas dengan byte gambar dan header remove.bg, atau { "data": { "result_b64", "foreground_top", "foreground_left", "foreground_width", "foreground_height" } } jika Anda mengirim Accept: application/json. Error memakai bentuk remove.bg: { "errors": [{ "title", "code", "detail" }] }. Berbeda dengan /v1/remove, endpoint ini tidak pernah membalas 202: endpoint ini menunggu hingga 110 detik, lalu mengembalikan 503 timeout. Job tetap berjalan dan ditagih jika berhasil, jadi mengulang request itu akan memulai job kedua.

ParameterStatusCatatan
image_file / image_file_b64 / image_urlDidukungBody multipart, urlencoded, atau JSON. JPG, PNG, atau WebP hingga 25 MB.
sizeDidukungauto, full, 4k, dan 50MP menghasilkan resolusi asli (hingga 25 MP); preview, small, dan regular ≈ 0,25 MP; medium 1,5 MP; hd 4 MP. Selalu 1 kredit.
formatDidukungauto (PNG jika transparan, selain itu JPG), png, jpg, webp, dan zip (color.jpg + alpha.png).
crop / crop_marginDidukungpx atau % dari objek, 1–4 nilai gaya CSS ("10% 20%" = vertikal, horizontal); maksimal 500px atau 50% per sisi.
roiDidukung"x1 y1 x2 y2" dalam px atau %: hanya objek di dalam area tersebut yang dipertahankan.
scale / positionDidukungscale 10%–100% atau original; position center, original, atau "x% y%".
channelsDidukungrgba (potongan) atau alpha (mask grayscale).
bg_colorDidukungHex dengan atau tanpa # (81d4fa), atau nama warna. Hex 8 digit mempertahankan warnanya dan membuang alpha-nya.
bg_image_url / bg_image_fileDidukungPotongan ditempatkan di atas gambar background Anda, disesuaikan (cover) dengan ukuran output.
Accept: application/jsonDidukungMengembalikan { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } }.
type / type_levelDiterima, diabaikanObjek terdeteksi otomatis; X-Type selalu "other".
semitransparencyDiterima, diabaikanTepi lembut dan area semi-transparan diambil apa adanya dari matte model.
shadow_type / shadow_opacity / add_shadowDiterima, diabaikanTidak ada bayangan yang ditambahkan.
Request yang berjalan lamaPerbedaanKami menunggu hingga 110 detik; jika gambar belum siap saat itu, Anda menerima 503 yang bisa dicoba ulang (tidak dikenai biaya kecuali prosesnya selesai).

Contoh

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

Header respons

HeaderArti
X-Width / X-HeightUkuran hasil dalam piksel.
X-Credits-ChargedKredit yang dipakai gambar ini: selalu 1 (gambar yang gagal 0).
X-TypeSelalu "other" (deteksi objek berjalan otomatis).
X-Foreground-Top / -Left / -Width / -HeightKotak pembatas objek pada hasil, dalam piksel.
X-Request-IDMengembalikan X-Request-ID Anda, atau id yang dibuat otomatis. Tambahan.
X-Matte-Confidence / X-Matte-Ambiguous-RatioSeberapa bersih mask-nya (0–1), dan proporsi piksel lembut. Tambahan: berguna untuk menandai gambar yang perlu ditinjau.

Error

StatusArti
400Parameter atau gambar tidak valid (kode seperti invalid_size, invalid_crop_margin, missing_source, file_too_large, unknown_foreground).
402insufficient_credits: isi ulang di halaman harga.
403auth_failed: X-Api-Key tidak ada atau tidak valid.
429rate_limit_exceeded.
500 / 503Pemrosesan gagal, waktu habis, atau layanan sedang tidak tersedia sebentar. Coba lagi; gambar yang gagal gratis.

GET /v1.0/account

Saldo Anda dalam bentuk akun remove.bg: { "data": { "attributes": { "credits": { "total", "subscription": 0, "payg", "enterprise": 0 }, "api": { "free_calls": 0, "sizes": "all" } } } }. Semua kredit bersifat bayar sesuai pemakaian dan tidak pernah kedaluwarsa, jadi total sama dengan payg. GET https://removebackground.dev/v1.0/account dengan X-Api-Key Anda.

Error (endpoint /v1)

Gambar yang gagal tidak pernah ditagih.

StatusKodeArti
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_imagesRequest atau URL gambar tidak bisa dipakai.
401unauthorizedx-api-key tidak ada, salah, atau sudah dicabut.
402insufficient_credits, out_of_creditsSaldo Anda kosong. Isi ulang di halaman harga.
404not_foundJob tidak ditemukan (atau bukan milik Anda).
409not_ready, canceled, idempotency_key_reusedGET …/result saat job masih berjalan (coba lagi setelah 2 detik), job dibatalkan, atau Idempotency-Key dipakai ulang untuk request yang berbeda.
410result_unavailableHasil sudah dihapus atau kedaluwarsa.
413too_largeGambar lebih besar dari 25 MB.
422processing_failed, invalid_image, missing_uploadFile bukan gambar yang bisa dibaca. Tidak ditagih.
429rate_limited, too_many_batchesMelebihi batas request per akun (tunggu sesuai Retry-After), atau Anda sudah punya 3 job batch yang sedang berjalan.
502model_unavailable, upstream_error, …Kami tidak bisa memproses gambar setelah beberapa kali mencoba. Tidak ditagih.
503server_paused, unavailableAPI sedang dijeda (sebelum peluncuran) atau sedang tidak tersedia sebentar. Coba lagi nanti.

Batch, dari awal sampai akhir

1. Kirim

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" }'

Hingga 100 URL gambar publik ditambah opsi apa pun dari /v1/remove. Dua URL placeholder di atas akan memakai hingga 2 kredit jika keduanya gambar sungguhan. Jawabannya langsung datang:

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 menghitung entri yang bukan URL http(s) dan duplicates menghitung entri berulang; keduanya dibuang dan tidak pernah dikenai biaya. Simpan id: itulah cara Anda melanjutkan job setelah restart.

2. Poll job

GET /v1/jobs/:id setiap beberapa detik sampai done bernilai true. status berpindah dari queued ke processing, lalu berakhir sebagai succeeded, partial (sebagian gambar gagal), atau failed. Item yang sedang dicoba ulang menampilkan 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. Unduh setiap hasil

GET /v1/jobs/:id/result?item=N untuk setiap item yang berhasil (atau gunakan result_url-nya). item adalah position yang dimulai dari nol. Posisi mengikuti daftar Anda setelah URL yang tidak valid dan berulang dibuang, jadi jika salah satu hitungan itu di atas 0, cocokkan hasil berdasarkan input, bukan berdasarkan indeks.

  • Sebuah batch tidak lagi dihitung ke batas 3 batch terbuka setelah done bernilai true.
  • API tidak punya endpoint pembatalan, webhook, atau unduhan ZIP. Batch yang dimulai di halaman Bulk bisa dibatalkan atau diunduh sebagai ZIP di sana.

Percobaan ulang, duplikat, dan tagihan

Kirim Idempotency-Key agar percobaan ulang tidak bisa menagih dua kali. Tambahkan header Idempotency-Key (string unik apa pun hingga 255 karakter, misalnya UUID) ke POST /v1/remove atau POST /v1/batch, satu key per gambar atau batch. Jika Anda mengirim request yang sama lagi dengan key yang sama, Anda mendapat job yang dibuat oleh request pertama, dengan Idempotent-Replayed: true: tanpa job baru dan tanpa tagihan baru, bahkan jika request pertama masih berjalan. Key yang sama dengan gambar atau opsi berbeda akan dibalas 409 idempotency_key_reused. Key terikat ke akun Anda dan tidak kedaluwarsa.

Tanpa key, setiap POST membuat job baru, dan setiap job yang berhasil memakai 1 kredit (POST /v1.0/removebg yang kompatibel dengan remove.bg tidak mendukung key ini). Membaca job (GET /v1/jobs/…) selalu gratis dan aman diulang.

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

Apa yang memakai kredit

SituasiBiaya
Request ditolak sebelum diproses (key salah, opsi salah, terlalu besar, kredit habis)Gratis.
Gambar tidak bisa diproses (422 gambar tidak valid, 502 setelah percobaan ulang kami)Gratis.
Gambar berhasil1 kredit, ditagih sekali, saat berhasil. Percobaan ulang internal kami tidak menambah tagihan.
Anda menerima 202Belum ada. Job tetap berjalan dan hanya ditagih 1 kredit jika berhasil.
Client Anda timeout atau terputus saat menungguJob tetap berjalan dan ditagih jika berhasil. Hasilnya muncul di Studio Anda.
Anda mengirim request yang sama dua kali dengan Idempotency-Key yang samaSatu job, maksimal 1 kredit. Request ulang mendapat job yang sama (header Idempotent-Replayed: true).
Anda mengirim gambar yang sama dua kali tanpa keyDua job terpisah; masing-masing yang berhasil memakai 1 kredit.
Anda mengunduh lagi hasil yang sudah jadiGratis, sesering yang Anda mau selama hasil masih disimpan.
Sebuah batch berhasil sebagian1 kredit per gambar yang berhasil; credits_charged pada job menunjukkan totalnya.
Sebuah batch mencantumkan URL yang sama dua kaliPengulangan dalam satu batch dibuang sebelum masuk antrean dan tidak pernah ditagih. URL identik di batch berbeda adalah job terpisah.
Kredit habis di tengah batchGambar yang sudah selesai tetap dibayar; sisanya ditandai skipped (out_of_credits) dan gratis. Beli kredit, lalu kirim URL yang tersisa sebagai batch baru.

Kapan harus mencoba ulang

Yang terjadiYang harus dilakukan
GET /v1/jobs/:id atau …/result gagal (error jaringan, 5xx)Aman dicoba ulang: membaca job tidak pernah membuat pekerjaan baru atau tagihan. Beri jeda sedikit di antara percobaan.
GET …/result membalas 409 not_readyTunggu sesuai Retry-After (2 detik) lalu tanyakan lagi. Jangan kirim ulang gambarnya.
GET …/result membalas 410 result_unavailableHasil yang disimpan sudah dihapus. Memproses gambar lagi berarti job baru dan memakai 1 kredit.
POST membalas 400, 413, atau 422Perbaiki request atau gambarnya terlebih dahulu; mengirimnya tanpa perubahan akan memberikan jawaban yang sama.
POST membalas 401 atau 402Perbaiki key atau isi ulang kredit. Jangan diulang terus-menerus.
POST membalas 429 rate_limitedTunggu sesuai detik di Retry-After, lalu kirim lagi (dengan Idempotency-Key yang sama). Lebih dari 60 gambar per menit? Gunakan POST /v1/batch: satu request untuk hingga 100 gambar.
POST /v1/batch membalas 429 too_many_batchesTunggu sampai salah satu dari 3 batch terbuka Anda selesai (poll batch tersebut), lalu kirim.
POST /v1/… membalas 503 (unavailable, server_paused)Tidak ada job yang dibuat. Coba lagi setelah menunggu sebentar. (Endpoint yang kompatibel dengan remove.bg berbeda: 503 timeout-nya berarti job masih berjalan.)
POST /v1/remove membalas 502Job itu gagal dan tidak ditagih. Satu percobaan ulang adalah job baru.
POST timeout, koneksi terputus, atau Anda menerima 500Dengan Idempotency-Key: kirim ulang request yang sama dengan key yang sama; Anda mendapat job aslinya. Tanpa key, job mungkin sudah ada dan mungkin ditagih: cek Studio Anda terlebih dahulu.
POST membalas 409 idempotency_key_reusedKey itu sudah dipakai untuk gambar atau opsi yang berbeda. Buat key baru untuk setiap gambar baru.

Batasan dan penyimpanan

BatasNilaiError jika terlampaui
File gambar25 MB (25 × 1024 × 1024 byte); JPG, PNG, atau WebP, dideteksi dari byte file413 too_large · 422 processing_failed
Body Base64 / JSON25 MB setelah didekode (body request bisa sekitar sepertiga lebih besar)413 too_large
Resolusi inputGambar di atas 25 MP diperkecil menjadi 25 MP sebelum diproses—
Ukuran outputwidth dan height masing-masing 1–6000 px400 invalid_width / invalid_height
Unduhan image_urlhanya http(s), timeout 15 detik, maksimal 3 redirect; alamat privat, loopback, dan link-local ditolak, di setiap redirect400 invalid_url · fetch_failed · fetch_timeout
Waktu tunggu di POST /v1/removeSekitar 55 detik, lalu 202 dengan job id202
Ukuran batch100 URL gambar per POST /v1/batch400 too_many_images
Batch terbuka3 job multi-gambar yang belum selesai per akun (gambar tunggal tidak dihitung)429 too_many_batches
Laju request60 request per menit per akun, gabungan POST /v1/remove, /v1/batch, dan /v1.0/removebg. Satu batch dihitung sekali, berapa pun ukurannya. Membaca job tidak dibatasi429 rate_limited (dengan Retry-After)

Berapa lama hasil disimpan

Setiap hasil disimpan secara privat di akun Anda selama 48 jam setelah dibuat, lalu dihapus. Sampai saat itu Anda bisa mengunduhnya lagi secara gratis dengan GET /v1/jobs/:id/result atau dari Studio Anda. Setelah itu, link hasil membalas 410 result_unavailable; memproses gambar lagi berarti job baru. Catatan status job tetap bisa dibaca setelah gambarnya hilang. Lihat kebijakan privasi untuk cara unggahan ditangani; kami tidak menggunakan gambar Anda untuk melatih model.

Keamanan

Simpan API key Anda di server yang Anda kendalikan. Jangan menaruhnya di kode browser, aplikasi seluler, repositori publik, atau URL. Agar pengguna Anda sendiri bisa menghapus background, kirim gambar mereka melalui backend Anda, dan tambahkan login serta batas pengeluaran Anda sendiri di sana.

  • API mengizinkan CORS agar bisa dipakai dari tool dan kode di sisi server. Itu tidak membuat key aman ditaruh di halaman web: siapa pun bisa membacanya di sana.
  • Semua key di satu akun memakai saldo kredit yang sama. Buat key terpisah untuk setiap aplikasi atau environment di halaman akun Anda, agar Anda bisa mencabut satu key tanpa mengganggu yang lain.
  • Jika sebuah key bocor, segera cabut di halaman akun (key langsung berhenti berfungsi) dan buat key baru. Kami hanya menyimpan hash setiap key, jadi kami tidak bisa menampilkannya lagi kepada Anda.

Pemecahan masalah

GejalaPenyebabnya
PNG saya tidak bisa dibukaBody-nya berupa JSON (job 202 atau error), bukan gambar. Cek status HTTP dan Content-Type sebelum menyimpan.
Skrip saya timeout tetapi gambarnya muncul di StudioJob tetap berjalan setelah Anda berhenti menunggu. Ambil dengan job id-nya, jangan kirim ulang.
Saya ditagih dua kali untuk satu gambarGambar dikirim dua kali tanpa Idempotency-Key (sering kali karena percobaan ulang otomatis setelah timeout). Kirim satu key per gambar dan gunakan lagi saat mencoba ulang.
URL terbuka di browser saya tetapi API tidak bisa mengambilnyaHost mungkin butuh cookie atau login, memblokir server, melakukan redirect lebih dari 3 kali, butuh lebih dari 15 detik, atau signed URL-nya sudah kedaluwarsa. Unggah file-nya saja.
Batch saya berhenti di tengah jalanLihat items[] di job: item yang gagal punya kode error; item skipped dengan out_of_credits berarti saldo habis.
Sebuah opsi sepertinya tidak berpengaruhNama parameter yang tidak dikenal diabaikan tanpa pemberitahuan. Cek ejaannya dengan tabel parameter. Di /v1.0/removebg, beberapa opsi remove.bg diterima tetapi diabaikan (lihat tabel tersebut).
Background-nya tidak transparanJPG tidak bisa transparan. Gunakan format=png atau webp dan jangan isi bg_color.
Link hasil memberikan 410Hasil yang disimpan sudah dihapus. Memproses lagi memakai 1 kredit.