Developer TutorialUpdated 2026

Car Photo API in Python: A Complete Tutorial

A complete, production-ready Python guide to the AutoBackgrounding car background removal API — authentication, uploads, async polling, concurrency-controlled bulk processing, and robust error handling.

14 min read

This guide is part of the AutoBackgrounding API documentation series. See live endpoints, rate limits, and per-image pricing from on the API pricing & docs page.

View API Pricing & Docs

Python is the go-to language for data pipelines, automation scripts, and machine-learning backends — which makes it a perfect match for the car background removal API. Whether you are batch-processing a dealer's inventory overnight or adding clean vehicle photos to a Django marketplace, this tutorial shows a complete, production-ready integration of the AutoBackgrounding vehicle image API in Python.

Every example uses the widely adopted requests library plus the standard library, so you can drop the code into Flask, FastAPI, Django, an Airflow DAG, or a simple cron script.

Why Python for automotive image processing

Teams reach for Python when a background removal API needs to sit inside a larger data or automation workflow. It excels at gluing systems together: pull VINs and photo URLs from your DMS, send each car photo to the image processing API, then write the cleaned results back to your inventory database or CDN.

  • The requests library makes authenticated HTTP calls trivial.
  • concurrent.futures gives you painless parallelism for bulk vehicle photo processing.
  • Python fits naturally into existing ETL, scraping, and ML pipelines dealers already run.

Prerequisites and setup

To follow along with the automotive photo API examples, you need:

bash
"tok-comment"># Create a virtual environment and install requests
python -m venv venv
source venv/bin/activate
pip install requests

"tok-comment"># Store your API key as an environment variable
export AUTOBG_API_KEY="sk_live_your_api_key_here"

Authentication and API keys

The car background removal API uses bearer token authentication. Build a small reusable session so every request carries the right header and you never repeat yourself:

python
"tok-comment"># client.py - reusable session for the car background removal API
import os
import requests

API_BASE = "https:">//api.autobackgrounding.com/v1"
API_KEY = os.environ["AUTOBG_API_KEY"]

session = requests.Session()
session.headers.update({
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
})

def autobg_request(method, path, **kwargs):
    resp = session.request(method, API_BASE + path, timeout=30, **kwargs)
    resp.raise_for_status()  "tok-comment"># raises for 4xx / 5xx
    return resp.json()

Your first background removal request

Submit a single vehicle photo by posting its URL to the process endpoint and requesting a clean white studio background. This is the minimal call to the vehicle image API:

python
from client import autobg_request

def remove_background(image_url):
    "tok-comment"># Submit the car photo for background removal
    job = autobg_request("POST", "/images/process", json={
        "image_url": image_url,
        "background": "white_studio",      "tok-comment"># clean dealership background
        "output_format": "png",
        "remove_other_vehicles": True,       "tok-comment"># strip nearby cars from the lot
    })
    print("Job submitted:", job["id"])
    return job

if __name__ == "__main__":
    remove_background("https:">//example.com/lot-photos/sedan-front.jpg")

Polling async jobs

Full-resolution car photos are processed asynchronously. The image processing API returns a job you poll until it reports completed or failed. This helper adds a timeout and a polling interval:

python
import time
from client import autobg_request

def wait_for_job(job_id, timeout=120, interval=1.5):
    start = time.time()

    while time.time() - start < timeout:
        job = autobg_request("GET", f"/images/jobs/{job_id}")

        if job["status"] == "completed":
            return job
        if job["status"] == "failed":
            raise RuntimeError("Processing failed: " + job.get("error", "unknown"))

        time.sleep(interval)  "tok-comment"># still processing - wait and poll again

    raise TimeoutError(f"Timed out waiting for job {job_id}")

def process_vehicle_photo(image_url, background="white_studio"):
    job = autobg_request("POST", "/images/process", json={
        "image_url": image_url,
        "background": background,
        "output_format": "png",
    })
    finished = wait_for_job(job["id"])
    return finished["output_url"]  "tok-comment"># hosted URL of the cleaned car photo

Bulk processing with a thread pool

To process a whole inventory with the bulk image processing API, use a ThreadPoolExecutor. Because the work is I/O bound (waiting on the API), threads give you real throughput. Match max_workers to your plan's rate limit:

python
from concurrent.futures import ThreadPoolExecutor, as_completed
from poll import process_vehicle_photo

inventory = [
    "https:">//example.com/vin1-front.jpg",
    "https:">//example.com/vin1-side.jpg",
    "https:">//example.com/vin2-front.jpg",
    "tok-comment"># ...hundreds more vehicle photos
]

def process_inventory(image_urls, max_workers=5):
    results = {}
    with ThreadPoolExecutor(max_workers=max_workers) as pool:
        futures = {pool.submit(process_vehicle_photo, url): url for url in image_urls}

        for future in as_completed(futures):
            url = futures[future]
            try:
                results[url] = future.result()
            except Exception as exc:
                results[url] = f"ERROR: {exc}"
    return results

if __name__ == "__main__":
    output = process_inventory(inventory, max_workers=5)
    ok = sum(1 for v in output.values() if not str(v).startswith("ERROR"))
    print(f"Processed {ok} of {len(inventory)} car photos")

For very large inventories, prefer the async batch endpoint with webhooks so you are not holding open hundreds of threads — see the webhooks and async processing guide.

Error handling and retries

Production code that calls any vehicle photo API must handle rate limits (HTTP 429) and transient 5xx errors. This decorator adds exponential backoff around any request function:

python
import time
import functools
import requests

def with_retry(retries=4, base_delay=0.5):
    def decorator(fn):
        @functools.wraps(fn)
        def wrapper(*args, **kwargs):
            attempt = 0
            while True:
                try:
                    return fn(*args, **kwargs)
                except requests.HTTPError as exc:
                    status = exc.response.status_code if exc.response else 0
                    attempt += 1
                    retryable = status == 429 or 500 <= status < 600
                    if not retryable or attempt > retries:
                        raise
                    delay = base_delay * (2 ** (attempt - 1))
                    print(f"Retry {attempt} after {delay:.1f}s (status {status})")
                    time.sleep(delay)
        return wrapper
    return decorator

That completes a robust Python integration of the car background removal API: an authenticated session, single-photo processing, async polling, thread-pool bulk processing, and retry logic. Grab an API key and check current per-image pricing and rate limits on the API pricing & docs page. Working in JavaScript instead? See the companion Node.js car background removal tutorial.

Frequently Asked Questions

Which Python version does the car background removal API support?

Python 3.8 and newer. The examples use the popular requests library and the standard-library concurrent.futures module, so they run on any modern Python environment including virtualenvs, Docker, and serverless.

Do I need a dedicated SDK to call the vehicle image API in Python?

No. The API is standard HTTPS with JSON, so the requests library is all you need. This keeps the integration lightweight and easy to drop into Django, Flask, FastAPI, or a batch script.

How do I bulk-process an entire inventory in Python without hitting rate limits?

Use a ThreadPoolExecutor with a worker count matched to your plan's rate limit, or use the async batch endpoint with webhooks for very large inventories. The bulk section below includes a complete thread-pool example.

How much does the car photo API cost?

Pricing starts at 5 cents per image on higher-volume plans, with a pay-as-you-go Starter Pack for testing. Current per-image rates and rate limits are on the API pricing and docs page.

Start Building With the Car Background Removal API

Automotive-trained background removal from just 5¢ per image. Get an API key and process your first vehicle photo in minutes.

Continue the Series