> ## 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).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.