enrich.vin

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.

the enriched row at enrich.vin/{VIN}: decode plus the licensed record fields · the file runs the same, row by row

The file, before and afterinventory.csv → inventory.enriched.csv

before · one column

7MMVABDM3RN163785

after · the same rows, plus the record

7MMVABDM3RN1637852024 Mazda CX-50posts where licensedresolved
decodespecsvalueslistingsstickerflags

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.

  1. decodeYear · make · model · trim · style · drivetrain, resolved per row. Always appends — the structure reads free.
  2. specsThe trim’s factory numbers, where the catalog licenses them.

    specs.vinreads singly, free

  3. valuesThe posted market numbers with their basis, where licensed.

    values.vinone row’s numbers, with their basis

  4. listingsThe live-listing state — is the row for sale, where licensed.

    listings.vinthe live-listings spine

  5. stickerThe birth-record fields — MSRP and factory options as printed, where licensed.

    sticker.vinthe window sticker, as printed

  6. 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

  7. 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 batch envelopevia apis.vin · MCP
// 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

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 twin

Machine 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.