# enrich.vin > Upload a CSV or XLSX with a VIN column — get the file back with every row decoded and the record appended, the same capability by API and MCP. Batch VIN enrichment: upload a CSV or XLSX, and every row's VIN comes back decoded with the record appended — specs, values, history flags, whatever the catalog licenses. The same capability runs by API and MCP through apis.vin. The structure reads free. Motions: B2A Routes: GET / (this document's page) · GET /{VIN} (the record for one vehicle) Representations: text/html · text/markdown · application/json (Accept header; same URL) Evidence: every field posts value · source · timestamp · verification state; empty states are typed EMPTY, invalid VINs are typed INVALID_VIN — never a faked 200. Agent surface: one estate MCP server — https://apis.vin/mcp (all .vin doors are lenses over one spine; tools: decode_vin, vehicle_history, market_value, window_sticker, out_the_door_price, open_recalls, search_listings, cash_offer, transport_quote, finance_prequal, insurance_quote, start_purchase) Gates: typed OFFER (posted price, hard ceiling, x402) or NEEDS_HUMAN handoff URL — no account walls. Auth: https://auth.vin (issuer) · keys/metering via id.org.ai Siblings: https://data.vin/ — The pillar door: every field a row can carry, cataloged — coverage, license, price, posted. https://apis.vin/ — The same enrichment by API and MCP — one key, batch or row at a time. https://vindex.vin/ — Rows keyed to a provider's IDs instead of VINs — the crosswalk maps them to the spine. https://values.vin/ — One row's numbers, read singly: the posted values for any VIN and their basis. https://vhr.vin/ — One row's history, read in full: what happened to any VIN, posted. https://all.vin/ — Every door, one record: all.vin/