Chassis
The machinery every capability rides — keys, pricing, the acceptance suite, the SDK, the CLI, and the MCP server.
The chassis is the machinery every capability shares. A capability is a descriptor; the chassis is how you authenticate to it, pay for it, prove it, and call it from code.
Keys
One package (apis.vin), one key, no account wall. POST /keys mints an
anonymous sandbox key over the wire — no email, no approval:
curl -X POST https://apis.vin/keysThe key is returned once and stored only as a hash. Introspect it at
GET /keys/me. The free data faces answer with no key at all; a key adds account
context and metering, never a lockout. See
the precision ladder.
Pricing
Every posted price lives on the capability's own catalog row and in the pricing
surface at apis.vin/pricing — the descriptor and
the meter are the same bytes, so the quoted price and the charged price cannot
drift. This site links to /pricing and never restates figures. Where a price is
not yet set, the row says declared and points at /pricing rather than
inventing a number.
Price follows the facet: Data is free at the door and metered for precision; Services carries a take-rate on the dispatched work; Commerce is flat fees and take-rates on the deal, gated by settlement, never by signup.
The acceptance suite
A row is live only when its RED acceptance suite is green — and the suite is
authored before the capability. The suite, not the surface, grades
completeness. It is published, digest-pinned, at apis.vin/suite.json, so a
caller can verify what "live" means rather than take it on faith. This is why the
status on every row is trustworthy: it
is a test result, not a claim.
The SDK
The typed client is generated from the catalog. It reads the way the catalog is
shaped — noun.verb, real names:
import { vehicle, transport, deal } from 'apis.vin'
// Data — know it
const spec = await vehicle.decode({ vin: 'JM3KFBXY1S0597748' })
// Services — do it (quote is a read; order is the priced act)
const quote = await transport.quote({ vin: 'JM3KFBXY1S0597748', from: '94103', to: '90210' })
// Commerce — transact it
const opened = await deal.open({ workflow: 'buy', vin: 'JM3KFBXY1S0597748' })Every noun is a tree-shakeable named export; workflows export as top-level
functions of their camel-folded id (import { sellTrade } from 'apis.vin').
The gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer,
so a caller must handle a 402 OFFER to read the value. CapabilityName is a
generated union, so a typo fails at compile, not in production.
The CLI
vin is the same catalog on the command line — every capability is a verb:
vin vehicle.decode --vin JM3KFBXY1S0597748
vin catalog
vin deal.open --vin JM3KFBXY1S0597748Anonymous with no key set; VIN_API_KEY (or APIS_VIN_KEY) selects the keyed
rung. Every call prints the typed Answer.
The MCP server
The estate MCP server at apis.vin/mcp is a code-mode trio — search ·
fetch · exec — not a sprawling tool menu:
- search the catalog for the right capability.
- fetch a descriptor or a record.
- exec agent-written TypeScript against the same digest-pinned SDK, inside
a sandboxed isolate with no ambient authority. Gates survive as typed
Answer<T>values, and the acceptance suite runs in the same isolate.
One server, three verbs, the whole catalog — because the catalog is the product and the MCP server is one more representation of it.
Next
- Start — one keyless curl, then the five pillar on-ramps.
- The catalog — every capability the SDK, CLI, and MCP expose.
- The act — the gate law the SDK types.