API thời gian thực

API tách nền: gửi một yêu cầu, nhận PNG hoàn chỉnh.

Tải tệp lên, gửi URL ảnh công khai, hoặc cung cấp base64. Hầu hết ảnh đơn được trả về hoàn chỉnh trong cùng phản hồi HTTP, thường chỉ sau vài giây. Nếu một ảnh mất nhiều thời gian hơn, bạn nhận được job id để lấy kết quả mà không cần gửi lại ảnh. Có endpoint batch cho xử lý hàng loạt.

1 credit cho mỗi ảnh thành công · ảnh lỗi miễn phí · khóa API có trong tài khoản của bạn

$ 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 · thường chỉ vài giây
  đã lưu dog.png (nền trong suốt, độ phân giải đầy đủ)
1 Ảnh của bạn2 Một yêu cầu HTTP3 PNG trong phản hồi

Bắt đầu nhanh

Sao chép, dán, thay YOUR_API_KEY. Mỗi ví dụ lưu kết quả thẳng vào tệp, và các ví dụ JavaScript và Python còn chờ xử lý mã 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

Gửi ảnh

POST /v1/remove nhận ảnh theo bốn cách. Hãy gửi một trong số đó; nếu một yêu cầu chứa nhiều cách, image_file được ưu tiên, rồi đến image_file_b64, rồi image_url, rồi body thô. Các ví dụ này đọc khóa từ biến môi trường REMOVEBG_API_KEY (đặt bằng export REMOVEBG_API_KEY=…); lưu ý dấu nháy kép, giúp shell điền giá trị vào.

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, trường image_file. JPG, PNG hoặc WebP, tối đa 25 MB.

Mọi ví dụ đều lưu body vào tệp. Tệp đó chỉ là ảnh khi mã trạng thái là 200; xem Xử lý phản hồi.

Xử lý phản hồi

Hầu hết ảnh đơn được trả về hoàn chỉnh trong cùng phản hồi. Khi hàng đợi bận bất thường và một ảnh mất hơn khoảng 55 giây, bạn sẽ nhận 202 Accepted kèm job id. Job vẫn tiếp tục chạy: lấy kết quả bằng id đó. Gửi lại ảnh sẽ tạo job thứ hai và có thể tốn thêm một credit.

Trạng tháiBodyCần làm gì
200Ảnh (image/png, image/jpeg hoặc image/webp)Lưu lại. Dùng Content-Type để chọn phần mở rộng tệp.
202JSON: { id, status, status_url, result_url }Không phải ảnh. Đợi vài giây, rồi GET result_url. Đừng gửi lại ảnh.
4xx / 5xxJSON: { "error": { "code", "message" } }Không phải ảnh. Đọc mã lỗi (xem phần Lỗi) và đừng lưu body thành ảnh.

Ví dụ đầy đủ

Xử lý ảnh hoàn chỉnh, mã 202, job thất bại và giới hạn thời gian phía bạn. Ví dụ chỉ gửi ảnh một lần và chỉ thử lại các lần kiểm tra trạng thái an toàn.

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

Cần Python 3 và requests (pip install requests).

  • Dừng script không dừng job; job vẫn có thể hoàn tất và bị tính phí. Kết quả sẽ xuất hiện trong Studio của bạn.
  • Giới hạn thời gian do bạn chọn, không phải cam kết từ chúng tôi; hầu hết ảnh xong trong vài giây.
  • Endpoint tương thích remove.bg hoạt động khác: nó không bao giờ trả về 202 (xem bên dưới).

Xác thực

Gửi khóa API trong header x-api-key. Tạo và thu hồi khóa ở trang tài khoản; mỗi lệnh gọi dùng credit của tài khoản đó. Mọi endpoint nằm dưới https://removebackground.dev và chấp nhận yêu cầu CORS, nhưng CORS không làm cho việc đặt khóa trong trang web trở nên an toàn: hãy giữ khóa trên máy chủ của bạn (xem Bảo mật). Lỗi trả về dạng JSON: { "error": { "code": "…", "message": "…" } }.

Toàn bộ đặc tả được công bố dưới dạng OpenAPI 3.1 (openapi.json), dùng cho trình tạo client, Postman hoặc kiểm thử; trợ lý lập trình AI có thể bắt đầu từ llms.txt.

POST /v1/remove

Thời gian thực. Tách nền một ảnh. Thông thường ảnh hoàn chỉnh chính là body phản hồi (image/png, image/jpeg hoặc image/webp), thường sau vài giây. Tham số có thể là trường form, khóa JSON hoặc giá trị query string; bạn cũng có thể POST byte ảnh thô với Content-Type: image/jpeg, image/png, image/webp hoặc application/octet-stream. Tối đa 25 MB. Xem Gửi ảnh cho từng cách gửi.

Tham sốKiểuMô tả
image_filefileẢnh (JPG, PNG hoặc WebP), dạng multipart form data.
image_file_b64stringẢnh dạng base64, có hoặc không có tiền tố data:image/…;base64, (25 MB sau khi giải mã). Tiện khi gửi từ JSON.
image_urlstringURL http(s) công khai của ảnh. Chúng tôi tải ảnh về (tối đa 3 lần chuyển hướng, 15 giây). Nếu gửi nhiều nguồn, image_file được ưu tiên, rồi đến image_file_b64, rồi image_url, rồi body thô.
formatpng | jpg | webpĐịnh dạng đầu ra. Mặc định png. JPG không có nền trong suốt: ảnh được làm phẳng lên bg_color, hoặc nền trắng.
bg_colormàuTô nền: hex (ffffff, #fff), rgb(255, 255, 255), hoặc white, black, red, green, blue, yellow, gray / grey. transparent (mặc định) giữ nền trong suốt.
sizepreview | medium | hd | fullGiới hạn megapixel, giữ tỷ lệ khung hình, không bao giờ phóng to: preview ≤ 0,25 MP, medium ≤ 1,5 MP, hd ≤ 4 MP, full (mặc định) độ phân giải gốc (tối đa 25 MP). Bị bỏ qua khi đặt width hoặc height.
croptrue | false | W:HCắt sát khung bao của chủ thể. Với tỷ lệ khung hình (1:1, 4:5, 4:3, 16:9…), khung sau đó được mở rộng (không bao giờ thu nhỏ) theo tỷ lệ đó quanh chủ thể; vùng nằm ngoài ảnh sẽ trong suốt (hoặc bg_color). Mặc định false.
paddingpx | phân số | %Dùng với crop: lề thêm vào mỗi cạnh. 0.1 hoặc 10% = một phần mười chiều rộng (trái/phải) và chiều cao (trên/dưới) của chủ thể; "10%,7.5%" đặt riêng chiều ngang và chiều dọc; 24px (hoặc một số nguyên lớn hơn 1) tính bằng pixel, tối đa 500. Mặc định 0.
channelsrgba | rgb | alphargba (mặc định): ảnh tách nền trong suốt. rgb: không trong suốt, làm phẳng lên bg_color hoặc nền trắng. alpha: mặt nạ PNG thang xám (trắng = chủ thể), cùng kích thước và vùng cắt với ảnh tách nền. type=mask vẫn hoạt động như tên gọi khác của alpha.
width / height1–6000Kích thước đầu ra chính xác tính bằng pixel, áp dụng sau crop (ghi đè size). Nếu chỉ đặt một giá trị, giá trị kia theo tỷ lệ khung hình. Không bao giờ kéo giãn.
roix1 y1 x2 y2Vùng quan tâm, tính bằng px hoặc % (ví dụ 0% 0% 50% 100%). Chỉ giữ chủ thể nằm trong vùng này; mọi thứ bên ngoài trở thành nền. Tọa độ tính theo ảnh gốc. Mặc định: toàn bộ ảnh.
fitcontain | cover | scale-downDùng với width và height. contain (mặc định): vừa bên trong, căn giữa, phần còn lại trong suốt (hoặc bg_color). cover: lấp đầy khung, cắt phần thừa quanh chủ thể. scale-down: giống contain, nhưng không bao giờ phóng to.

Các tùy chọn được áp dụng theo thứ tự: roi, size (hoặc width/height ở bước sau), crop + padding + tỷ lệ khung hình, width/height + fit, rồi channels hoặc màu nền, rồi định dạng. Mọi tùy chọn đều có cùng giá 1 credit. Tham số không xác định bị bỏ qua.

Ví dụ: JPG HD trên nền trắng, cắt theo chủ thể với khoảng đệm 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

Ví dụ: ảnh vuông cho sàn thương mại điện tử, chủ thể căn giữa với khoảng đệm 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

Ví dụ: đầu vào base64, đầu ra mặt nạ alpha

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 ảnh, kèm các header sau:

HeaderÝ nghĩa
X-Image-Width / X-Image-HeightKích thước kết quả tính bằng pixel (cũng được gửi dưới dạng X-Width / X-Height).
X-Request-IDX-Request-ID của bạn nếu có gửi, nếu không là một id được tạo tự động. Hãy cung cấp id này khi liên hệ hỗ trợ.
X-Processing-Time-MsThời gian xử lý yêu cầu (cũng có trong X-Processing-Ms).
X-Matte-Confidence0–1: độ dứt khoát của mặt nạ (trung bình của |2a − 1| trên các pixel, a = alpha). Gần 1 là ảnh tách nền sạch; giá trị thấp hơn nghĩa là có nhiều viền mềm hoặc không chắc chắn.
X-Matte-Ambiguous-RatioTỷ lệ pixel có alpha nằm hẳn giữa 0,1 và 0,9 (tóc, kính, nhòe chuyển động). Hữu ích để đánh dấu ảnh cần kiểm tra lại.
X-Credits-RemainingSố dư của bạn sau ảnh này.
X-Removal-IdId của kết quả đã lưu.
X-Job-IdId của job đứng sau yêu cầu (dùng được với /v1/jobs/:id).

202 Accepted (phương án dự phòng khi hàng đợi dài)

Nếu ảnh chưa xong trong khoảng 55 giây, ví dụ khi hàng đợi bận bất thường, bạn nhận 202 với JSON { id, status, status_url, result_url } (kèm Location và Retry-After: 2). Kiểm tra status_url định kỳ cho đến khi done là true, rồi tải result_url. Bạn chỉ bị tính phí một lần, khi ảnh thành công. Đừng gửi lại ảnh mà không có Idempotency-Key: việc đó sẽ tạo job thứ hai. Xem Xử lý phản hồi để có ví dụ đầy đủ.

GET /v1/jobs/:id

Trạng thái của job được tạo bởi /v1/remove hoặc /v1/batch. Cùng khóa; bạn chỉ thấy job của chính mình.

TrườngÝ nghĩa
statusqueued, processing, succeeded, partial, failed hoặc canceled
donetrue khi không còn gì cần chạy
total, succeeded, failed, skippedsố lượng ảnh
credits_chargedsố credit job này đã dùng (1 cho mỗi ảnh thành công)
status_url, result_urlnơi kiểm tra trạng thái, và nơi tải về
items[]cho mỗi ảnh: position, input, status, error { code, message }, và khi thành công có removal_id, width, height, format, result_url

GET /v1/jobs/:id/result

Byte ảnh của một job đã hoàn tất, với cùng header như /v1/remove. ?item=N chọn một ảnh trong job batch (mặc định 0). Trả về 409 not_ready với Retry-After: 2 khi job vẫn đang chạy, hoặc lỗi của chính ảnh đó nếu thất bại.

POST /v1/batch

Đưa tối đa 100 URL ảnh vào hàng đợi thành một job: JSON { "image_urls": ["https://…", …], "format": "jpg", "bg_color": "ffffff", "size": "hd", "crop": "1:1", "padding": "10%" }, với cùng tùy chọn như /v1/remove (cả channels, width, height và fit). Trả về 202 ngay lập tức với { id, status, total, invalid, duplicates, status_url }. Kiểm tra job định kỳ, rồi tải result_url của từng mục. 1 credit cho mỗi ảnh thành công; tối đa 3 job batch đang mở mỗi tài khoản. Hướng dẫn chi tiết kèm phản hồi mẫu trong Batch, từ đầu đến cuối.

Endpoint tương thích remove.bg

API tự phục vụ của remove.bg kết thúc vào 1 December 2026, 09:00 CET (thông báo). Các tích hợp remove.bg hiện có hoạt động ở đây chỉ bằng cách đổi một dòng: https://api.remove.bg/v1.0/removebg → https://removebackground.dev/v1.0/removebg, với khóa removebackground.dev trong cùng header X-Api-Key. Cùng hàng đợi, cùng 1 credit cho mỗi ảnh thành công, cùng chất lượng đầu ra như /v1/remove. Hướng dẫn chuyển đổi.

POST /v1.0/removebg

Body dạng multipart, urlencoded hoặc JSON với tên tham số của remove.bg. Trả về byte ảnh và các header của remove.bg, hoặc { "data": { "result_b64", "foreground_top", "foreground_left", "foreground_width", "foreground_height" } } khi bạn gửi Accept: application/json. Lỗi dùng cấu trúc của remove.bg: { "errors": [{ "title", "code", "detail" }] }. Khác với /v1/remove, endpoint này không bao giờ trả về 202: nó chờ tối đa 110 giây, rồi trả về 503 timeout. Job vẫn tiếp tục chạy và bị tính phí nếu thành công, nên thử lại yêu cầu đó sẽ tạo job thứ hai.

Tham sốTrạng tháiGhi chú
image_file / image_file_b64 / image_urlHỗ trợBody dạng multipart, urlencoded hoặc JSON. JPG, PNG hoặc WebP tối đa 25 MB.
sizeHỗ trợauto, full, 4k và 50MP cho độ phân giải gốc (tối đa 25 MP); preview, small và regular ≈ 0,25 MP; medium 1,5 MP; hd 4 MP. Luôn là 1 credit.
formatHỗ trợauto (PNG nếu có nền trong suốt, nếu không thì JPG), png, jpg, webp và zip (color.jpg + alpha.png).
crop / crop_marginHỗ trợpx hoặc % của chủ thể, 1–4 giá trị theo kiểu CSS ("10% 20%" = dọc, ngang); tối đa 500px hoặc 50% mỗi cạnh.
roiHỗ trợ"x1 y1 x2 y2" tính bằng px hoặc %: chỉ giữ chủ thể nằm trong vùng này.
scale / positionHỗ trợscale từ 10%–100% hoặc original; position là center, original hoặc "x% y%".
channelsHỗ trợrgba (ảnh tách nền) hoặc alpha (mặt nạ thang xám).
bg_colorHỗ trợMã hex có hoặc không có # (81d4fa), hoặc tên màu. Mã hex 8 chữ số giữ màu và bỏ kênh alpha.
bg_image_url / bg_image_fileHỗ trợẢnh tách nền được ghép lên ảnh nền của bạn, co giãn kiểu cover theo kích thước đầu ra.
Accept: application/jsonHỗ trợTrả về { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } }.
type / type_levelChấp nhận, bỏ quaChủ thể được nhận diện tự động; X-Type luôn là "other".
semitransparencyChấp nhận, bỏ quaViền mềm và vùng bán trong suốt được giữ nguyên theo matte của mô hình.
shadow_type / shadow_opacity / add_shadowChấp nhận, bỏ quaKhông thêm bóng đổ.
Yêu cầu chạy lâuKhác biệtChúng tôi chờ tối đa 110 giây; nếu ảnh chưa xong vào lúc đó, bạn nhận mã 503 có thể thử lại (không tính phí trừ khi ảnh đã xử lý xong).

Ví dụ

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 phản hồi

HeaderÝ nghĩa
X-Width / X-HeightKích thước kết quả tính bằng pixel.
X-Credits-ChargedSố credit ảnh này đã dùng: luôn là 1 (ảnh lỗi tốn 0).
X-TypeLuôn là "other" (nhận diện chủ thể tự động).
X-Foreground-Top / -Left / -Width / -HeightKhung bao của chủ thể trong kết quả, tính bằng pixel.
X-Request-IDTrả lại X-Request-ID của bạn, hoặc một id được tạo tự động. Bổ sung.
X-Matte-Confidence / X-Matte-Ambiguous-RatioĐộ sạch của mặt nạ (0–1), và tỷ lệ pixel mềm. Bổ sung: hữu ích để đánh dấu ảnh cần kiểm tra lại.

Lỗi

Trạng tháiÝ nghĩa
400Tham số hoặc ảnh không hợp lệ (các mã như invalid_size, invalid_crop_margin, missing_source, file_too_large, unknown_foreground).
402insufficient_credits: nạp thêm ở trang bảng giá.
403auth_failed: thiếu hoặc sai X-Api-Key.
429rate_limit_exceeded.
500 / 503Xử lý thất bại, hết thời gian chờ hoặc dịch vụ tạm thời không khả dụng. Hãy thử lại; ảnh lỗi miễn phí.

GET /v1.0/account

Số dư của bạn theo cấu trúc tài khoản của remove.bg: { "data": { "attributes": { "credits": { "total", "subscription": 0, "payg", "enterprise": 0 }, "api": { "free_calls": 0, "sizes": "all" } } } }. Mọi credit đều trả theo nhu cầu và không bao giờ hết hạn, nên total bằng payg. GET https://removebackground.dev/v1.0/account với X-Api-Key của bạn.

Lỗi (endpoint /v1)

Ảnh lỗi không bao giờ bị tính phí.

Trạng tháiMãÝ nghĩa
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_imagesKhông thể dùng yêu cầu hoặc URL ảnh.
401unauthorizedThiếu, sai hoặc đã thu hồi x-api-key.
402insufficient_credits, out_of_creditsSố dư của bạn đã hết. Nạp thêm ở trang bảng giá.
404not_foundKhông có job này (hoặc job không thuộc về bạn).
409not_ready, canceled, idempotency_key_reusedGET …/result khi job vẫn đang chạy (thử lại sau 2 giây), job đã bị hủy, hoặc Idempotency-Key đã được dùng lại cho một yêu cầu khác.
410result_unavailableKết quả đã bị xóa hoặc hết hạn.
413too_largeẢnh lớn hơn 25 MB.
422processing_failed, invalid_image, missing_uploadTệp không phải là ảnh đọc được. Không tính phí.
429rate_limited, too_many_batchesVượt giới hạn yêu cầu mỗi tài khoản (đợi theo Retry-After), hoặc bạn đã có 3 job batch đang chạy.
502model_unavailable, upstream_error, …Chúng tôi không xử lý được ảnh sau nhiều lần thử. Không tính phí.
503server_paused, unavailableAPI đang tạm dừng (trước khi ra mắt) hoặc tạm thời không khả dụng. Hãy thử lại sau.

Batch, từ đầu đến cuối

1. Gửi

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

Tối đa 100 URL ảnh công khai cùng bất kỳ tùy chọn nào của /v1/remove. Hai URL giữ chỗ ở trên sẽ tốn tối đa 2 credit nếu là ảnh thật. Phản hồi trả về ngay lập tức:

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 đếm các mục không phải URL http(s) và duplicates đếm các mục lặp lại; cả hai đều bị loại bỏ và không bao giờ bị tính phí. Hãy lưu id: đó là cách bạn tiếp tục theo dõi job sau khi khởi động lại.

2. Kiểm tra job định kỳ

GET /v1/jobs/:id vài giây một lần cho đến khi done là true. status chuyển từ queued sang processing, rồi kết thúc ở succeeded, partial (một số ảnh lỗi) hoặc failed. Mục đang được thử lại hiển thị 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ải từng kết quả

GET /v1/jobs/:id/result?item=N cho mỗi mục thành công (hoặc dùng result_url của nó). item là position bắt đầu từ 0. Thứ tự vị trí theo danh sách của bạn sau khi loại bỏ URL không hợp lệ và trùng lặp, nên khi một trong hai số đếm lớn hơn 0, hãy khớp kết quả theo input thay vì theo chỉ số.

  • Một batch không còn tính vào giới hạn 3 batch đang mở khi done là true.
  • API không có endpoint hủy, webhook hay tải ZIP. Các batch bắt đầu từ trang Hàng loạt có thể được hủy hoặc tải về dạng ZIP tại đó.

Thử lại, trùng lặp và tính phí

Gửi Idempotency-Key để các lần thử lại không bị tính phí hai lần. Thêm header Idempotency-Key (bất kỳ chuỗi duy nhất nào dài tối đa 255 ký tự, như UUID) vào POST /v1/remove hoặc POST /v1/batch, mỗi ảnh hoặc batch một khóa. Nếu bạn gửi lại cùng yêu cầu với cùng khóa, bạn nhận được job mà yêu cầu đầu tiên đã tạo, kèm Idempotent-Replayed: true: không có job mới và không tính phí mới, kể cả khi yêu cầu đầu tiên vẫn đang chạy. Cùng khóa với ảnh hoặc tùy chọn khác sẽ trả về 409 idempotency_key_reused. Khóa thuộc về tài khoản của bạn và không hết hạn.

Không có khóa, mỗi POST tạo một job mới, và mỗi job thành công tốn 1 credit (endpoint tương thích remove.bg POST /v1.0/removebg không hỗ trợ khóa này). Đọc job (GET /v1/jobs/…) luôn miễn phí và an toàn để lặp lại.

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

Điều gì tốn credit

Tình huốngPhí
Yêu cầu bị từ chối trước khi xử lý (sai khóa, sai tùy chọn, quá lớn, hết credit)Miễn phí.
Ảnh không thể xử lý (422 ảnh không hợp lệ, 502 sau khi chúng tôi đã thử lại)Miễn phí.
Ảnh xử lý thành công1 credit, tính một lần, khi thành công. Các lần thử lại nội bộ của chúng tôi không tính thêm phí.
Bạn nhận mã 202Chưa tính gì. Job tiếp tục chạy và chỉ bị tính 1 credit nếu thành công.
Client của bạn hết thời gian chờ hoặc ngắt kết nối khi đang đợiJob tiếp tục chạy và bị tính phí nếu thành công. Kết quả xuất hiện trong Studio của bạn.
Bạn gửi cùng yêu cầu hai lần với cùng Idempotency-KeyMột job, tối đa 1 credit. Lần gửi lặp nhận cùng job đó (header Idempotent-Replayed: true).
Bạn gửi cùng ảnh hai lần không có khóaHai job riêng biệt; mỗi job thành công tốn 1 credit.
Bạn tải lại một kết quả đã hoàn tấtMiễn phí, tải bao nhiêu lần tùy thích khi kết quả còn được lưu.
Một batch thành công một phần1 credit cho mỗi ảnh thành công; credits_charged trong job hiển thị tổng số.
Một batch liệt kê cùng URL hai lầnCác mục lặp trong một batch bị loại bỏ trước khi vào hàng đợi và không bao giờ bị tính phí. URL giống nhau ở các batch khác nhau là các job riêng biệt.
Hết credit giữa chừng một batchCác ảnh đã xong vẫn được tính phí; phần còn lại được đánh dấu skipped (out_of_credits) và miễn phí. Mua thêm credit, rồi gửi các URL còn lại thành một batch mới.

Khi nào nên thử lại

Chuyện gì đã xảy raCần làm gì
GET /v1/jobs/:id hoặc …/result thất bại (lỗi mạng, 5xx)Có thể thử lại an toàn: đọc job không bao giờ tạo việc mới hay tính phí. Hãy chờ một chút giữa các lần thử.
GET …/result trả về 409 not_readyĐợi theo Retry-After (2 giây) rồi hỏi lại. Đừng gửi lại ảnh.
GET …/result trả về 410 result_unavailableKết quả đã lưu bị xóa. Xử lý lại ảnh là một job mới và tốn 1 credit.
POST trả về 400, 413 hoặc 422Sửa yêu cầu hoặc ảnh trước; gửi lại y nguyên sẽ nhận cùng kết quả.
POST trả về 401 hoặc 402Sửa khóa hoặc nạp thêm credit. Đừng gửi lặp liên tục.
POST trả về 429 rate_limitedĐợi số giây trong Retry-After, rồi gửi lại (với cùng Idempotency-Key). Hơn 60 ảnh mỗi phút? Hãy dùng POST /v1/batch: một yêu cầu cho tối đa 100 ảnh.
POST /v1/batch trả về 429 too_many_batchesĐợi đến khi một trong 3 batch đang mở hoàn tất (kiểm tra định kỳ), rồi gửi.
POST /v1/… trả về 503 (unavailable, server_paused)Không có job nào được tạo. Thử lại sau một lúc. (Endpoint tương thích remove.bg thì khác: mã 503 timeout của nó nghĩa là job vẫn đang chạy.)
POST /v1/remove trả về 502Job đó đã thất bại và không bị tính phí. Thử lại một lần là một job mới.
POST hết thời gian chờ, mất kết nối, hoặc bạn nhận mã 500Có Idempotency-Key: gửi lại cùng yêu cầu với cùng khóa; bạn nhận được job ban đầu. Không có khóa: job có thể đã tồn tại và có thể bị tính phí, hãy kiểm tra Studio trước.
POST trả về 409 idempotency_key_reusedKhóa đó đã được dùng cho một ảnh hoặc tùy chọn khác. Hãy tạo khóa mới cho mỗi ảnh mới.

Giới hạn và lưu trữ

Giới hạnGiá trịLỗi khi vượt quá
Tệp ảnh25 MB (25 × 1024 × 1024 byte); JPG, PNG hoặc WebP, nhận diện từ byte của tệp413 too_large · 422 processing_failed
Body Base64 / JSON25 MB sau khi giải mã (body yêu cầu có thể lớn hơn khoảng một phần ba)413 too_large
Độ phân giải đầu vàoẢnh trên 25 MP được thu nhỏ xuống 25 MP trước khi xử lý—
Kích thước đầu rawidth và height mỗi chiều từ 1–6000 px400 invalid_width / invalid_height
Tải image_urlchỉ http(s), thời gian chờ 15 giây, tối đa 3 lần chuyển hướng; địa chỉ riêng tư, loopback và link-local bị từ chối, ở mọi lần chuyển hướng400 invalid_url · fetch_failed · fetch_timeout
Thời gian chờ trong POST /v1/removeKhoảng 55 giây, sau đó trả về 202 kèm job id202
Kích thước batch100 URL ảnh mỗi POST /v1/batch400 too_many_images
Batch đang mở3 job nhiều ảnh chưa hoàn tất mỗi tài khoản (ảnh đơn không tính)429 too_many_batches
Tần suất yêu cầu60 yêu cầu mỗi phút mỗi tài khoản, tính chung cho POST /v1/remove, /v1/batch và /v1.0/removebg. Một batch tính là một lần, bất kể kích thước. Đọc job không bị giới hạn429 rate_limited (kèm Retry-After)

Kết quả được lưu trong bao lâu

Mọi kết quả được lưu riêng tư trong tài khoản của bạn trong 48 giờ sau khi tạo, sau đó bị xóa. Trong thời gian đó, bạn có thể tải lại miễn phí bằng GET /v1/jobs/:id/result hoặc từ Studio. Sau đó, liên kết kết quả trả về 410 result_unavailable; xử lý lại ảnh là một job mới. Bản ghi trạng thái job vẫn đọc được sau khi ảnh đã bị xóa. Xem chính sách quyền riêng tư để biết cách xử lý tệp tải lên; chúng tôi không dùng ảnh của bạn để huấn luyện mô hình.

Bảo mật

Giữ khóa API trên máy chủ do bạn kiểm soát. Đừng đặt khóa trong code trình duyệt, ứng dụng di động, kho mã công khai hay URL. Để người dùng của bạn tách nền, hãy gửi ảnh của họ qua backend của bạn, và thêm cơ chế đăng nhập cùng giới hạn chi tiêu riêng tại đó.

  • API cho phép CORS để hoạt động từ các công cụ và code phía máy chủ. Điều đó không có nghĩa là an toàn khi đặt khóa trong trang web: bất kỳ ai cũng có thể đọc được.
  • Mọi khóa trong một tài khoản đều dùng chung số dư credit. Hãy tạo một khóa riêng cho mỗi ứng dụng hoặc môi trường ở trang tài khoản, để có thể thu hồi một khóa mà không ảnh hưởng các khóa khác.
  • Nếu khóa bị lộ, hãy thu hồi ngay ở trang tài khoản (khóa ngừng hoạt động lập tức) và tạo khóa mới. Chúng tôi chỉ lưu giá trị băm của mỗi khóa, nên không thể hiển thị lại khóa cho bạn.

Khắc phục sự cố

Triệu chứngNguyên nhân
Tệp PNG của tôi không mở đượcBody là JSON (job 202 hoặc lỗi), không phải ảnh. Hãy kiểm tra mã trạng thái HTTP và Content-Type trước khi lưu.
Script của tôi hết thời gian chờ nhưng ảnh vẫn xuất hiện trong StudioJob vẫn tiếp tục chạy sau khi bạn ngừng chờ. Hãy lấy kết quả bằng job id thay vì gửi lại.
Tôi bị tính phí hai lần cho một ảnhẢnh đã được gửi hai lần mà không có Idempotency-Key (thường do tự động thử lại sau khi hết thời gian chờ). Hãy dùng một khóa cho mỗi ảnh và dùng lại khóa đó khi thử lại.
URL mở được trong trình duyệt nhưng API không tải đượcMáy chủ có thể yêu cầu cookie hoặc đăng nhập, chặn máy chủ khác, chuyển hướng hơn 3 lần, mất hơn 15 giây, hoặc URL có chữ ký đã hết hạn. Hãy tải tệp lên thay thế.
Batch của tôi dừng giữa chừngXem items[] trong job: mục lỗi có mã lỗi; mục bị bỏ qua với out_of_credits nghĩa là số dư đã hết.
Một tùy chọn dường như không có tác dụngTên tham số không xác định bị bỏ qua mà không báo lỗi. Hãy kiểm tra chính tả với bảng tham số. Trên /v1.0/removebg, một số tùy chọn của remove.bg được chấp nhận nhưng bị bỏ qua (xem bảng đó).
Nền không trong suốtJPG không thể có nền trong suốt. Hãy dùng format=png hoặc webp và không đặt bg_color.
Liên kết kết quả trả về 410Kết quả đã lưu bị xóa. Xử lý lại tốn 1 credit.