the identifier crosswalk · a Data member
Vindex.vin
One car. A different identity at every provider.
Chrome, KBB, Edmunds, EVOX, and vPIC each mint their own key for the same car. Vindex resolves them to one YMMTS spine — year, make, model, trim, style — and through it to each other: every edge carries a posted confidence and a verification timestamp, and coverage posts per provider pair.
A VIN is 17 characters and never uses I, O, or Q.
the identity manifest at vindex.vin/{VIN}: the spine and its structure read free · no account
7MMVABDM3RN163785
- vPICNHTSApatterntrim: candidates — enumerated, scored, postedthe pattern id · the confidence · the verified date
- Chromestyletrim: onethe style id · the confidence · the verified date
- KBBvehicletrim: onethe vehicle id · the confidence · the verified date
- Edmundsstyletrim: onethe style id · the confidence · the verified date
- EVOXstyle × colortrim: one, per colorthe vif · the confidence · the verified date
Every row binds to the same spine row. An edge posts once verified, with its timestamp; where candidates remain, they are enumerated and scored, never blended. Identifiers, confidences, and timestamps render live at the address.
Provider names are stated nominatively; each mark belongs to its owner. Vindex maps between catalogs — it never republishes them.
01 · the fracture
The fracture.
Every provider minted its own key.
The industry’s catalogs never shared an identifier. The same physical car is a style at one provider, a vehicle at another, a pattern at a third — each under its own ID, its own trim string, its own grain. So the industry’s data joins by hand, by string-matching trim names, or not at all.
And the VIN itself has a ceiling: it decodes to a pattern, and a pattern can end above trim. Where it does, Vindex enumerates the candidates and scores them — posted, not picked.
- decode → booka decoded VIN priced against a valuation book’s row — the lender’s daily join, done today by string-matching trim names
- listing → photoa listing’s style bound to the imagery catalog’s style-and-color key — or the wrong car’s pictures
- compliance → merchandisinga government pattern reconciled with a merchandising style — two grains, no shared key
- without a hubevery pair is its own maintained map — n·(n−1)/2 crosswalks, each drifting on its own
- on the spineeach provider maps to YMMTS once — n edges, and every pair resolves through the hub
The spine is the neutral hub. Providers home their identifiers; Vindex serves resolution.
02 · the spine
The spine.
One neutral hub. Every ID a sameAs edge.
YMMTS — year, make, model, trim, style — is the hierarchy every provider’s catalog already describes. A provider’s ID is a sameAs edge on the spine, never a join key: it stays the provider’s identifier, homed in the provider’s catalog. Vindex serves the resolution between them.
A mapping posts only once verified, with its timestamp. Confidence is a number the buyer reads on the edge, never an adjective this page uses.
- resolve(vin | provider:id) → the identity manifest: every known provider ID, each edge scored
- Where the pattern ceiling holds, candidate styles enumerate with scores — never a silent pick
- Withheld depth — full equivalence layers, historical mappings — sits behind the gate: sealed, real, and counted
- The JSON twin and the typed gate envelope answer agents at the same address
// 200 · every provider's ID for one VIN, evidence-stated { "type": "vindex.identity", "vin": "7MMVABDM3RN163785", "spine": { "year": 2024, "make": "Mazda", "model": "CX-50", "trim": <resolved, or candidates with scores>, "style": <resolved, or candidates with scores> }, "edges": [ { "provider": <provider mark>, "grain": <pattern | style | vehicle | style×color>, "id": <that provider's ID>, "confidence": <posted, 0–1>, "verified": <RFC 3339> } ], "coverage": <posted per provider pair, per model year>, "gate": <sealed layers, counted · isAccessibleForFree: false> }
03 · coverage & confidence
Coverage, posted.
A cell is mapped, or it says unmapped.
The coverage manifest posts per provider pair, per model year: the mapped styles, the confidence distribution, the last-verified date. No coverage figure on this page is hand-written — the slots render from the manifest, and an unmapped cell renders as unmapped.
Posted absence is still posted.
- provider A × provider Bthe mapped styles · the confidence · the last-verified date
- provider A × provider Cthe mapped styles · the confidence · the last-verified date
- provider B × provider Cthe mapped styles · the confidence · the last-verified date
- an unbound pairno mapping posted — stated, never guessed
Cells render from the coverage manifest at the address. The pair grid is data-driven — no provider pair is favored in layout.
04 · pair resolution
Any ID in.
Any provider’s identifier out, scored.
Hand the resolver a VIN or any provider’s identifier; name the target provider. The answer is the mapped identifier, stated as evidence — value · source · timestamp · verification state — with its confidence on the edge. Where a pair has no posted mapping, the answer is the gap, not a guess.
Neutral by construction: every pair resolves through the same spine, in either direction.
- ina VIN — or provider:id
- targetany mapped provider — either direction
- outthe mapped identifier · confidence · verified timestamp — or no mapping posted
The same resolution runs as API and MCP through apis.vin — one answer, both registers.
05 · posted
Posted.
The price is on the page, for people and agents.
The price vindex.vin
- Freethe spine · the structure · the coverage manifest$0
- Per resolutionone identifier in, one out, scoredposts live
- Pair tableone provider pair’s full mapping, licensedposts live
- Full mapthe whole crosswalk, at portfolio scalepriced on paper
A number is posted or it is absent. Mapped IDs transact when the gate clears: each cross-mapped provider’s license must name crosswalk redistribution before that provider’s mapped IDs transact — the spine structure and the per-pair coverage manifest read free while the gate stands.
The seams data.vin · apis.vin
The crosswalk is a catalog product: coverage, license, and price post at data.vin. Integration — key, SDK, quota, MCP — is apis.vin’s job. This door owns resolution and nothing else.
Every paid resolution returns a typed, machine-readable offer — posted amount, x402 settlement, expiry — so an agent settles per call on its own account and the worst case is on paper before the first byte moves. An agent buying resolution reads this same page.
One account, every address: auth.vin.
the spine’s neighbors
- specs.vinthe spine’s factory numbers — dimensions, powertrain, capacities
- build.vinthe as-built option codes the crosswalk maps, as the factory ordered them
- listings.vinthe live-listings spine whose decode and slug grammar the YMMTS hierarchy serves
Vindex serves identifiers and equivalences only — never a provider’s specs, values, or photos. The readings live at the member addresses; the record’s canonical address stays vin.company/{VIN}.
For the agent you send
The agent reads the same record you do. Same two routes, three representations — the numbers never differ between them.
motions: B2A
- B2A — the buyer is an agent — no human leaf; discover, bind, pay, worst-case cost posted before the call
curl https://vindex.vin/ -H 'accept: text/markdown' → the markdown twin of this page
curl https://vindex.vin/{VIN} -H 'accept: application/json' → the record as typed evidence objects
curl https://vindex.vin/{VIN} -H 'accept: text/markdown' → the record's markdown twinMachine surfaces on this host: /llms.txt · /icp.json · /.well-known/agents.json · one estate MCP server — apis.vin/mcp (every door a lens; tool results carry the door URL).
Attribution: X-Client-Type: html | md | json | mcp — read for agent-led demand attribution; it never changes the record.