curl --request POST \
--url https://api.trycarhub.com/v1/render/background \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form images=@example-file \
--form background=19 \
--form category=auto \
--form interior_background=default \
--form 'interior_color=#FFFFFFFF' \
--form image_ratio=4:3 \
--form upscale_model_name=GAN \
--form denoising_strength=0.175 \
--form shadow_intensity=0.8 \
--form is_reflection=true \
--form reflection_intensity=0.35 \
--form alpha_value=100 \
--form 'logo=<string>' \
--form logo_asset_id=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form plate_color= \
--form 'top_banner_url=<string>' \
--form top_banner_asset_id=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form 'bottom_banner_url=<string>' \
--form bottom_banner_asset_id=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form overlay_top=false \
--form overlay_bot=false \
--form only_banner=false \
--form studio_mode=false \
--form roll=123 \
--form pitch=123 \
--form 'token=<string>' \
--form output_format=jpgimport requests
url = "https://api.trycarhub.com/v1/render/background"
files = { "images": ("example-file", open("example-file", "rb")) }
payload = {
"background": "19",
"category": "auto",
"interior_background": "default",
"interior_color": "#FFFFFFFF",
"image_ratio": "4:3",
"upscale_model_name": "GAN",
"denoising_strength": "0.175",
"shadow_intensity": "0.8",
"is_reflection": "true",
"reflection_intensity": "0.35",
"alpha_value": "100",
"logo": "<string>",
"logo_asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"plate_color": "",
"top_banner_url": "<string>",
"top_banner_asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bottom_banner_url": "<string>",
"bottom_banner_asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"overlay_top": "false",
"overlay_bot": "false",
"only_banner": "false",
"studio_mode": "false",
"roll": "123",
"pitch": "123",
"token": "<string>",
"output_format": "jpg"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('images', '<string>');
form.append('background', '19');
form.append('category', 'auto');
form.append('interior_background', 'default');
form.append('interior_color', '#FFFFFFFF');
form.append('image_ratio', '4:3');
form.append('upscale_model_name', 'GAN');
form.append('denoising_strength', '0.175');
form.append('shadow_intensity', '0.8');
form.append('is_reflection', 'true');
form.append('reflection_intensity', '0.35');
form.append('alpha_value', '100');
form.append('logo', '<string>');
form.append('logo_asset_id', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('plate_color', '');
form.append('top_banner_url', '<string>');
form.append('top_banner_asset_id', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('bottom_banner_url', '<string>');
form.append('bottom_banner_asset_id', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('overlay_top', 'false');
form.append('overlay_bot', 'false');
form.append('only_banner', 'false');
form.append('studio_mode', 'false');
form.append('roll', '123');
form.append('pitch', '123');
form.append('token', '<string>');
form.append('output_format', 'jpg');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.trycarhub.com/v1/render/background', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.trycarhub.com/v1/render/background",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"images\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"background\"\r\n\r\n19\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"category\"\r\n\r\nauto\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_background\"\r\n\r\ndefault\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_color\"\r\n\r\n#FFFFFFFF\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image_ratio\"\r\n\r\n4:3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upscale_model_name\"\r\n\r\nGAN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"denoising_strength\"\r\n\r\n0.175\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"shadow_intensity\"\r\n\r\n0.8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_reflection\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reflection_intensity\"\r\n\r\n0.35\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"alpha_value\"\r\n\r\n100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"plate_color\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_top\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_bot\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"only_banner\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"studio_mode\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"roll\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pitch\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"output_format\"\r\n\r\njpg\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.trycarhub.com/v1/render/background"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"images\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"background\"\r\n\r\n19\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"category\"\r\n\r\nauto\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_background\"\r\n\r\ndefault\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_color\"\r\n\r\n#FFFFFFFF\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image_ratio\"\r\n\r\n4:3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upscale_model_name\"\r\n\r\nGAN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"denoising_strength\"\r\n\r\n0.175\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"shadow_intensity\"\r\n\r\n0.8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_reflection\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reflection_intensity\"\r\n\r\n0.35\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"alpha_value\"\r\n\r\n100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"plate_color\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_top\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_bot\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"only_banner\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"studio_mode\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"roll\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pitch\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"output_format\"\r\n\r\njpg\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.trycarhub.com/v1/render/background")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"images\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"background\"\r\n\r\n19\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"category\"\r\n\r\nauto\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_background\"\r\n\r\ndefault\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_color\"\r\n\r\n#FFFFFFFF\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image_ratio\"\r\n\r\n4:3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upscale_model_name\"\r\n\r\nGAN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"denoising_strength\"\r\n\r\n0.175\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"shadow_intensity\"\r\n\r\n0.8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_reflection\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reflection_intensity\"\r\n\r\n0.35\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"alpha_value\"\r\n\r\n100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"plate_color\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_top\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_bot\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"only_banner\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"studio_mode\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"roll\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pitch\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"output_format\"\r\n\r\njpg\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.trycarhub.com/v1/render/background")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"images\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"background\"\r\n\r\n19\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"category\"\r\n\r\nauto\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_background\"\r\n\r\ndefault\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_color\"\r\n\r\n#FFFFFFFF\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image_ratio\"\r\n\r\n4:3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upscale_model_name\"\r\n\r\nGAN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"denoising_strength\"\r\n\r\n0.175\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"shadow_intensity\"\r\n\r\n0.8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_reflection\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reflection_intensity\"\r\n\r\n0.35\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"alpha_value\"\r\n\r\n100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"plate_color\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_top\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_bot\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"only_banner\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"studio_mode\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"roll\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pitch\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"output_format\"\r\n\r\njpg\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"is_staging": false,
"id": "job_3ZxK9pQr7TnW",
"object": "job",
"endpoint": "vehicle.pose",
"status": "queued",
"livemode": true,
"created": 1755300000,
"started_at": 1755300000,
"completed_at": 1755300000,
"model_version": "plate-reader@2026-08-27",
"credits": {
"reserved": 20,
"charged": 20
},
"result": {
"images": [
{
"image": {
"url": "<string>",
"expires_at": 1755300000,
"format": "jpg",
"width": 2,
"height": 2,
"bytes": 1
},
"input_index": 1,
"position": "<string>",
"category": "exterior",
"renderer": "exterior",
"plate_flag": true,
"segmentation_flag": true,
"background": {
"mode": "replaced",
"preset": "studio_white"
},
"source": {
"width": 2,
"height": 2
}
}
],
"image_count": 15,
"token": "<string>"
},
"error": {
"type": "processing_error",
"code": "model_inference_failed",
"message": "<string>"
},
"test_scenario": "low_confidence"
}Image Backgrounding
Tool to replace the background of images containing vehicles.
- Effectively removes background from an image.
- Offers multiple backgrounds to replace the original background.
- Provides the ability to enhance an image or video with a blurred or transformed background.
Accepts up to 30 assets and returns one result per input, preserving input order. Rendered files are served from signed URLs that expire — download and re-host anything you intend to keep.
curl --request POST \
--url https://api.trycarhub.com/v1/render/background \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form images=@example-file \
--form background=19 \
--form category=auto \
--form interior_background=default \
--form 'interior_color=#FFFFFFFF' \
--form image_ratio=4:3 \
--form upscale_model_name=GAN \
--form denoising_strength=0.175 \
--form shadow_intensity=0.8 \
--form is_reflection=true \
--form reflection_intensity=0.35 \
--form alpha_value=100 \
--form 'logo=<string>' \
--form logo_asset_id=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form plate_color= \
--form 'top_banner_url=<string>' \
--form top_banner_asset_id=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form 'bottom_banner_url=<string>' \
--form bottom_banner_asset_id=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form overlay_top=false \
--form overlay_bot=false \
--form only_banner=false \
--form studio_mode=false \
--form roll=123 \
--form pitch=123 \
--form 'token=<string>' \
--form output_format=jpgimport requests
url = "https://api.trycarhub.com/v1/render/background"
files = { "images": ("example-file", open("example-file", "rb")) }
payload = {
"background": "19",
"category": "auto",
"interior_background": "default",
"interior_color": "#FFFFFFFF",
"image_ratio": "4:3",
"upscale_model_name": "GAN",
"denoising_strength": "0.175",
"shadow_intensity": "0.8",
"is_reflection": "true",
"reflection_intensity": "0.35",
"alpha_value": "100",
"logo": "<string>",
"logo_asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"plate_color": "",
"top_banner_url": "<string>",
"top_banner_asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"bottom_banner_url": "<string>",
"bottom_banner_asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"overlay_top": "false",
"overlay_bot": "false",
"only_banner": "false",
"studio_mode": "false",
"roll": "123",
"pitch": "123",
"token": "<string>",
"output_format": "jpg"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('images', '<string>');
form.append('background', '19');
form.append('category', 'auto');
form.append('interior_background', 'default');
form.append('interior_color', '#FFFFFFFF');
form.append('image_ratio', '4:3');
form.append('upscale_model_name', 'GAN');
form.append('denoising_strength', '0.175');
form.append('shadow_intensity', '0.8');
form.append('is_reflection', 'true');
form.append('reflection_intensity', '0.35');
form.append('alpha_value', '100');
form.append('logo', '<string>');
form.append('logo_asset_id', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('plate_color', '');
form.append('top_banner_url', '<string>');
form.append('top_banner_asset_id', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('bottom_banner_url', '<string>');
form.append('bottom_banner_asset_id', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('overlay_top', 'false');
form.append('overlay_bot', 'false');
form.append('only_banner', 'false');
form.append('studio_mode', 'false');
form.append('roll', '123');
form.append('pitch', '123');
form.append('token', '<string>');
form.append('output_format', 'jpg');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.trycarhub.com/v1/render/background', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.trycarhub.com/v1/render/background",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"images\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"background\"\r\n\r\n19\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"category\"\r\n\r\nauto\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_background\"\r\n\r\ndefault\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_color\"\r\n\r\n#FFFFFFFF\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image_ratio\"\r\n\r\n4:3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upscale_model_name\"\r\n\r\nGAN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"denoising_strength\"\r\n\r\n0.175\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"shadow_intensity\"\r\n\r\n0.8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_reflection\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reflection_intensity\"\r\n\r\n0.35\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"alpha_value\"\r\n\r\n100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"plate_color\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_top\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_bot\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"only_banner\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"studio_mode\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"roll\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pitch\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"output_format\"\r\n\r\njpg\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.trycarhub.com/v1/render/background"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"images\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"background\"\r\n\r\n19\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"category\"\r\n\r\nauto\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_background\"\r\n\r\ndefault\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_color\"\r\n\r\n#FFFFFFFF\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image_ratio\"\r\n\r\n4:3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upscale_model_name\"\r\n\r\nGAN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"denoising_strength\"\r\n\r\n0.175\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"shadow_intensity\"\r\n\r\n0.8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_reflection\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reflection_intensity\"\r\n\r\n0.35\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"alpha_value\"\r\n\r\n100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"plate_color\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_top\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_bot\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"only_banner\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"studio_mode\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"roll\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pitch\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"output_format\"\r\n\r\njpg\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.trycarhub.com/v1/render/background")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"images\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"background\"\r\n\r\n19\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"category\"\r\n\r\nauto\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_background\"\r\n\r\ndefault\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_color\"\r\n\r\n#FFFFFFFF\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image_ratio\"\r\n\r\n4:3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upscale_model_name\"\r\n\r\nGAN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"denoising_strength\"\r\n\r\n0.175\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"shadow_intensity\"\r\n\r\n0.8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_reflection\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reflection_intensity\"\r\n\r\n0.35\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"alpha_value\"\r\n\r\n100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"plate_color\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_top\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_bot\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"only_banner\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"studio_mode\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"roll\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pitch\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"output_format\"\r\n\r\njpg\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.trycarhub.com/v1/render/background")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"images\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"background\"\r\n\r\n19\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"category\"\r\n\r\nauto\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_background\"\r\n\r\ndefault\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"interior_color\"\r\n\r\n#FFFFFFFF\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"image_ratio\"\r\n\r\n4:3\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"upscale_model_name\"\r\n\r\nGAN\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"denoising_strength\"\r\n\r\n0.175\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"shadow_intensity\"\r\n\r\n0.8\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"is_reflection\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"reflection_intensity\"\r\n\r\n0.35\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"alpha_value\"\r\n\r\n100\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"logo_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"plate_color\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"top_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"bottom_banner_asset_id\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_top\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"overlay_bot\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"only_banner\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"studio_mode\"\r\n\r\nfalse\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"roll\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"pitch\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"token\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"output_format\"\r\n\r\njpg\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"is_staging": false,
"id": "job_3ZxK9pQr7TnW",
"object": "job",
"endpoint": "vehicle.pose",
"status": "queued",
"livemode": true,
"created": 1755300000,
"started_at": 1755300000,
"completed_at": 1755300000,
"model_version": "plate-reader@2026-08-27",
"credits": {
"reserved": 20,
"charged": 20
},
"result": {
"images": [
{
"image": {
"url": "<string>",
"expires_at": 1755300000,
"format": "jpg",
"width": 2,
"height": 2,
"bytes": 1
},
"input_index": 1,
"position": "<string>",
"category": "exterior",
"renderer": "exterior",
"plate_flag": true,
"segmentation_flag": true,
"background": {
"mode": "replaced",
"preset": "studio_white"
},
"source": {
"width": 2,
"height": 2
}
}
],
"image_count": 15,
"token": "<string>"
},
"error": {
"type": "processing_error",
"code": "model_inference_failed",
"message": "<string>"
},
"test_scenario": "low_confidence"
}Authorizations
Organisation API key, sent as Authorization: Bearer chk_live_….
chk_live_…— production inference, live credits,livemode: true,is_staging: false.chk_stg_…— real inference classified as staging, the same live credits,livemode: true,is_staging: true.chk_test_…— identical pipeline against the fixture backend, test credits,livemode: false.
Keys are stored hashed; only the prefix (chk_live_a1b2…) is ever displayed again. A key
may be scoped to a subset of endpoint families — calling outside its scopes is a 403.
Headers
Client-generated key (a UUID is ideal) making this POST safe to retry. The first request
is executed and its response stored for 24 h; any replay with the same key returns that
stored response with Idempotent-Replayed: true and bills nothing. Reusing a key with a
different payload is a 409 idempotency_key_reuse.
8 - 255Steers the fixture backend. Ignored by live keys, 400 test_scenario_not_supported if the
scenario is unknown to the endpoint. Common catalogue:
| Scenario | Effect |
|---|---|
| (absent) | Deterministic success — the endpoint's default fixture. |
empty_result | Success with nothing detected: empty lists, null readings. |
low_confidence | Success with every confidence below 0.5. |
model_error | Job settles failed; the reservation is released. |
slow | Completion after ~30 s — makes wait=true time out. |
insufficient_credits | 402 at admission, no job created. |
Some endpoints add their own scenarios; unsupported common scenarios (for example
empty_result on a generation endpoint) are rejected rather than silently ignored.
"empty_result"
"low_confidence"
"model_error"
"slow"
"insufficient_credits"
Query Parameters
Hold the connection until the job settles and answer 200 with the completed job instead
of 202 with a queued one. Available on fast endpoints only; the ceiling is 30 s, after
which the job keeps running and the call answers 202 as usual.
Body
Repeat the images field once per file. 10 MB each.
1 - 30 elementsProvisioned preset name or an organisation-owned background selector. default selects the default studio; use custom--<ID> for a custom background. An empty string skips replacement and returns the source image.
"19"
"35"
"109"
"custom--5"
"default"
""
Renderer/category override. Auto routes exterior position folders to the exterior renderer and interior, tire, trunk and engine folders to the interior renderer.
auto, exterior, interior, tire, trunk, engine Provisioned interior background set used for non-exterior shots.
"default"
"peyrot"
RGBA fallback when a category image is absent from the interior set.
^#[0-9A-Fa-f]{8}$Output aspect ratio. Banners force 16:9.
4:3, 16:9, 3:2 GAN enhancement is the default. Choose fine_grain for diffusion enhancement or None to skip enhancement.
fine_grain, GAN, None Fine-grain denoising strength. Values above 0.2 can introduce artifacts.
0 <= x <= 10 <= x <= 1Add a floor reflection beneath the vehicle.
0 <= x <= 1Opacity of interior glass and windscreen areas (0 transparent, 255 opaque).
0 <= x <= 255Public HTTP(S) dealership logo URL. Applied when a plate is detected.
Organisation-owned licence-plate asset. Mutually exclusive with logo.
^$|^#[0-9A-Fa-f]{6}$Top banner image. Any banner forces a 16:9 render.
Organisation-owned top banner. Mutually exclusive with top_banner_url.
Bottom banner image. Any banner forces a 16:9 render.
Organisation-owned bottom banner. Mutually exclusive with bottom_banner_url.
Skip background removal and assemble banners around the original image.
Detect position from pixels. When false, infer it from the image URL path.
Explicit camera roll in degrees; null enables automatic detection.
Reserved for compatibility; currently unused by the pipeline.
Optional traceability value returned unchanged in the result.
jpg, png, webp Response
Job completed synchronously (wait=true).
The unit of work of the API. Every inference call creates one, and every result is read
back from one — synchronously through wait=true, or later through GET /v1/jobs/{id}
or a webhook.
result is populated only in succeeded, error only in failed / expired.
Staging classification. Requires live mode and uses the organisation's shared live credits.
Job identifier — job_ followed by a base58 string.
^job_[1-9A-HJ-NP-Za-km-z]{8,32}$"job_3ZxK9pQr7TnW"
"job"Dotted slug of a CarHub endpoint, the identifier used for jobs and usage.
vehicle.pose, vehicle.segment, vehicle.identify, vin.read, driver_license.read, plate.read, document.read, dashboard.read, engine.detect, damage.detect, damage.severity, tire.read, tire.detect, parts.recognize, parts.segment, parts.decompose, pricing.vehicle, pricing.repair, render.background, render.enhance, render.plate, render.360, render.video, render.hotspots Lifecycle of a job. queued → processing → one of succeeded | partial | failed; expired
when it was never picked up in time, canceled when it was cancelled before starting.
Every state after processing is terminal.
queued, processing, succeeded, partial, failed, expired, canceled false when the job was created with a chk_test_ key: fixture result, test credits.
Epoch seconds, UTC.
1755300000
When the job left the queue. Null while queued.
1755300000
When the job settled. Null until then.
1755300000
Exact model build that produced the result, as <model>@<release date>. Null until the job starts. Pin your regression tests to it.
"plate-reader@2026-08-27"
Credit accounting for the job. One thousand credits equal one USD. reserved is held at
admission and charged is the real cost after settlement; unused credits are released.
Show child attributes
Show child attributes
Re-backgrounded images in the same order as the submitted inputs.
Show child attributes
Show child attributes
Populated when status is failed or expired, null otherwise.
Show child attributes
Show child attributes
The X-Carhub-Test-Scenario that produced this job. Present on test-mode jobs that were steered by one, absent otherwise — a live job never carries it.
"low_confidence"