API ลบพื้นหลัง: ส่งคำขอเดียว ได้ PNG ที่เสร็จแล้วกลับมา
อัปโหลดไฟล์ ส่ง URL ของรูปสาธารณะ หรือส่ง base64 รูปเดี่ยวส่วนใหญ่จะเสร็จและส่งกลับมาในการตอบกลับ HTTP เดียวกัน ปกติใช้เวลาไม่กี่วินาที หากรูปใดใช้เวลานานกว่านั้น คุณจะได้ job id ไว้ดึงผลลัพธ์ โดยไม่ต้องส่งรูปซ้ำ และมีเอนด์พอยต์ batch สำหรับงานทีละหลายรูป
1 เครดิตต่อรูปที่สำเร็จ · รูปที่ล้มเหลวไม่เสียเครดิต · คีย์อยู่ในบัญชีของคุณ
$ 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 และ raw body ตัวอย่างเหล่านี้อ่านคีย์จากตัวแปรสภาพแวดล้อม 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.pngMultipart form data ฟิลด์ image_file ไฟล์ JPG, PNG หรือ WebP ไม่เกิน 25 MB
ทุกตัวอย่างบันทึก body ลงไฟล์ ไฟล์นั้นจะเป็นรูปภาพก็ต่อเมื่อสถานะเป็น 200 เท่านั้น ดูจัดการการตอบกลับ
จัดการการตอบกลับ
รูปเดี่ยวส่วนใหญ่จะเสร็จและส่งกลับมาในการตอบกลับเดียวกัน เมื่อคิวยุ่งผิดปกติและรูปใช้เวลานานกว่าประมาณ 55 วินาที คุณจะได้ 202 Accepted พร้อม job id แทน งานยังคงทำงานต่อ: ดึงผลลัพธ์ด้วย id นั้น การส่งรูปซ้ำจะเริ่มงานที่สองและอาจเสียเครดิตเป็นครั้งที่สอง
| สถานะ | Body | สิ่งที่ต้องทำ |
|---|---|---|
200 | รูปภาพ (image/png, image/jpeg หรือ image/webp) | บันทึกไว้ ใช้ Content-Type เพื่อเลือกนามสกุลไฟล์ |
202 | JSON: { id, status, status_url, result_url } | ไม่ใช่รูปภาพ รอสองสามวินาที แล้ว GET result_url อย่าส่งรูปซ้ำ |
4xx / 5xx | JSON: { "error": { "code", "message" } } | ไม่ใช่รูปภาพ อ่านรหัส (ดูข้อผิดพลาด) และอย่าบันทึก body เป็นรูป |
ตัวอย่างฉบับสมบูรณ์
จัดการรูปที่เสร็จแล้ว กรณี 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": "…" } }
สัญญา API ฉบับเต็มเผยแพร่เป็น OpenAPI 3.1 (openapi.json) สำหรับตัวสร้างไคลเอนต์ Postman หรือการทดสอบ ผู้ช่วยเขียนโค้ด AI เริ่มต้นได้จาก llms.txt
POST /v1/remove
แบบเรียลไทม์ ลบพื้นหลังจากรูปหนึ่งรูป โดยปกติรูปที่เสร็จแล้วจะเป็น response body (image/png, image/jpeg หรือ image/webp) ปกติหลังจากไม่กี่วินาที พารามิเตอร์ส่งเป็นฟิลด์ฟอร์ม คีย์ JSON หรือค่าใน query string ได้ คุณยัง POST ไบต์ดิบของรูปด้วย Content-Type: image/jpeg, image/png, image/webp หรือ application/octet-stream ได้ด้วย สูงสุด 25 MB ดูส่งรูปของคุณสำหรับแต่ละวิธี
| พารามิเตอร์ | ชนิด | คำอธิบาย |
|---|---|---|
image_file | file | รูปภาพ (JPG, PNG หรือ WebP) แบบ multipart form data |
image_file_b64 | string | รูปภาพแบบ base64 จะมีหรือไม่มีคำนำหน้า data:image/…;base64, ก็ได้ (25 MB หลังถอดรหัส) สะดวกเมื่อส่งจาก JSON |
image_url | string | URL แบบ http(s) สาธารณะของรูป เราจะดาวน์โหลดให้ (redirect สูงสุด 3 ครั้ง, 15 วินาที) หากส่งมาหลายแบบ image_file จะได้ก่อน ตามด้วย image_file_b64, image_url และ raw body |
format | png | jpg | webp | รูปแบบผลลัพธ์ ค่าเริ่มต้น png JPG ไม่มีความโปร่งใส: จะถูกรวมลงบน bg_color หรือสีขาว |
bg_color | สี | เติมพื้นหลัง: hex (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%,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 เครดิตเท่ากัน พารามิเตอร์ที่ไม่รู้จักจะถูกละเว้น
ตัวอย่าง: JPG แบบ HD บนพื้นขาว ครอปตามวัตถุพร้อมระยะขอบ 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 ที่สร้างขึ้น แจ้ง id นี้เมื่อติดต่อฝ่ายช่วยเหลือ |
X-Processing-Time-Ms | เวลาที่ใช้กับคำขอ (ส่งเป็น X-Processing-Ms ด้วย) |
X-Matte-Confidence | 0–1: มาสก์ชัดเจนแค่ไหน (ค่าเฉลี่ยของ |2a − 1| ทุกพิกเซล, a = alpha) ใกล้ 1 คือตัดพื้นหลังได้สะอาด ค่าต่ำหมายถึงมีขอบนุ่มหรือขอบที่ไม่แน่นอนมาก |
X-Matte-Ambiguous-Ratio | สัดส่วนพิกเซลที่มี alpha อยู่ระหว่าง 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) ตรวจสถานะ status_url จนกว่า done จะเป็น true แล้วดาวน์โหลด 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 ต่อรูปที่สำเร็จ) |
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 ใช้เลือกรูปในงาน batch (ค่าเริ่มต้น 0) ตอบกลับ 409 not_ready พร้อม Retry-After: 2 ขณะยังทำงานอยู่ หรือข้อผิดพลาดของรูปนั้นหากล้มเหลว
POST /v1/batch
ส่ง URL ของรูปสูงสุด 100 รายการเข้าคิวเป็นงานเดียว: 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 เครดิตต่อรูปที่สำเร็จ เปิดงาน batch ได้สูงสุด 3 งานต่อบัญชี ดูคำแนะนำพร้อมตัวอย่างการตอบกลับในBatch ตั้งแต่ต้นจนจบ
เอนด์พอยต์ที่เข้ากันได้กับ remove.bg
API แบบบริการตนเองของ remove.bg จะยุติในวันที่ 1 December 2026, 09:00 CET (ประกาศ) การเชื่อมต่อ remove.bg ที่มีอยู่ใช้งานที่นี่ได้โดยเปลี่ยนบรรทัดเดียว: https://api.remove.bg/v1.0/removebg → https://removebackground.dev/v1.0/removebg พร้อมคีย์ removebackground.dev ในเฮดเดอร์ X-Api-Key เดิม คิวเดียวกัน 1 เครดิตต่อรูปที่สำเร็จเหมือนกัน และคุณภาพผลลัพธ์เท่ากับ /v1/remove คู่มือการย้าย
POST /v1.0/removebg
Body แบบ multipart, urlencoded หรือ JSON ด้วยชื่อพารามิเตอร์ของ remove.bg ตอบกลับด้วยไบต์ของรูปและเฮดเดอร์ของ remove.bg หรือ { "data": { "result_b64", "foreground_top", "foreground_left", "foreground_width", "foreground_height" } } เมื่อคุณส่ง Accept: application/json ข้อผิดพลาดใช้รูปแบบของ 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 หรือ % ของวัตถุ ค่า 1–4 ค่าแบบ CSS (“10% 20%” = แนวตั้ง, แนวนอน); สูงสุด 500px หรือ 50% ต่อด้าน |
roi | รองรับ | “x1 y1 x2 y2” เป็น px หรือ %: เก็บไว้เฉพาะวัตถุที่อยู่ในพื้นที่นั้น |
scale / position | รองรับ | scale 10%–100% หรือ original; position เป็น center, original หรือ “x% y%” |
channels | รองรับ | rgba (ตัดพื้นหลัง) หรือ alpha (มาสก์ระดับสีเทา) |
bg_color | รองรับ | รหัส Hex จะมีหรือไม่มี # ก็ได้ (81d4fa) หรือชื่อสี รหัส Hex 8 หลักจะคงสีไว้และตัดค่า alpha ออก |
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 | รับได้ แต่ไม่มีผล | ขอบนุ่มและส่วนกึ่งโปร่งใสมาจาก matte ของโมเดลตามที่เป็นอยู่ |
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 เรียก GET https://removebackground.dev/v1.0/account ด้วย X-Api-Key ของคุณ
ข้อผิดพลาด (เอนด์พอยต์ /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) หรือคุณมีงาน batch ทำงานอยู่แล้ว 3 งาน |
502 | model_unavailable, upstream_error, … | เราประมวลผลรูปไม่ได้หลังลองใหม่แล้ว ไม่เสียเครดิต |
503 | server_paused, unavailable | API หยุดชั่วคราว (ก่อนเปิดให้บริการ) หรือไม่พร้อมใช้งานชั่วคราว ลองใหม่ภายหลัง |
Batch ตั้งแต่ต้นจนจบ
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" }'URL ของรูปสาธารณะสูงสุด 100 รายการ พร้อมตัวเลือกใดก็ได้ของ /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 นับรายการที่ไม่ใช่ URL แบบ http(s) และ duplicates นับรายการซ้ำ ทั้งสองแบบจะถูกตัดออกและไม่เสียเครดิต บันทึก id ไว้: ใช้เพื่อกลับมาดูงานต่อหลังรีสตาร์ท
2. ตรวจสถานะงาน
GET /v1/jobs/:id ทุกสองสามวินาทีจนกว่า done จะเป็น true 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 คือ position ที่เริ่มจากศูนย์ ตำแหน่งเรียงตามรายการของคุณหลังตัด URL ที่ไม่ถูกต้องและซ้ำออก ดังนั้นเมื่อจำนวนใดจำนวนหนึ่งมากกว่า 0 ให้จับคู่ผลลัพธ์ด้วย input แทนลำดับ
- Batch จะไม่นับรวมในขีดจำกัด 3 batch ที่เปิดอยู่อีกต่อไปเมื่อ
doneเป็น true - API ไม่มีเอนด์พอยต์ยกเลิก webhook หรือการดาวน์โหลด ZIP ส่วน batch ที่เริ่มในหน้าทีละหลายรูปสามารถยกเลิกหรือดาวน์โหลดเป็น ZIP ได้ที่หน้านั้น
การลองใหม่ รายการซ้ำ และการคิดเครดิต
ส่ง Idempotency-Key แล้วการลองใหม่จะไม่คิดเครดิตซ้ำ เพิ่มเฮดเดอร์ Idempotency-Key (สตริงที่ไม่ซ้ำกันยาวไม่เกิน 255 ตัวอักษร เช่น UUID) ใน POST /v1/remove หรือ POST /v1/batch หนึ่งคีย์ต่อหนึ่งรูปหรือหนึ่ง batch หากคุณส่งคำขอเดิมอีกครั้งด้วยคีย์เดิม คุณจะได้งานที่คำขอแรกสร้างไว้ พร้อม Idempotent-Replayed: true: ไม่มีงานใหม่และไม่คิดเครดิตใหม่ แม้คำขอแรกยังทำงานอยู่ คีย์เดิมกับรูปหรือตัวเลือกที่ต่างกันจะตอบกลับ 409 idempotency_key_reused คีย์เป็นของบัญชีคุณและไม่หมดอายุ
หากไม่มีคีย์ ทุก POST จะสร้างงานใหม่ และแต่ละงานที่สำเร็จใช้ 1 เครดิต (POST /v1.0/removebg ที่เข้ากันได้กับ remove.bg ไม่มีคีย์) การอ่านงาน (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 เครดิต |
| คุณดาวน์โหลดผลลัพธ์ที่เสร็จแล้วอีกครั้ง | ไม่เสียเครดิต ดาวน์โหลดได้บ่อยเท่าที่ต้องการขณะที่ยังจัดเก็บอยู่ |
| Batch สำเร็จบางส่วน | 1 เครดิตต่อรูปที่สำเร็จ credits_charged ในงานแสดงยอดรวม |
| Batch มี URL เดิมสองครั้ง | รายการซ้ำใน batch เดียวกันจะถูกตัดออกก่อนเข้าคิวและไม่เสียเครดิต URL เดียวกันใน batch ต่างกันถือเป็นงานแยกกัน |
| เครดิตหมดระหว่าง batch | รูปที่เสร็จแล้วยังคิดเครดิตตามเดิม ที่เหลือจะถูกทำเครื่องหมายว่าข้าม (out_of_credits) และไม่เสียเครดิต ซื้อเครดิต แล้วส่ง URL ที่เหลือเป็น batch ใหม่ |
เมื่อไรควรลองใหม่
| สิ่งที่เกิดขึ้น | สิ่งที่ต้องทำ |
|---|---|
| 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 เดิม) มากกว่า 60 รูปต่อนาที? ใช้ POST /v1/batch: หนึ่งคำขอสำหรับสูงสุด 100 รูป |
| POST /v1/batch ตอบกลับ 429 too_many_batches | รอจนกว่า batch ที่เปิดอยู่ 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 body | 25 MB หลังถอดรหัส (request body อาจใหญ่กว่าประมาณหนึ่งในสาม) | 413 too_large |
| ความละเอียดของรูปต้นทาง | รูปที่เกิน 25 MP จะถูกย่อเหลือ 25 MP ก่อนประมวลผล | — |
| ขนาดผลลัพธ์ | width และ height อย่างละ 1–6000 px | 400 invalid_width / invalid_height |
| การดาวน์โหลด image_url | http(s) เท่านั้น หมดเวลา 15 วินาที redirect ได้สูงสุด 3 ครั้ง ที่อยู่แบบ private, loopback และ link-local จะถูกปฏิเสธในทุก redirect | 400 invalid_url · fetch_failed · fetch_timeout |
| การรอใน POST /v1/remove | ประมาณ 55 วินาที จากนั้นได้ 202 พร้อม job id | 202 |
| ขนาด batch | URL ของรูป 100 รายการต่อ POST /v1/batch | 400 too_many_images |
| Batch ที่เปิดอยู่ | งานหลายรูปที่ยังไม่เสร็จ 3 งานต่อบัญชี (รูปเดี่ยวไม่นับ) | 429 too_many_batches |
| อัตราคำขอ | 60 คำขอต่อนาทีต่อบัญชี รวมทั้ง POST /v1/remove, /v1/batch และ /v1.0/removebg หนึ่ง batch นับเป็นหนึ่งครั้งไม่ว่าขนาดเท่าไร การอ่านงานไม่จำกัด | 429 rate_limited (พร้อม Retry-After) |
ผลลัพธ์เก็บไว้นานแค่ไหน
ผลลัพธ์ทุกรายการจัดเก็บเป็นส่วนตัวในบัญชีของคุณเป็นเวลา 48 ชั่วโมงหลังสร้าง แล้วจึงถูกลบ ระหว่างนั้นคุณดาวน์โหลดอีกครั้งได้ฟรีด้วย GET /v1/jobs/:id/result หรือจากสตูดิโอของคุณ หลังจากนั้น ลิงก์ผลลัพธ์จะตอบกลับ 410 result_unavailable การประมวลผลรูปอีกครั้งเป็นงานใหม่ บันทึกสถานะงานยังอ่านได้หลังรูปถูกลบไปแล้ว ดูนโยบายความเป็นส่วนตัวสำหรับวิธีจัดการไฟล์ที่อัปโหลด เราไม่ใช้รูปของคุณในการฝึกโมเดล
ความปลอดภัย
เก็บคีย์ API ไว้บนเซิร์ฟเวอร์ที่คุณควบคุม อย่าใส่ไว้ในโค้ดฝั่งเบราว์เซอร์ แอปมือถือ รีโพสาธารณะ หรือ URL หากต้องการให้ผู้ใช้ของคุณลบพื้นหลังได้ ให้ส่งรูปผ่านแบ็กเอนด์ของคุณ และเพิ่มระบบเข้าสู่ระบบและการจำกัดการใช้จ่ายของคุณเองที่นั่น
- API อนุญาต CORS เพื่อให้ใช้งานได้จากเครื่องมือและโค้ดฝั่งเซิร์ฟเวอร์ แต่ไม่ได้ทำให้การใส่คีย์ในหน้าเว็บปลอดภัย: ใครก็อ่านคีย์ได้จากที่นั่น
- ทุกคีย์ในบัญชีใช้ยอดเครดิตเดียวกัน สร้างคีย์แยกสำหรับแต่ละแอปหรือสภาพแวดล้อมในหน้าบัญชีของคุณ เพื่อให้เพิกถอนคีย์หนึ่งได้โดยไม่กระทบคีย์อื่น
- หากคีย์รั่วไหล ให้เพิกถอนในหน้าบัญชีทันที (คีย์จะหยุดทำงานทันที) แล้วสร้างคีย์ใหม่ เราเก็บเพียงค่าแฮชของแต่ละคีย์ จึงแสดงคีย์ให้คุณอีกไม่ได้
การแก้ปัญหา
| อาการ | สาเหตุ |
|---|---|
| เปิดไฟล์ PNG ไม่ได้ | body เป็น JSON (งาน 202 หรือข้อผิดพลาด) ไม่ใช่รูปภาพ ตรวจสอบสถานะ HTTP และ Content-Type ก่อนบันทึก |
| สคริปต์หมดเวลา แต่รูปแสดงในสตูดิโอ | งานยังทำงานต่อหลังคุณหยุดรอ ดึงผลลัพธ์ด้วย job id แทนการส่งซ้ำ |
| ถูกคิดเครดิตสองครั้งสำหรับรูปเดียว | รูปถูกส่งสองครั้งโดยไม่มี Idempotency-Key (มักเป็นการลองใหม่อัตโนมัติหลังหมดเวลา) ใช้หนึ่งคีย์ต่อหนึ่งรูปและใช้คีย์เดิมเมื่อลองใหม่ |
| URL เปิดได้ในเบราว์เซอร์ แต่ API ดึงไม่ได้ | โฮสต์อาจต้องใช้คุกกี้หรือการเข้าสู่ระบบ บล็อกเซิร์ฟเวอร์ redirect เกิน 3 ครั้ง ใช้เวลาเกิน 15 วินาที หรือ signed URL หมดอายุแล้ว ให้อัปโหลดไฟล์แทน |
| Batch หยุดกลางทาง | ดู items[] ในงาน: รายการที่ล้มเหลวมีรหัสข้อผิดพลาด รายการที่ข้ามพร้อม out_of_credits หมายความว่ายอดเครดิตหมด |
| ตัวเลือกดูเหมือนไม่มีผล | ชื่อพารามิเตอร์ที่ไม่รู้จักจะถูกละเว้นโดยไม่แจ้ง ตรวจสอบการสะกดกับตารางพารามิเตอร์ บน /v1.0/removebg ตัวเลือกบางตัวของ remove.bg รับได้แต่ไม่มีผล (ดูตารางนั้น) |
| พื้นหลังไม่โปร่งใส | JPG โปร่งใสไม่ได้ ใช้ format=png หรือ webp และไม่ต้องตั้ง bg_color |
| ลิงก์ผลลัพธ์ได้ 410 | ผลลัพธ์ที่จัดเก็บไว้ถูกลบแล้ว การประมวลผลอีกครั้งใช้ 1 เครดิต |