Background Removal API

High quality results, with affordable rates

Designed for cost-effectiveness and high-quality results, delivers superior image cutouts, giving you more value for less.

Example Outputs

Evaluate the quality in various categories. Additionally, you can upload your photos, and inspect the result.

Dog on the Beach Dog on the Beach Background Removed
Photo by Pauline Loroy on Unsplash
A Woman Running in the Forest A Woman Running in the Forest Background Removed
Photo by Ali Choubin on Unsplash
Image with a Complex Foreground Image with a Complex Foreground Background Removed
Photo by Rahul Vaidya on Unsplash

Test it

Drag and Drop or Click to Upload Image
Submitted Image Submitted Image with Background Removed


We provide comfortable rates. Go as you pay.

Package Credits Price Price per Credit Validity
Free trial* 50 € 0 € 0.00 30 days
Package XS 100 € 10 € 0.10 30 days
Package S 500 € 40 € 0.08 20% off 30 days
Package M 1,000 € 70 € 0.07 30% off 90 days
Package L 5,000 € 300 € 0.06 40% off 180 days
Package XL 10,000 € 500 € 0.05 50% off 360 days

* Create account and get your API Key with 50 free credits.

Easy Integration

Our API is easy to integrate into your existing workflows. Here are some examples in various languages.

import requests

headers = {
    'accept': 'application/json',
    'X-API-Key': 'YOUR_API_KEY',
    # requests won't add a boundary if this header is set when you pass files=
    # 'Content-Type': 'multipart/form-data',

files = {
    'file': open('input-image.jpg', 'rb'),

response ='', headers=headers, files=files)

import java.util.Scanner;

class Main {

	public static void main(String[] args) throws IOException {
		URL url = new URL("");
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();

		httpConn.setRequestProperty("accept", "application/json");
		httpConn.setRequestProperty("X-API-Key", "YOUR_API_KEY");
		httpConn.setRequestProperty("Content-Type", "multipart/form-data");

		InputStream responseStream = httpConn.getResponseCode() / 100 == 2
				? httpConn.getInputStream()
				: httpConn.getErrorStream();
		Scanner s = new Scanner(responseStream).useDelimiter("\\A");
		String response = s.hasNext() ? : "";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, '');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'accept: application/json',
    'X-API-Key: YOUR_API_KEY',
    'Content-Type: multipart/form-data',
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'file' => new CURLFile('input-image.jpg'),

$response = curl_exec($ch);


extern crate reqwest;
use reqwest::{header, blocking::multipart};

fn main() -> Result<(), Box> {
    let mut headers = header::HeaderMap::new();
    headers.insert("accept", "application/json".parse().unwrap());
    headers.insert("X-API-Key", "YOUR_API_KEY".parse().unwrap());
    headers.insert("Content-Type", "multipart/form-data".parse().unwrap());

    let form = multipart::Form::new()
        .file("file", "input-image.jpg")?;

    let client = reqwest::blocking::Client::builder()
    let res ="")
    println!("{}", res);


const form = new FormData();
form.append('file', File([''], 'input-image.jpg'));

fetch('', {
    method: 'POST',
    headers: {
        'accept': 'application/json',
        'X-API-Key': 'YOUR_API_KEY',
        'Content-Type': 'multipart/form-data'
    body: form

package main

import (

func main() {
	form := new(bytes.Buffer)
	writer := multipart.NewWriter(form)
	fw, err := writer.CreateFormFile("input-image.jpg", filepath.Base("input-image.jpg"))
	if err != nil {
	fd, err := os.Open("input-image.jpg")
	if err != nil {
	defer fd.Close()
	_, err = io.Copy(fw, fd)
	if err != nil {


	client := &http.Client{}
	req, err := http.NewRequest("POST", "", form)
	if err != nil {
	req.Header.Set("accept", "application/json")
	req.Header.Set("X-API-Key", "YOUR_API_KEY")
	req.Header.Set("Content-Type", writer.FormDataContentType())
	resp, err := client.Do(req)
	if err != nil {
	defer resp.Body.Close()
	bodyText, err := io.ReadAll(resp.Body)
	if err != nil {
	fmt.Printf("%s\n", bodyText)

curl -X 'POST' \ \
    -H 'X-API-Key: YOUR_API_KEY' \
    -F 'file=@input-image.jpg' \
    -o output-image.png

using System.Net.Http;
using System.Net.Http.Headers;

HttpClient client = new HttpClient();

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "");

request.Headers.Add("accept", "application/json");
request.Headers.Add("X-API-Key", "YOUR_API_KEY");

MultipartFormDataContent content = new MultipartFormDataContent();
content.Add(new ByteArrayContent(File.ReadAllBytes("input-image.jpg")), "file", Path.GetFileName("input-image.jpg"));
request.Content = content;
request.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data");

HttpResponseMessage response = await client.SendAsync(request);
string responseBody = await response.Content.ReadAsStringAsync();

To see alternative endpoints, check the documentation page.



You can use any programming language. You can find several examples on the documentation page.

Yes. 7 requests / minute.


It is a supervised machine learning algorithm, meaning that it is learning from the examples we provide.

Our image background removal model is designed to handle complex backgrounds, including those with gradients or textures. In most cases, our model is able to successfully remove the background while preserving the foreground object. However, for the best results, we recommend using the service with images that have smooth and solid backgrounds, if possible. This can help to ensure that the image background removal is as accurate and seamless as possible and that the final output meets your expectations.

While your service aims to preserve the original quality of the foreground object as much as possible, it is important to note that there may still be some minor loss of detail or resolution in certain cases. If you prefer, you may request only the alpha channel, and process it on your side.


Yes. When you sign up, you get 50 free credits.

We provide an endpoint for getting available credits and expiration dates. Every processing costs 1 credit.

When you run out of credits or exceed your monthly credit limit, the API will respond with a 403 Forbidden status code along with a JSON payload specifying an Insufficient Credit error. To continue using the service, you can purchase additional credits on your account dashboard.


We process your images in memory. We do not store them.

No tracking code on our website. Your browsing habits are not tracked.


Frankfurt, Germany

Privacy by Design

We truly care about your privacy. Here is how:

  • To minimize the amount of personal data we store, we process your images in memory. We do not store them.
  • No tracking code on our website, meaning that your browsing habits are not tracked.
  • Keeping requirements at a minimum. For example, we do not even require a password for user registration, instead, we send a login link each time you want to log in.