Customize one vehicle photograph from your prompt for a marketing publication.
Invite-only beta: beta access is required for both live and test keys, including the Playground.
Accepts exactly one JPEG, PNG, or WebP image up to 20 MiB and 40 megapixels.
Produces one 1K PNG with Nano Banana 2.1 (gemini-nano-banana-2.1) on Vertex AI, without external search.
A prompt such as “Wash the car” produces a clean car, without a washing scene.
Explicit modifications are allowed; unaffected vehicle details and source orientation are preserved as closely as possible.
Visual fidelity must be evaluated on the generated result.
Reserves 400 credits and charges 400 credits only for a successful image.
Refusals and invalid image responses fail without a charge. Poll the returned job or use a webhook.
Jobs expire after 300 seconds. Result URLs expire after 15 minutes by default, as indicated by
result.image.expires_at; polling does not renew them. Download the image before expiration.
Test keys return a deterministic fixture and never call Vertex AI.
Batch inputs, unknown parameters, and conversation history are not accepted.
POST
/
v1
/
render
/
customize
Image Customizer
curl --request POST \ --url https://api.trycarhub.com/v1/render/customize \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: multipart/form-data' \ --form image=@example-file \ --form 'prompt=Wash the car. Keep its current paint color, wheels, equipment, and background.'
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.
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.
Steers 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.
Describe the final photograph you want. Only explicitly requested modifications should affect the vehicle.
Required string length: 1 - 4000
Pattern: \S
Examples:
"Wash the car. Keep its current paint color, wheels, equipment, and background."
"Change the paint color to metallic blue while preserving the wheels, trim, and vehicle condition."
"Place the car in a modern outdoor dealership courtyard with coherent daylight and reflections."
Response
Existing job returned by an idempotent replay.
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.
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.
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.
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.
Example:
"low_confidence"
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"CarHub Documentation","colors":{"primary":"#00D178","light":"#00D178","dark":"#00875A"},"logo":{"light":"https://mintcdn.com/carhub/QGtnYbiXqdelnLLP/logo/light.svg?fit=max\u0026auto=format\u0026n=QGtnYbiXqdelnLLP\u0026q=85\u0026s=30a659d8433638ab4c9a5e34224c530f","dark":"https://mintcdn.com/carhub/QGtnYbiXqdelnLLP/logo/dark.svg?fit=max\u0026auto=format\u0026n=QGtnYbiXqdelnLLP\u0026q=85\u0026s=bc5d0962de5aeed19417f2ad93d2c1f7"},"favicon":"https://mintcdn.com/carhub/QGtnYbiXqdelnLLP/favicon.svg?fit=max\u0026auto=format\u0026n=QGtnYbiXqdelnLLP\u0026q=85\u0026s=c2de244add29254fc76a410eaf5537d3","navbar":{"links":[{"href":"https://api.trycarhub.com/healthz","label":"API status"},{"href":"mailto:api@trycarhub.com","label":"Support"}],"primary":{"type":"button","label":"Open dashboard","href":"https://app.trycarhub.com"}},"footer":{"socials":{"github":"https://github.com/TryCarhub"}},"contextual":{"options":["copy","view","chatgpt","claude","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"carhub","hasAudioNarration":false,"actualSubdomain":"carhub","customDomains":["docs.trycarhub.com"],"gitSource":{"type":"github","owner":"trycarhub","repo":"documentation","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae0e992ba6430b0c747743d","collectionId":"8104c16a-7c49-45b3-9c1a-55fd528ac993","liveDeploymentHistoryId":"6ae0e992ba6430b0c747743d","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae0e992ba6430b0c747743d","clientVersion":"0.0.3990","searchFilterCounts":[{"language":"default","tag":"API reference","count":106},{"language":"default","tag":"Management","count":53},{"language":"default","tag":"API Reference","count":12},{"language":"default","tag":"Build your integration","count":9},{"language":"default","tag":"A — Understand the vehicle","count":9},{"language":"default","tag":"Get started","count":7},{"language":"default","tag":"E — Image production","count":7},{"language":"default","tag":"Uploads","count":5},{"language":"default","tag":"Assets","count":4},{"language":"default","tag":"B — Damage \u0026 condition","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/e-—-image-production/image-customizer","slug":"/api-reference/e-—-image-production/image-customizer","pageMetadata":{"title":"Image Customizer","description":"Customize one vehicle photograph from your prompt for a marketing publication.\nInvite-only beta: beta access is required for both live and test keys, including the Playground.\nAccepts exactly one JPEG, PNG, or WebP image up to 20 MiB and 40 megapixels.\nProduces one 1K PNG with Nano Banana 2.1 (`gemini-nano-banana-2.1`) on Vertex AI, without external search.\nA prompt such as \"Wash the car\" produces a clean car, without a washing scene.\nExplicit modifications are allowed; unaffected vehicle details and source orientation are preserved as closely as possible.\nVisual fidelity must be evaluated on the generated result.\n\nReserves 400 credits and charges 400 credits only for a successful image.\nRefusals and invalid image responses fail without a charge. Poll the returned job or use a webhook.\nJobs expire after 300 seconds. Result URLs expire after 15 minutes by default, as indicated by\n`result.image.expires_at`; polling does not renew them. Download the image before expiration.\nTest keys return a deterministic fixture and never call Vertex AI.\nBatch inputs, unknown parameters, and conversation history are not accepted.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/render/customize","href":"/api-reference/e-—-image-production/image-customizer","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Customize one vehicle photograph from your prompt for a marketing publication.\\nInvite-only beta: beta access is required for both live and test keys, including the Playground.\\nAccepts exactly one JPEG, PNG, or WebP image up to 20 MiB and 40 megapixels.\\nProduces one 1K PNG with Nano Banana 2.1 (\", _jsx(_components.code, {\n children: \"gemini-nano-banana-2.1\"\n }), \") on Vertex AI, without external search.\\nA prompt such as “Wash the car” produces a clean car, without a washing scene.\\nExplicit modifications are allowed; unaffected vehicle details and source orientation are preserved as closely as possible.\\nVisual fidelity must be evaluated on the generated result.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Reserves 400 credits and charges 400 credits only for a successful image.\\nRefusals and invalid image responses fail without a charge. Poll the returned job or use a webhook.\\nJobs expire after 300 seconds. Result URLs expire after 15 minutes by default, as indicated by\\n\", _jsx(_components.code, {\n children: \"result.image.expires_at\"\n }), \"; polling does not renew them. Download the image before expiration.\\nTest keys return a deterministic fixture and never call Vertex AI.\\nBatch inputs, unknown parameters, and conversation history are not accepted.\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Image Customizer","description":"Customize one vehicle photograph from your prompt for a marketing publication.\nInvite-only beta: beta access is required for both live and test keys, including the Playground.\nAccepts exactly one JPEG, PNG, or WebP image up to 20 MiB and 40 megapixels.\nProduces one 1K PNG with Nano Banana 2.1 (`gemini-nano-banana-2.1`) on Vertex AI, without external search.\nA prompt such as \"Wash the car\" produces a clean car, without a washing scene.\nExplicit modifications are allowed; unaffected vehicle details and source orientation are preserved as closely as possible.\nVisual fidelity must be evaluated on the generated result.\n\nReserves 400 credits and charges 400 credits only for a successful image.\nRefusals and invalid image responses fail without a charge. Poll the returned job or use a webhook.\nJobs expire after 300 seconds. Result URLs expire after 15 minutes by default, as indicated by\n`result.image.expires_at`; polling does not renew them. Download the image before expiration.\nTest keys return a deterministic fixture and never call Vertex AI.\nBatch inputs, unknown parameters, and conversation history are not accepted.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/render/customize","href":"/api-reference/e-—-image-production/image-customizer","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["E — Image production"],"operationId":"renderCustomize","summary":"Image Customizer","description":"Customize one vehicle photograph from your prompt for a marketing publication.\nInvite-only beta: beta access is required for both live and test keys, including the Playground.\nAccepts exactly one JPEG, PNG, or WebP image up to 20 MiB and 40 megapixels.\nProduces one 1K PNG with Nano Banana 2.1 (`gemini-nano-banana-2.1`) on Vertex AI, without external search.\nA prompt such as \"Wash the car\" produces a clean car, without a washing scene.\nExplicit modifications are allowed; unaffected vehicle details and source orientation are preserved as closely as possible.\nVisual fidelity must be evaluated on the generated result.\n\nReserves 400 credits and charges 400 credits only for a successful image.\nRefusals and invalid image responses fail without a charge. Poll the returned job or use a webhook.\nJobs expire after 300 seconds. Result URLs expire after 15 minutes by default, as indicated by\n`result.image.expires_at`; polling does not renew them. Download the image before expiration.\nTest keys return a deterministic fixture and never call Vertex AI.\nBatch inputs, unknown parameters, and conversation history are not accepted.\n","x-carhub-model":"image-customizer","x-carhub-meter":"per_image","x-carhub-endpoint":"render.customize","x-carhub-result-schema":"RenderCustomizeResult","parameters":["8ac37a11-74c8-4580-a4b1-ce0688be689c","975b344c-a993-4be4-8f78-dc15dead8bb4"],"requestBody":"eada2bca-1298-40a2-b52c-aa5bb364a426","responses":{"200":"1c210e04-fb84-4bfd-bc3e-de525726559a","202":"71049316-d771-43e8-b7c7-d8098b163fb0","400":"e9f7e828-543d-4750-ba41-3a6b2f9315d6","401":"c2228c92-ea10-42dd-9726-0845a707ecdb","402":"e6992e8f-6001-4c6c-bce4-a861b525eb7f","403":"ce1fe576-9915-4832-98b9-3a8406a3a7ab","404":"69ad5438-6708-48ec-bcfd-f315ae506672","409":"fe9a14ec-3d73-4626-8191-e2a06fa629fc","429":"dc89fd93-cfe3-43e9-b798-f36de71ecdf7","500":"740e0bc9-3ff9-43b4-934f-1d150bd94fa9"},"method":"post","type":"path","servers":["9708d856-6fe0-4a7c-a4e4-f8c34bef999b"],"security":["eaf03e77-949d-429d-99ec-98ad08844cb8"],"path":"/v1/render/customize","baseUrlOptions":["https://api.trycarhub.com"],"title":"Image Customizer","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"8ac37a11-74c8-4580-a4b1-ce0688be689c":{"name":"Idempotency-Key","in":"header","required":false,"description":"Client-generated key (a UUID is ideal) making this `POST` safe to retry. The first request\nis executed and its response stored for 24 h; any replay with the same key returns that\nstored response with `Idempotent-Replayed: true` and bills nothing. Reusing a key with a\ndifferent payload is a `409 idempotency_key_reuse`.\n","schema":{"type":"string","minLength":8,"maxLength":255,"isRequired":false,"description":"Client-generated key (a UUID is ideal) making this `POST` safe to retry. The first request\nis executed and its response stored for 24 h; any replay with the same key returns that\nstored response with `Idempotent-Replayed: true` and bills nothing. Reusing a key with a\ndifferent payload is a `409 idempotency_key_reuse`.\n","uniqueKey":"","typeLabel":"string"},"examples":{"uuid":{"value":"8b1f1c2e-9d3a-4a51-9f0c-1c9a2f6d7b44"}}},"975b344c-a993-4be4-8f78-dc15dead8bb4":{"name":"X-Carhub-Test-Scenario","in":"header","required":false,"description":"Steers the fixture backend. Ignored by live keys, `400 test_scenario_not_supported` if the\nscenario is unknown to the endpoint. Common catalogue:\n\n| Scenario | Effect |\n|---|---|\n| *(absent)* | Deterministic success — the endpoint's `default` fixture. |\n| `empty_result` | Success with nothing detected: empty lists, null readings. |\n| `low_confidence` | Success with every confidence below 0.5. |\n| `model_error` | Job settles `failed`; the reservation is released. |\n| `slow` | Completion after ~30 s — makes `wait=true` time out. |\n| `insufficient_credits` | `402` at admission, no job created. |\n\nSome endpoints add their own scenarios; unsupported common scenarios (for example\n`empty_result` on a generation endpoint) are rejected rather than silently ignored.\n","schema":{"type":"string","examples":["empty_result","low_confidence","model_error","slow","insufficient_credits"],"isRequired":false,"description":"Steers the fixture backend. Ignored by live keys, `400 test_scenario_not_supported` if the\nscenario is unknown to the endpoint. Common catalogue:\n\n| Scenario | Effect |\n|---|---|\n| *(absent)* | Deterministic success — the endpoint's `default` fixture. |\n| `empty_result` | Success with nothing detected: empty lists, null readings. |\n| `low_confidence` | Success with every confidence below 0.5. |\n| `model_error` | Job settles `failed`; the reservation is released. |\n| `slow` | Completion after ~30 s — makes `wait=true` time out. |\n| `insufficient_credits` | `402` at admission, no job created. |\n\nSome endpoints add their own scenarios; unsupported common scenarios (for example\n`empty_result` on a generation endpoint) are rejected rather than silently ignored.\n","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","additionalProperties":false,"required":["image","prompt"],"properties":{"image":{"type":"string","format":"binary","description":"One JPEG, PNG, or WebP image up to 20 MiB.","isRequired":true,"uniqueKey":"image","typeLabel":"file"},"prompt":{"type":"string","minLength":1,"maxLength":4000,"pattern":"\\S","x-multiline":true,"description":"Describe the final photograph you want. Only explicitly requested modifications should affect the vehicle.","examples":["Wash the car. Keep its current paint color, wheels, equipment, and background.","Change the paint color to metallic blue while preserving the wheels, trim, and vehicle condition.","Place the car in a modern outdoor dealership courtyard with coherent daylight and reflections."],"isRequired":true,"uniqueKey":"prompt","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"image":"\u003cstring>","prompt":"Wash the car. Keep its current paint color, wheels, equipment, and background."}}},"exampleType":"generated"},"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["input_ref","prompt"],"properties":{"input_ref":{"type":"string","description":"An available upload reference owned by your organization.","isRequired":true,"uniqueKey":"input_ref","typeLabel":"string"},"prompt":{"type":"string","minLength":1,"maxLength":4000,"pattern":"\\S","x-multiline":true,"description":"Describe the final photograph you want. Only explicitly requested modifications should affect the vehicle.","examples":["Wash the car. Keep its current paint color, wheels, equipment, and background.","Change the paint color to metallic blue while preserving the wheels, trim, and vehicle condition.","Place the car in a modern outdoor dealership courtyard with coherent daylight and reflections."],"isRequired":true,"uniqueKey":"prompt","typeLabel":"string"}},"uniqueKey":"","typeLabel":"object"},"example":{"input_ref":"upl_example","prompt":"Wash the car. Keep its current paint color, wheels, equipment, and background."},"examples":{"Example":{"title":"Example","value":{"input_ref":"upl_example","prompt":"Wash the car. Keep its current paint color, wheels, equipment, and background."}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"1c210e04-fb84-4bfd-bc3e-de525726559a":{"description":"Existing job returned by an idempotent replay.","content":{"application/json":{"schema":{"type":"object","title":"Job","description":"The unit of work of the API. Every inference call creates one, and every result is read\nback from one — synchronously through `wait=true`, or later through `GET /v1/jobs/{id}`\nor a webhook.\n\n`result` is populated only in `succeeded`, `error` only in `failed` / `expired`.\n","required":["id","object","endpoint","status","livemode","is_staging","created","started_at","completed_at","model_version","credits","result","error"],"properties":{"is_staging":{"type":"boolean","default":false,"description":"Staging classification. Requires live mode and uses the organisation's shared live credits.","isRequired":true,"uniqueKey":"is_staging","typeLabel":"boolean"},"id":{"type":"string","description":"Job identifier — `job_` followed by a base58 string.","pattern":"^job_[1-9A-HJ-NP-Za-km-z]{8,32}$","examples":["job_3ZxK9pQr7TnW"],"isRequired":true,"uniqueKey":"id","typeLabel":"string"},"object":{"type":"string","const":"job","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"endpoint":{"type":"string","description":"Dotted slug of a CarHub endpoint, the identifier used for jobs and usage.","enum":["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"],"isRequired":true,"uniqueKey":"endpoint","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Lifecycle of a job. `queued` → `processing` → one of `succeeded` | `partial` | `failed`; `expired`\nwhen it was never picked up in time, `canceled` when it was cancelled before starting.\nEvery state after `processing` is terminal.\n","enum":["queued","processing","succeeded","partial","failed","expired","canceled"],"isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"livemode":{"type":"boolean","description":"`false` when the job was created with a `chk_test_` key: fixture result, test credits.","isRequired":true,"uniqueKey":"livemode","typeLabel":"boolean"},"created":{"type":"integer","format":"int64","description":"Epoch seconds, UTC.","examples":[1755300000],"isRequired":true,"uniqueKey":"created","typeLabel":"integer\u003cint64>"},"started_at":{"oneOf":[{"type":"integer","description":"When the job left the queue. Null while `queued`.","format":"int64","example":1755300000,"isRequired":true,"uniqueKey":"started_at.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"When the job left the queue. Null while `queued`.","isRequired":true,"uniqueKey":"started_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"started_at","typeLabel":"integer\u003cint64> | null"},"completed_at":{"oneOf":[{"type":"integer","description":"When the job settled. Null until then.","format":"int64","example":1755300000,"isRequired":true,"uniqueKey":"completed_at.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"When the job settled. Null until then.","isRequired":true,"uniqueKey":"completed_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"completed_at","typeLabel":"integer\u003cint64> | null"},"model_version":{"oneOf":[{"type":"string","description":"Exact model build that produced the result, as `\u003cmodel>@\u003crelease date>`. Null until the job starts. Pin your regression tests to it.","examples":["plate-reader@2026-08-27"],"isRequired":true,"uniqueKey":"model_version.oneOf.0","typeLabel":"string"},{"type":"null","description":"Exact model build that produced the result, as `\u003cmodel>@\u003crelease date>`. Null until the job starts. Pin your regression tests to it.","examples":["plate-reader@2026-08-27"],"isRequired":true,"uniqueKey":"model_version.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"model_version","typeLabel":"string | null"},"credits":{"type":"object","description":"Credit accounting for the job. One thousand credits equal one USD. `reserved` is held at\nadmission and `charged` is the real cost after settlement; unused credits are released.\n","required":["reserved","charged"],"properties":{"reserved":{"type":"integer","minimum":0,"examples":[20],"isRequired":true,"uniqueKey":"credits.reserved","typeLabel":"integer"},"charged":{"oneOf":[{"type":"integer","minimum":0,"description":"Null while the job is unsettled.","examples":[20],"isRequired":true,"uniqueKey":"credits.charged.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"Null while the job is unsettled.","examples":[20],"isRequired":true,"uniqueKey":"credits.charged.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"credits.charged","typeLabel":"integer | null"}},"isRequired":true,"uniqueKey":"credits","typeLabel":"object"},"result":{"oneOf":[{"type":"object","description":"Endpoint-specific payload, null until the job succeeds. See each endpoint's `200` / `202` schema for its exact shape.","required":["image"],"properties":{"image":{"type":"object","title":"Rendered asset","description":"A file produced by a generation endpoint, served from a signed URL that expires. Download and re-host anything you intend to keep — the object is also subject to your organisation's storage TTL.","required":["url","expires_at","format","width","height","bytes"],"properties":{"url":{"type":"string","format":"uri","isRequired":true,"uniqueKey":"result.oneOf.0.image.url","typeLabel":"string\u003curi>"},"expires_at":{"type":"integer","format":"int64","description":"Epoch seconds, UTC.","examples":[1755300000],"isRequired":true,"uniqueKey":"result.oneOf.0.image.expires_at","typeLabel":"integer\u003cint64>"},"format":{"type":"string","enum":["png"],"isRequired":true,"uniqueKey":"result.oneOf.0.image.format","typeLabel":"enum\u003cstring>"},"width":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"result.oneOf.0.image.width","typeLabel":"integer"},"height":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"result.oneOf.0.image.height","typeLabel":"integer"},"bytes":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"result.oneOf.0.image.bytes","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"result.oneOf.0.image","typeLabel":"Rendered asset · object"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"result.oneOf.0","typeLabel":"object"},{"type":"null","description":"Endpoint-specific payload, null until the job succeeds. See each endpoint's `200` / `202` schema for its exact shape.","isRequired":true,"uniqueKey":"result.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result","typeLabel":"object | null"},"error":{"oneOf":[{"type":"object","description":"Populated when `status` is `failed` or `expired`, null otherwise.","required":["type","code","message"],"properties":{"type":{"type":"string","enum":["processing_error","invalid_request","internal"],"isRequired":true,"uniqueKey":"error.oneOf.0.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","examples":["model_inference_failed","unreadable_input","upstream_timeout","job_expired"],"isRequired":true,"uniqueKey":"error.oneOf.0.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.oneOf.0.message","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error.oneOf.0","typeLabel":"object"},{"type":"null","description":"Populated when `status` is `failed` or `expired`, null otherwise.","isRequired":true,"uniqueKey":"error.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error","typeLabel":"object | null"},"test_scenario":{"type":"string","description":"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.","examples":["low_confidence"],"uniqueKey":"test_scenario","typeLabel":"string"}},"uniqueKey":"","typeLabel":"Job · object"},"examples":{"Example":{"title":"Example","value":{"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":{"image":{"url":"\u003cstring>","expires_at":1755300000,"format":"png","width":2,"height":2,"bytes":2}},"error":{"type":"processing_error","code":"model_inference_failed","message":"\u003cstring>"},"test_scenario":"low_confidence"}}},"exampleType":"generated"}},"exampleType":"generated"},"71049316-d771-43e8-b7c7-d8098b163fb0":{"description":"Job accepted, 400 credits reserved, work queued.","headers":{"Request-Id":{"description":"Unique identifier of this request. Quote it in any support conversation.","schema":{"type":"string","examples":["req_2Kd8xQmPvL4T"]}},"Location":{"description":"Absolute URL of the created job.","schema":{"type":"string","format":"uri","examples":["https://api.trycarhub.com/v1/jobs/job_3ZxK9pQr7TnW"]}},"Idempotent-Replayed":{"description":"`true` when this response was replayed from a previous request carrying the same `Idempotency-Key`. Absent when the request was executed for real.","schema":{"type":"boolean"}}},"content":{"application/json":{"schema":{"type":"object","title":"Job","description":"The unit of work of the API. Every inference call creates one, and every result is read\nback from one — synchronously through `wait=true`, or later through `GET /v1/jobs/{id}`\nor a webhook.\n\n`result` is populated only in `succeeded`, `error` only in `failed` / `expired`.\n","required":["id","object","endpoint","status","livemode","is_staging","created","started_at","completed_at","model_version","credits","result","error"],"properties":{"is_staging":{"type":"boolean","default":false,"description":"Staging classification. Requires live mode and uses the organisation's shared live credits.","isRequired":true,"uniqueKey":"is_staging","typeLabel":"boolean"},"id":{"type":"string","description":"Job identifier — `job_` followed by a base58 string.","pattern":"^job_[1-9A-HJ-NP-Za-km-z]{8,32}$","examples":["job_3ZxK9pQr7TnW"],"isRequired":true,"uniqueKey":"id","typeLabel":"string"},"object":{"type":"string","const":"job","isRequired":true,"uniqueKey":"object","typeLabel":"string"},"endpoint":{"type":"string","description":"Dotted slug of a CarHub endpoint, the identifier used for jobs and usage.","enum":["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"],"isRequired":true,"uniqueKey":"endpoint","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Lifecycle of a job. `queued` → `processing` → one of `succeeded` | `partial` | `failed`; `expired`\nwhen it was never picked up in time, `canceled` when it was cancelled before starting.\nEvery state after `processing` is terminal.\n","enum":["queued","processing","succeeded","partial","failed","expired","canceled"],"isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"livemode":{"type":"boolean","description":"`false` when the job was created with a `chk_test_` key: fixture result, test credits.","isRequired":true,"uniqueKey":"livemode","typeLabel":"boolean"},"created":{"type":"integer","format":"int64","description":"Epoch seconds, UTC.","examples":[1755300000],"isRequired":true,"uniqueKey":"created","typeLabel":"integer\u003cint64>"},"started_at":{"oneOf":[{"type":"integer","description":"When the job left the queue. Null while `queued`.","format":"int64","example":1755300000,"isRequired":true,"uniqueKey":"started_at.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"When the job left the queue. Null while `queued`.","isRequired":true,"uniqueKey":"started_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"started_at","typeLabel":"integer\u003cint64> | null"},"completed_at":{"oneOf":[{"type":"integer","description":"When the job settled. Null until then.","format":"int64","example":1755300000,"isRequired":true,"uniqueKey":"completed_at.oneOf.0","typeLabel":"integer\u003cint64>"},{"type":"null","description":"When the job settled. Null until then.","isRequired":true,"uniqueKey":"completed_at.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"completed_at","typeLabel":"integer\u003cint64> | null"},"model_version":{"oneOf":[{"type":"string","description":"Exact model build that produced the result, as `\u003cmodel>@\u003crelease date>`. Null until the job starts. Pin your regression tests to it.","examples":["plate-reader@2026-08-27"],"isRequired":true,"uniqueKey":"model_version.oneOf.0","typeLabel":"string"},{"type":"null","description":"Exact model build that produced the result, as `\u003cmodel>@\u003crelease date>`. Null until the job starts. Pin your regression tests to it.","examples":["plate-reader@2026-08-27"],"isRequired":true,"uniqueKey":"model_version.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"model_version","typeLabel":"string | null"},"credits":{"type":"object","description":"Credit accounting for the job. One thousand credits equal one USD. `reserved` is held at\nadmission and `charged` is the real cost after settlement; unused credits are released.\n","required":["reserved","charged"],"properties":{"reserved":{"type":"integer","minimum":0,"examples":[20],"isRequired":true,"uniqueKey":"credits.reserved","typeLabel":"integer"},"charged":{"oneOf":[{"type":"integer","minimum":0,"description":"Null while the job is unsettled.","examples":[20],"isRequired":true,"uniqueKey":"credits.charged.oneOf.0","typeLabel":"integer"},{"type":"null","minimum":0,"description":"Null while the job is unsettled.","examples":[20],"isRequired":true,"uniqueKey":"credits.charged.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"credits.charged","typeLabel":"integer | null"}},"isRequired":true,"uniqueKey":"credits","typeLabel":"object"},"result":{"oneOf":[{"type":"object","description":"Endpoint-specific payload, null until the job succeeds. See each endpoint's `200` / `202` schema for its exact shape.","required":["image"],"properties":{"image":{"type":"object","title":"Rendered asset","description":"A file produced by a generation endpoint, served from a signed URL that expires. Download and re-host anything you intend to keep — the object is also subject to your organisation's storage TTL.","required":["url","expires_at","format","width","height","bytes"],"properties":{"url":{"type":"string","format":"uri","isRequired":true,"uniqueKey":"result.oneOf.0.image.url","typeLabel":"string\u003curi>"},"expires_at":{"type":"integer","format":"int64","description":"Epoch seconds, UTC.","examples":[1755300000],"isRequired":true,"uniqueKey":"result.oneOf.0.image.expires_at","typeLabel":"integer\u003cint64>"},"format":{"type":"string","enum":["png"],"isRequired":true,"uniqueKey":"result.oneOf.0.image.format","typeLabel":"enum\u003cstring>"},"width":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"result.oneOf.0.image.width","typeLabel":"integer"},"height":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"result.oneOf.0.image.height","typeLabel":"integer"},"bytes":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"result.oneOf.0.image.bytes","typeLabel":"integer"}},"isRequired":true,"uniqueKey":"result.oneOf.0.image","typeLabel":"Rendered asset · object"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"result.oneOf.0","typeLabel":"object"},{"type":"null","description":"Endpoint-specific payload, null until the job succeeds. See each endpoint's `200` / `202` schema for its exact shape.","isRequired":true,"uniqueKey":"result.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"result","typeLabel":"object | null"},"error":{"oneOf":[{"type":"object","description":"Populated when `status` is `failed` or `expired`, null otherwise.","required":["type","code","message"],"properties":{"type":{"type":"string","enum":["processing_error","invalid_request","internal"],"isRequired":true,"uniqueKey":"error.oneOf.0.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","examples":["model_inference_failed","unreadable_input","upstream_timeout","job_expired"],"isRequired":true,"uniqueKey":"error.oneOf.0.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.oneOf.0.message","typeLabel":"string"}},"isRequired":true,"uniqueKey":"error.oneOf.0","typeLabel":"object"},{"type":"null","description":"Populated when `status` is `failed` or `expired`, null otherwise.","isRequired":true,"uniqueKey":"error.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error","typeLabel":"object | null"},"test_scenario":{"type":"string","description":"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.","examples":["low_confidence"],"uniqueKey":"test_scenario","typeLabel":"string"}},"uniqueKey":"","typeLabel":"Job · object"},"examples":{"Example":{"title":"Example","value":{"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":{"image":{"url":"\u003cstring>","expires_at":1755300000,"format":"png","width":2,"height":2,"bytes":2}},"error":{"type":"processing_error","code":"model_inference_failed","message":"\u003cstring>"},"test_scenario":"low_confidence"}}},"exampleType":"generated"}},"exampleType":"generated"},"e9f7e828-543d-4750-ba41-3a6b2f9315d6":{"description":"Malformed or unusable request — bad JSON, missing or oversized file, unknown parameter,\n`wait=true` on an endpoint that does not support it.\n","headers":{"Request-Id":{"description":"Unique identifier of this request. Quote it in any support conversation.","schema":{"type":"string","examples":["req_2Kd8xQmPvL4T"]}}},"content":{"application/json":{"schema":{"type":"object","title":"Error response","description":"The single error envelope of the API. Every non-2xx response on every route group has exactly this shape.","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"object","required":["type","code","message","param","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad class of the failure — enough to branch on without matching codes.","enum":["invalid_request","authentication","permission","rate_limit","insufficient_credits","not_found","conflict","processing_error","internal"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable machine-readable identifier, narrower than `type`. New codes may appear; treat an unknown code as its `type`.","examples":["missing_input","invalid_api_key","rate_limit_exceeded"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"English, human-readable, safe to log. Never localised, never for end users.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"doc_url":{"type":"string","format":"uri","description":"Documentation page for this exact code.","examples":["https://docs.trycarhub.com/errors/missing_input"],"isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Identifier of the failing request, mirrored in the `Request-Id` header.","examples":["req_2Kd8xQmPvL4T"],"isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"quota_bytes":{"type":"integer","description":"Organisation storage limit for `storage_quota_exceeded`.","uniqueKey":"error.quota_bytes","typeLabel":"integer"},"stored_bytes":{"type":"integer","uniqueKey":"error.stored_bytes","typeLabel":"integer"},"reserved_bytes":{"type":"integer","uniqueKey":"error.reserved_bytes","typeLabel":"integer"},"available_bytes":{"type":"integer","uniqueKey":"error.available_bytes","typeLabel":"integer"},"requested_bytes":{"type":"integer","uniqueKey":"error.requested_bytes","typeLabel":"integer"},"oldest_deletable_ref":{"type":"string","uniqueKey":"error.oldest_deletable_ref","typeLabel":"string"},"oldest_deletable_at":{"type":"string","format":"date-time","uniqueKey":"error.oldest_deletable_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"Error response · object"},"examples":{"missingInput":{"title":"missingInput","value":{"error":{"type":"invalid_request","code":"missing_input","message":"Provide either a multipart `image` field or an `input_ref`.","param":"image","doc_url":"https://docs.trycarhub.com/errors/missing_input","request_id":"req_2Kd8xQmPvL4T"}}},"waitUnsupported":{"title":"waitUnsupported","value":{"error":{"type":"invalid_request","code":"wait_not_supported","message":"This endpoint is long-running; poll the job or use a webhook instead.","param":"wait","doc_url":"https://docs.trycarhub.com/errors/wait_not_supported","request_id":"req_2Kd8xQmPvL4T"}}}},"exampleType":"examples"}},"exampleType":"examples"},"c2228c92-ea10-42dd-9726-0845a707ecdb":{"description":"Missing, malformed, revoked or expired credential.","headers":{"Request-Id":{"description":"Unique identifier of this request. Quote it in any support conversation.","schema":{"type":"string","examples":["req_2Kd8xQmPvL4T"]}}},"content":{"application/json":{"schema":{"type":"object","title":"Error response","description":"The single error envelope of the API. Every non-2xx response on every route group has exactly this shape.","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"object","required":["type","code","message","param","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad class of the failure — enough to branch on without matching codes.","enum":["invalid_request","authentication","permission","rate_limit","insufficient_credits","not_found","conflict","processing_error","internal"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable machine-readable identifier, narrower than `type`. New codes may appear; treat an unknown code as its `type`.","examples":["missing_input","invalid_api_key","rate_limit_exceeded"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"English, human-readable, safe to log. Never localised, never for end users.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"doc_url":{"type":"string","format":"uri","description":"Documentation page for this exact code.","examples":["https://docs.trycarhub.com/errors/missing_input"],"isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Identifier of the failing request, mirrored in the `Request-Id` header.","examples":["req_2Kd8xQmPvL4T"],"isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"quota_bytes":{"type":"integer","description":"Organisation storage limit for `storage_quota_exceeded`.","uniqueKey":"error.quota_bytes","typeLabel":"integer"},"stored_bytes":{"type":"integer","uniqueKey":"error.stored_bytes","typeLabel":"integer"},"reserved_bytes":{"type":"integer","uniqueKey":"error.reserved_bytes","typeLabel":"integer"},"available_bytes":{"type":"integer","uniqueKey":"error.available_bytes","typeLabel":"integer"},"requested_bytes":{"type":"integer","uniqueKey":"error.requested_bytes","typeLabel":"integer"},"oldest_deletable_ref":{"type":"string","uniqueKey":"error.oldest_deletable_ref","typeLabel":"string"},"oldest_deletable_at":{"type":"string","format":"date-time","uniqueKey":"error.oldest_deletable_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"Error response · object"},"examples":{"invalidKey":{"title":"invalidKey","value":{"error":{"type":"authentication","code":"invalid_api_key","message":"The provided API key is invalid or has been revoked.","param":null,"doc_url":"https://docs.trycarhub.com/errors/invalid_api_key","request_id":"req_2Kd8xQmPvL4T"}}}},"exampleType":"examples"}},"exampleType":"examples"},"e6992e8f-6001-4c6c-bce4-a861b525eb7f":{"description":"The organisation's balance cannot cover the reservation for this call. Nothing was\nqueued and nothing was charged. Top up with `POST /mgmt/v1/billing/checkout` — or, in\ntest mode, `POST /mgmt/v1/billing/test-credits`.\n","headers":{"Request-Id":{"description":"Unique identifier of this request. Quote it in any support conversation.","schema":{"type":"string","examples":["req_2Kd8xQmPvL4T"]}}},"content":{"application/json":{"schema":{"type":"object","title":"Error response","description":"The single error envelope of the API. Every non-2xx response on every route group has exactly this shape.","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"object","required":["type","code","message","param","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad class of the failure — enough to branch on without matching codes.","enum":["invalid_request","authentication","permission","rate_limit","insufficient_credits","not_found","conflict","processing_error","internal"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable machine-readable identifier, narrower than `type`. New codes may appear; treat an unknown code as its `type`.","examples":["missing_input","invalid_api_key","rate_limit_exceeded"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"English, human-readable, safe to log. Never localised, never for end users.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"doc_url":{"type":"string","format":"uri","description":"Documentation page for this exact code.","examples":["https://docs.trycarhub.com/errors/missing_input"],"isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Identifier of the failing request, mirrored in the `Request-Id` header.","examples":["req_2Kd8xQmPvL4T"],"isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"quota_bytes":{"type":"integer","description":"Organisation storage limit for `storage_quota_exceeded`.","uniqueKey":"error.quota_bytes","typeLabel":"integer"},"stored_bytes":{"type":"integer","uniqueKey":"error.stored_bytes","typeLabel":"integer"},"reserved_bytes":{"type":"integer","uniqueKey":"error.reserved_bytes","typeLabel":"integer"},"available_bytes":{"type":"integer","uniqueKey":"error.available_bytes","typeLabel":"integer"},"requested_bytes":{"type":"integer","uniqueKey":"error.requested_bytes","typeLabel":"integer"},"oldest_deletable_ref":{"type":"string","uniqueKey":"error.oldest_deletable_ref","typeLabel":"string"},"oldest_deletable_at":{"type":"string","format":"date-time","uniqueKey":"error.oldest_deletable_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"Error response · object"},"examples":{"emptyCreditBalances":{"title":"emptyCreditBalances","value":{"error":{"type":"insufficient_credits","code":"insufficient_credits","message":"Credit balance is 3 credits; this call reserves 8.","param":null,"doc_url":"https://docs.trycarhub.com/errors/insufficient_credits","request_id":"req_2Kd8xQmPvL4T"}}}},"exampleType":"examples"}},"exampleType":"examples"},"ce1fe576-9915-4832-98b9-3a8406a3a7ab":{"description":"Authenticated but not allowed: key scope excludes this endpoint family, role too low for a management route, or the resource belongs to another organisation.","headers":{"Request-Id":{"description":"Unique identifier of this request. Quote it in any support conversation.","schema":{"type":"string","examples":["req_2Kd8xQmPvL4T"]}}},"content":{"application/json":{"schema":{"type":"object","title":"Error response","description":"The single error envelope of the API. Every non-2xx response on every route group has exactly this shape.","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"object","required":["type","code","message","param","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad class of the failure — enough to branch on without matching codes.","enum":["invalid_request","authentication","permission","rate_limit","insufficient_credits","not_found","conflict","processing_error","internal"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable machine-readable identifier, narrower than `type`. New codes may appear; treat an unknown code as its `type`.","examples":["missing_input","invalid_api_key","rate_limit_exceeded"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"English, human-readable, safe to log. Never localised, never for end users.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"doc_url":{"type":"string","format":"uri","description":"Documentation page for this exact code.","examples":["https://docs.trycarhub.com/errors/missing_input"],"isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Identifier of the failing request, mirrored in the `Request-Id` header.","examples":["req_2Kd8xQmPvL4T"],"isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"quota_bytes":{"type":"integer","description":"Organisation storage limit for `storage_quota_exceeded`.","uniqueKey":"error.quota_bytes","typeLabel":"integer"},"stored_bytes":{"type":"integer","uniqueKey":"error.stored_bytes","typeLabel":"integer"},"reserved_bytes":{"type":"integer","uniqueKey":"error.reserved_bytes","typeLabel":"integer"},"available_bytes":{"type":"integer","uniqueKey":"error.available_bytes","typeLabel":"integer"},"requested_bytes":{"type":"integer","uniqueKey":"error.requested_bytes","typeLabel":"integer"},"oldest_deletable_ref":{"type":"string","uniqueKey":"error.oldest_deletable_ref","typeLabel":"string"},"oldest_deletable_at":{"type":"string","format":"date-time","uniqueKey":"error.oldest_deletable_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"Error response · object"},"examples":{"outOfScope":{"title":"outOfScope","value":{"error":{"type":"permission","code":"scope_not_granted","message":"This API key is not scoped for the `render` endpoint family.","param":null,"doc_url":"https://docs.trycarhub.com/errors/scope_not_granted","request_id":"req_2Kd8xQmPvL4T"}}}},"exampleType":"examples"}},"exampleType":"examples"},"69ad5438-6708-48ec-bcfd-f315ae506672":{"description":"No such resource, or it is not visible to this credential.","headers":{"Request-Id":{"description":"Unique identifier of this request. Quote it in any support conversation.","schema":{"type":"string","examples":["req_2Kd8xQmPvL4T"]}}},"content":{"application/json":{"schema":{"type":"object","title":"Error response","description":"The single error envelope of the API. Every non-2xx response on every route group has exactly this shape.","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"object","required":["type","code","message","param","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad class of the failure — enough to branch on without matching codes.","enum":["invalid_request","authentication","permission","rate_limit","insufficient_credits","not_found","conflict","processing_error","internal"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable machine-readable identifier, narrower than `type`. New codes may appear; treat an unknown code as its `type`.","examples":["missing_input","invalid_api_key","rate_limit_exceeded"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"English, human-readable, safe to log. Never localised, never for end users.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"doc_url":{"type":"string","format":"uri","description":"Documentation page for this exact code.","examples":["https://docs.trycarhub.com/errors/missing_input"],"isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Identifier of the failing request, mirrored in the `Request-Id` header.","examples":["req_2Kd8xQmPvL4T"],"isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"quota_bytes":{"type":"integer","description":"Organisation storage limit for `storage_quota_exceeded`.","uniqueKey":"error.quota_bytes","typeLabel":"integer"},"stored_bytes":{"type":"integer","uniqueKey":"error.stored_bytes","typeLabel":"integer"},"reserved_bytes":{"type":"integer","uniqueKey":"error.reserved_bytes","typeLabel":"integer"},"available_bytes":{"type":"integer","uniqueKey":"error.available_bytes","typeLabel":"integer"},"requested_bytes":{"type":"integer","uniqueKey":"error.requested_bytes","typeLabel":"integer"},"oldest_deletable_ref":{"type":"string","uniqueKey":"error.oldest_deletable_ref","typeLabel":"string"},"oldest_deletable_at":{"type":"string","format":"date-time","uniqueKey":"error.oldest_deletable_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"Error response · object"},"examples":{"unknownJob":{"title":"unknownJob","value":{"error":{"type":"not_found","code":"job_not_found","message":"No job with id `job_3ZxK9pQr7TnW`.","param":"id","doc_url":"https://docs.trycarhub.com/errors/job_not_found","request_id":"req_2Kd8xQmPvL4T"}}}},"exampleType":"examples"}},"exampleType":"examples"},"fe9a14ec-3d73-4626-8191-e2a06fa629fc":{"description":"The request contradicts the current state — an idempotency key replayed with a different body, or an input storage reservation that exceeds the organisation quota.","headers":{"Request-Id":{"description":"Unique identifier of this request. Quote it in any support conversation.","schema":{"type":"string","examples":["req_2Kd8xQmPvL4T"]}}},"content":{"application/json":{"schema":{"type":"object","title":"Error response","description":"The single error envelope of the API. Every non-2xx response on every route group has exactly this shape.","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"object","required":["type","code","message","param","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad class of the failure — enough to branch on without matching codes.","enum":["invalid_request","authentication","permission","rate_limit","insufficient_credits","not_found","conflict","processing_error","internal"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable machine-readable identifier, narrower than `type`. New codes may appear; treat an unknown code as its `type`.","examples":["missing_input","invalid_api_key","rate_limit_exceeded"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"English, human-readable, safe to log. Never localised, never for end users.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"doc_url":{"type":"string","format":"uri","description":"Documentation page for this exact code.","examples":["https://docs.trycarhub.com/errors/missing_input"],"isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Identifier of the failing request, mirrored in the `Request-Id` header.","examples":["req_2Kd8xQmPvL4T"],"isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"quota_bytes":{"type":"integer","description":"Organisation storage limit for `storage_quota_exceeded`.","uniqueKey":"error.quota_bytes","typeLabel":"integer"},"stored_bytes":{"type":"integer","uniqueKey":"error.stored_bytes","typeLabel":"integer"},"reserved_bytes":{"type":"integer","uniqueKey":"error.reserved_bytes","typeLabel":"integer"},"available_bytes":{"type":"integer","uniqueKey":"error.available_bytes","typeLabel":"integer"},"requested_bytes":{"type":"integer","uniqueKey":"error.requested_bytes","typeLabel":"integer"},"oldest_deletable_ref":{"type":"string","uniqueKey":"error.oldest_deletable_ref","typeLabel":"string"},"oldest_deletable_at":{"type":"string","format":"date-time","uniqueKey":"error.oldest_deletable_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"Error response · object"},"examples":{"idempotencyReuse":{"title":"idempotencyReuse","value":{"error":{"type":"conflict","code":"idempotency_key_reuse","message":"This Idempotency-Key was already used with a different request body.","param":"Idempotency-Key","doc_url":"https://docs.trycarhub.com/errors/idempotency_key_reuse","request_id":"req_2Kd8xQmPvL4T"}}}},"exampleType":"examples"}},"exampleType":"examples"},"dc89fd93-cfe3-43e9-b798-f36de71ecdf7":{"description":"Too many requests for this endpoint and plan. Back off and retry.","headers":{"Request-Id":{"description":"Unique identifier of this request. Quote it in any support conversation.","schema":{"type":"string","examples":["req_2Kd8xQmPvL4T"]}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":0,"examples":[12]}},"RateLimit-Limit":{"description":"Requests allowed in the current window for this endpoint and plan.","schema":{"type":"integer","examples":[120]}},"RateLimit-Remaining":{"description":"Requests left in the current window.","schema":{"type":"integer","examples":[0]}},"RateLimit-Reset":{"description":"Epoch second at which the current window resets.","schema":{"type":"integer","examples":[1755300060]}}},"content":{"application/json":{"schema":{"type":"object","title":"Error response","description":"The single error envelope of the API. Every non-2xx response on every route group has exactly this shape.","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"object","required":["type","code","message","param","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad class of the failure — enough to branch on without matching codes.","enum":["invalid_request","authentication","permission","rate_limit","insufficient_credits","not_found","conflict","processing_error","internal"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable machine-readable identifier, narrower than `type`. New codes may appear; treat an unknown code as its `type`.","examples":["missing_input","invalid_api_key","rate_limit_exceeded"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"English, human-readable, safe to log. Never localised, never for end users.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"doc_url":{"type":"string","format":"uri","description":"Documentation page for this exact code.","examples":["https://docs.trycarhub.com/errors/missing_input"],"isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Identifier of the failing request, mirrored in the `Request-Id` header.","examples":["req_2Kd8xQmPvL4T"],"isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"quota_bytes":{"type":"integer","description":"Organisation storage limit for `storage_quota_exceeded`.","uniqueKey":"error.quota_bytes","typeLabel":"integer"},"stored_bytes":{"type":"integer","uniqueKey":"error.stored_bytes","typeLabel":"integer"},"reserved_bytes":{"type":"integer","uniqueKey":"error.reserved_bytes","typeLabel":"integer"},"available_bytes":{"type":"integer","uniqueKey":"error.available_bytes","typeLabel":"integer"},"requested_bytes":{"type":"integer","uniqueKey":"error.requested_bytes","typeLabel":"integer"},"oldest_deletable_ref":{"type":"string","uniqueKey":"error.oldest_deletable_ref","typeLabel":"string"},"oldest_deletable_at":{"type":"string","format":"date-time","uniqueKey":"error.oldest_deletable_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"Error response · object"},"examples":{"tooFast":{"title":"tooFast","value":{"error":{"type":"rate_limit","code":"rate_limit_exceeded","message":"Rate limit of 120 requests per minute exceeded for `plate.read`.","param":null,"doc_url":"https://docs.trycarhub.com/errors/rate_limit_exceeded","request_id":"req_2Kd8xQmPvL4T"}}}},"exampleType":"examples"}},"exampleType":"examples"},"740e0bc9-3ff9-43b4-934f-1d150bd94fa9":{"description":"Something broke on our side. The request was not billed. Retry with the same `Idempotency-Key`; if it persists, quote `request_id`.","headers":{"Request-Id":{"description":"Unique identifier of this request. Quote it in any support conversation.","schema":{"type":"string","examples":["req_2Kd8xQmPvL4T"]}}},"content":{"application/json":{"schema":{"type":"object","title":"Error response","description":"The single error envelope of the API. Every non-2xx response on every route group has exactly this shape.","required":["error"],"additionalProperties":false,"properties":{"error":{"type":"object","required":["type","code","message","param","doc_url","request_id"],"properties":{"type":{"type":"string","description":"Broad class of the failure — enough to branch on without matching codes.","enum":["invalid_request","authentication","permission","rate_limit","insufficient_credits","not_found","conflict","processing_error","internal"],"isRequired":true,"uniqueKey":"error.type","typeLabel":"enum\u003cstring>"},"code":{"type":"string","description":"Stable machine-readable identifier, narrower than `type`. New codes may appear; treat an unknown code as its `type`.","examples":["missing_input","invalid_api_key","rate_limit_exceeded"],"isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"English, human-readable, safe to log. Never localised, never for end users.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"param":{"oneOf":[{"type":"string","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.0","typeLabel":"string"},{"type":"null","description":"The offending field or header, when the failure can be attributed to one.","isRequired":true,"uniqueKey":"error.param.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"error.param","typeLabel":"string | null"},"doc_url":{"type":"string","format":"uri","description":"Documentation page for this exact code.","examples":["https://docs.trycarhub.com/errors/missing_input"],"isRequired":true,"uniqueKey":"error.doc_url","typeLabel":"string\u003curi>"},"request_id":{"type":"string","description":"Identifier of the failing request, mirrored in the `Request-Id` header.","examples":["req_2Kd8xQmPvL4T"],"isRequired":true,"uniqueKey":"error.request_id","typeLabel":"string"},"quota_bytes":{"type":"integer","description":"Organisation storage limit for `storage_quota_exceeded`.","uniqueKey":"error.quota_bytes","typeLabel":"integer"},"stored_bytes":{"type":"integer","uniqueKey":"error.stored_bytes","typeLabel":"integer"},"reserved_bytes":{"type":"integer","uniqueKey":"error.reserved_bytes","typeLabel":"integer"},"available_bytes":{"type":"integer","uniqueKey":"error.available_bytes","typeLabel":"integer"},"requested_bytes":{"type":"integer","uniqueKey":"error.requested_bytes","typeLabel":"integer"},"oldest_deletable_ref":{"type":"string","uniqueKey":"error.oldest_deletable_ref","typeLabel":"string"},"oldest_deletable_at":{"type":"string","format":"date-time","uniqueKey":"error.oldest_deletable_at","typeLabel":"string\u003cdate-time>"}},"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"uniqueKey":"","typeLabel":"Error response · object"},"examples":{"internal":{"title":"internal","value":{"error":{"type":"internal","code":"internal_error","message":"An unexpected error occurred.","param":null,"doc_url":"https://docs.trycarhub.com/errors/internal_error","request_id":"req_2Kd8xQmPvL4T"}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"eaf03e77-949d-429d-99ec-98ad08844cb8":{"ApiKeyAuth":{"type":"http","scheme":"bearer","bearerFormat":"CarHub API key","description":"Organisation API key, sent as `Authorization: Bearer chk_live_…`.\n\n* `chk_live_…` — production inference, live credits, `livemode: true`, `is_staging: false`.\n* `chk_stg_…` — real inference classified as staging, the same live credits, `livemode: true`, `is_staging: true`.\n* `chk_test_…` — identical pipeline against the fixture backend, test credits,\n `livemode: false`.\n\nKeys are stored hashed; only the prefix (`chk_live_a1b2…`) is ever displayed again. A key\nmay be scoped to a subset of endpoint families — calling outside its scopes is a `403`.\n","scopes":[],"schemeName":"ApiKeyAuth"}}},"servers":{"9708d856-6fe0-4a7c-a4e4-f8c34bef999b":{"url":"https://api.trycarhub.com","description":"Production (EU)"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","bearerFormat":"CarHub API key","description":"Organisation API key, sent as `Authorization: Bearer chk_live_…`.\n\n* `chk_live_…` — production inference, live credits, `livemode: true`, `is_staging: false`.\n* `chk_stg_…` — real inference classified as staging, the same live credits, `livemode: true`, `is_staging: true`.\n* `chk_test_…` — identical pipeline against the fixture backend, test credits,\n `livemode: false`.\n\nKeys are stored hashed; only the prefix (`chk_live_a1b2…`) is ever displayed again. A key\nmay be scoped to a subset of endpoint families — calling outside its scopes is a `403`.\n","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Organisation API key, sent as `Authorization: Bearer chk_live_…`.\n\n* `chk_live_…` — production inference, live credits, `livemode: true`, `is_staging: false`.\n* `chk_stg_…` — real inference classified as staging, the same live credits, `livemode: true`, `is_staging: true`.\n* `chk_test_…` — identical pipeline against the fixture backend, test credits,\n `livemode: false`.\n\nKeys are stored hashed; only the prefix (`chk_live_a1b2…`) is ever displayed again. A key\nmay be scoped to a subset of endpoint families — calling outside its scopes is a `403`.\n","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"ApiKeyAuth","name":"Authorization"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"openapi.yaml"},"subdomain":"carhub","siteName":"CarHub Documentation","title":"Image Customizer - CarHub Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-27T18:13:03.241Z","originalFileLocation":"api-reference/e-—-image-production/image-customizer.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Customize one vehicle photograph from your prompt for a marketing publication. Invite-only beta: beta access is required for both live and test keys, including the Playground. Accepts exactly one JPEG, PNG, or WebP image up to 20 MiB and 40 megapixels. Produces one 1K PNG with Nano Banana 2.1 (gemini-nano-banana-2.1) on Vertex AI, without external search. A prompt such as \u0026quot;Wash the car\u0026quot; produces a clean car, without a washing scene. Explicit modifications are allowed; unaffected vehicle details and source orientation are preserved as closely as possible. Visual fidelity must be evaluated on the generated result. Reserves 400 credits and charges 400 credits only for a successful image. Refusals and invalid image responses fail without a charge. Poll the returned job or use a webhook. Jobs expire after 300 seconds. Result URLs expire after 15 minutes by default, as indicated by result.image.expires_at; polling does not renew them. Download the image before expiration. Test keys return a deterministic fixture and never call Vertex AI. Batch inputs, unknown parameters, and conversation history are not accepted.\">\u003cmeta data-mint-head name=\"application-name\" content=\"CarHub Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/carhub/j8ptl7lKO7Unj0yz/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/carhub/j8ptl7lKO7Unj0yz/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/carhub/j8ptl7lKO7Unj0yz/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/carhub/j8ptl7lKO7Unj0yz/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/carhub/j8ptl7lKO7Unj0yz/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/carhub/j8ptl7lKO7Unj0yz/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/carhub/j8ptl7lKO7Unj0yz/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/carhub/j8ptl7lKO7Unj0yz/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/carhub/j8ptl7lKO7Unj0yz/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Image Customizer - CarHub Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Customize one vehicle photograph from your prompt for a marketing publication. Invite-only beta: beta access is required for both live and test keys, including the Playground. Accepts exactly one JPEG, PNG, or WebP image up to 20 MiB and 40 megapixels. Produces one 1K PNG with Nano Banana 2.1 (gemini-nano-banana-2.1) on Vertex AI, without external search. A prompt such as \u0026quot;Wash the car\u0026quot; produces a clean car, without a washing scene. Explicit modifications are allowed; unaffected vehicle details and source orientation are preserved as closely as possible. Visual fidelity must be evaluated on the generated result. Reserves 400 credits and charges 400 credits only for a successful image. Refusals and invalid image responses fail without a charge. Poll the returned job or use a webhook. Jobs expire after 300 seconds. Result URLs expire after 15 minutes by default, as indicated by result.image.expires_at; polling does not renew them. Download the image before expiration. Test keys return a deterministic fixture and never call Vertex AI. Batch inputs, unknown parameters, and conversation history are not accepted.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"CarHub Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.trycarhub.com/api-reference/e-—-image-production/image-customizer\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://carhub.mintlify.app/_mintlify/api/og/v2?division=E+%E2%80%94+Image+production\u0026amp;title=Image+Customizer\u0026amp;description=Customize+one+vehicle+photograph+from+your+prompt+for+a+marketing+publication.%0AInvite-only+beta%3A+beta+access+is+required+for+both+live+and+test+keys%2C+including+\u0026amp;theme=2969cd0aa47105f7519ede16\u0026amp;signature=5428a6940087da1b2828dbd714c1613006c4da4bffc377cd4e0d23187e266f94\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Image Customizer - CarHub Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Customize one vehicle photograph from your prompt for a marketing publication. Invite-only beta: beta access is required for both live and test keys, including the Playground. Accepts exactly one JPEG, PNG, or WebP image up to 20 MiB and 40 megapixels. Produces one 1K PNG with Nano Banana 2.1 (gemini-nano-banana-2.1) on Vertex AI, without external search. A prompt such as \u0026quot;Wash the car\u0026quot; produces a clean car, without a washing scene. Explicit modifications are allowed; unaffected vehicle details and source orientation are preserved as closely as possible. Visual fidelity must be evaluated on the generated result. Reserves 400 credits and charges 400 credits only for a successful image. Refusals and invalid image responses fail without a charge. Poll the returned job or use a webhook. Jobs expire after 300 seconds. Result URLs expire after 15 minutes by default, as indicated by result.image.expires_at; polling does not renew them. Download the image before expiration. Test keys return a deterministic fixture and never call Vertex AI. Batch inputs, unknown parameters, and conversation history are not accepted.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://carhub.mintlify.app/_mintlify/api/og/v2?division=E+%E2%80%94+Image+production\u0026amp;title=Image+Customizer\u0026amp;description=Customize+one+vehicle+photograph+from+your+prompt+for+a+marketing+publication.%0AInvite-only+beta%3A+beta+access+is+required+for+both+live+and+test+keys%2C+including+\u0026amp;theme=2969cd0aa47105f7519ede16\u0026amp;signature=5428a6940087da1b2828dbd714c1613006c4da4bffc377cd4e0d23187e266f94\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/carhub/j8ptl7lKO7Unj0yz/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"CarHub Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#00D178\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.trycarhub.com/api-reference/e-—-image-production/image-customizer\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/e-%E2%80%94-image-production/image-customizer.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.trycarhub.com/#organization\",\"name\":\"CarHub Documentation\",\"url\":\"https://docs.trycarhub.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/carhub/QGtnYbiXqdelnLLP/logo/light.svg?fit=max\u0026auto=format\u0026n=QGtnYbiXqdelnLLP\u0026q=85\u0026s=30a659d8433638ab4c9a5e34224c530f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.trycarhub.com#website\",\"name\":\"CarHub Documentation\",\"url\":\"https://docs.trycarhub.com\",\"publisher\":{\"@id\":\"https://docs.trycarhub.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.trycarhub.com/api-reference/e-%E2%80%94-image-production/image-customizer#webpage\",\"url\":\"https://docs.trycarhub.com/api-reference/e-%E2%80%94-image-production/image-customizer\",\"name\":\"Image Customizer\",\"description\":\"Customize one vehicle photograph from your prompt for a marketing publication. Invite-only beta: beta access is required for both live and test keys, including the Playground. Accepts exactly one JPEG, PNG, or WebP image up to 20 MiB and 40 megapixels. Produces one 1K PNG with Nano Banana 2.1 (gemini-nano-banana-2.1) on Vertex AI, without external search. A prompt such as \\\"Wash the car\\\" produces a clean car, without a washing scene. Explicit modifications are allowed; unaffected vehicle details and source orientation are preserved as closely as possible. Visual fidelity must be evaluated on the generated result. Reserves 400 credits and charges 400 credits only for a successful image. Refusals and invalid image responses fail without a charge. Poll the returned job or use a webhook. Jobs expire after 300 seconds. Result URLs expire after 15 minutes by default, as indicated by result.image.expires_at; polling does not renew them. Download the image before expiration. Test keys return a deterministic fixture and never call Vertex AI. Batch inputs, unknown parameters, and conversation history are not accepted.\",\"dateModified\":\"2026-10-27T18:13:03.241Z\",\"isPartOf\":{\"@id\":\"https://docs.trycarhub.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.trycarhub.com/api-reference/e-%E2%80%94-image-production/image-customizer#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.trycarhub.com/api-reference/e-%E2%80%94-image-production/image-customizer#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API reference\",\"item\":\"https://docs.trycarhub.com/api-reference/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"E — Image production\",\"item\":\"https://docs.trycarhub.com/api-reference/e-%E2%80%94-image-production/image-backgrounding\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Image Customizer\",\"item\":\"https://docs.trycarhub.com/api-reference/e-%E2%80%94-image-production/image-customizer\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.trycarhub.com/api-reference/e-%E2%80%94-image-production/image-customizer#apireference\",\"headline\":\"Image Customizer\",\"name\":\"Image Customizer\",\"description\":\"Customize one vehicle photograph from your prompt for a marketing publication. Invite-only beta: beta access is required for both live and test keys, including the Playground. Accepts exactly one JPEG, PNG, or WebP image up to 20 MiB and 40 megapixels. Produces one 1K PNG with Nano Banana 2.1 (gemini-nano-banana-2.1) on Vertex AI, without external search. A prompt such as \\\"Wash the car\\\" produces a clean car, without a washing scene. Explicit modifications are allowed; unaffected vehicle details and source orientation are preserved as closely as possible. Visual fidelity must be evaluated on the generated result. Reserves 400 credits and charges 400 credits only for a successful image. Refusals and invalid image responses fail without a charge. Poll the returned job or use a webhook. Jobs expire after 300 seconds. Result URLs expire after 15 minutes by default, as indicated by result.image.expires_at; polling does not renew them. Download the image before expiration. Test keys return a deterministic fixture and never call Vertex AI. Batch inputs, unknown parameters, and conversation history are not accepted.\",\"url\":\"https://docs.trycarhub.com/api-reference/e-%E2%80%94-image-production/image-customizer\",\"mainEntityOfPage\":{\"@id\":\"https://docs.trycarhub.com/api-reference/e-%E2%80%94-image-production/image-customizer#webpage\"},\"dateModified\":\"2026-10-27T18:13:03.241Z\",\"publisher\":{\"@id\":\"https://docs.trycarhub.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.trycarhub.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"CarHub Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"CarHub Documentation","nav":{"global":null,"pages":[{"group":"Get started","pages":[{"title":"CarHub developer documentation","href":"/index"},{"title":"Quickstart","href":"/quickstart"},{"title":"Authentication","href":"/authentication"},{"title":"Test mode","href":"/guides/test-mode"},{"title":"Use staging","href":"/guides/staging"},{"title":"Go-live checklist","href":"/guides/go-live"},{"title":"Credits and monthly plans","href":"/guides/credits-and-plans"}]},{"group":"Build your integration","pages":[{"title":"SDK licences and permissions","href":"/guides/sdk-licenses"},{"title":"Submit and retrieve jobs","href":"/guides/jobs"},{"title":"Detect exterior damage","href":"/guides/damage-detect"},{"title":"Customize vehicle photos","href":"/guides/customize-images"},{"title":"Generate a 360 spin","href":"/guides/spin-360"},{"title":"Upload media","href":"/guides/uploads"},{"title":"Permanent assets","href":"/guides/assets"},{"title":"Receive webhooks","href":"/guides/webhooks"},{"title":"Use CarHub through MCP","href":"/guides/mcp"}]},{"group":"API reference","pages":[{"title":"API overview","href":"/api-reference/overview"},{"title":"Errors and retries","href":"/api-reference/errors"},{"group":"Assets","pages":[{"title":"List permanent organization assets","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/assets","href":"/api-reference/assets/list-permanent-organization-assets"},{"title":"Upload a permanent organization asset","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/assets","href":"/api-reference/assets/upload-a-permanent-organization-asset"},{"title":"Retrieve an organization asset","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/assets/{id}","href":"/api-reference/assets/retrieve-an-organization-asset"},{"title":"Delete a permanent organization asset","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /v1/assets/{id}","href":"/api-reference/assets/delete-a-permanent-organization-asset"}]},{"group":"Management","pages":[{"title":"List permanent assets for the active organization","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/assets","href":"/api-reference/management/list-permanent-assets-for-the-active-organization"},{"title":"Upload permanent artwork or a Studio background package","deprecated":null,"version":null,"openapi":"/openapi.yaml post /mgmt/v1/assets","href":"/api-reference/management/upload-permanent-artwork-or-a-studio-background-package"},{"title":"Retrieve a permanent organization asset","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/assets/{id}","href":"/api-reference/management/retrieve-a-permanent-organization-asset"},{"title":"Request deletion of a permanent organization asset","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /mgmt/v1/assets/{id}","href":"/api-reference/management/request-deletion-of-a-permanent-organization-asset"},{"title":"Retrieve the active organisation","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/org","href":"/api-reference/management/retrieve-the-active-organisation"},{"title":"List input storage (admin or owner)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/uploads","href":"/api-reference/management/list-input-storage-admin-or-owner"},{"title":"Read shared input and asset storage usage (admin or owner)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/uploads/usage","href":"/api-reference/management/read-shared-input-and-asset-storage-usage-admin-or-owner"},{"title":"Preview or delete organization inputs (admin or owner)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /mgmt/v1/uploads/deletions","href":"/api-reference/management/preview-or-delete-organization-inputs-admin-or-owner"},{"title":"Follow an input deletion (admin or owner)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/uploads/deletions/{id}","href":"/api-reference/management/follow-an-input-deletion-admin-or-owner"},{"title":"List API keys","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/api-keys","href":"/api-reference/management/list-api-keys"},{"title":"Create an API key","deprecated":null,"version":null,"openapi":"/openapi.yaml post /mgmt/v1/api-keys","href":"/api-reference/management/create-an-api-key"},{"title":"Revoke an API key","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /mgmt/v1/api-keys/{id}","href":"/api-reference/management/revoke-an-api-key"},{"title":"Update API key scopes","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /mgmt/v1/api-keys/{id}","href":"/api-reference/management/update-api-key-scopes"},{"title":"Rotate an API key","deprecated":null,"version":null,"openapi":"/openapi.yaml post /mgmt/v1/api-keys/{id}/rotate","href":"/api-reference/management/rotate-an-api-key"},{"title":"Usage aggregates","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/usage","href":"/api-reference/management/usage-aggregates"},{"title":"Job history of the organisation","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/jobs","href":"/api-reference/management/job-history-of-the-organisation"},{"title":"Retrieve a job (dashboard)","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/jobs/{id}","href":"/api-reference/management/retrieve-a-job-dashboard"},{"title":"Credit ledger entries","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/billing/ledger","href":"/api-reference/management/credit-ledger-entries"},{"title":"Create a Stripe Checkout session","deprecated":null,"version":null,"openapi":"/openapi.yaml post /mgmt/v1/billing/checkout","href":"/api-reference/management/create-a-stripe-checkout-session"},{"title":"Create a Stripe Customer Portal session","deprecated":null,"version":null,"openapi":"/openapi.yaml post /mgmt/v1/billing/portal","href":"/api-reference/management/create-a-stripe-customer-portal-session"},{"title":"Top up the test credit balance","deprecated":null,"version":null,"openapi":"/openapi.yaml post /mgmt/v1/billing/test-credits","href":"/api-reference/management/top-up-the-test-credit-balance"},{"title":"List webhook endpoints","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/webhook-endpoints","href":"/api-reference/management/list-webhook-endpoints"},{"title":"Create a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi.yaml post /mgmt/v1/webhook-endpoints","href":"/api-reference/management/create-a-webhook-endpoint"},{"title":"Delete a webhook endpoint","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /mgmt/v1/webhook-endpoints/{id}","href":"/api-reference/management/delete-a-webhook-endpoint"},{"title":"Send a test event","deprecated":null,"version":null,"openapi":"/openapi.yaml post /mgmt/v1/webhook-endpoints/{id}/test","href":"/api-reference/management/send-a-test-event"},{"title":"Read balances and billing state","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/billing/overview","href":"/api-reference/management/read-balances-and-billing-state"},{"title":"Get mgmtv1billingauto reload","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/billing/auto-reload","href":"/api-reference/management/get-mgmtv1billingauto-reload"},{"title":"Delete mgmtv1billingauto reload","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /mgmt/v1/billing/auto-reload","href":"/api-reference/management/delete-mgmtv1billingauto-reload"},{"title":"Patch mgmtv1billingauto reload","deprecated":null,"version":null,"openapi":"/openapi.yaml patch /mgmt/v1/billing/auto-reload","href":"/api-reference/management/patch-mgmtv1billingauto-reload"},{"title":"Post mgmtv1billingauto reloadsetup","deprecated":null,"version":null,"openapi":"/openapi.yaml post /mgmt/v1/billing/auto-reload/setup","href":"/api-reference/management/post-mgmtv1billingauto-reloadsetup"},{"title":"Get mgmtv1adminorganizations auto reload","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/admin/organizations/{id}/auto-reload","href":"/api-reference/management/get-mgmtv1adminorganizations-auto-reload"},{"title":"Delete mgmtv1adminorganizations auto reload","deprecated":null,"version":null,"openapi":"/openapi.yaml delete /mgmt/v1/admin/organizations/{id}/auto-reload","href":"/api-reference/management/delete-mgmtv1adminorganizations-auto-reload"},{"title":"Read usable credit lots and open reservations","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/billing/grants","href":"/api-reference/management/read-usable-credit-lots-and-open-reservations"},{"title":"Freeze a stripe proration quote for at most five minutes before renewal","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/billing/subscription/change-preview","href":"/api-reference/management/freeze-a-stripe-proration-quote-for-at-most-five-minutes-before-renewal"},{"title":"Execute the frozen change; upgrade rights wait for invoicepaid","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/billing/subscription/change","href":"/api-reference/management/execute-the-frozen-change;-upgrade-rights-wait-for-invoicepaid"},{"title":"Confirm abandonment of a preview or unpaid checkout","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/billing/subscription/abandon","href":"/api-reference/management/confirm-abandonment-of-a-preview-or-unpaid-checkout"},{"title":"Cancel at the end of the paid period","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/billing/subscription/cancel","href":"/api-reference/management/cancel-at-the-end-of-the-paid-period"},{"title":"Remove the scheduled cancellation or downgrade","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/billing/subscription/resume","href":"/api-reference/management/remove-the-scheduled-cancellation-or-downgrade"},{"title":"Platform administrator: read organisation billing overview","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/overview","href":"/api-reference/management/platform-administrator:-read-organisation-billing-overview"},{"title":"Platform administrator: read organisation billing grants","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/grants","href":"/api-reference/management/platform-administrator:-read-organisation-billing-grants"},{"title":"Platform administrator: read organisation billing ledger","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/ledger","href":"/api-reference/management/platform-administrator:-read-organisation-billing-ledger"},{"title":"Platform administrator: read organisation billing operations","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/operations","href":"/api-reference/management/platform-administrator:-read-organisation-billing-operations"},{"title":"Platform administrator: read organisation billing payments","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/payments","href":"/api-reference/management/platform-administrator:-read-organisation-billing-payments"},{"title":"Explain the lots used by a reservation or settlement","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/ledger/{entryID}/allocations","href":"/api-reference/management/explain-the-lots-used-by-a-reservation-or-settlement"},{"title":"Read the shared plan catalogue","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/billing/plans","href":"/api-reference/management/read-the-shared-plan-catalogue"},{"title":"Platform administrator: change preview with an audit reason and confirmation","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/change-preview","href":"/api-reference/management/platform-administrator:-change-preview-with-an-audit-reason-and-confirmation"},{"title":"Platform administrator: change with an audit reason and confirmation","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/change","href":"/api-reference/management/platform-administrator:-change-with-an-audit-reason-and-confirmation"},{"title":"Confirm abandonment of a preview or unpaid checkout 1","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/abandon","href":"/api-reference/management/confirm-abandonment-of-a-preview-or-unpaid-checkout-1"},{"title":"Platform administrator: cancel with an audit reason and confirmation","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/cancel","href":"/api-reference/management/platform-administrator:-cancel-with-an-audit-reason-and-confirmation"},{"title":"Platform administrator: resume with an audit reason and confirmation","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/resume","href":"/api-reference/management/platform-administrator:-resume-with-an-audit-reason-and-confirmation"},{"title":"Platform administrator: sync with an audit reason and confirmation","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/billing/sync","href":"/api-reference/management/platform-administrator:-sync-with-an-audit-reason-and-confirmation"},{"title":"Grant permanent or temporary commercial credits with an audit reason","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations/{id}/credits","href":"/api-reference/management/grant-permanent-or-temporary-commercial-credits-with-an-audit-reason"},{"title":"List organisations with their currently usable credits and effective plan","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /mgmt/v1/admin/organizations","href":"/api-reference/management/list-organisations-with-their-currently-usable-credits-and-effective-plan"}]},{"group":"API Reference","pages":[{"title":"List supported scopes for API key management","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/api-key-scopes","href":"/api-reference/list-supported-scopes-for-api-key-management"},{"title":"List SDK licence states and quota","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/sdk-licenses","href":"/api-reference/list-sdk-licence-states-and-quota"},{"title":"Retrieve the current organisation SDK licence","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/sdk-licenses/{sdk}","href":"/api-reference/retrieve-the-current-organisation-sdk-licence"},{"title":"Request SDK licence attribution or renewal","deprecated":null,"version":null,"openapi":"/openapi.yaml post /mgmt/v1/sdk-licenses/{sdk}","href":"/api-reference/request-sdk-licence-attribution-or-renewal"},{"title":"Get public Ed25519 licence verification keys","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/sdk-licenses/jwks","href":"/api-reference/get-public-ed25519-licence-verification-keys"},{"title":"Retrieve an SDK licence without renewal","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/sdk-licenses/{sdk}","href":"/api-reference/retrieve-an-sdk-licence-without-renewal"},{"title":"Create, renew or regenerate an SDK licence","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/sdk-licenses/{sdk}","href":"/api-reference/create-renew-or-regenerate-an-sdk-licence"},{"title":"Get the authenticated key identity and normalized permissions","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/api-keys/self","href":"/api-reference/get-the-authenticated-key-identity-and-normalized-permissions"},{"title":"Read the confirmed status of an organisation purchase","deprecated":null,"version":null,"openapi":"/openapi.yaml get /mgmt/v1/billing/purchases/{purchaseID}","href":"/api-reference/read-the-confirmed-status-of-an-organisation-purchase"},{"title":"A job completed successfully","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook job.succeeded","href":"/api-reference/a-job-completed-successfully"},{"title":"A batch job completed with per image errors","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook job.partial","href":"/api-reference/a-batch-job-completed-with-per-image-errors"},{"title":"A job failed","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook job.failed","href":"/api-reference/a-job-failed"}]},{"group":"A — Understand the vehicle","pages":[{"title":"Vehicle Pose","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/vehicle/pose","href":"/api-reference/a-—-understand-the-vehicle/vehicle-pose"},{"title":"Car Segmentation","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/vehicle/segment","href":"/api-reference/a-—-understand-the-vehicle/car-segmentation"},{"title":"Preview — Vehicle Model Detection","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/vehicle/identify","href":"/api-reference/a-—-understand-the-vehicle/preview-—-vehicle-model-detection"},{"title":"VIN Reader","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/vin/read","href":"/api-reference/a-—-understand-the-vehicle/vin-reader"},{"title":"Preview — Driver License Reader","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/driver-license/read","href":"/api-reference/a-—-understand-the-vehicle/preview-—-driver-license-reader"},{"title":"Preview — License Plate Reader","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/plate/read","href":"/api-reference/a-—-understand-the-vehicle/preview-—-license-plate-reader"},{"title":"Document Reader","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/document/read","href":"/api-reference/a-—-understand-the-vehicle/document-reader"},{"title":"Dashboard \u0026 Mileage Reader","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/dashboard/read","href":"/api-reference/a-—-understand-the-vehicle/dashboard-\u0026-mileage-reader"},{"title":"Preview — Engine Fault Sound Detection","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/engine/detect","href":"/api-reference/a-—-understand-the-vehicle/preview-—-engine-fault-sound-detection"}]},{"group":"B — Damage \u0026 condition","pages":[{"title":"Damage Detection","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/damage/detect","href":"/api-reference/b-—-damage-\u0026-condition/damage-detection"},{"title":"Preview — Car Severity Estimation","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/damage/severity","href":"/api-reference/b-—-damage-\u0026-condition/preview-—-car-severity-estimation"},{"title":"Tire Reading","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/tire/read","href":"/api-reference/b-—-damage-\u0026-condition/tire-reading"},{"title":"Tire Wear Detection","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/tire/detect","href":"/api-reference/b-—-damage-\u0026-condition/tire-wear-detection"}]},{"group":"C — Parts","pages":[{"title":"Car Parts Recognition","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/parts/recognize","href":"/api-reference/c-—-parts/car-parts-recognition"},{"title":"Car Parts Segmentation","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/parts/segment","href":"/api-reference/c-—-parts/car-parts-segmentation"},{"title":"Preview — Car Parts Decomposition","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/parts/decompose","href":"/api-reference/c-—-parts/preview-—-car-parts-decomposition"}]},{"group":"D — Money","pages":[{"title":"Preview — Car Pricing","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/pricing/vehicle","href":"/api-reference/d-—-money/preview-—-car-pricing"},{"title":"Preview — Car Reparation Pricing","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/pricing/repair","href":"/api-reference/d-—-money/preview-—-car-reparation-pricing"}]},{"group":"E — Image production","pages":[{"title":"Image Backgrounding","description":"Tool to replace the background of images containing vehicles.\n\n- Effectively removes background from an image.\n- Offers multiple backgrounds to replace the original background.\n- Provides the ability to enhance an image or video with a blurred or transformed\n background.\n\nAccepts up to 30 assets and returns one result per input, preserving input order. Rendered\nfiles are served from signed URLs that expire — download and re-host anything you intend\nto keep.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/render/background","href":"/api-reference/e-—-image-production/image-backgrounding"},{"title":"Image Customizer","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/render/customize","href":"/api-reference/e-—-image-production/image-customizer"},{"title":"Quality Improver","description":"Tool to improve the quality of an image.\n\n- Turn bad photos into professional quality photos.\n- Offers advanced pixelation features without a professional studio.\n- Provides the ability to effectively remarket your ads with great photos.\n\nReports which operations were actually applied, so a pipeline can tell a genuine rescue\nfrom a no-op on an already-clean shot.\n","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/render/enhance","href":"/api-reference/e-—-image-production/quality-improver"},{"title":"License Plate Replacer","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/render/plate","href":"/api-reference/e-—-image-production/license-plate-replacer"},{"title":"360 Generation","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/render/360","href":"/api-reference/e-—-image-production/360-generation"},{"title":"Preview — Ad Video Generation","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/render/video","href":"/api-reference/e-—-image-production/preview-—-ad-video-generation"},{"title":"360 Viewer \u0026 Hotspoter","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/render/hotspots","href":"/api-reference/e-—-image-production/360-viewer-\u0026-hotspoter"}]},{"group":"Jobs","pages":[{"title":"List jobs","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/jobs","href":"/api-reference/jobs/list-jobs"},{"title":"Retrieve a job","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/jobs/{id}","href":"/api-reference/jobs/retrieve-a-job"},{"title":"List the endpoint catalogue","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/endpoints","href":"/api-reference/jobs/list-the-endpoint-catalogue"}]},{"group":"Uploads","pages":[{"title":"List organization input uploads","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/uploads","href":"/api-reference/uploads/list-organization-input-uploads"},{"title":"Create a presigned upload","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/uploads","href":"/api-reference/uploads/create-a-presigned-upload"},{"title":"Get shared organization input and asset storage usage","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/uploads/usage","href":"/api-reference/uploads/get-shared-organization-input-and-asset-storage-usage"},{"title":"Preview or asynchronously delete inputs","deprecated":null,"version":null,"openapi":"/openapi.yaml post /v1/uploads/deletions","href":"/api-reference/uploads/preview-or-asynchronously-delete-inputs"},{"title":"Get an upload deletion operation","deprecated":null,"version":null,"openapi":"/openapi.yaml get /v1/uploads/deletions/{id}","href":"/api-reference/uploads/get-an-upload-deletion-operation"}]},{"group":"Internal","pages":[{"title":"Inference completion callback (internal)","deprecated":null,"version":null,"openapi":"/openapi.yaml post /internal/callbacks/modal","href":"/api-reference/internal/inference-completion-callback-internal"}]},{"group":"Catalogue","pages":[{"title":"Read the current commercial plan catalogue","version":null,"deprecated":null,"openapi":"/openapi.yaml webhook /v1/plans","href":"/api-reference/catalogue/read-the-current-commercial-plan-catalogue"}]}]}]},"title":"Image Customizer - CarHub Documentation","buildId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","deploymentId":"dpl_2oYXwqkEXirXBPk8wV1FtM5USFWi","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-WRhTSUDL.js","utils-ChMov4Kr.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-_REmC2bI.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-Bp6nVRCu.js","snippetPresets-DZadmXoU.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CY2WdoTl.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-DwYG-Q4l.js","shallow-BXQIGwv4.js","getApiPlaygroundDisplay-CK5nK5B9.js","CodeSnippet-TH4a2aGW.js","CodeSnippets-DwsQiOFS.js","Page-R3M_BF4L.js","getPastedJson-DD7kUzi_.js","icon-holE3QoJ.js","MethodPill-DUW0T8us.js","DuplicateIcon-CI_p4be-.js","createIcon-BdbRvavb.js","DynamicMarkdown-DN96a4Ur.js","SectionHeading-SCu36A9d.js","axios-vUo_bRtp.js","Markdown-CCeGv-zI.js","clsx-BGBGWFTt.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-Cv_O2fky.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-2C5OB2eV.js"]}