360 Viewer & Hotspoter
Tool to anchor points of interest onto named parts of a vehicle across a set of images.
- Allows you to request a point of interest on a named part of the vehicle.
- Proposes an x,y position on each image where the requested part is visible.
- Offers the possibility of anchoring several points across a whole series of photos of the same vehicle.
Give it a list of images and a part — bonnet — and it returns, per image, a coordinate
where the hotspot belongs. Images that do not show the part come back with visible: false and a null point rather than with a guess.
For a visible part, the anchor is the pixel furthest from the segmented part boundary. This keeps the marker inside the panel, including on irregular or concave shapes. The response also includes the part bounding box and model confidence for each image.
This returns geometry, not a rendered view. The 360 viewer is the consumer of that geometry, not this endpoint. Anything that can draw a marker on a photo can use the output. Billed per image submitted.
Authorizations
Organisation API key, sent as Authorization: Bearer chk_live_….
chk_live_…— real inference, real credits,livemode: true.chk_test_…— identical pipeline against the fixture backend, test credits,livemode: false.
Keys are stored hashed; only the prefix (chk_live_a1b2…) is ever displayed again. A key
may be scoped to a subset of endpoint families — calling outside its scopes is a 403.
Headers
Client-generated key (a UUID is ideal) making this POST safe to retry. The first request
is executed and its response stored for 24 h; any replay with the same key returns that
stored response with Idempotent-Replayed: true and bills nothing. Reusing a key with a
different payload is a 409 idempotency_key_reuse.
8 - 255Steers the fixture backend. Ignored by live keys, 400 test_scenario_not_supported if the
scenario is unknown to the endpoint. Common catalogue:
Some endpoints add their own scenarios; unsupported common scenarios (for example
empty_result on a generation endpoint) are rejected rather than silently ignored.
"empty_result"
"low_confidence"
"model_error"
"slow"
"insufficient_credits"
Query Parameters
Hold the connection until the job settles and answer 200 with the completed job instead
of 202 with a queued one. Available on fast endpoints only; the ceiling is 30 s, after
which the job keeps running and the call answers 202 as usual.
Body
Repeat the images field once per file. 10 MB each.
1 - 30 elementsThe parts to anchor. One group per part comes back in the result.
1 - 20 elementsStable identifier of a vehicle part, shared by every endpoint that names one. Snake case,
side-suffixed where a vehicle has two (door_front_left). The list grows with the part
taxonomy, so treat an unknown code as opaque rather than rejecting it.
Below this, an image is reported as not showing the part rather than guessed at.
0 <= x <= 1Response
Job completed synchronously (wait=true).
The unit of work of the API. Every inference call creates one, and every result is read
back from one — synchronously through wait=true, or later through GET /v1/jobs/{id}
or a webhook.
result is populated only in succeeded, error only in failed / expired.
stages is present on inspection jobs only.
Job identifier — job_ followed by a base58 string.
^job_[1-9A-HJ-NP-Za-km-z]{8,32}$"job_3ZxK9pQr7TnW"
"job"Dotted slug of a CarHub endpoint, the identifier used for jobs and usage.
vehicle.analyze, vehicle.segment, vehicle.identify, vin.read, plate.read, document.read, dashboard.read, engine.detect, video.onboard, 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, viewer.hotspots, inspections Lifecycle of a job. queued → processing → one of succeeded | failed; expired
when it was never picked up in time, canceled when it was cancelled before starting.
The three settled states are terminal.
queued, processing, succeeded, failed, expired, canceled false when the job was created with a chk_test_ key: fixture result, test credits.
Epoch seconds, UTC.
1755300000
When the job left the queue. Null while queued.
1755300000
When the job settled. Null until then.
1755300000
Exact model build that produced the result, as <model>@<release date>. Null until the job starts. Pin your regression tests to it.
"plate-reader@2026-08-01"
Credit accounting for the job. One credit equals one USD cent. reserved is held at
admission and charged is the real cost after settlement; unused credits are released.
Geometry, not a rendered view: for each requested part, where on each image the marker belongs. Images that do not show the part come back with visible: false and a null point rather than with a guess.
Populated when status is failed or expired, null otherwise.
Per-stage progress. Present on inspections jobs only, absent everywhere else.
The X-Carhub-Test-Scenario that produced this job. Present on test-mode jobs that were steered by one, absent otherwise — a live job never carries it.
"low_confidence"