🌐 US-Proxy
>; the forty bespoke doors don't, so a body-keyed rule silently fails on every one of them (that flashed the hamburger white on hover, 2026-07-28). Guarded by a test. */ .estate-nav[data-s="dark"]{background:#0A1411;border-bottom-color:#20342B;color:#DCE7E0} .estate-nav[data-s="dark"] .lockup .stop{color:#35B183} .estate-nav[data-s="dark"] .estate-layers a:hover,.estate-nav[data-s="dark"] .estate-layers .sl-here{color:#35B183} .estate-nav[data-s="dark"] .estate-layers .sl-held{color:#8BA396} .estate-nav[data-s="dark"] .estate-nav-body{background:#0A1411;border-bottom-color:#20342B} .estate-nav[data-s="dark"] .estate-layers a{border-top-color:#20342B} .estate-nav[data-s="dark"] .nav-cta{color:#DCE7E0!important;border-color:#20342B} .estate-nav[data-s="dark"] .nav-cta:hover{border-color:#DCE7E0} .estate-nav[data-s="dark"] .nav-partner{background:#35B183;color:#0A1411} .estate-nav[data-s="dark"] .nav-partner:hover{filter:brightness(1.06);color:#0A1411} .estate-nav[data-s="dark"] .nav-btn:hover{background:rgba(255,255,255,.06)} .nav-state:checked ~ .estate-nav .i-menu{opacity:0;transform:rotate(90deg) scale(.7)} .nav-state:checked ~ .estate-nav .i-close{opacity:1;transform:none} .nav-state:focus-visible ~ .estate-nav .nav-btn{outline:2px solid var(--accent,var(--green,#0E6B4A));outline-offset:2px} @media(min-width:861px){ .estate-nav-row{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:16px} .estate-nav-row .lockup{grid-column:1;justify-self:start} .estate-nav-body{display:contents} .estate-layers{grid-column:2;justify-self:center;flex-wrap:nowrap;column-gap:22px} /* The right slot: field and/or CTA share one grid cell as a flex row, so if a surface ever passes BOTH they sit side by side instead of overlapping. */ .estate-nav-end{grid-column:3;justify-self:end;display:flex;align-items:center;gap:12px} .estate-nav-end .vin-field--bar{width:260px;max-width:100%} } @media(max-width:860px){ .estate-nav-row .nav-btn{display:inline-flex} /* EVERY SHELL TOKEN IN THIS SHEET NAMES BOTH VOCABULARIES. --bg / --rule / --accent are the shared SHELL's semantic slots (styles.ts). The forty bespoke doors render their :root from rootCss(), which emits --paper / --line / --green and has NEVER carried the shell's names. So on every bespoke door the bar and the open menu both resolved to rgba(0,0,0,0) — a transparent header with the page scrolling through it, and a transparent dropdown. It looked correct on the shell and broke on forty doors, which is why a shell-only check passed it. Fallback chain, not a rename: shell slot, then door token, then literal. */ /* THE DROPDOWN MUST NAME BOTH TOKEN VOCABULARIES. --bg / --rule are the shared SHELL's semantic slots (styles.ts). The forty bespoke doors render their :root from rootCss(), which emits --paper and --line and has never carried --bg or --rule. So on every bespoke door the open menu resolved to rgba(0,0,0,0) — a transparent panel with the page scrolling behind it. It looked right on the shell and broke everywhere else, which is why a shell-only check would have passed it. Fallback chain, not a rename: shell slot, then door token, then literal. */ .estate-nav-body{position:absolute;top:100%;left:0;right:0;z-index:50;flex-direction:column;align-items:stretch;gap:14px;background:var(--bg,var(--paper,#FFFFFF));border-bottom:1px solid var(--rule,var(--line,#E4E8E5));padding:16px 24px 20px;opacity:0;transform:translateY(-10px);pointer-events:none;transition:opacity .24s ease,transform .28s cubic-bezier(.2,.7,.3,1)} /* .estate-nav-end unwraps here so field/CTA keep their own dropdown slots (field on top, CTA lower) instead of grouping as they do on desktop. */ .estate-nav-end{display:contents} .estate-nav-body .vin-field--bar{order:0} .estate-layers{order:1;flex-direction:column;align-items:stretch;column-gap:0;row-gap:0;font-size:1.05rem} .estate-layers a,.estate-layers .sl-here,.estate-layers .sl-held{display:flex;align-items:center;min-height:54px;padding:0;border-top:1px solid var(--rule,var(--line,#E4E8E5))} .estate-nav-body .nav-cta{order:2;justify-content:center;margin-top:4px} .estate-nav-body .nav-partner{order:3;justify-content:center;margin-top:4px;width:100%;min-height:48px;font-size:1rem;font-weight:700;font-family:var(--sans-display)} .nav-state:checked ~ .estate-nav .estate-nav-body{opacity:1;transform:none;pointer-events:auto} } /* The shared menu-toggle machinery EstateNav renders: the sr-only checkbox, the hamburger button + its menu/close icon, the scrim, and the scroll lock. The nav STRUCTURE (bar grid, layers, CTA, mobile dropdown) lives in estateNavCss above; the old .nav-inner / .nav-links / .nav-panel / .np-* sheet was retired with DoorNav (2026-07-27). Icon-swap + focus are scoped to .estate-nav there. */ .sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0} .nav-state{position:fixed;top:0;left:0} .nav-btn{display:none;align-items:center;justify-content:center;width:48px;height:48px;margin-right:-12px;border-radius:8px;cursor:pointer;position:relative;z-index:2;color:inherit} .nav-btn:hover{background:#F5F7F6} .nav-ico,.nav-ico svg,.nav-ico path,.nav-ico span{pointer-events:none} .nav-ico{position:relative;width:24px;height:24px;display:block} .nav-ico > span{position:absolute;inset:0;display:block;width:24px;height:24px;transition:opacity .22s ease,transform .28s cubic-bezier(.2,.7,.3,1)} .nav-ico svg{width:24px;height:24px;display:block} .i-close{opacity:0;transform:rotate(-90deg) scale(.7)} .nav-scrim{display:none;position:fixed;inset:0;z-index:40;background:rgba(11,18,15,.28);opacity:0;pointer-events:none;transition:opacity .26s ease} .nav-state:checked ~ .nav-scrim{opacity:1;pointer-events:auto} /* THE SCROLL LOCK — clip, never hidden. overflow:clip is not a scroll container, so nothing clamps the offset to 0; both Chromium and WebKit hold position. */ body:has(.nav-state:checked){overflow:clip} .nav-scrim{overscroll-behavior:contain} .nav-state:checked ~ .nav-scrim{touch-action:none} @media(max-width:860px){ .nav-scrim{display:block} } /* ---- ranks: the ground ------------------------------------------------ */ .price,.price-col,.price-block{ --p-ink:#0B120F;--p-soft:#3C4642;--p-muted:#66716B; --p-posted:#0E6B4A;--p-rule:#E4E8E5; } [data-ground="dark"] .price,[data-ground="dark"] .price-col,[data-ground="dark"] .price-block, [data-s="dark"] .price,[data-s="dark"] .price-col,[data-s="dark"] .price-block, [data-surface="dark"] .price,[data-surface="dark"] .price-col,[data-surface="dark"] .price-block, .dark .price,.dark .price-col,.dark .price-block{ --p-ink:#F2F7F4;--p-soft:#DCE7E0;--p-muted:#8BA396; --p-posted:#35B183;--p-rule:#20342B; } /* ---- ranks: the type -------------------------------------------------- */ .price-eyebrow{ display:block;font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:.68rem;font-weight:600; letter-spacing:.22em;text-transform:uppercase;color:var(--p-muted,#66716B); } .price-lead{ display:block;font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size:clamp(1.5rem,1.05rem + 1.35vw,1.875rem); font-weight:600;letter-spacing:-.02em;line-height:1.05;color:var(--p-ink,#0B120F); font-variant-numeric:tabular-nums;white-space:nowrap; } /* Posted takes the green (tokens.ts: the trust signal is the stop, posted prices, primary actions). Quoted never does — a quote is not certified. */ .price-lead[data-price="posted"]{color:var(--p-posted,#0E6B4A)} .price-lead[data-price="quoted"]{color:var(--p-ink,#0B120F)} .price-sum{ font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:1.0625rem;font-weight:600; letter-spacing:-.01em;color:var(--p-ink,#0B120F);text-align:right;white-space:nowrap; font-variant-numeric:tabular-nums; } .price-line{ font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:.875rem;font-weight:500; color:var(--p-ink,#0B120F);text-align:right;white-space:nowrap; font-variant-numeric:tabular-nums; } .price-qual{ display:block;font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:.8125rem;font-weight:400; line-height:1.5;color:var(--p-soft,#3C4642);font-variant-numeric:tabular-nums; } .price-qual + .price-qual{margin-top:4px} /* An anchor is a Qualifier that names its source and its date. It is never a was/now: attestation has no before-price, so the strike is refused here rather than trusted not to be authored. */ .price-anchor{color:var(--p-muted,#66716B)} .price-lead,.price-sum,.price-line,.price-qual,.price-anchor,.price-slot{text-decoration:none} .price-lead s,.price-sum s,.price-line s,.price-qual s,.price-anchor s, .price-lead del,.price-qual del,.price-anchor del{text-decoration:none;font-style:normal} /* The slot inherits the rank it stands in for and is capped at Line. It never takes weight >=600, never green, never full ink. */ .price-slot{color:var(--p-muted,#66716B);font-weight:400;letter-spacing:.04em} .price-sum.price-slot{font-size:.875rem;font-weight:400} .price-lead.price-slot{font-size:1.0625rem;font-weight:400;letter-spacing:.04em} /* ---- the column: ONE shrink-wrapped box (THE ALIGNMENT LAW, §11/§12.5) -- */ .price-col{ display:grid;grid-template-columns:minmax(0,1fr) max-content; gap:0 16px;align-items:baseline;font-variant-numeric:tabular-nums; } .price-col > .price-line,.price-col > .price-sum{grid-column:2} .price-col > .price-rule{grid-column:1 / -1;height:1px;background:var(--p-rule,#E4E8E5);margin:8px 0} /* A price that is also a link is still an address: 44px target, no colour hand-off to the link rule. */ a.price-lead,a.price-sum,a.price-line{display:inline-block;padding:12px 0;margin:-12px 0} a.price-lead:hover,a.price-sum:hover,a.price-line:hover{text-decoration:underline;text-underline-offset:4px} /* ======================================================================= */ /* ADOPTION — the hooks the shipped landings already emit, resolved onto */ /* the five ranks. Every selector below was measured on the served artifact */ /* on 2026-07-26; all of them sit on a white or paper-2 ground, so the ink */ /* values are safe without a per-door ground test. */ /* ======================================================================= */ /* Line: 12 distinct renderings across 126 figures, collapsed to one. */ .stk-rows .amt,.ord-rows .amt,.order-rows .amt,.order-rows .o-amt,.pay-rows .amt, .venue-rows .v-price,.comp-rows .c-price:not(.h),.result-rows .r-price, .option-rows .o-pay{ font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:.875rem;font-weight:500; color:#0B120F;text-align:right;white-space:nowrap; font-variant-numeric:tabular-nums; } /* Sum: 21 of 22 shipped renderings already agreed at 17px/600/ink. The outlier is sticker's Monroney facsimile (.msrp-*), which is a reproduction of a printed label and keeps its own smaller scale on purpose — promoting it made an unpriced total the loudest money on that page, measured, so it is excluded here rather than argued with. */ .stk-total .amt,.ord-total .amt,.order-total .amt,.order-total .o-amt, .pay-out .amt{ font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:1.0625rem;font-weight:600; letter-spacing:-.01em;color:#0B120F;white-space:nowrap; font-variant-numeric:tabular-nums; } /* Lead: the door's own posted price. vhr.vin's posted block is the estate's only shipped instance where the real price stands alone in its own element; the peer SKU beneath it takes the Sum rank, per §12.2. */ .posted-rows li:first-child .amt{ font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:clamp(1.5rem,1.05rem + 1.35vw,1.875rem); font-weight:600;letter-spacing:-.02em;line-height:1.05;color:#0E6B4A; font-variant-numeric:tabular-nums; } .posted-rows li + li .amt{ font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:1.0625rem;font-weight:600; letter-spacing:-.01em;color:#0B120F;font-variant-numeric:tabular-nums; } /* Qualifier: the TTL/anchor line under a posted price, and the ladder rung's own explanatory clause. 4.9:1 muted -> 9.8:1 ink-soft. */ .posted-rows .amt small,.rung-what,.rung-text{ font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:.8125rem;font-weight:400; line-height:1.5;color:#3C4642;font-variant-numeric:tabular-nums; } .posted-rows .amt small{display:block;margin-top:4px} /* The price pair inside a proof card is two peer SKUs: Sum rank, one ink. (The same two prices inside .close-row are label text on a button — one of them aria-disabled — so they are left to the door: restyling them would dress a disabled control as an active one.) */ .proof-prices .pp b{ font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:1.0625rem;font-weight:600; letter-spacing:-.01em;color:#0B120F;font-variant-numeric:tabular-nums; } /* Slot: figures a landing shows the shape of but does not post — the five value bands, the register slot lines. They keep their size, and their place in the column, and stop impersonating a price. (sticker's option prices are withheld by a ratified rule, not merely unpriced; they already render at the slot's weight and ink and are left where they are — sizing them up would draw the eye to a figure the door is deliberately not showing.) */ .st-slot,.r-slots,.m-slots{ font-weight:400;color:#66716B;letter-spacing:.04em; font-variant-numeric:tabular-nums; } /* The door's own posted fee sentence keeps the posted green (it is a posted price) and gains the Qualifier's size and weight. */ .sheet-fee,.order-fee,.zero-fee{ font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:.8125rem;font-weight:500; color:#0E6B4A; } /* Tabular on every money column box, not on each figure — insurance against a face swap. Measured cost today: 0.00px (Fira Code digit-width delta 0). */ .stk-rows,.ord-rows,.order-rows,.pay-rows,.opt-rows,.venue-rows,.comp-rows, .result-rows,.option-rows,.posted-rows,.pay-grid,.doc-msrp,.proof-prices, .close-row{font-variant-numeric:tabular-nums} /* Money is never struck through, anywhere, however it was authored. */ .stk-rows s,.ord-rows s,.order-rows s,.pay-rows s,.posted-rows s,.opt-rows s, .comp-rows s,.venue-rows s,.result-rows s,.option-rows s{text-decoration:none} /* Below 414px the label column and the money column compete for the same ~290px. The Line rank steps down one notch so the figure never buys its width out of the line name — measured on insure.vin, whose .what label was clipping 3px further at 375px before this step existed. Sum:Line holds at 17/13 = 1.31x, still inside §12.2. */ @media(max-width:414px){ .stk-rows .amt,.ord-rows .amt,.order-rows .amt,.order-rows .o-amt,.pay-rows .amt, .venue-rows .v-price,.comp-rows .c-price:not(.h),.result-rows .r-price, .option-rows .o-pay{font-size:.8125rem} } @media(max-width:560px){ .posted-rows li:first-child .amt{text-align:left} } .next-rows a,.product-rows a,.rec-rows a,.rail-rows a,.dir-rows a,.grammar-rows a{ /* Square, not rounded (founder ruling 2026-08-04): the row hover/focus fill sits flush. One shared value so no door drifts back to a radius. */ padding-left:12px;padding-right:12px;border-radius:0; } @media(max-width:700px){ .next-rows .addr,.product-rows .addr,.rec-rows .addr,.rail-rows .addr,.dir-rows .addr,.grammar-rows .addr{grid-column:1;grid-row:1} .next-rows .arrow,.product-rows .arrow,.rec-rows .arrow,.rail-rows .arrow,.dir-rows .arrow,.grammar-rows .arrow{grid-column:2;grid-row:1;align-self:center} .next-rows .desc,.product-rows .desc,.rec-rows .desc,.rail-rows .desc,.dir-rows .desc,.grammar-rows .desc{grid-column:1 / -1;grid-row:2} } /* THE AGENT BAND'S CODE SAMPLE — scrolls in its own box, never wraps. Founder ruling 2026-07-28, superseding the ≤860px pre-wrap fit that shipped here: code keeps its line shape at every width and the box scrolls horizontally inside itself (white-space:pre + overflow-x:auto). Every door also ships the same pair locally on .demo-pre; this shared rule enforces the ruling for any door whose local block goes missing — the apis.vin case, where the absent block let the raw pre push ~660px of page-level scroll at 320px. */ .demo-pre{white-space:pre;overflow-x:auto;overflow-wrap:normal} /* THE AGENT BAND SITS IN THE PAGE, not against the glass. The band is full-bleed by design — its rule and ground span the viewport — but its CONTENT belongs in the same measure as everything above it. Three treatments shipped across the estate: 20 doors padding:5.5rem max(28px,calc((100% - var(--wrap))/2)) 6rem correct 16 doors padding:5.5rem 0 6rem no padding at all 6 doors padding:5.5rem 28px 6rem 28px, no measure So on 22 of 40 doors "for the agent you send" ran to the window edge while the section above it stopped at the wrap. Only the horizontal padding is set here — each door keeps its own vertical rhythm, border and ground. The +28px is not a fudge. A normal section is .wrap — max-width:var(--wrap) AND 28px of padding inside it — so its CONTENT is var(--wrap) minus 56, not var(--wrap). Centring a full-bleed band on var(--wrap) alone therefore left the agent band 56px wider than everything above it and 28px further out on each side: 1040 against 984 at a 1440 viewport. Below the wrap both clamp to 28px, which is why this only ever showed on desktop. */ .agent{ padding-left:max(28px,calc((100% - var(--wrap))/2 + 28px)); padding-right:max(28px,calc((100% - var(--wrap))/2 + 28px)); } .estate-footer{background:#0A1411;color:#DCE7E0;border-top:1px solid #20342B} .estate-footer .wrap{max-width:var(--wrap);margin:0 auto;padding:0 28px} .estate-footer .stop{color:#35B183} .estate-footer a:focus-visible{outline:2px solid #35B183;outline-offset:3px;border-radius:2px} .ef-ident{padding:3.2rem 0 2.4rem;display:flex;align-items:flex-start;justify-content:space-between;gap:20px 40px;flex-wrap:wrap} .ef-word{font-family:'Sora', -apple-system, 'Segoe UI', Roboto, Helvetica, sans-serif;font-weight:700;font-size:clamp(1.3rem,2.6vw,1.6rem);letter-spacing:-.02em;color:#F2F7F4;line-height:1} .ef-line{margin-top:.55rem;font-size:.88rem;color:#8BA396} .ef-auth{display:inline-flex;align-items:baseline;gap:12px;flex-wrap:wrap;text-decoration:none;border:1px solid #20342B;border-radius:12px;padding:12px 18px;transition:border-color .16s ease} .ef-auth:hover{border-color:#35B183} .ef-auth-addr{font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-weight:500;color:#35B183;font-size:.9rem} .ef-auth-what{color:#8BA396;font-size:.86rem} .ef-seam{border:0;border-top:1px solid #20342B} .ef-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:2.6rem 40px;padding:3rem 0} .ef-pw{font-family:'Sora', -apple-system, 'Segoe UI', Roboto, Helvetica, sans-serif;font-weight:700;font-size:1rem;letter-spacing:-.01em;color:#F2F7F4;line-height:1.1} .ef-doors{list-style:none;display:flex;flex-direction:column;margin-top:.5rem} .ef-door{font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:.8rem;font-weight:400;line-height:1.3;display:block;padding:3.5px 0;color:#8BA396;text-decoration:none;transition:color .13s ease} a.ef-door:hover{color:#35B183} .ef-held{color:#5E6E66} .ef-base{padding:1.9rem 0 3rem;display:flex;align-items:center;justify-content:space-between;gap:12px 24px;flex-wrap:wrap;font-size:.82rem;color:#8BA396} .ef-house{font-family:'Fira Code', ui-monospace, 'SF Mono', Menlo, Consolas, monospace;font-size:.78rem;display:flex;gap:14px;flex-wrap:wrap;align-items:center} .ef-house .ef-door{display:inline;padding:0} .ef-sep{opacity:.45} @media(max-width:520px){ .estate-footer .ef-cols{grid-template-columns:repeat(2,1fr);gap:1.8rem 18px} .estate-footer .ef-door{font-size:.78rem} .estate-footer .ef-ident{flex-direction:column} .estate-footer .ef-auth{width:100%} }
data.vin

the record layer

Data.vin

One VIN opens the full record.

Every fact about every car, cataloged: seven canonical addresses, one featured crosswalk, one batch product — posted coverage, posted license, posted price, keyed to the same seventeen characters.

01 · the catalog

The catalog.

Seven canonical addresses.

Vehicle recordvhr.vin/JM3KFBXY1S0597748

JM3KFBXY1S0597748

2025 Mazda CX-5

  • Title recordin the record
  • Odometer readingsin the record
  • Recall checkrecalls.vin
  • Window stickersticker.vin
  • Market valuesvalues.vin
Retailposts live
Private partyposts live
Trade-inposts live
Wholesaleposts live
Auctionposts live

Figures render live at the address. This page states structure, not prices.

02 · featured

Vindex.vin

The Rosetta Stone of automotive industry data.

One neutral YMMTS spine — year, make, model, trim, style — with every industry provider’s IDs and trim, style, color, and option codes cross-mapped between all of them. A provider’s ID is a sameAs edge on the spine, never a join key; every other row in this catalog joins through it.

A mapping posts only once verified, with its timestamp. Confidence is a number the buyer reads, not an adjective this page uses.

  • resolve(vin | provider:id) → the identity manifest: every known provider ID, each edge scored
  • Pairwise resolution — provider A’s ID to provider B’s, neutral and scored
  • Where the VIN bottoms out at pattern level, candidates enumerate with scores — never a silent pick
  • Coverage posted per provider pair, per model year, before purchase

vindex.vin

The identity manifestvindex.vin/{VIN}
// 200 · every provider's ID for one VIN, evidence-stated
{
  "type": "vindex.identity",
  "vin": "JM3KFBXY1S0597748",
  "spine": {
    "year": 2025, "make": "Mazda", "model": "CX-5",
    "trim": <resolved, or candidates with scores>,
    "style": <resolved, or candidates with scores>
  },
  "edges": [
    { "provider": <provider mark>, "id": <that provider's ID>,
      "confidence": <posted, 0–1>, "verified": <RFC 3339> }
  ],
  "coverage": <posted per provider pair, per model year>
}

03 · the batch product

Enrich.vin

Upload the file. The rows come back enriched.

CSV or XLSX, one VIN column. Every row returns with the VIN decoded and the record appended — year, make, model, trim, and the datasets the license names. The same capability runs as API and MCP through apis.vin.

enrich.vin

Batch enrichmentenrich.vin
  • ininventory.csv · one VIN column
  • outthe same file, every row appended: decode · the licensed datasets
  • viaupload at enrich.vin · API and MCP through apis.vin

Per-row price posts at the address — a number is posted or it is absent.

04 · the seam

What and how.

data.vin sells the catalog. apis.vin sells the key.

The WHAT data.vin

Coverage · license · posted price · the x402 per-VIN bundle. The manifest at data.vin/{VIN} states which datasets hold rows and prices the full record as one typed bundle. It renders no member’s face and is noindex by construction — the readings live at the member addresses.

The bundle composes the members’ posted prices; it never undercuts a member’s gate, and a bundle containing the history report credits per vhr.vin’s posted rule — the member’s rule, restated, never re-priced.

  • Freeread the catalog · quote any VIN$0
  • Startermetered · per-call price postedposts live
  • Growthmetered · volume tierposts live
  • Scalemetered · volume tierposts live
  • Bulk / firehosedataset licensing at portfolio scalepriced on paper

Bundles settle when the gate clears: the upstream data license must name catalog resale before any bundle settles; the manifest quotes today, free.

The HOW apis.vin

Key, SDK, quota, and MCP are apis.vin’s job — this page prices what it integrates. One MCP server for the whole platform: apis.vin/mcp. One account, every address: auth.vin.

Every paid action returns a typed, machine-readable offer — posted amount, x402 settlement, expiry — so the worst case is on paper before the first byte moves. An agent buying data reads this same page.

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 · B2A2D

curl https://data.vin/ -H 'accept: text/markdown'        → the markdown twin of this page
curl https://data.vin/{VIN} -H 'accept: application/json' → the record as typed evidence objects
curl https://data.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 MCP server for the whole platform — 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.