You're building an agent that shortlists used cars. It can read listings. It can compare prices.
But before it recommends anything, it should know one thing a listing never tells it: is this
specific vehicle safe, reliable, and actually cheap once the taxes and fees land?
That answer is scattered across NHTSA, Transport Canada, and 64 different tax jurisdictions. No
human wants to assemble it. No agent should have to. So I built Vindex — a vehicle-intelligence
API designed to be called by agents, priced per call, with no accounts and no API keys.
Let me walk an agent through buying a car.
Step 1 — Decode the VIN ($0.01)
Every sample endpoint returns a real response for one fixed vehicle (a 2013 Ford F-150), so you
can learn the shape before you pay a cent:
curl -s https://api.vindexapi.dev/v1/sample/decode
{
"vin": "1FTFW1ET5DFC10312",
"vehicle": {
"make": "FORD", "model": "F-150", "year": 2013,
"bodyClass": "Pickup", "driveType": "4WD/4-Wheel Drive/4x4",
"engine": { "fuelType": "Gasoline", "cylinders": 6, "displacementL": 3.5 },
"plantCountry": "UNITED STATES (USA)"
},
"warranty": {
"make": "FORD", "matched": true, "modelYear": 2013,
"basic": { "years": 3, "miles": 36000 },
"powertrain": { "years": 5, "miles": 60000 },
"corrosion": { "years": 5, "miles": null },
"roadside": { "years": 5, "miles": 60000 },
"evBattery": null
},
"provenance": { "source": "nhtsa-vpic", "cache": "hit" },
"sample": true
}
The paid twin, GET /v1/decode?vin=..., does this for any 17-character VIN — and folds in the
original factory new-vehicle warranty terms (basic/powertrain/corrosion/roadside/EV-battery) keyed
off the decoded make + model-year. These are the manufacturer's coverage as sold, not
warranty-remaining.
Step 2 — Check recalls in BOTH countries ($0.01)
This is the endpoint I couldn't find anywhere else. GET /v1/recalls merges NHTSA (US) and
Transport Canada into one response:
curl -s https://api.vindexapi.dev/v1/sample/recalls
{
"counts": { "us": 3, "canada": 3 },
"recalls": {
"us": [
{
"campaign": "19V075000",
"component": "POWER TRAIN:AUTOMATIC TRANSMISSION:CONTROL MODULE (TCM/PCM/TECM)",
"summary": "...the transmission may unexpectedly downshift into first gear...",
"consequence": "...loss of vehicle control, increasing the risk of a crash."
}
],
"canada": [
{
"recallNumber": "2019065",
"systemType": "Powertrain",
"unitsAffected": 158971,
"summary": "...a sensor problem may cause the transmission to suddenly downshift..."
}
]
},
"provenance": {
"attribution": "Contains information licensed under the Open Government Licence – Canada."
}
}
Same defect, two regulators, one call. An agent selling to a Canadian buyer sees the Canadian
campaign and the units affected without touching a second data source.
Step 3 — Cluster the noise into known issues ($0.05)
NHTSA has 2,796 complaints on this truck. Your agent doesn't want 2,796 rows — it wants the
named problems, and it wants receipts. GET /v1/known-issues clusters complaints into failure
modes, and every cluster cites the verified ODI complaint numbers it was built from:
curl -s https://api.vindexapi.dev/v1/sample/known-issues
{
"status": "ok",
"complaintCount": 2796,
"complaintsAnalyzed": 150,
"knownIssues": [
{
"title": "Sudden transmission downshift to first gear",
"count": 96, "trend": "rising", "confidence": 0.95,
"componentTags": ["POWER TRAIN", "VEHICLE SPEED CONTROL"],
"odiNumbers": [11562449, 11632047, 11631221, "…93 more"]
},
{
"title": "Instrument cluster and speedometer failure",
"count": 22, "trend": "rising", "confidence": 0.9,
"componentTags": ["ELECTRICAL SYSTEM"]
}
],
"reliability": {
"topComponents": [
{ "component": "POWER TRAIN", "count": 354 },
{ "component": "ENGINE", "count": 70 }
],
"severitySignals": { "crashes": 3, "fires": 2, "injuries": 5 },
"recalls": { "usCount": 3, "canadaCount": 3, "canadaUnitsAffected": 217860 }
}
}
The citations matter: the model is hallucination-gated, validated against the source complaint
set. complaintsAnalyzed tells you the size of the recent-weighted stratified sample the LLM
actually saw (vs complaintCount, the total). If a VIN has fewer than 15 complaints, the endpoint
refuses — and you're not charged for the refusal. This single $0.05 response also bundles a
reliability aggregates block (top components, severity signals, US/Canada recall counts) plus the
full vehicle decode, at no extra cost.
Step 4 — Compute the true drive-away cost ($0.02)
Sticker price is not the price. GET /v1/purchase-costs?country=CA itemizes what it actually costs
to put the car on the road, per jurisdiction:
curl -s https://api.vindexapi.dev/v1/sample/purchase-costs
{
"ca": {
"province": "ON", "provinceName": "Ontario",
"input": { "priceCad": 25000, "saleType": "private" },
"lines": [
{ "label": "RST (13%)", "amountCad": 3250, "kind": "tax" },
{ "label": "Used Vehicle Information Package (UVIP)", "amountCad": 20 },
{ "label": "Vehicle permit + new licence plate", "amountCad": 59 },
{ "label": "Safety / mechanical inspection", "rangeCad": { "low": 60, "high": 200 } }
],
"totalKnownCad": 3329
}
}
Every line carries its own sourceUrl and a confidence flag. This works for all 13 Canadian
provinces and territories (BC's bracketed PST, Alberta's tax-free private sales, Quebec's GST+QST,
the GST-only territories) and, via GET /v1/purchase-costs?country=US, for all 50 US states + DC —
including the weird ones (DC's MPG-tiered excise, Illinois's RUT-50 flat table, South Carolina's
capped fee). 64 jurisdictions, same $0.02 price.
How payment works: 402 → pay → 200
There's no signup and no key. The first call comes back 402 with an exact quote:
{
"x402Version": 2,
"error": "Payment required",
"resource": {
"url": "https://api.vindexapi.dev/v1/known-issues",
"mimeType": "application/json"
},
"accepts": [
{
"scheme": "exact",
"network": "eip155:8453",
"amount": "50000",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"payTo": "0x444731dac7c9cde478147f41e621a064fcbe70f2",
"maxTimeoutSeconds": 300,
"extra": { "name": "USD Coin", "version": "2" }
}
]
}
Your x402 client signs a one-shot exact USDC authorization on Base, and
retries the same request with the payment header. The server is compute-first: it computes the
answer, then only settles and charges if the answer is billable. An error, an unresolvable VIN, or
a below-threshold refusal comes back uncharged. On success you get 200 and the JSON.
The price list
| Endpoint | What you get | Price |
|---|---|---|
GET /v1/decode |
Normalized NHTSA vPIC decode + factory warranty terms | $0.01 |
GET /v1/recalls |
Merged US + Canada recalls | $0.01 |
GET /v1/known-issues |
Clustered failure modes with ODI citations + reliability aggregates | $0.05 |
| `GET /v1/purchase-costs?country=CA\ | US` | Drive-away costs (CA or US, 64 jurisdictions) |
No tiers, no bundles, no subscription. The four /v1/sample/* endpoints are always free.
Built to be found by agents
Vindex is machine-discoverable end to end: llms.txt, openapi.json, /.well-known/x402, an
A2A agent card, and a /discovery JSON manifest. An agent can locate the service, read the price,
and pay — inside one loop, no human in the middle.
What it isn't
Vindex is not a vehicle-history report. No liens, no accidents, no odometer claims — that's a
different product, and in Canada, Carfax owns it. No listings or market prices yet either; that's
Phase 2, and I'm sequencing it behind actual demand. The data is 100% public-domain (NHTSA;
Transport Canada under the Open Government Licence – Canada), and it's informational only, not
purchasing advice.
Try it
Everything above is one curl away, free, right now:
curl -s https://api.vindexapi.dev/v1/sample/recalls
Docs, samples, and the full discovery surface: https://vindexapi.dev. I'd genuinely like
feedback on the API shape and whether the merged-recall angle is useful for what you're building.
Top comments (1)
I was particularly interested in the section on clustering complaints into known issues, as this is an area where I've seen many agents struggle to make sense of the noise in the data. The ability to reduce 2,796 complaints into named problems with receipts is incredibly valuable, and I appreciate how the API provides a confidence score and trend analysis for each issue. I've worked with similar datasets in the past and found that this type of clustering can be really challenging, so I'm curious to know more about the algorithms and techniques used to achieve this in the Vindex API. Can you share any insights into the technical approach behind this endpoint?