API удаления фона: один запрос на входе, готовый PNG на выходе.
Загрузите файл, отправьте публичный URL изображения или передайте base64. Большинство одиночных изображений возвращаются готовыми в том же HTTP-ответе, обычно за несколько секунд. Если обработка затянется, вы получите id задачи, по которому можно забрать результат, не отправляя изображение повторно. Для массовой обработки есть эндпоинт пакетов.
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, затем необработанное тело запроса. Эти примеры берут ключ из переменной окружения 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.
Каждый пример сохраняет тело ответа в файл. Этот файл является изображением, только если статус 200; см. Обработка ответа.
Обработка ответа
Большинство одиночных изображений возвращаются готовыми в том же ответе. Если очередь необычно загружена и обработка занимает дольше примерно 55 секунд, вместо этого вы получите 202 Accepted с id задачи. Задача продолжает выполняться: заберите результат по id. Повторная отправка изображения запустит вторую задачу и может стоить ещё один кредит.
| Статус | Тело | Что делать |
|---|---|---|
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" } } | Это не изображение. Прочитайте код (см. «Ошибки») и не сохраняйте тело как картинку. |
Полный пример
Обрабатывает готовое изображение, ответ 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 или тестов; ИИ-ассистенты для программирования могут начать с llms.txt.
POST /v1/remove
В реальном времени. Удаляет фон с одного изображения. Обычно телом ответа является готовое изображение (image/png, image/jpeg или image/webp), как правило через несколько секунд. Параметры можно передавать как поля формы, ключи JSON или параметры строки запроса; можно также отправить 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 | Публичный http(s)-URL изображения. Мы скачиваем его (до 3 редиректов, 15 с). Если передано несколько источников, приоритет у image_file, затем image_file_b64, затем image_url, затем необработанное тело. |
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 | Точный размер вывода в пикселях, применяется после обрезки (переопределяет 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 или цвет фона, затем формат. Любой параметр стоит те же 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 = 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 выбирает изображение из пакетной задачи (по умолчанию 0). Пока задача выполняется, отвечает 409 not_ready с Retry-After: 2, а если изображение не обработано — его собственной ошибкой.
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 кредит за успешное изображение; не более 3 открытых пакетных задач на аккаунт. Пошаговое руководство с примерами ответов — в разделе Пакеты от начала до конца.
Эндпоинт, совместимый с remove.bg
Self-serve 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
Тело 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 по таймауту. Задача продолжает выполняться и оплачивается при успехе, поэтому повтор такого запроса запускает вторую задачу.
| Параметр | Статус | Примечания |
|---|---|---|
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) либо название цвета. 8-значный hex сохраняет цвет и отбрасывает его альфа-канал. |
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. 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), или у вас уже выполняются 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. Опрос задачи
Вызывайте 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, а не по индексу.
- Пакет перестаёт учитываться в лимите 3 открытых пакетов, как только
doneстановится true. - В API нет эндпоинта отмены, вебхуков и скачивания в ZIP. Пакеты, запущенные на странице пакетной обработки, можно там же отменить или скачать в ZIP.
Повторы, дубликаты и оплата
Передавайте Idempotency-Key — и повторы не спишут кредиты дважды. Добавьте заголовок Idempotency-Key (любая уникальная строка длиной до 255 символов, например UUID) к POST /v1/remove или POST /v1/batch — один ключ на изображение или пакет. Если вы снова отправите тот же запрос с тем же ключом, то получите задачу, созданную первым запросом, с 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 кредит за каждое успешное изображение; поле 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). Больше 60 изображений в минуту? Используйте POST /v1/batch: один запрос — до 100 изображений. |
| POST /v1/batch отвечает 429 too_many_batches | Дождитесь завершения одного из ваших открытых пакетов (лимит — 3; опрашивайте его), затем отправляйте. |
| POST /v1/… отвечает 503 (unavailable, server_paused) | Задача не создана. Повторите после небольшой паузы. (У эндпоинта, совместимого с remove.bg, иначе: его 503 по таймауту означает, что задача ещё выполняется.) |
| 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 после декодирования (тело запроса может быть примерно на треть больше) | 413 too_large |
| Входное разрешение | Изображения больше 25 MP уменьшаются до 25 MP перед обработкой | — |
| Размер вывода | ширина и высота — от 1 до 6000 px каждая | 400 invalid_width / invalid_height |
| Скачивание по image_url | только http(s), таймаут 15 с, до 3 редиректов; частные, loopback- и link-local-адреса отклоняются на каждом редиректе | 400 invalid_url · fetch_failed · fetch_timeout |
| Ожидание в POST /v1/remove | Около 55 с, затем 202 с id задачи | 202 |
| Размер пакета | 100 URL изображений на один POST /v1/batch | 400 too_many_images |
| Открытые пакеты | 3 незавершённых задач с несколькими изображениями на аккаунт (одиночные изображения не учитываются) | 429 too_many_batches |
| Частота запросов | 60 запросов в минуту на аккаунт, суммарно по POST /v1/remove, /v1/batch и /v1.0/removebg. Пакет считается один раз, независимо от размера. Чтение задач не ограничено | 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 не может его скачать | Хостинг может требовать cookie или вход, блокировать серверы, делать больше 3 редиректов, отвечать дольше 15 с, или срок действия подписанного URL истёк. Загрузите файл напрямую. |
| Мой пакет остановился на полпути | Посмотрите items[] в задаче: у неудачных элементов есть код ошибки; пропущенные элементы с out_of_credits означают, что закончился баланс. |
| Параметр как будто ничего не делает | Неизвестные названия параметров молча игнорируются. Сверьте написание с таблицей параметров. На /v1.0/removebg некоторые параметры remove.bg принимаются, но игнорируются (см. ту таблицу). |
| Фон не прозрачный | JPG не поддерживает прозрачность. Используйте format=png или webp и не задавайте bg_color. |
| Ссылка на результат отвечает 410 | Сохранённый результат удалён. Повторная обработка стоит 1 кредит. |