배경 제거 API: 요청 한 번에 완성된 PNG.
파일을 업로드하거나, 공개 이미지 URL을 보내거나, base64를 전달하세요. 대부분의 단일 이미지는 같은 HTTP 응답으로 완성되어 돌아와요. 보통 몇 초면 끝나요. 더 오래 걸리면 작업 ID를 받아, 이미지를 다시 보내지 않고 결과를 가져올 수 있어요. 대량 처리는 배치 엔드포인트로 할 수 있어요.
성공한 이미지 1장당 1 크레딧 · 실패한 이미지는 무료 · API 키는 계정에서 발급
$ 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 · 보통 몇 초
dog.png 저장됨(투명, 원본 해상도)빠른 시작
복사해서 붙여 넣고 YOUR_API_KEY만 바꾸세요. 모든 예제는 결과를 바로 파일로 저장하며, JavaScript와 Python 예제는 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이미지 보내기
POST /v1/remove는 네 가지 방법으로 이미지를 받아요. 이 중 하나를 보내세요. 요청에 여러 개가 포함되면 image_file, image_file_b64, image_url, 원시 본문 순으로 우선 적용돼요. 이 예제들은 REMOVEBG_API_KEY 환경 변수에서 키를 읽어요(export REMOVEBG_API_KEY=…로 설정). 셸이 값을 채울 수 있도록 큰따옴표를 사용한 점에 유의하세요.
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멀티파트 폼 데이터, 필드 이름 image_file. JPG, PNG 또는 WebP, 최대 25 MB.
모든 예제는 본문을 파일로 저장해요. 그 파일은 상태가 200일 때만 이미지예요. 응답 처리하기를 참고하세요.
응답 처리하기
대부분의 단일 이미지는 같은 응답으로 완성되어 돌아와요. 대기열이 유난히 혼잡해서 이미지 처리가 약 55초 이상 걸리면, 대신 작업 ID와 함께 202 Accepted를 받아요. 작업은 계속 실행되므로 ID로 결과를 가져오세요. 이미지를 다시 보내면 두 번째 작업이 시작되어 크레딧이 한 번 더 차감될 수 있어요.
| 상태 | 본문 | 해야 할 일 |
|---|---|---|
200 | 이미지(image/png, image/jpeg 또는 image/webp) | 저장하세요. 파일 확장자는 Content-Type을 보고 정하세요. |
202 | JSON: { id, status, status_url, result_url } | 이미지가 아니에요. 몇 초 기다린 뒤 result_url을 GET 하세요. 이미지를 다시 보내지 마세요. |
4xx / 5xx | JSON: { "error": { "code", "message" } } | 이미지가 아니에요. code를 확인하고(오류 참고), 본문을 이미지로 저장하지 마세요. |
전체 예제
완성된 이미지, 202, 실패한 작업, 로컬 시간 제한을 모두 처리해요. 이미지는 한 번만 보내고, 안전한 상태 확인만 재시도해요.
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"))Python 3와 requests가 필요해요(pip install requests).
- 스크립트를 멈춰도 작업은 멈추지 않아요. 작업이 완료되어 요금이 부과될 수 있으며, 결과는 스튜디오에 표시돼요.
- 시간 제한은 직접 정하는 값이며 저희가 보장하는 것은 아니에요. 대부분의 이미지는 몇 초 안에 완료돼요.
- remove.bg 호환 엔드포인트는 다르게 동작해요. 202를 절대 반환하지 않아요(아래 참고).
인증
API 키를 x-api-key 헤더에 담아 보내세요. 키는 계정 페이지에서 만들고 폐기할 수 있으며, 모든 호출은 해당 계정의 크레딧을 사용해요. 모든 엔드포인트는 https://removebackground.dev 아래에 있고 CORS 요청을 허용하지만, CORS가 있다고 해서 웹 페이지에 키를 넣어도 안전한 것은 아니에요. 키는 서버에 보관하세요(보안 참고). 오류는 JSON 형식이에요: { "error": { "code": "…", "message": "…" } }.
전체 명세는 OpenAPI 3.1(openapi.json)으로 공개되어 있어 클라이언트 생성기, Postman, 테스트에 활용할 수 있어요. AI 코딩 어시스턴트는 llms.txt에서 시작할 수 있어요.
POST /v1/remove
실시간. 이미지 한 장의 배경을 제거해요. 보통 완성된 이미지가 응답 본문(image/png, image/jpeg 또는 image/webp)으로 오며, 일반적으로 몇 초가 걸려요. 파라미터는 폼 필드, JSON 키, 쿼리 문자열 값 중 어느 것으로든 보낼 수 있어요. Content-Type: image/jpeg, image/png, image/webp 또는 application/octet-stream으로 원시 이미지 바이트를 POST 할 수도 있어요. 최대 25 MB. 각 입력 방법은 이미지 보내기를 참고하세요.
| 파라미터 | 유형 | 설명 |
|---|---|---|
image_file | file | 이미지(JPG, PNG 또는 WebP), 멀티파트 폼 데이터로 전송. |
image_file_b64 | string | base64 형식의 이미지. data:image/…;base64, 접두사는 있어도 없어도 돼요(디코딩 후 25 MB). JSON에서 보낼 때 편리해요. |
image_url | string | 이미지의 공개 http(s) URL. 저희가 다운로드해요(리디렉션 최대 3회, 15초). 여러 개를 보내면 image_file, image_file_b64, image_url, 원시 본문 순으로 우선 적용돼요. |
format | png | jpg | webp | 출력 형식. 기본값은 png. JPG는 투명도가 없어서 bg_color 또는 흰색으로 채워져요. |
bg_color | 색상 | 배경 채우기: 16진수(ffffff, #fff), rgb(255, 255, 255), 또는 white, black, red, green, blue, yellow, gray / grey. transparent(기본값)는 투명하게 유지해요. |
size | preview | medium | hd | full | 메가픽셀 상한, 가로세로 비율 유지, 확대 없음: preview ≤ 0.25 MP, medium ≤ 1.5 MP, hd ≤ 4 MP, full(기본값)은 원본 해상도(최대 25 MP). width나 height를 지정하면 무시돼요. |
crop | true | false | W:H | 피사체의 경계 상자에 맞게 잘라요. 가로세로 비율(1:1, 4:5, 4:3, 16:9…)을 지정하면 상자가 피사체를 중심으로 그 비율까지 확장돼요(축소는 안 돼요). 사진 바깥 영역은 투명(또는 bg_color)해요. 기본값은 false. |
padding | px | 비율 | % | crop과 함께 사용: 각 변에 여백을 추가해요. 0.1 또는 10% = 피사체 너비(좌우)와 높이(상하)의 10분의 1. "10%,7.5%"는 가로와 세로를 따로 지정해요. 24px(또는 1보다 큰 정수만 입력)는 픽셀 단위이며 최대 500. 기본값은 0. |
channels | rgba | rgb | alpha | rgba(기본값): 투명한 누끼. rgb: 불투명, bg_color 또는 흰색으로 채움. alpha: 흑백 PNG 마스크(흰색 = 피사체), 누끼와 같은 크기 및 자르기. type=mask도 여전히 alpha의 별칭으로 작동해요. |
width / height | 1–6000 | 픽셀 단위의 정확한 출력 크기로, crop 이후에 적용돼요(size보다 우선). 하나만 지정하면 다른 하나는 가로세로 비율을 따라요. 늘어나지 않아요. |
roi | x1 y1 x2 y2 | 관심 영역, px 또는 %로 지정(예: 0% 0% 50% 100%). 영역 안의 피사체만 남고 바깥은 모두 배경이 돼요. 좌표는 원본 이미지 기준이에요. 기본값: 이미지 전체. |
fit | contain | cover | scale-down | width와 height와 함께 사용. contain(기본값): 상자 안에 맞춰 가운데 정렬하고 나머지는 투명(또는 bg_color). cover: 상자를 가득 채우고 넘치는 부분은 피사체 주변에서 잘라요. scale-down: contain과 같지만 확대하지 않아요. |
옵션은 다음 순서로 적용돼요: roi, size(또는 이후 width/height), crop + padding + 가로세로 비율, width/height + fit, 그다음 channels 또는 배경색, 마지막으로 format. 어떤 옵션이든 똑같이 1 크레딧이에요. 알 수 없는 파라미터는 무시돼요.
예시: 흰색 배경의 HD JPG, 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예시: 마켓플레이스용 정사각형 이미지, 피사체를 가운데 두고 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예시: base64 입력, 알파 마스크 출력
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
이미지 바이트와 다음 헤더:
| 헤더 | 의미 |
|---|---|
X-Image-Width / X-Image-Height | 결과의 크기(픽셀)(X-Width / X-Height로도 전송). |
X-Request-ID | X-Request-ID를 보냈다면 그 값, 아니면 생성된 ID. 지원팀에 문의할 때 알려 주세요. |
X-Processing-Time-Ms | 요청 처리에 걸린 시간(X-Processing-Ms로도 전송). |
X-Matte-Confidence | 0~1: 마스크가 얼마나 명확한지(픽셀 전체에 대한 |2a − 1|의 평균, a = 알파). 1에 가까울수록 깔끔한 누끼이고, 값이 낮을수록 부드럽거나 불확실한 가장자리가 많다는 뜻이에요. |
X-Matte-Ambiguous-Ratio | 알파 값이 0.1 초과 0.9 미만인 픽셀의 비율(머리카락, 유리, 모션 블러). 검토가 필요한 이미지를 표시하는 데 유용해요. |
X-Credits-Remaining | 이 이미지 처리 후 잔액. |
X-Removal-Id | 저장된 결과의 ID. |
X-Job-Id | 요청에 해당하는 작업의 ID(/v1/jobs/:id에서 사용 가능). |
202 Accepted(대기열이 길 때의 대체 응답)
대기열이 유난히 혼잡할 때처럼 이미지가 약 55초 안에 완성되지 않으면, 202와 JSON { id, status, status_url, result_url }(그리고 Location 및 Retry-After: 2)를 받아요. done이 true가 될 때까지 status_url을 폴링한 뒤 result_url을 다운로드하세요. 요금은 이미지 처리에 성공했을 때 한 번만 부과돼요. Idempotency-Key 없이 이미지를 다시 보내지 마세요. 두 번째 작업이 시작돼요. 전체 예제는 응답 처리하기를 참고하세요.
GET /v1/jobs/:id
/v1/remove 또는 /v1/batch로 만든 작업의 상태. 같은 키를 사용하며, 내 작업만 볼 수 있어요.
| 필드 | 의미 |
|---|---|
status | queued, processing, succeeded, partial, failed 또는 canceled |
done | 더 실행할 것이 없으면 true |
total, succeeded, failed, skipped | 이미지 수 |
credits_charged | 이 작업에 사용된 크레딧(성공한 이미지 1장당 1) |
status_url, result_url | 폴링할 위치와 다운로드할 위치 |
items[] | 이미지별: position, input, status, error { code, message }, 성공 시 removal_id, width, height, format, result_url |
GET /v1/jobs/:id/result
완료된 작업의 이미지 바이트로, /v1/remove와 같은 헤더가 포함돼요. ?item=N은 배치 작업의 이미지를 선택해요(기본값 0). 아직 실행 중이면 Retry-After: 2와 함께 409 not_ready를, 실패했다면 해당 이미지의 오류를 반환해요.
POST /v1/batch
최대 100개의 이미지 URL을 하나의 작업으로 대기열에 넣어요: JSON { "image_urls": ["https://…", …], "format": "jpg", "bg_color": "ffffff", "size": "hd", "crop": "1:1", "padding": "10%" }, /v1/remove와 같은 옵션(channels, width, height, fit 포함) 사용 가능. 즉시 202와 { id, status, total, invalid, duplicates, status_url }를 반환해요. 작업을 폴링한 뒤 각 항목의 result_url을 가져오세요. 성공한 이미지 1장당 1 크레딧이며, 계정당 미완료 배치 작업은 최대 3개예요. 응답 예시가 포함된 안내는 배치 처리 전체 과정을 참고하세요.
remove.bg 호환 엔드포인트
remove.bg의 셀프서비스 API가 1 December 2026, 09:00 CET에 종료돼요(공지). 기존 remove.bg 연동은 한 줄만 바꾸면 여기서 작동해요: https://api.remove.bg/v1.0/removebg → https://removebackground.dev/v1.0/removebg, 같은 X-Api-Key 헤더에 removebackground.dev 키를 넣으세요. 대기열, 성공한 이미지 1장당 1 크레딧, 출력 품질 모두 /v1/remove와 같아요. 이전 가이드.
POST /v1.0/removebg
remove.bg의 파라미터 이름을 사용하는 multipart, urlencoded 또는 JSON 본문. 이미지 바이트와 remove.bg의 헤더를 반환하며, Accept: application/json을 보내면 { "data": { "result_b64", "foreground_top", "foreground_left", "foreground_width", "foreground_height" } }를 반환해요. 오류는 remove.bg 형식을 사용해요: { "errors": [{ "title", "code", "detail" }] }. /v1/remove와 달리 202를 반환하지 않고, 최대 110초를 기다린 뒤 503 timeout을 반환해요. 작업은 계속 실행되어 성공하면 요금이 부과되므로, 그 요청을 재시도하면 두 번째 작업이 시작돼요.
| 파라미터 | 상태 | 참고 |
|---|---|---|
image_file / image_file_b64 / image_url | 지원 | multipart, urlencoded 또는 JSON 본문. JPG, PNG, WebP 최대 25 MB. |
size | 지원 | auto, full, 4k, 50MP는 원본 해상도(최대 25 MP), preview, small, regular는 약 0.25 MP, medium은 1.5 MP, hd는 4 MP. 항상 1 크레딧이에요. |
format | 지원 | auto(투명하면 PNG, 아니면 JPG), png, jpg, webp, zip(color.jpg + alpha.png). |
crop / crop_margin | 지원 | 피사체 기준 px 또는 %, CSS 방식의 값 1~4개("10% 20%" = 세로, 가로). 각 변 최대 500px 또는 50%. |
roi | 지원 | px 또는 %로 지정한 "x1 y1 x2 y2": 영역 안의 피사체만 남겨요. |
scale / position | 지원 | scale은 10%~100% 또는 original, position은 center, original 또는 "x% y%". |
channels | 지원 | rgba(누끼) 또는 alpha(흑백 마스크). |
bg_color | 지원 | #을 붙이거나 붙이지 않은 16진수(81d4fa) 또는 색상 이름. 8자리 16진수는 색상은 유지하고 알파 값은 무시해요. |
bg_image_url / bg_image_file | 지원 | 누끼를 배경 이미지 위에 합성하며, 배경 이미지는 출력 크기에 맞게 cover 방식으로 채워져요. |
Accept: application/json | 지원 | { data: { result_b64, foreground_top, foreground_left, foreground_width, foreground_height } }를 반환해요. |
type / type_level | 허용, 무시됨 | 피사체는 자동으로 감지되며, X-Type은 항상 "other"예요. |
semitransparency | 허용, 무시됨 | 부드러운 가장자리와 반투명 영역은 모델의 매트를 그대로 사용해요. |
shadow_type / shadow_opacity / add_shadow | 허용, 무시됨 | 그림자는 추가되지 않아요. |
오래 걸리는 요청 | 차이점 | 최대 110초까지 기다려요. 그때까지 이미지가 준비되지 않으면 재시도 가능한 503을 반환해요(처리가 완료되지 않으면 요금이 부과되지 않아요). |
예시
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응답 헤더
| 헤더 | 의미 |
|---|---|
X-Width / X-Height | 결과물의 크기(픽셀). |
X-Credits-Charged | 이 이미지에 사용된 크레딧: 항상 1(실패한 이미지는 0). |
X-Type | 항상 "other"(피사체 감지는 자동). |
X-Foreground-Top / -Left / -Width / -Height | 결과물에서 피사체의 경계 상자(픽셀). |
X-Request-ID | 보낸 X-Request-ID 또는 생성된 ID를 그대로 반환해요. 추가 기능. |
X-Matte-Confidence / X-Matte-Ambiguous-Ratio | 마스크가 얼마나 깔끔한지(0~1)와 부드러운 픽셀의 비율. 추가 기능: 검토가 필요한 이미지를 표시하는 데 유용해요. |
오류
| 상태 | 의미 |
|---|---|
400 | 잘못된 파라미터 또는 이미지(invalid_size, invalid_crop_margin, missing_source, file_too_large, unknown_foreground 등의 코드). |
402 | insufficient_credits: 요금 페이지에서 충전하세요. |
403 | auth_failed: X-Api-Key가 없거나 유효하지 않아요. |
429 | rate_limit_exceeded. |
500 / 503 | 처리 실패, 시간 초과 또는 서비스를 잠시 사용할 수 없는 상태예요. 다시 시도하세요. 실패한 이미지는 무료예요. |
GET /v1.0/account
remove.bg 계정 형식의 잔액: { "data": { "attributes": { "credits": { "total", "subscription": 0, "payg", "enterprise": 0 }, "api": { "free_calls": 0, "sizes": "all" } } } }. 모든 크레딧은 종량제이고 만료되지 않으므로 total은 payg와 같아요. X-Api-Key와 함께 GET https://removebackground.dev/v1.0/account를 호출하세요.
오류(/v1 엔드포인트)
실패한 이미지에는 절대 요금이 부과되지 않아요.
| 상태 | 코드 | 의미 |
|---|---|---|
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 | 요청 또는 이미지 URL을 사용할 수 없어요. |
401 | unauthorized | x-api-key가 없거나, 잘못되었거나, 폐기되었어요. |
402 | insufficient_credits, out_of_credits | 잔액이 없어요. 요금 페이지에서 충전하세요. |
404 | not_found | 해당 작업이 없어요(또는 내 작업이 아니에요). |
409 | not_ready, canceled, idempotency_key_reused | 작업이 아직 실행 중일 때 GET …/result를 호출했거나(2초 후 재시도), 작업이 취소되었거나, Idempotency-Key가 다른 요청에 재사용되었어요. |
410 | result_unavailable | 결과가 삭제되었거나 만료되었어요. |
413 | too_large | 이미지가 25 MB보다 커요. |
422 | processing_failed, invalid_image, missing_upload | 파일이 읽을 수 있는 이미지가 아니에요. 요금은 부과되지 않아요. |
429 | rate_limited, too_many_batches | 계정당 요청 한도를 초과했거나(Retry-After만큼 대기), 이미 배치 작업 3개가 실행 중이에요. |
502 | model_unavailable, upstream_error, … | 재시도 후에도 이미지를 처리하지 못했어요. 요금은 부과되지 않아요. |
503 | server_paused, unavailable | API가 일시 중지되었거나(출시 전) 잠시 사용할 수 없어요. 나중에 다시 시도하세요. |
배치 처리 전체 과정
1. 제출
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" }'최대 100개의 공개 이미지 URL과 /v1/remove의 옵션을 함께 보내세요. 위의 자리 표시자 URL 두 개가 실제 이미지라면 최대 2 크레딧이 차감돼요. 응답은 바로 와요:
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는 http(s) URL이 아닌 항목 수, duplicates는 중복 항목 수예요. 둘 다 제외되며 요금이 부과되지 않아요. id는 저장해 두세요. 재시작 후 작업을 다시 이어받을 때 필요해요.
2. 작업 폴링
done이 true가 될 때까지 몇 초마다 GET /v1/jobs/:id를 호출하세요. status는 queued에서 processing으로 바뀌고, 최종적으로 succeeded, partial(일부 이미지 실패) 또는 failed로 끝나요. 재시도 중인 항목은 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. 각 결과 다운로드
성공한 각 항목에 대해 GET /v1/jobs/:id/result?item=N을 호출하세요(또는 해당 result_url 사용). item은 0부터 시작하는 position이에요. 위치는 잘못된 URL과 중복 URL을 제외한 목록 순서를 따르므로, 둘 중 하나라도 0보다 크면 인덱스가 아닌 input으로 결과를 매칭하세요.
done이 true가 되면 해당 배치는 미완료 배치 한도 3개에 더 이상 포함되지 않아요.- API에는 취소 엔드포인트, 웹훅, ZIP 다운로드가 없어요. 일괄 처리 페이지에서 시작한 배치는 그 페이지에서 취소하거나 ZIP으로 다운로드할 수 있어요.
재시도, 중복, 과금
Idempotency-Key를 보내면 재시도해도 두 번 과금되지 않아요. POST /v1/remove 또는 POST /v1/batch에 Idempotency-Key 헤더(UUID 같은 255자 이하의 고유 문자열)를 추가하세요. 키는 이미지나 배치마다 하나씩 사용해요. 같은 키로 같은 요청을 다시 보내면, 첫 요청이 만든 작업을 Idempotent-Replayed: true와 함께 받아요. 첫 요청이 아직 실행 중이어도 새 작업이나 새 과금은 없어요. 같은 키로 다른 이미지나 옵션을 보내면 409 idempotency_key_reused가 반환돼요. 키는 계정에 귀속되며 만료되지 않아요.
키가 없으면 POST할 때마다 새 작업이 만들어지고, 성공한 작업마다 1 크레딧이 차감돼요(remove.bg 호환 POST /v1.0/removebg는 키를 지원하지 않아요). 작업 조회(GET /v1/jobs/…)는 항상 무료이며 반복해도 안전해요.
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크레딧이 차감되는 경우
| 상황 | 과금 |
|---|---|
| 처리 전에 요청이 거부됨(잘못된 키, 잘못된 옵션, 크기 초과, 크레딧 부족) | 무료. |
| 이미지를 처리할 수 없음(422 잘못된 이미지, 저희 측 재시도 후 502) | 무료. |
| 이미지 처리에 성공함 | 성공 시 1 크레딧, 한 번만 차감돼요. 저희 내부 재시도로 요금이 추가되지 않아요. |
| 202를 받음 | 아직 차감되지 않아요. 작업은 계속 실행되며, 성공했을 때만 1 크레딧이 차감돼요. |
| 기다리는 동안 클라이언트가 시간 초과되거나 연결이 끊김 | 작업은 계속 실행되며, 성공하면 요금이 부과돼요. 결과는 스튜디오에 표시돼요. |
| 같은 Idempotency-Key로 같은 요청을 두 번 보냄 | 작업은 하나, 최대 1 크레딧. 두 번째 요청은 같은 작업을 받아요(헤더 Idempotent-Replayed: true). |
| 키 없이 같은 이미지를 두 번 보냄 | 별개의 작업 두 개가 되며, 성공한 작업마다 1 크레딧이 차감돼요. |
| 완성된 결과를 다시 다운로드함 | 보관되는 동안에는 몇 번이든 무료예요. |
| 배치가 부분적으로 성공함 | 성공한 이미지 1장당 1 크레딧. 합계는 작업의 credits_charged에서 확인할 수 있어요. |
| 배치에 같은 URL이 두 번 포함됨 | 한 배치 안의 중복 항목은 대기열에 들어가기 전에 제외되며 요금이 부과되지 않아요. 서로 다른 배치에 있는 같은 URL은 별개의 작업이에요. |
| 배치 처리 중 크레딧이 소진됨 | 이미 완료된 이미지는 결제된 상태로 유지되고, 나머지는 건너뜀(out_of_credits)으로 표시되며 무료예요. 크레딧을 구매한 뒤 남은 URL을 새 배치로 보내세요. |
재시도해야 할 때
| 발생한 상황 | 해야 할 일 |
|---|---|
| GET /v1/jobs/:id 또는 …/result 실패(네트워크 오류, 5xx) | 안전하게 재시도할 수 있어요. 작업 조회는 새 작업을 만들거나 요금을 부과하지 않아요. 재시도 사이에 간격을 조금 두세요. |
| GET …/result가 409 not_ready 반환 | Retry-After(2초)만큼 기다린 뒤 다시 요청하세요. 이미지를 다시 제출하지 마세요. |
| GET …/result가 410 result_unavailable 반환 | 저장된 결과가 삭제되었어요. 이미지를 다시 처리하면 새 작업이 되며 1 크레딧이 차감돼요. |
| POST가 400, 413 또는 422 반환 | 먼저 요청이나 이미지를 수정하세요. 그대로 보내면 같은 응답을 받아요. |
| POST가 401 또는 402 반환 | 키를 수정하거나 충전하세요. 반복해서 재시도하지 마세요. |
| POST가 429 rate_limited 반환 | Retry-After에 표시된 초만큼 기다린 뒤 (같은 Idempotency-Key로) 다시 보내세요. 1분에 60장을 넘나요? POST /v1/batch를 사용하세요. 요청 한 번으로 최대 100장까지 처리돼요. |
| POST /v1/batch가 429 too_many_batches 반환 | 미완료 배치 3개 중 하나가 완료될 때까지 (폴링하며) 기다린 뒤 제출하세요. |
| POST /v1/…가 503(unavailable, server_paused) 반환 | 작업이 만들어지지 않았어요. 잠시 후 다시 시도하세요. (remove.bg 호환 엔드포인트는 달라요. 그 503 timeout은 작업이 아직 실행 중이라는 뜻이에요.) |
| POST /v1/remove가 502 반환 | 해당 작업은 실패했으며 요금이 부과되지 않았어요. 재시도하면 새 작업이 돼요. |
| POST가 시간 초과되거나, 연결이 끊기거나, 500을 받음 | Idempotency-Key가 있다면: 같은 키로 같은 요청을 다시 보내면 원래 작업을 받아요. 키가 없다면 작업이 이미 존재하고 요금이 부과되었을 수 있으니 먼저 스튜디오를 확인하세요. |
| POST가 409 idempotency_key_reused 반환 | 그 키는 이미 다른 이미지나 옵션에 사용되었어요. 새 이미지마다 새 키를 만드세요. |
제한과 보관
| 제한 항목 | 값 | 초과 시 오류 |
|---|---|---|
| 이미지 파일 | 25 MB(25 × 1024 × 1024바이트). JPG, PNG 또는 WebP(파일 바이트로 판별) | 413 too_large · 422 processing_failed |
| Base64 / JSON 본문 | 디코딩 후 25 MB(요청 본문은 약 3분의 1 더 클 수 있어요) | 413 too_large |
| 입력 해상도 | 25 MP를 넘는 이미지는 처리 전에 25 MP로 축소돼요 | — |
| 출력 크기 | width와 height 각각 1~6000 px | 400 invalid_width / invalid_height |
| image_url 다운로드 | http(s)만 허용, 시간 제한 15초, 리디렉션 최대 3회. 사설, 루프백, 링크 로컬 주소는 모든 리디렉션 단계에서 거부돼요 | 400 invalid_url · fetch_failed · fetch_timeout |
| POST /v1/remove 대기 시간 | 약 55초, 이후 작업 ID와 함께 202 | 202 |
| 배치 크기 | POST /v1/batch 한 번에 이미지 URL 100개 | 400 too_many_images |
| 미완료 배치 | 계정당 완료되지 않은 다중 이미지 작업 3개(단일 이미지는 포함 안 됨) | 429 too_many_batches |
| 요청 속도 | POST /v1/remove, /v1/batch, /v1.0/removebg 합산 계정당 분당 60회 요청. 배치는 크기와 관계없이 한 번으로 계산돼요. 작업 조회는 제한이 없어요 | 429 rate_limited(Retry-After 포함) |
결과 보관 기간
모든 결과는 만들어진 후 48시간 동안 내 계정에 비공개로 보관된 다음 삭제돼요. 그전까지는 GET /v1/jobs/:id/result 또는 스튜디오에서 무료로 다시 다운로드할 수 있어요. 그 이후에는 결과 링크가 410 result_unavailable을 반환하며, 이미지를 다시 처리하면 새 작업이 돼요. 작업 상태 기록은 이미지가 삭제된 후에도 조회할 수 있어요. 업로드 처리 방식은 개인정보 처리방침을 참고하세요. 저희는 이미지를 모델 학습에 사용하지 않아요.
보안
API 키는 직접 관리하는 서버에 보관하세요. 브라우저 코드, 모바일 앱, 공개 저장소, URL에 넣지 마세요. 내 서비스의 사용자에게 배경 제거 기능을 제공하려면 이미지를 백엔드를 통해 보내고, 그곳에 자체 로그인과 사용 한도를 설정하세요.
- API는 도구와 서버 측 코드에서 작동하도록 CORS를 허용해요. 그렇다고 웹 페이지에 키를 넣어도 안전한 것은 아니에요. 누구나 그 키를 읽을 수 있어요.
- 한 계정의 모든 키는 같은 크레딧 잔액을 사용해요. 계정 페이지에서 앱이나 환경마다 별도의 키를 만들면, 다른 키에 영향을 주지 않고 하나만 폐기할 수 있어요.
- 키가 유출되면 계정 페이지에서 즉시 폐기하고(바로 작동이 중지돼요) 새 키를 만드세요. 저희는 각 키의 해시만 저장하므로 키를 다시 보여 드릴 수 없어요.
문제 해결
| 증상 | 원인 |
|---|---|
| PNG가 열리지 않아요 | 본문이 이미지가 아니라 JSON(202 작업 또는 오류)이었어요. 저장하기 전에 HTTP 상태와 Content-Type을 확인하세요. |
| 스크립트는 시간 초과됐는데 이미지가 스튜디오에 있어요 | 기다리기를 멈춘 뒤에도 작업은 계속 실행됐어요. 다시 보내지 말고 작업 ID로 결과를 가져오세요. |
| 이미지 한 장에 두 번 과금됐어요 | Idempotency-Key 없이 두 번 전송되었어요(보통 시간 초과 후 자동 재시도 때문이에요). 이미지마다 키를 하나씩 보내고, 재시도할 때도 같은 키를 사용하세요. |
| 브라우저에서는 URL이 열리는데 API는 가져오지 못해요 | 호스트가 쿠키나 로그인을 요구하거나, 서버 접근을 차단하거나, 3회를 넘게 리디렉션하거나, 15초 넘게 걸리거나, 서명된 URL이 만료되었을 수 있어요. 대신 파일을 업로드하세요. |
| 배치가 중간에 멈췄어요 | 작업의 items[]를 확인하세요. 실패한 항목에는 오류 코드가 있고, out_of_credits로 건너뛴 항목은 잔액이 소진되었다는 뜻이에요. |
| 옵션이 적용되지 않는 것 같아요 | 알 수 없는 파라미터 이름은 별도 안내 없이 무시돼요. 파라미터 표와 비교해 철자를 확인하세요. /v1.0/removebg에서는 일부 remove.bg 옵션이 허용되지만 무시돼요(해당 표 참고). |
| 배경이 투명하지 않아요 | JPG는 투명도를 지원하지 않아요. format=png 또는 webp를 사용하고 bg_color는 지정하지 마세요. |
| 결과 링크가 410을 반환해요 | 저장된 결과가 삭제되었어요. 다시 처리하면 1 크레딧이 차감돼요. |