> ## Documentation Index
> Fetch the complete documentation index at: https://docs.poof.bg/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrate from remove.bg

> remove.bg shuts down on 1 December 2026. Switch to Poof by changing the domain and key, or use Studio and the no-code integrations

remove.bg shuts down on 1 December 2026. Poof is a plug-and-play replacement: for most integrations you switch the domain from `api.remove.bg` to `api.poof.bg`, put your Poof key in the same header, and everything else keeps working. Same upload, same options, same image back.

<Tip>
  **Plug and play: change the domain, keep the rest.** `api.poof.bg` serves the remove.bg path, so `POST https://api.poof.bg/v1.0/removebg` behaves exactly like `POST https://api.poof.bg/v1/remove`. It is a route alias, not an HTTP redirect, so POST bodies and headers arrive untouched. `X-Api-Key` works in any casing. A remove.bg client that only swaps the domain and the key value keeps working.
</Tip>

Pick the path that fits you:

1. **No code.** Sign in at [dash.poof.bg](https://dash.poof.bg) and open **Studio**: upload images, process them on your account, select and download the results. For automations, connect Poof in [n8n](/integrations/n8n), [Zapier](/integrations/zapier) or [Make](/integrations/make), or give your AI assistant the [MCP server](/integrations/mcp).
2. **An existing remove.bg integration.** Change the domain and the key as described above. Then skim section 2 for the handful of parameters that differ.
3. **A full mapping.** Sections 1 to 6 below cover every endpoint, parameter, header and error, plus the [Python](/integrations/python) and [TypeScript](/integrations/typescript) SDKs and a migration checklist.

The shutdown date comes from the [remove.bg API documentation](https://www.remove.bg/api); the standalone website closes on the same day at 9:00am CET.

## 1. Endpoint and authentication

|                  | remove.bg                                  | Poof                                                      |
| ---------------- | ------------------------------------------ | --------------------------------------------------------- |
| Endpoint         | `POST https://api.remove.bg/v1.0/removebg` | `POST https://api.poof.bg/v1/remove`                      |
| Auth header      | `X-Api-Key: <remove.bg key>`               | `x-api-key: <Poof key>`                                   |
| Account info     | `GET https://api.remove.bg/v1.0/account`   | [`GET https://api.poof.bg/v1/me`](/api-reference/account) |
| Request body     | `multipart/form-data`                      | `multipart/form-data`, unchanged                          |
| Success response | Binary image                               | Binary image, unchanged                                   |

HTTP header names are case-insensitive, so code that already sends `X-Api-Key` works as-is once the value is a Poof key. Get a key at [dash.poof.bg](https://dash.poof.bg).

<Note>
  Sticking with `/v1.0/removebg` on `api.poof.bg` is fine. Use `/v1/remove` in new code; it is the canonical path.
</Note>

<CodeGroup>
  ```bash cURL theme={null}
  # remove.bg (before)
  curl -X POST https://api.remove.bg/v1.0/removebg \
    -H 'X-Api-Key: YOUR_REMOVEBG_KEY' \
    -F 'image_file=@image.jpg' \
    -o no-bg.png

  # Poof (after)
  curl -X POST https://api.poof.bg/v1/remove \
    -H 'X-Api-Key: YOUR_POOF_KEY' \
    -F 'image_file=@image.jpg' \
    -o no-bg.png
  ```

  ```python Python (requests) theme={null}
  import requests

  # remove.bg (before)
  response = requests.post(
      'https://api.remove.bg/v1.0/removebg',
      files={'image_file': open('image.jpg', 'rb')},
      headers={'X-Api-Key': 'YOUR_REMOVEBG_KEY'},
  )

  # Poof (after)
  response = requests.post(
      'https://api.poof.bg/v1/remove',
      files={'image_file': open('image.jpg', 'rb')},
      headers={'X-Api-Key': 'YOUR_POOF_KEY'},
  )
  response.raise_for_status()
  open('no-bg.png', 'wb').write(response.content)
  ```

  ```javascript Node.js (fetch) theme={null}
  import fs from 'node:fs/promises';

  const form = new FormData();
  form.append('image_file', new Blob([await fs.readFile('image.jpg')]), 'image.jpg');

  // remove.bg (before): https://api.remove.bg/v1.0/removebg with YOUR_REMOVEBG_KEY
  // Poof (after):
  const res = await fetch('https://api.poof.bg/v1/remove', {
    method: 'POST',
    headers: { 'X-Api-Key': 'YOUR_POOF_KEY' },
    body: form,
  });
  if (!res.ok) throw new Error(await res.text());
  await fs.writeFile('no-bg.png', Buffer.from(await res.arrayBuffer()));
  ```
</CodeGroup>

## 2. Request parameters

Poof's validator ignores fields it does not know, so leftover remove.bg parameters never cause a rejection. The one exception is `size`: Poof validates its value, and remove.bg's `auto`, `small`, `regular`, `4k` and `50MP` are only accepted through the remove.bg compatibility layer described below.

| remove.bg parameter                              | Poof                     | Status        | Notes                                                                                                                                                                                                                                 |
| ------------------------------------------------ | ------------------------ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `image_file`                                     | `image_file`             | Same          | PNG, JPG or WebP, up to 20 MB                                                                                                                                                                                                         |
| `format` = `png` \| `jpg` \| `webp`              | `format`                 | Same          | `auto` and `zip` are not supported: request `png`, `jpg` or `webp` explicitly                                                                                                                                                         |
| `bg_color`                                       | `bg_color`               | Same          | Hex, `rgb()` or a CSS colour name                                                                                                                                                                                                     |
| `channels` = `rgba` \| `alpha`                   | `channels`               | Same          | Poof also accepts `rgb` for an opaque image on `bg_color`                                                                                                                                                                             |
| `crop`                                           | `crop`                   | Same          | `true`/`false`; Poof also accepts an aspect ratio such as `1:1` or `4:3`                                                                                                                                                              |
| `size` = `preview` \| `medium` \| `hd` \| `full` | `size`                   | Same          | Same names. On Poof they cap the output at 0.25 MP, 1.5 MP, 4 MP and the original size                                                                                                                                                |
| `size` = `auto` \| `4k` \| `50MP`                | `size=full`              | Mapped        | Compatibility layer. Poof's default is already `full`                                                                                                                                                                                 |
| `size` = `small` \| `regular`                    | `size=preview`           | Mapped        | Compatibility layer                                                                                                                                                                                                                   |
| `crop_margin`                                    | `padding`                | Mapped        | Compatibility layer, percentages only: `10%` maps directly, `5% 10%` becomes `10%,5%`. Pixel margins such as `10px` cannot be honoured and are ignored (Poof's default `padding` of `10%` applies). `padding`, when sent, always wins |
| `image_url`                                      | `image_url`              | Mapped        | Compatibility layer: Poof downloads the image server-side. Otherwise download it yourself and send `image_file`                                                                                                                       |
| `image_file_b64`                                 | `image_file_b64`         | Mapped        | Compatibility layer. Otherwise decode and send `image_file`                                                                                                                                                                           |
| `scale`, `position`                              | `width`, `height`, `fit` | Partial       | No one-to-one mapping. Use [`width`/`height`](/api-reference/remove-background) (1 to 6000 px) with `fit=contain`, `cover` or `scale-down`                                                                                            |
| `type`, `type_level`                             | —                        | Ignored       | Poof does not take a subject hint. People, products, cars, animals and graphics are handled without one                                                                                                                               |
| `semitransparency`                               | —                        | Ignored       | Poof always returns a full alpha matte                                                                                                                                                                                                |
| `roi`                                            | —                        | Not supported | Crop the input before sending it                                                                                                                                                                                                      |
| `add_shadow`, `shadow_type`, `shadow_opacity`    | —                        | Not supported | Composite shadows client-side                                                                                                                                                                                                         |
| `bg_image_url`, `bg_image_file`                  | —                        | Not supported | Request a transparent PNG or WebP and composite the background yourself                                                                                                                                                               |

<Note>
  **remove.bg compatibility layer.** Rows marked *Mapped* are accepted by a compatibility layer on `/v1/remove`, which also answers on the legacy path `/v1.0/removebg`. It exists so an existing remove.bg client can switch by changing the hostname and key. In new code prefer Poof's native parameters: one of the four `size` values, `padding` instead of `crop_margin`, and `image_file` uploads.
</Note>

## 3. Response headers

| remove.bg header                     | Poof header                                     | Notes                                                                                                                    |
| ------------------------------------ | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `Content-Type`                       | `Content-Type`                                  | `image/png`, `image/jpeg` or `image/webp`                                                                                |
| `X-Width`, `X-Height`                | `X-Image-Width`, `X-Image-Height`               | Same values, different names. Update code that reads the dimensions                                                      |
| `X-Credits-Charged`                  | —                                               | Not sent. Every successful request costs exactly 1 credit and failed requests are free, so the value would always be `1` |
| `X-Type`                             | —                                               | Not sent                                                                                                                 |
| `X-Foreground-Top/Left/Width/Height` | —                                               | Not sent. Use `crop=true` to get the subject bounds as the output                                                        |
| `X-RateLimit-*`, `Retry-After`       | —                                               | See [rate\_limit\_exceeded](/errors/rate-limit-exceeded)                                                                 |
| —                                    | `X-Request-ID`                                  | Include it in support requests                                                                                           |
| —                                    | `X-Processing-Time-Ms`                          | Server-side processing time                                                                                              |
| —                                    | `X-Matte-Confidence`, `X-Matte-Ambiguous-Ratio` | Matte quality signals, see the [API reference](/api-reference/remove-background)                                         |

## 4. Error handling

remove.bg returned errors as an array:

```json remove.bg theme={null}
{
  "errors": [
    { "title": "<human-readable title>", "code": "<remove.bg error code>" }
  ]
}
```

Poof returns a flat object with a machine-readable `code`, a `message`, optional `details`, a `request_id` and a `doc_url`. Update any code that reads `errors[0].title`:

```json Poof theme={null}
{
  "code": "validation_error",
  "message": "Invalid parameters.",
  "details": { "size": ["must be one of: preview, medium, hd, full"] },
  "request_id": "req_3f6a2c1e-9b0d-4e7a-8c21-5d1f0a9b7e42",
  "doc_url": "https://docs.poof.bg/errors/validation-error"
}
```

| Situation              | Poof status and code                                       |
| ---------------------- | ---------------------------------------------------------- |
| Missing or invalid key | 401 [`authentication_error`](/errors/authentication-error) |
| Out of credits         | 402 [`payment_required`](/errors/payment-required)         |
| Rate limited           | 429 [`rate_limit_exceeded`](/errors/rate-limit-exceeded)   |
| Bad parameter          | 400 [`validation_error`](/errors/validation-error)         |
| No image in request    | 400 [`missing_image`](/errors/missing-image)               |
| Image too large        | 400 [`image_too_large`](/errors/image-too-large)           |
| Processing failure     | 502 [`upstream_error`](/errors/upstream-error)             |

Check the status code first and then `code`; remove.bg used different status codes for some of these cases, so do not rely on the old mapping.

The full list is in the [error reference](/errors/list).

## 5. Using the SDKs instead

If you would rather not hand-roll multipart requests, the official SDKs expose the same parameters as typed options.

<CodeGroup>
  ```python Python theme={null}
  # pip install poofbg
  from poof import Poof

  client = Poof(api_key="YOUR_POOF_KEY")

  # remove.bg: -F image_file=@product.jpg -F size=auto -F crop=true -F crop_margin=10%
  result = client.remove_background(
      "product.jpg",
      size="full",
      crop=True,
      padding="10%",
  )
  result.save("no-bg.png")
  ```

  ```typescript TypeScript theme={null}
  // npm install @poof-bg/js
  import { Poof } from '@poof-bg/js';
  import fs from 'fs/promises';

  const poof = new Poof({ apiKey: process.env.POOF_API_KEY! });

  // remove.bg: -F image_file=@product.jpg -F format=jpg -F bg_color=ffffff
  const result = await poof.removeBackground('product.jpg', {
    format: 'jpg',
    channels: 'rgb',
    bgColor: '#ffffff',
  });
  await fs.writeFile('no-bg.jpg', Buffer.from(result.data));
  ```
</CodeGroup>

See the [Python SDK](/integrations/python) and [TypeScript SDK](/integrations/typescript) pages for the full option list, and the [integrations overview](/integrations/overview) for n8n, Zapier, Make and MCP.

## 6. Checklist

<Steps>
  <Step title="Create a Poof account and key">
    Sign up at [dash.poof.bg](https://dash.poof.bg). The Free plan includes 100 credits every month, enough to validate the migration.
  </Step>

  <Step title="Swap the hostname and key">
    Replace `api.remove.bg` with `api.poof.bg` and set your Poof key in the API key header. The remove.bg path `/v1.0/removebg` keeps working on Poof, so these two edits are the minimum; switch to the canonical `/v1/remove` when convenient.
  </Step>

  <Step title="Audit your parameters">
    Fix `size` values, replace `crop_margin` with `padding`, and remove any dependence on shadows, `roi` or background images.
  </Step>

  <Step title="Update error handling">
    Read `code` and `message` from the flat error body instead of `errors[0]`, and log `request_id`.
  </Step>

  <Step title="Run your test suite">
    The success response is the same binary image, so existing assertions on output should pass unchanged.
  </Step>
</Steps>

Pricing for the volume you process is on [poof.bg/pricing](https://poof.bg/pricing). For a shorter overview of why teams pick Poof after remove.bg, see [poof.bg/alternative/remove-bg](https://poof.bg/alternative/remove-bg).
