Layer 3 · Data
Everything true about a vehicle that a model cannot see.
Sourced from supported vehicle-data providers, then normalised into one schema behind the same key. You integrate one contract instead of provider-specific formats.
9 domains · supported data sources · normalised into one schema · same key
Why this layer
We do not compute any of this ourselves.
A model cannot see a service history or an outstanding finance claim. Those records come from supported data sources with different formats and availability. You integrate the CarHub schema once instead of building around each source format.
The domains
9 domains behind the same key.
Availability and freshness can vary by source. The public response contract remains consistent across the supported data domains.
- Identity
- VIN decode, build sheet, factory options, plate → VIN lookup
- Specs
- Technical data, equipment, dimensions, powertrain
- Battery
- State of health, usable capacity, range and charging data
- Value
- Market pricing, residuals, depreciation curves
- History
- Mileage records, ownership, accidents, write-off status
- Compliance
- Recalls, service campaigns, emissions, homologation, taxes
- Financing
- Outstanding balances, lender records and settlement data
- Parts
- OEM references and catalogues — feeds pricing/repair
- Risk
- Stolen-vehicle, fraud and risk checks
Where it joins
Data on its own is a lookup. Joined to the models, it is an answer.
You can call these domains directly. Most of their value shows up where a Layer 2 endpoint reads them mid-computation.
- IdentityPOST/v1/plate/read
Plate OCR with country detection is the bridge in — read the plate, resolve the VIN, and the build sheet follows
- ValuePOST/v1/pricing/vehicle
Market valuation needs both halves: identity and residuals from here, observed condition from the models
- PartsPOST/v1/pricing/repair
OEM references turn a detected damage into a part with a price rather than a bounding box
What we do not claim
No country is covered on every domain, and we will tell you which ones are thin before you build on them. Where a source is missing, the field comes back empty rather than guessed.
The rest of the stack
What reads this, and what shows it.
Start with a plate.
Send one to /v1/plate/read and follow what comes back. That single call is the doorway into all 9 domains.








