실시간 API

배경 제거 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 저장됨(투명, 원본 해상도)
1 내 이미지2 HTTP 요청 한 번3 응답으로 받은 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을 보고 정하세요.
202JSON: { id, status, status_url, result_url }이미지가 아니에요. 몇 초 기다린 뒤 result_url을 GET 하세요. 이미지를 다시 보내지 마세요.
4xx / 5xxJSON: { "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_filefile이미지(JPG, PNG 또는 WebP), 멀티파트 폼 데이터로 전송.
image_file_b64stringbase64 형식의 이미지. data:image/…;base64, 접두사는 있어도 없어도 돼요(디코딩 후 25 MB). JSON에서 보낼 때 편리해요.
image_urlstring이미지의 공개 http(s) URL. 저희가 다운로드해요(리디렉션 최대 3회, 15초). 여러 개를 보내면 image_file, image_file_b64, image_url, 원시 본문 순으로 우선 적용돼요.
formatpng | jpg | webp출력 형식. 기본값은 png. JPG는 투명도가 없어서 bg_color 또는 흰색으로 채워져요.
bg_color색상배경 채우기: 16진수(ffffff, #fff), rgb(255, 255, 255), 또는 white, black, red, green, blue, yellow, gray / grey. transparent(기본값)는 투명하게 유지해요.
sizepreview | medium | hd | full메가픽셀 상한, 가로세로 비율 유지, 확대 없음: preview ≤ 0.25 MP, medium ≤ 1.5 MP, hd ≤ 4 MP, full(기본값)은 원본 해상도(최대 25 MP). width나 height를 지정하면 무시돼요.
croptrue | false | W:H피사체의 경계 상자에 맞게 잘라요. 가로세로 비율(1:1, 4:5, 4:3, 16:9…)을 지정하면 상자가 피사체를 중심으로 그 비율까지 확장돼요(축소는 안 돼요). 사진 바깥 영역은 투명(또는 bg_color)해요. 기본값은 false.
paddingpx | 비율 | %crop과 함께 사용: 각 변에 여백을 추가해요. 0.1 또는 10% = 피사체 너비(좌우)와 높이(상하)의 10분의 1. "10%,7.5%"는 가로와 세로를 따로 지정해요. 24px(또는 1보다 큰 정수만 입력)는 픽셀 단위이며 최대 500. 기본값은 0.
channelsrgba | rgb | alphargba(기본값): 투명한 누끼. rgb: 불투명, bg_color 또는 흰색으로 채움. alpha: 흑백 PNG 마스크(흰색 = 피사체), 누끼와 같은 크기 및 자르기. type=mask도 여전히 alpha의 별칭으로 작동해요.
width / height1–6000픽셀 단위의 정확한 출력 크기로, crop 이후에 적용돼요(size보다 우선). 하나만 지정하면 다른 하나는 가로세로 비율을 따라요. 늘어나지 않아요.
roix1 y1 x2 y2관심 영역, px 또는 %로 지정(예: 0% 0% 50% 100%). 영역 안의 피사체만 남고 바깥은 모두 배경이 돼요. 좌표는 원본 이미지 기준이에요. 기본값: 이미지 전체.
fitcontain | cover | scale-downwidth와 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.png

200 OK

이미지 바이트와 다음 헤더:

헤더의미
X-Image-Width / X-Image-Height결과의 크기(픽셀)(X-Width / X-Height로도 전송).
X-Request-IDX-Request-ID를 보냈다면 그 값, 아니면 생성된 ID. 지원팀에 문의할 때 알려 주세요.
X-Processing-Time-Ms요청 처리에 걸린 시간(X-Processing-Ms로도 전송).
X-Matte-Confidence0~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로 만든 작업의 상태. 같은 키를 사용하며, 내 작업만 볼 수 있어요.

필드의미
statusqueued, 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 등의 코드).
402insufficient_credits: 요금 페이지에서 충전하세요.
403auth_failed: X-Api-Key가 없거나 유효하지 않아요.
429rate_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 엔드포인트)

실패한 이미지에는 절대 요금이 부과되지 않아요.

상태코드의미
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_images요청 또는 이미지 URL을 사용할 수 없어요.
401unauthorizedx-api-key가 없거나, 잘못되었거나, 폐기되었어요.
402insufficient_credits, out_of_credits잔액이 없어요. 요금 페이지에서 충전하세요.
404not_found해당 작업이 없어요(또는 내 작업이 아니에요).
409not_ready, canceled, idempotency_key_reused작업이 아직 실행 중일 때 GET …/result를 호출했거나(2초 후 재시도), 작업이 취소되었거나, Idempotency-Key가 다른 요청에 재사용되었어요.
410result_unavailable결과가 삭제되었거나 만료되었어요.
413too_large이미지가 25 MB보다 커요.
422processing_failed, invalid_image, missing_upload파일이 읽을 수 있는 이미지가 아니에요. 요금은 부과되지 않아요.
429rate_limited, too_many_batches계정당 요청 한도를 초과했거나(Retry-After만큼 대기), 이미 배치 작업 3개가 실행 중이에요.
502model_unavailable, upstream_error, …재시도 후에도 이미지를 처리하지 못했어요. 요금은 부과되지 않아요.
503server_paused, unavailableAPI가 일시 중지되었거나(출시 전) 잠시 사용할 수 없어요. 나중에 다시 시도하세요.

배치 처리 전체 과정

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 px400 invalid_width / invalid_height
image_url 다운로드http(s)만 허용, 시간 제한 15초, 리디렉션 최대 3회. 사설, 루프백, 링크 로컬 주소는 모든 리디렉션 단계에서 거부돼요400 invalid_url · fetch_failed · fetch_timeout
POST /v1/remove 대기 시간약 55초, 이후 작업 ID와 함께 202202
배치 크기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 크레딧이 차감돼요.