হাতে একটি ছবির ব্যাকগ্রাউন্ড সরাতে প্রতি ছবিতে কয়েক মিনিট লাগে। আপনার অ্যাপে আপলোড হওয়া প্রতিটি প্রোডাক্ট ছবি, প্রোফাইল ছবি বা থাম্বনেইলের জন্য এটি করতে হলে দরকার একটি ব্যাকগ্রাউন্ড রিমুভ API: একটি HTTP রিকোয়েস্ট পাঠান, তৈরি cut-out ফেরত পান।
এই গাইডে দেখানো হয়েছে কীভাবে এটি ঠিকভাবে ইন্টিগ্রেট করবেন। আপনি পাবেন চালু করার মতো cURL, Python ও JavaScript কোড, জানার মতো আউটপুট অপশন, ধীর ছবি ও বাল্ক জব সামলানোর উপায়, আর দুবার টাকা না দিয়ে কীভাবে retry করবেন। উদাহরণে আমাদের সহযোগী প্রোডাক্ট removebackground.dev ব্যবহার করা হয়েছে, তবে এই পদ্ধতিগুলো যেকোনো প্রোভাইডারের ক্ষেত্রেই খাটে।
ব্যাকগ্রাউন্ড রিমুভ API কীভাবে কাজ করে
আপনি একটি ছবি পাঠান, প্রোভাইডার একটি segmentation মডেল চালায় যা subject-কে ব্যাকগ্রাউন্ড থেকে আলাদা করে, আর আপনি একটি নতুন ছবি ফেরত পান। ফলাফলের মূল অংশ হলো alpha channel: প্রতিটি পিক্সেলের একটি মান, যা বলে সেই পিক্সেলের কতটা subject-এর অংশ। পুরোপুরি অস্বচ্ছ পিক্সেল subject, পুরোপুরি স্বচ্ছ পিক্সেল ব্যাকগ্রাউন্ড, আর মাঝের মানগুলো চুল, লোম ও কাচের মতো নরম কিনারা সামলায়।
এই matte থেকে API কয়েক ধরনের ফলাফল দিতে পারে:
- স্বচ্ছ cut-out, সাধারণত ব্যাকগ্রাউন্ড সরানো PNG বা WebP
- একরঙা ব্যাকগ্রাউন্ডে subject, যেসব মার্কেটপ্লেসে সাদা ব্যাকগ্রাউন্ড বাধ্যতামূলক সেগুলোর জন্য JPG-তে flatten করা
- mask নিজেই, একটি grayscale ছবি যা আপনি নিজের compositing pipeline-এ ব্যবহার করতে পারেন
- crop বা resize করা সংস্করণ, subject অনুযায়ী ছেঁটে নির্দিষ্ট সাইজে বসানো
রিকোয়েস্ট পাঠানো সহজ অংশ। প্রোডাকশন ইন্টিগ্রেশনকে আরও সামলাতে হয় স্বাভাবিকের চেয়ে বেশি সময় নেওয়া ছবি, বড় ব্যাচ, rate limit, retry এবং API key ব্যবহারকারীদের থেকে দূরে রাখা।
ব্যাকগ্রাউন্ড রিমুভ API বাছাইয়ে কী দেখবেন
কোড লেখার আগে নিজের ছবি ও ট্রাফিকের সঙ্গে মিলিয়ে এই বিষয়গুলো যাচাই করুন।
| মানদণ্ড | কী যাচাই করবেন | কেন জরুরি |
|---|---|---|
| কিনারার মান | নিজের 20 থেকে 50টি ছবিতে চুল, লোম, স্বচ্ছ বস্তু ও ভিড়ভাট্টা ব্যাকগ্রাউন্ড | প্রোভাইডারদের পার্থক্য কঠিন ক্ষেত্রগুলোতেই ধরা পড়ে |
| ইনপুটের উপায় | ফাইল আপলোড, পাবলিক URL, base64, raw bytes | ঠিক করে আগে ছবি ডাউনলোড না করে queue worker থেকে কল করা যাবে কি না |
| আউটপুট অপশন | format, ব্যাকগ্রাউন্ডের রং, crop, padding, নির্দিষ্ট সাইজ, mask আউটপুট | আপনার দিকের দ্বিতীয় ইমেজ প্রসেসিং ধাপ বাঁচায় |
| ধীর ছবি | কোনো ছবিতে আপনার HTTP timeout-এর চেয়ে বেশি সময় লাগলে কী হয় | জব id না থাকলে retry করলে দুবার টাকা দিতে হতে পারে |
| বাল্ক | batch endpoint, ব্যাচের সাইজ, আংশিক ব্যর্থতা কীভাবে জানানো হয় | ক্যাটালগ ইমপোর্ট কীভাবে প্রসেস করবেন তা ঠিক করে |
| বিলিং | প্রতি সফলতায় চার্জ নাকি প্রতি রিকোয়েস্টে, সাবস্ক্রিপশন নাকি ক্রেডিট, ক্রেডিটের মেয়াদ শেষ হয় কি না | বেশি পরিমাণে ব্যর্থ ছবি ও retry-এর খরচ জমতে থাকে |
| সীমা | ফাইল সাইজ, রেজোলিউশন, rate limit, ফলাফল কতদিন রাখা হয় | আপনার queue ও স্টোরেজের ডিজাইন ঠিক করে |
| প্রাইভেসি | আপলোড ও ফলাফল কতদিন রাখা হয়, ছবি দিয়ে মডেল ট্রেন করা হয় কি না | প্রায়ই গ্রাহকদের বাধ্যতামূলক শর্ত |
ধাপ 1: API key তৈরি করুন
removebackground.dev-এ সাইন আপ করুন এবং অ্যাকাউন্ট পেজে একটি key তৈরি করুন। নতুন অ্যাকাউন্টে 50টি ফ্রি ক্রেডিট পাওয়া যায়, যা নিচের উদাহরণগুলো চালাতে এবং নিজের ছবিতে পরীক্ষা করতে যথেষ্ট।
key-টি আপনার সার্ভারের একটি environment variable-এ রাখুন:
export REMOVEBG_API_KEY="your_api_key"
প্রতিটি কল x-api-key header-এ key পাঠায়, এবং প্রতিটি কল সেই অ্যাকাউন্টের ক্রেডিট খরচ করে। প্রতিটি অ্যাপ বা environment-এর জন্য আলাদা key তৈরি করুন, যাতে একটি revoke করলে বাকিগুলো বন্ধ না হয়।
ধাপ 2: cURL দিয়ে ব্যাকগ্রাউন্ড রিমুভ করুন
real-time endpoint হলো POST https://removebackground.dev/v1/remove। সবচেয়ে দ্রুত পরীক্ষা হলো ফাইল আপলোড:
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
বেশিরভাগ একক ছবি একই রেসপন্সে তৈরি হয়ে ফেরত আসে, সাধারণত কয়েক সেকেন্ডে, পূর্ণ রেজোলিউশনের স্বচ্ছ PNG হিসেবে।
endpoint চারভাবে ছবি গ্রহণ করে। এর যেকোনো একটি পাঠান:
| ইনপুট | কীভাবে পাঠাবেন |
|---|---|
| image_file | Multipart form data। JPG, PNG বা WebP, সর্বোচ্চ 25 MB |
| image_url | একটি পাবলিক http(s) URL। API এটি ডাউনলোড করে, সর্বোচ্চ 3টি redirect অনুসরণ করে, 15 সেকেন্ড timeout সহ |
| image_file_b64 | JSON body-তে base64, data:image prefix সহ বা ছাড়া, decode করার পর সর্বোচ্চ 25 MB |
| Raw body | ছবির bytes, Content-Type image/jpeg, image/png, image/webp বা application/octet-stream সহ |
একটি রিকোয়েস্টে একাধিক থাকলে আগে image_file, তারপর image_file_b64, তারপর image_url, তারপর raw body অগ্রাধিকার পায়। অপশনগুলো form field, JSON key বা query-string মান হিসেবে পাঠানো যায়।
একটি বিষয়ে খেয়াল রাখুন: -o status যা-ই হোক body সেভ করে ফেলে। key ভুল হলে বা ছবি অবৈধ হলে আপনার "PNG" আসলে একটি JSON এরর। ফাইলের ওপর ভরসা করার আগে status code যাচাই করুন।
ধাপ 3: Python-এ 200, 202 ও এরর সামলান
ব্যাকগ্রাউন্ড রিমুভ API নিশ্চয়তা দিতে পারে না যে প্রতিটি ছবি একটি HTTP রিকোয়েস্টের মধ্যেই শেষ হবে। queue অস্বাভাবিক ব্যস্ত থাকলে এবং কোনো ছবিতে প্রায় 55 সেকেন্ডের বেশি লাগলে removebackground.dev ছবির বদলে একটি জব id সহ 202 Accepted ফেরত দেয়। জবটি চলতে থাকে, আর আপনি id দিয়ে ফলাফল আনেন।
| Status | Body | কী করবেন |
|---|---|---|
| 200 | ছবি (image/png, image/jpeg বা image/webp) | সেভ করুন। ফাইল এক্সটেনশন বাছতে Content-Type ব্যবহার করুন |
| 202 | id, status, status_url ও result_url সহ JSON | কয়েক সেকেন্ড অপেক্ষা করুন, তারপর ফলাফল GET করুন। ছবি আবার পাঠাবেন না |
| 4xx বা 5xx | JSON: {"error": {"code", "message"}} | code পড়ুন। body-কে ছবি হিসেবে সেভ করবেন না |
মূল নিয়ম: 202-এর পর কখনো ছবি আবার পাঠাবেন না। এতে দ্বিতীয় একটি জব শুরু হয় এবং দ্বিতীয় ক্রেডিট লাগতে পারে। এখানে সম্পূর্ণ Python সংস্করণ দেওয়া হলো, যা ছবি একবার পাঠায় এবং শুধু নিরাপদ কলগুলো retry করে:
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: a retry with the same key returns the same job, never a second charge.
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 is the image; anything else raises
# 202: still processing. Wait for the same job.
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 /v1/jobs/{job_id} later.")
print(remove_background("https://example.com/photo.jpg"))
এর জন্য Python 3 ও requests (pip install requests) দরকার। দুটি বিষয় সহজেই চোখ এড়িয়ে যায়। প্রথমত, স্ক্রিপ্ট থামালে জব থামে না: সেটি তবুও শেষ হয়ে চার্জ হতে পারে, এবং ফলাফল আপনার অ্যাকাউন্টের Studio-তে দেখা যায়। দ্বিতীয়ত, জব চলার সময় GET /v1/jobs/:id/result 409 not_ready দেয়, তাই এটিকে ব্যর্থতা নয়, "অপেক্ষা করুন" হিসেবে ধরুন।
JavaScript (Node.js)-এ একই ফ্লো
Node.js 18 বা তার পরের সংস্করণে একই ফ্লো, built-in fetch, FormData ও Blob দিয়ে, লোকাল ফাইল আপলোড করে:
import { readFile, writeFile } from "node:fs/promises"
import { randomUUID } from "node:crypto"
const API = "https://removebackground.dev"
const KEY = process.env.REMOVEBG_API_KEY // server side only
const EXT = { "image/png": ".png", "image/jpeg": ".jpg", "image/webp": ".webp" }
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
async function save(res, stem) {
const mime = (res.headers.get("content-type") || "").split(";")[0]
if (res.status !== 200 || !EXT[mime]) {
throw new Error("HTTP " + res.status + ": " + (await res.text()).slice(0, 500))
}
const path = stem + EXT[mime]
await writeFile(path, Buffer.from(await res.arrayBuffer()))
return path
}
export async function removeBackground(filePath, stem = "result", maxWaitMs = 300000) {
const form = new FormData()
form.append("image_file", new Blob([await readFile(filePath)]), "upload")
form.append("format", "png")
const res = await fetch(API + "/v1/remove", {
method: "POST",
// Reuse the same Idempotency-Key if you retry this POST.
headers: { "x-api-key": KEY, "Idempotency-Key": randomUUID() },
body: form,
})
if (res.status !== 202) return save(res, stem)
const { id } = await res.json()
const deadline = Date.now() + maxWaitMs
while (Date.now() < deadline) {
await sleep(2000)
const result = await fetch(API + "/v1/jobs/" + id + "/result", {
headers: { "x-api-key": KEY },
})
if (result.status === 409) {
const body = await result.json()
if (body.error && body.error.code === "not_ready") continue
throw new Error("Job " + id + ": " + body.error.code)
}
return save(result, stem)
}
throw new Error("Job " + id + " is still running. Check /v1/jobs/" + id + " later.")
}
console.log(await removeBackground("photo.jpg"))
API CORS রিকোয়েস্ট গ্রহণ করে, যা টুল ও টেস্টিংয়ের জন্য সুবিধাজনক। তবে এর মানে এই নয় যে key সহ কোনো ওয়েব পেজ থেকে কল করা নিরাপদ। এ নিয়ে আরও আছে নিচের নিরাপত্তা অংশে।
ধাপ 4: আউটপুট নিয়ন্ত্রণ করুন
বেশিরভাগ অ্যাপ পূর্ণ রেজোলিউশনের কাঁচা cut-out চায় না। তারা চায় সাদা ব্যাকগ্রাউন্ডে বর্গাকার প্রোডাক্ট ছবি, একটি ছোট preview, বা একটি mask। API-এর কাছে সরাসরি চূড়ান্ত ফাইল চাইলে দ্বিতীয় প্রসেসিং ধাপ বাঁচে। /v1/remove-এর অপশনগুলো হলো:
| প্যারামিটার | মান | কী করে |
|---|---|---|
| format | png, jpg, webp | আউটপুট format। ডিফল্ট png। JPG-তে স্বচ্ছতা নেই, তাই এটি bg_color বা সাদায় flatten হয় |
| bg_color | Hex (ffffff, #fff), rgb(255, 255, 255) বা রঙের নাম | ব্যাকগ্রাউন্ড ভরাট করে। ডিফল্ট স্বচ্ছ |
| size | preview, medium, hd, full | aspect ratio বজায় রেখে মেগাপিক্সেলের সীমা, কখনো upscale নয়: preview সর্বোচ্চ 0.25 MP, medium 1.5 MP, hd 4 MP, full হলো মূল ছবি (সর্বোচ্চ 25 MP) |
| crop | true, false বা 1:1, 4:5, 16:9-এর মতো অনুপাত | subject অনুযায়ী ছাঁটে। অনুপাত দিলে subject ঘিরে box সেই অনুপাতে বাড়ানো হয় |
| padding | পিক্সেল, ভগ্নাংশ বা শতাংশ | crop করার সময় subject-এর চারপাশে যোগ করা মার্জিন, সর্বোচ্চ 500 px |
| channels | rgba, rgb, alpha | স্বচ্ছ cut-out (ডিফল্ট), অস্বচ্ছ ছবি, বা grayscale mask যেখানে সাদা হলো subject |
| width, height | 1 থেকে 6000 | পিক্সেলে নির্দিষ্ট আউটপুট সাইজ, crop-এর পরে প্রয়োগ হয়। কখনো টেনে লম্বা করা হয় না |
| fit | contain, cover, scale-down | width ও height দুটোই সেট করলে ছবি কীভাবে বসবে |
| roi | x1 y1 x2 y2, px বা %-এ | শুধু এই অংশের ভেতরের subject রাখা হয় |
প্রতিটি অপশনের খরচ একই 1 ক্রেডিট, আর অজানা প্যারামিটার নীরবে উপেক্ষা করা হয়, তাই টাইপো করলেও কোনো এরর আসবে না। মাঝখানে প্রোডাক্ট ও 10% padding সহ একটি বর্গাকার মার্কেটপ্লেস ছবি দেখতে এমন:
curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_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
সফল রেসপন্সের সঙ্গে কিছু কাজের header-ও আসে। X-Credits-Remaining ছবির পর আপনার ব্যালান্স দেখায়। X-Matte-Confidence (0 থেকে 1) জানায় mask কতটা নিশ্চিত, আর X-Matte-Ambiguous-Ratio চুল, কাচ বা motion blur-এর মতো নরম পিক্সেলের অংশ জানায়। এই দুটি লগ করলে প্রতিটি ছবি না দেখে কম নিশ্চিত cut-out-গুলোকে মানুষের পর্যালোচনার জন্য চিহ্নিত করতে পারবেন।
ধাপ 5: একসাথে অনেক ছবি প্রসেস করুন
ক্যাটালগ ইমপোর্ট ও পুরোনো ডেটা প্রসেসের জন্য শত শত একক রিকোয়েস্ট পাঠাবেন না। POST /v1/batch সর্বোচ্চ 100টি পাবলিক ছবির URL একটি জব হিসেবে queue-তে রাখে, /v1/remove-এর একই অপশন সহ, এবং সঙ্গে সঙ্গে 202 ফেরত দেয়:
import os
import time
import uuid
import requests
API = "https://removebackground.dev"
s = requests.Session()
s.headers["x-api-key"] = os.environ["REMOVEBG_API_KEY"]
urls = ["https://example.com/front.jpg", "https://example.com/back.jpg"]
job = s.post(f"{API}/v1/batch",
json={"image_urls": urls, "format": "png", "size": "hd"},
headers={"Idempotency-Key": str(uuid.uuid4())}, timeout=30)
job.raise_for_status()
job_id = job.json()["id"] # save it: it's how you resume after a restart
while True:
time.sleep(3)
status = s.get(f"{API}/v1/jobs/{job_id}", timeout=30).json()
if status["done"]:
break
print(status["status"], "credits charged:", status["credits_charged"])
for item in status["items"]:
if item["status"] != "succeeded":
print("failed:", item["input"], item.get("error"))
continue
img = s.get(item["result_url"], timeout=60)
with open(f"out-{item['position']}.{item['format']}", "wb") as f:
f.write(img.content)
ডকুমেন্টেশনের কিছু নিয়ম, যেগুলো মাথায় রেখে ডিজাইন করবেন:
- জবের status শেষ পর্যন্ত হয় succeeded, partial (কিছু ছবি ব্যর্থ) বা failed।
items-এর প্রতিটি আইটেমের নিজস্ব status আছে, আর ব্যর্থ হলে একটি এরর code। - যেসব এন্ট্রি http(s) URL নয় এবং পুনরাবৃত্ত URL বাদ দেওয়া হয় এবং কখনো চার্জ করা হয় না। এর যেকোনো সংখ্যা 0-এর বেশি হলে অবস্থান নয়,
inputদিয়ে ফলাফল মেলান। - প্রতি অ্যাকাউন্টে একসাথে সর্বোচ্চ 3টি batch জব খোলা থাকতে পারে।
donetrue হলেই সেই ব্যাচ আর গণনায় থাকে না। - ব্যাচের মাঝপথে ক্রেডিট শেষ হলে শেষ হওয়া ছবিগুলোর টাকা কাটা থাকে, আর বাকিগুলো out_of_credits সহ skipped হিসেবে চিহ্নিত হয়, কোনো চার্জ ছাড়াই।
- API-তে cancel endpoint, webhook বা ZIP ডাউনলোড নেই, তাই polling-ই পদ্ধতি। জব পড়া ফ্রি এবং এতে rate limit নেই।
সরাসরি চালানোর মতো স্ক্রিপ্ট চান? Python দিয়ে ব্যাচ গাইড-এ ফোল্ডার থেকে ফোল্ডার পর্যন্ত সম্পূর্ণ ওয়ার্কফ্লো দেখানো হয়েছে।
ধাপ 6: নিরাপদে retry করুন এবং বিলিং অনুমানযোগ্য রাখুন
দ্বিগুণ চার্জ আসে নেটওয়ার্ক timeout থেকে। আপনার ক্লায়েন্ট হাল ছেড়ে retry করে, আর এখন একটি ছবির জন্য দুটি জব। সমাধান হলো Idempotency-Key header: 255 অক্ষর পর্যন্ত যেকোনো অনন্য string, যেমন একটি UUID, প্রতি ছবি বা ব্যাচে একটি। একই key দিয়ে একই রিকোয়েস্ট আবার পাঠালে প্রথম রিকোয়েস্টে তৈরি জবটিই পাবেন, Idempotent-Replayed: true header সহ, এবং নতুন কোনো চার্জ ছাড়া। অন্য ছবির জন্য একই key আবার ব্যবহার করলে 409 idempotency_key_reused আসে।
| রেসপন্স | কী করবেন |
|---|---|
| POST-এ নেটওয়ার্ক এরর, timeout বা 500 | একই Idempotency-Key দিয়ে একই রিকোয়েস্ট আবার পাঠান |
| 429 rate_limited | Retry-After-এ থাকা সেকেন্ড অপেক্ষা করুন, তারপর একই key দিয়ে আবার পাঠান |
| 429 too_many_batches | আপনার 3টি খোলা ব্যাচের একটি শেষ হওয়া পর্যন্ত অপেক্ষা করুন |
| 400, 413 বা 422 | রিকোয়েস্ট বা ছবি ঠিক করুন। না বদলে আবার পাঠালে একই উত্তর আসবে |
| 401 বা 402 | key ঠিক করুন বা টপ আপ করুন। loop করবেন না |
| ফলাফলে 409 not_ready | 2 সেকেন্ড অপেক্ষা করে আবার জিজ্ঞেস করুন। ছবি আবার জমা দেবেন না |
| 410 result_unavailable | সংরক্ষিত ফলাফল মুছে ফেলা হয়েছে। আবার প্রসেস করা একটি নতুন জব এবং 1 ক্রেডিট লাগে |
| POST-এ 502 | সেই জব ব্যর্থ হয়েছে এবং চার্জ হয়নি। একবার retry মানে নতুন জব |
বিলিং একটি সহজ নিয়ম মেনে চলে: ছবি সফল হলে 1 ক্রেডিট, ব্যর্থ হলে কিছুই নয়। প্রসেসিংয়ের আগে প্রত্যাখ্যাত রিকোয়েস্ট, পড়া যায় না এমন ছবি এবং প্রোভাইডারের নিজের retry-এর পরের ব্যর্থতা ফ্রি, আর সংরক্ষিত থাকা পর্যন্ত শেষ হওয়া ফলাফল আবার ডাউনলোড করাও ফ্রি।
ডিজাইনের সময় যে সীমাগুলো মাথায় রাখবেন
| সীমা | মান |
|---|---|
| ছবির ফাইল | 25 MB, JPG, PNG বা WebP, ফাইলের bytes থেকে শনাক্ত করা হয় |
| ইনপুট রেজোলিউশন | 25 MP-এর বেশি ছবি প্রসেসিংয়ের আগে 25 MP-এ ছোট করা হয় |
| আউটপুট সাইজ | width ও height প্রতিটি 1 থেকে 6000 px |
| image_url ডাউনলোড | শুধু http(s), 15 সেকেন্ড timeout, সর্বোচ্চ 3টি redirect। প্রাইভেট ও loopback ঠিকানা প্রত্যাখ্যাত |
| POST /v1/remove-এ অপেক্ষা | প্রায় 55 সেকেন্ড, তারপর জব id সহ 202 |
| ব্যাচ সাইজ | প্রতি রিকোয়েস্টে 100টি ছবির URL |
| খোলা ব্যাচ | প্রতি অ্যাকাউন্টে 3টি |
| রিকোয়েস্ট রেট | সব POST endpoint মিলিয়ে প্রতি অ্যাকাউন্টে মিনিটে 60টি রিকোয়েস্ট। ব্যাচ যত বড়ই হোক, একবার গোনা হয় |
| ফলাফল সংরক্ষণ | 48 ঘণ্টা, তারপর মুছে ফেলা হয় |
মিনিটে 60টির বেশি ছবি দরকার হলে batch endpoint-ই উত্তর: একটি রিকোয়েস্টে সর্বোচ্চ 100টি ছবি। ফলাফল ডাউনলোড করামাত্র নিজের bucket-এ রাখুন, কারণ 48 ঘণ্টা পর ফলাফলের লিংক 410 দেয়। প্রোভাইডারের ডকুমেন্টেশন অনুযায়ী, আপলোড করা ছবি মডেল ট্রেনিংয়ে ব্যবহার করা হয় না।
remove.bg API থেকে মাইগ্রেশন
remove.bg-এর আলাদা ওয়েবসাইট ও self-serve API 1 ডিসেম্বর 2026, 09:00 CET-এ বন্ধ হচ্ছে। এর API Leonardo.Ai-তে যাচ্ছে, যার জন্য আপনার ইন্টিগ্রেশন বদলাতে হবে। কিছুই নতুন করে লিখতে না চাইলে removebackground.dev-এ একটি remove.bg-compatible endpoint আছে, আর মাইগ্রেশন মাত্র এক লাইনের:
| আগে | পরে |
|---|---|
| https://api.remove.bg/v1.0/removebg | https://removebackground.dev/v1.0/removebg |
আপনি একই X-Api-Key header (removebackground.dev-এর key সহ), একই প্যারামিটার নাম, একই response header এবং একই এরর format রাখবেন:
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
বদলানোর আগে পার্থক্যগুলো জেনে নিন:
- কোনো 202 নেই। compatible endpoint সর্বোচ্চ 110 সেকেন্ড অপেক্ষা করে, তারপর 503 timeout দেয়। জব চলতে থাকে এবং সফল হলে চার্জ হয়, তাই অন্ধভাবে সেই রিকোয়েস্ট retry করলে দ্বিতীয় জব শুরু হয়।
- এই endpoint-এ কোনো idempotency key নেই। নিরাপদ retry দরকার হলে ধীরে ধীরে
/v1/remove-এ চলে যান। - কিছু অপশন গ্রহণ করা হয় কিন্তু উপেক্ষা করা হয়: type ও type_level (subject স্বয়ংক্রিয়ভাবে শনাক্ত হয়), semitransparency, এবং shadow অপশন (কোনো shadow যোগ হয় না)।
- সাইজ যা-ই হোক, সবসময় 1 ক্রেডিট, পূর্ণ রেজোলিউশন সহ।
মাইগ্রেশন গাইড-এ cURL, Python, Node ও PHP-এর আগে ও পরের কোড আছে, সঙ্গে Zapier, Make ও n8n-এর ধাপ।
API key ক্লায়েন্ট থেকে দূরে রাখুন
এই ভুলেই আসল টাকা খরচ হয়। আপনার key কোনো ওয়েব পেজ, মোবাইল অ্যাপ, পাবলিক repository বা URL-এ থাকলে যে কেউ তা পড়ে আপনার ক্রেডিট খরচ করতে পারে।
- নিজের ব্যবহারকারীদের ব্যাকগ্রাউন্ড রিমুভ করতে দিতে চাইলে তাদের ছবি আপনার ব্যাকএন্ড দিয়ে পাঠান এবং সেখান থেকে API কল করুন।
- সেই ব্যাকএন্ডে নিজস্ব সাইন-ইন ও প্রতি ব্যবহারকারীর খরচের সীমা যোগ করুন।
- প্রতিটি অ্যাপ বা environment-এ একটি করে key ব্যবহার করুন।
- key ফাঁস হলে অ্যাকাউন্ট পেজে revoke করুন। সেটি সঙ্গে সঙ্গে কাজ করা বন্ধ করে। প্রোভাইডার প্রতিটি key-এর শুধু একটি hash রাখে, তাই পুরোনো key ফিরে পাওয়ার চেষ্টা না করে নতুন একটি তৈরি করুন।
উদাহরণ: YouTube থাম্বনেইলের জন্য cut-out
ক্রিয়েটরদের জন্য টুল বানালে থাম্বনেইল একটি স্বাভাবিক ব্যবহার। থাম্বনেইল বেশিরভাগ সময় ছোট আকারে দেখা হয়, তাই cut-out-কেই মূল ভার বইতে হয়: একটি মুখ বা প্রোডাক্ট, বড় করে, সাধারণ ব্যাকগ্রাউন্ডের বিপরীতে স্পষ্ট কিনারা সহ। YouTube 16:9-এ 3840 x 2160 px এবং ন্যূনতম 640 px প্রস্থ সুপারিশ করে, এবং কম্পিউটার থেকে সর্বোচ্চ 50 MB-এর JPG বা PNG গ্রহণ করে, কিন্তু মোবাইল অ্যাপ থেকে মাত্র 2 MB।
API-এর দিকে মাত্র একটি কল, যা subject অনুযায়ী ছাঁটা স্বচ্ছ PNG ফেরত দেয়, সরাসরি 16:9 ক্যানভাসে বসানোর জন্য প্রস্তুত:
curl -X POST https://removebackground.dev/v1/remove \
-H "x-api-key: $REMOVEBG_API_KEY" \
-F 'image_file=@me.jpg' \
-F 'crop=true' -F 'padding=5%' \
-o me-cutout.png
cut-out-এর জন্য ভিডিও ফ্রেম না নিয়ে একটি স্থির ছবি তুলুন, কারণ ফ্রেমে প্রায়ই motion blur থাকে, আর নিচের ডান কোণ ফাঁকা রাখুন কারণ YouTube সেখানে ভিডিওর দৈর্ঘ্য দেখায়। ডিজাইনের দিকটি আছে YouTube থাম্বনেইল পেজে, আর থাম্বনেইল কেন এত গুরুত্বপূর্ণ তা ব্যাখ্যা করেছে আমাদের প্রথম 1,000 সাবস্ক্রাইবার পাওয়ার গাইড।
ChatGPT, Claude বা Cursor থেকে ব্যাকগ্রাউন্ড রিমুভ করা
প্রতিটি কাজে কোড লাগে না। removebackground.dev https://removebackground.dev/mcp-এ একটি MCP সার্ভার-ও চালায়, তাই ChatGPT, Claude, Cursor, VS Code বা n8n-এ ছবি আপলোড করে ব্যাকগ্রাউন্ড সরাতে বলতে পারেন। Claude Code-এ এটি একটি কমান্ড:
claude mcp add --transport http removebackground https://removebackground.dev/mcp
তারপর সাইন ইন করতে Claude Code-এ /mcp টাইপ করুন। সার্ভারটি তিনটি টুল দেয়: remove_background, কয়েক সেকেন্ডের বেশি সময় নেওয়া কাজের জন্য get_job, এবং check_credits। প্রতি ছবিতে 1 ক্রেডিট লাগে, API-এর মতোই।
খরচ কত
removebackground.dev সাবস্ক্রিপশন ছাড়া pay-as-you-go। ক্রেডিটের মেয়াদ কখনো শেষ হয় না, ব্যর্থ ছবি ফ্রি, আর নতুন অ্যাকাউন্টে 50টি ফ্রি ক্রেডিট পাওয়া যায়। API-এর মাধ্যমে 1 ক্রেডিট মানে পূর্ণ রেজোলিউশনে একটি সফল ব্যাকগ্রাউন্ড রিমুভ।
| প্যাক | ক্রেডিট | দাম | প্রতি ছবি |
|---|---|---|---|
| Starter | 4,000 | $17 | $0.0043 |
| Pro | 15,000 | $49 | $0.0033 |
| Scale | 40,000 | $99 | $0.0025 |
দাম USD-তে, এবং অব্যবহৃত ক্রেডিট 30 দিনের মধ্যে রিফান্ডযোগ্য। Scale-এর বেশি পরিমাণের জন্য দাম অনুরোধে পাওয়া যায়। বর্তমান তথ্যের জন্য প্রাইসিং পেজ দেখুন।
শেষ কথা
একটি মজবুত ব্যাকগ্রাউন্ড রিমুভ ইন্টিগ্রেশন কয়েকটি অভ্যাসে এসে দাঁড়ায়: key সার্ভারে রাখুন, body সেভ করার আগে status যাচাই করুন, 202-এর পর আবার না পাঠিয়ে জবের জন্য অপেক্ষা করুন, প্রতিটি POST-এর সঙ্গে Idempotency-Key পাঠান, আর বাল্ক কাজে batch endpoint ব্যবহার করুন।
OpenAPI 3.1 spec সহ সম্পূর্ণ রেফারেন্স আছে API ডকুমেন্টেশনে। ছবির পাশাপাশি ভিডিও নিয়েও কাজ করলে আমাদের YouTube ট্রান্সক্রিপ্ট API-এর তুলনা ও স্পিচ টু টেক্সট ইন্টিগ্রেশন গাইড টেক্সটের জন্য একই প্রোডাকশন পদ্ধতি ব্যবহার করে।
সাধারণ প্রশ্ন
ব্যাকগ্রাউন্ড রিমুভ API কী?+
এটি একটি HTTP endpoint যা একটি ছবি নেয় এবং ব্যাকগ্রাউন্ড সরিয়ে একই ছবি ফেরত দেয়, সাধারণত স্বচ্ছ ব্যাকগ্রাউন্ডের PNG হিসেবে। আপনি ফাইল, URL বা base64 পাঠান, আর প্রোভাইডার আপনার হয়ে segmentation মডেল চালায়।
Python দিয়ে ছবির ব্যাকগ্রাউন্ড রিমুভ করব কীভাবে?+
requests লাইব্রেরি দিয়ে header-এ key রেখে ছবিটি API-তে POST করুন, তারপর status 200 হলে response body ফাইলে সেভ করুন। ধীর ছবির জন্য API যদি 202 দিতে পারে, তাহলে ছবি আবার না পাঠিয়ে জবের result URL poll করুন। এই গাইডের Python উদাহরণ দুটো অবস্থাই সামলায়।
ব্যাকগ্রাউন্ড রিমুভ API-এর খরচ কত?+
এটি প্রোভাইডারের ওপর নির্ভর করে। removebackground.dev প্রতিটি সফল ছবির জন্য 1 ক্রেডিট নেয়, ক্রেডিট প্যাক $17-এ 4,000 ক্রেডিট (প্রতি ছবি $0.0043) থেকে $99-এ 40,000 ক্রেডিট (প্রতি ছবি $0.0025) পর্যন্ত। কোনো সাবস্ক্রিপশন নেই, ক্রেডিটের মেয়াদ কখনো শেষ হয় না, ব্যর্থ ছবি ফ্রি, আর নতুন অ্যাকাউন্টে 50টি ফ্রি ক্রেডিট পাওয়া যায়।
remove.bg API বন্ধ হওয়ার পরও কি আমার remove.bg কোড ব্যবহার করা যাবে?+
remove.bg-এর self-serve API 1 ডিসেম্বর 2026, 09:00 CET-এ বন্ধ হচ্ছে। removebackground.dev-এ remove.bg-compatible endpoint আছে, তাই URL https://api.remove.bg/v1.0/removebg থেকে বদলে https://removebackground.dev/v1.0/removebg করুন এবং একই X-Api-Key header-এ removebackground.dev-এর key ব্যবহার করুন।
ব্রাউজার থেকে সরাসরি ব্যাকগ্রাউন্ড রিমুভ API কল করা যায় কি?+
করা উচিত নয়। ওয়েব পেজ বা অ্যাপের সঙ্গে থাকা API key যে কেউ পড়তে পারে। ছবি আপনার নিজের ব্যাকএন্ড দিয়ে পাঠান, key সেখানেই রাখুন, আর ব্যবহারকারীদের জন্য নিজস্ব সাইন-ইন ও খরচের সীমা যোগ করুন।
সাদা ব্যাকগ্রাউন্ডের বদলে স্বচ্ছ PNG পাব কীভাবে?+
PNG বা WebP আউটপুট চান এবং ব্যাকগ্রাউন্ডের রং সেট করবেন না। JPG স্বচ্ছতা রাখতে পারে না, তাই JPG ফলাফল সবসময় একটি একরঙা ব্যাকগ্রাউন্ডে flatten হয়।