API реального времени

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 (прозрачный, полное разрешение)
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

Multipart form data, поле image_file. JPG, PNG или WebP, до 25 MB.

Каждый пример сохраняет тело ответа в файл. Этот файл является изображением, только если статус 200; см. Обработка ответа.

Обработка ответа

Большинство одиночных изображений возвращаются готовыми в том же ответе. Если очередь необычно загружена и обработка занимает дольше примерно 55 секунд, вместо этого вы получите 202 Accepted с id задачи. Задача продолжает выполняться: заберите результат по id. Повторная отправка изображения запустит вторую задачу и может стоить ещё один кредит.

СтатусТелоЧто делать
200Изображение (image/png, image/jpeg или image/webp)Сохраните его. Расширение файла выбирайте по Content-Type.
202JSON: { id, status, status_url, result_url }Это не изображение. Подождите пару секунд, затем сделайте GET по result_url. Не отправляйте изображение повторно.
4xx / 5xxJSON: { "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_filefileИзображение (JPG, PNG или WebP) в виде multipart form data.
image_file_b64stringИзображение в base64, с префиксом 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цветЗаливка фона: hex (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%,7.5%" задаёт горизонтальный и вертикальный отступы отдельно; 24px (или целое число больше 1 без единиц) — это пиксели, до 500. По умолчанию 0.
channelsrgba | rgb | alphargba (по умолчанию): вырезанный объект на прозрачном фоне. rgb: непрозрачное изображение на bg_color или белом. alpha: PNG-маска в оттенках серого (белое = объект) того же размера и с той же обрезкой, что и вырезанный объект. type=mask по-прежнему работает как псевдоним alpha.
width / height1–6000Точный размер вывода в пикселях, применяется после обрезки (переопределяет size). Если задан только один, второй вычисляется по соотношению сторон. Без растягивания.
roix1 y1 x2 y2Область интереса в px или % (например, 0% 0% 50% 100%). Сохраняется только объект внутри неё; всё снаружи становится фоном. Координаты относятся к исходному изображению. По умолчанию — всё изображение.
fitcontain | 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.png

200 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-Confidence0–1: насколько однозначна маска (среднее |2a − 1| по пикселям, a = alpha). Близко к 1 — чистое вырезание; меньшие значения означают много мягких или неуверенных краёв.
X-Matte-Ambiguous-RatioДоля пикселей с alpha строго между 0.1 и 0.9 (волосы, стекло, размытие в движении). Полезно, чтобы отмечать изображения для проверки.
X-Credits-RemainingВаш баланс после этого изображения.
X-Removal-IdId сохранённого результата.
X-Job-IdId задачи, стоящей за запросом (можно использовать с /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. Тот же ключ; видны только ваши задачи.

ПолеЗначение
statusqueued, processing, succeeded, partial, failed или canceled
donetrue, когда выполнять больше нечего
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).
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. GET https://removebackground.dev/v1.0/account с вашим X-Api-Key.

Ошибки (эндпоинты /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_reusedGET …/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. Опрос задачи

Вызывайте 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 / JSON25 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/batch400 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 кредит.