the batch product · a Data member
Enrich.vin
Upload the file. It comes back enriched.
A spreadsheet of VINs is a spreadsheet of unanswered questions. CSV or XLSX, one VIN column: every row returns with the VIN decoded and the licensed record fields appended — each with value, source, and timestamp. Your columns stay yours; the record joins them.
A VIN is 17 characters and never uses I, O, or Q.
the enriched row at enrich.vin/{VIN}: decode plus the licensed record fields · the file runs the same, row by row
before · one column
after · the same rows, plus the record
Every appended field posts value · source · timestamp; a field without a bound license posts as a gap. Figures render in the file, not on this page: the per-row fee, posted before the tier transacts.
01 · per row
What appends.
The columns people check first, appended first.
Ten thousand VINs in column A and nothing beside them: no trim, no value, no flag. The portfolio gets priced, insured, or floored on rows nobody resolved. Enrichment closes that gap in one pass — the file you sent, plus the record.
The free faces lead. The full history report stays a deepening step at its own address — priced there, chosen per row, never the front door here.
- decodeYear · make · model · trim · style · drivetrain, resolved per row. Always appends — the structure reads free.
- specsThe trim’s factory numbers, where the catalog licenses them.
specs.vinreads singly, free
- valuesThe posted market numbers with their basis, where licensed.
values.vinone row’s numbers, with their basis
- listingsThe live-listing state — is the row for sale, where licensed.
listings.vinthe live-listings spine
- stickerThe birth-record fields — MSRP and factory options as printed, where licensed.
sticker.vinthe window sticker, as printed
- flagsRecall status, and title-brand and odometer-consistency flags where licensed. The full history report is the deepening step, priced at its own address — never bundled silently into a row.
recalls.vinopen campaigns, freevhr.vinthe full report — the deepening step
- resolutionPer-row state: resolved · INVALID_VIN · no record — typed, never silently dropped. INVALID_VIN is an answer, not an error page.
Columns render per the catalog’s licensed fields. This page states structure, not coverage; a live member address links, a dark one renders as a plain mark — a data change, never a layout change.
02 · the twin
The same batch, machine-read.
One capability. Upload, API, or MCP.
The file a person downloads and the rows an agent reads render from the same record. Key, SDK, quota, and MCP are apis.vin’s job — one key, batch or row at a time; one MCP server for the whole platform at apis.vin/mcp.
Before any paid batch moves, the offer is typed and on paper: posted per-row amount, x402 settlement, expiry. An agent enriching a file reads this same page.
- The identical column sets by upload, API, and MCP — nothing an agent reads differs from the file
- Unresolved rows come back typed — INVALID_VIN is an answer, not an error page
- One account, every address — auth.vin
// the typed offer — on paper before the first byte moves { "type": "enrich.batch", "in": { "file": "inventory.csv", "vin_column": <named or detected> }, "offer": { "per_row": <posted, or absent while the gate is open>, "settlement": "x402", "expiry": <RFC 3339> }, "out": { "columns": <the licensed record fields — value · source · timestamp>, "resolution": ["resolved", "INVALID_VIN", "no record"] } }
03 · posted
Posted, or absent.
The structure reads free. The fee is on the page first.
The structure is free to read — the format, the column sets, the per-row states, no account. The paid batch tier posts its per-row fee on this page before it transacts, and not before.
Your rows are your rows: the enrichment appends and returns the file; it does not retain a portfolio.
- Readthe format · the per-row structure · no account$0
- Batchper row · posted before it transactsnot yet posted
The batch tier transacts when the gate clears: the upstream license must name batch enrichment delivery before a paid file transacts; the format read and the per-row structure stay free.
04 · the seam
What appends is what the catalog licenses.
This door runs the batch. The catalog posts the terms.
The catalog data.vin
Every field a row can carry is cataloged at the pillar door — coverage, license, posted price. What the catalog licenses is what appends here; a field without a bound license posts as a gap, never a guess. Coverage is posted there, not promised here.
Provider-keyed files vindex.vin
A file keyed to a provider’s IDs instead of VINs takes the crosswalk first: the Vindex spine maps provider IDs to YMMTS, and the enrichment runs from there — every edge scored, never a silent join.
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://enrich.vin/ -H 'accept: text/markdown' → the markdown twin of this page
curl https://enrich.vin/{VIN} -H 'accept: application/json' → the record as typed evidence objects
curl https://enrich.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.