docs.vin

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:

POST /keys — anonymous, instant
curl -X POST https://apis.vin/keys

The 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:

the SDK
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:

the CLI
vin vehicle.decode --vin JM3KFBXY1S0597748
vin catalog
vin deal.open --vin JM3KFBXY1S0597748

Anonymous 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 triosearch · 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.