vehicle
The vehicle noun — identity, lifecycle, events, and every capability as an anchored section: 20 capabilities, 8 live, 12 sandbox, 0 declared.
vehicle is one of the estate's 317 automotive nouns — a job a car needs done. It carries 20 capabilities: 8 live, 12 sandbox, 0 declared · doors build.vin · data.vin · specs.vin · aggregator.vin.
Identity
| Noun | vehicle |
| Pillar | Data (facets: 11 data · 5 services · 4 commerce) |
| Capabilities | 20 — 8 live · 12 sandbox · 0 declared |
| Entities | Vehicle |
| Doors | aggregator.vin · build.vin · data.vin · specs.vin |
| SDK | Vin.vehicle.* from apis.vin |
| Address | /catalog/vehicle#{action} — the anchor IS the wire name minus vehicle. |
Lifecycle
Vehicle — VehicleLifecycle: 7 states, 7 transitions — Decoded · Owned · InService · Listed · Sold · OwnershipTransferred · Retired. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 13 past-tense, versioned event types, each linked to the capability that emits it:
Lease.disposed@1— emitted bydisposeOrder.placed@1— emitted byorderServiceOrder.settled@1— emitted byorderVehicle.acquired@1— emitted byacquireVehicle.assembled@1— emitted byassembleVehicle.builded@1— emitted bybuildVehicle.disposed@1— emitted bydisposeVehicle.invoiced@1— emitted byinvoiceVehicle.ordered@1— emitted byorderVehicle.retired@1— emitted byretireVehicle.sold@1— emitted bydisposeVehicle.staged@1— emitted bystageVehicle.transported@1— emitted bytransport
Discover & read
lookup
vehicle.lookup · GET /vehicles/lookup · gate none · live · answers VehicleLookup@1
Promoted — earned its own page: /catalog/vehicle.lookup (computed on every regen: live on the wire + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.lookup({"vin":"3GCUKDED9TG130308"})curl 'https://apis.vin/vehicles/lookup?vin=3GCUKDED9TG130308'decode
vehicle.decode · GET /vehicles/decode · gate none · live · answers VehicleDecode@1
Promoted — earned its own page: /catalog/vehicle.decode (computed on every regen: live on the wire + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | yes | length 11–17 |
squish | boolean | no | — |
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.decode({"vin":"3GCUKDED9TG130308"})curl 'https://apis.vin/vehicles/decode?vin=3GCUKDED9TG130308'spec
vehicle.spec · GET /vehicles/spec · gate none · live · answers VehicleSpec@1
Promoted — earned its own page: /catalog/vehicle.spec (computed on every regen: live on the wire + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.spec({"vin":"3GCUKDED9TG130308"})curl 'https://apis.vin/vehicles/spec?vin=3GCUKDED9TG130308'specs
vehicle.specs · GET /vehicles/specs · gate none · live · answers VehicleSpecs@1
Promoted — earned its own page: /catalog/vehicle.specs (computed on every regen: live on the wire + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | yes | — |
styleId | string | no | — |
Door — specs.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.specs({"vin":"3GCUKDED9TG130308"})curl 'https://apis.vin/vehicles/specs?vin=3GCUKDED9TG130308'history
vehicle.history · GET /vehicles/history · gate none · sandbox · answers VehicleHistory@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.history({"vin":"3GCUKDED9TG130308"})curl 'https://apis.vin/vehicles/history?vin=3GCUKDED9TG130308'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehicleHistory@1",
"value": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"history": {
"accident": false,
"titleBrands": [],
"events": []
}
},
"evidence": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"history": {
"accident": false,
"titleBrands": [],
"events": []
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}verify
vehicle.verify · GET /vehicles/verify · gate none · live · answers VehicleVerify@1
Promoted — earned its own page: /catalog/vehicle.verify (computed on every regen: live on the wire + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.verify({"vin":"3GCUKDED9TG130308"})curl 'https://apis.vin/vehicles/verify?vin=3GCUKDED9TG130308'locate
vehicle.locate · GET /vehicles/locate · gate none · sandbox · answers VehicleLocate@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.locate({"vin":"3GCUKDED9TG130308"})curl 'https://apis.vin/vehicles/locate?vin=3GCUKDED9TG130308'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehicleLocate@1",
"value": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"location": {
"site": "unknown-to-the-world"
}
},
"evidence": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"location": {
"site": "unknown-to-the-world"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}photoDecode
vehicle.photoDecode · GET /vehicles/photo-decode · gate none · sandbox · answers VehiclePhotoDecode@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.photoDecode()curl 'https://apis.vin/vehicles/photo-decode'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehiclePhotoDecode@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "vehicle",
"asOf": "2026-08-10",
"decoded": {
"vin": "1HGCM82633A004352",
"valid": true,
"squishVin": "1HGCM82633A",
"lifecycle": "Decoded",
"mileage": 32490,
"grade": "clean",
"titleBranded": false,
"titleBrands": [],
"disposition": "retail"
},
"confidence": 0.94
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "vehicle",
"asOf": "2026-08-10",
"decoded": {
"vin": "1HGCM82633A004352",
"valid": true,
"squishVin": "1HGCM82633A",
"lifecycle": "Decoded",
"mileage": 32490,
"grade": "clean",
"titleBranded": false,
"titleBrands": [],
"disposition": "retail"
},
"confidence": 0.94
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
order
vehicle.order · POST /vehicles/order · gate offer · sandbox · answers VehicleOrder@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Order.placed@1 · ServiceOrder.settled@1 · Vehicle.ordered@1.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.order({"vin":"3GCUKDED9TG130308"})curl -X POST https://apis.vin/vehicles/order \
-H 'content-type: application/json' \
-d '{"vin":"3GCUKDED9TG130308"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehicleOrder@1",
"value": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"order": {
"id": "FO-4e05193a",
"position": "Confirmed",
"allocationId": "ALC-cdf4a59c"
}
},
"evidence": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"order": {
"id": "FO-4e05193a",
"position": "Confirmed",
"allocationId": "ALC-cdf4a59c"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}stage
vehicle.stage · POST /vehicles/stage · gate offer · sandbox · answers VehicleStage@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Vehicle.staged@1.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.stage({"vin":"3GCUKDED9TG130308"})curl -X POST https://apis.vin/vehicles/stage \
-H 'content-type: application/json' \
-d '{"vin":"3GCUKDED9TG130308"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehicleStage@1",
"value": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"stage": {
"reconStage": "not-in-recon"
}
},
"evidence": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"stage": {
"reconStage": "not-in-recon"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
invoice
vehicle.invoice · POST /vehicles/invoice · gate offer · sandbox · answers VehicleInvoice@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Vehicle.invoiced@1.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.invoice({"vin":"3GCUKDED9TG130308"})curl -X POST https://apis.vin/vehicles/invoice \
-H 'content-type: application/json' \
-d '{"vin":"3GCUKDED9TG130308"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehicleInvoice@1",
"value": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"invoice": {
"id": "WI-0b7d59b1",
"amountCents": 6034121,
"msrpCents": 6513100,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"invoice": {
"id": "WI-0b7d59b1",
"amountCents": 6034121,
"msrpCents": 6513100,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
transport
vehicle.transport · POST /vehicles/transport · gate offer · sandbox · answers VehicleTransport@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Vehicle.transported@1.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.transport({"vin":"3GCUKDED9TG130308"})curl -X POST https://apis.vin/vehicles/transport \
-H 'content-type: application/json' \
-d '{"vin":"3GCUKDED9TG130308"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehicleTransport@1",
"value": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"transport": {
"phase": "Booked"
}
},
"evidence": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"transport": {
"phase": "Booked"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}build
vehicle.build · POST /vehicles/build · gate none · live · answers BuildRecord@1
Promoted — earned its own page: /catalog/vehicle.build (computed on every regen: live on the wire + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | yes | — |
Door — build.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.
Emits — Vehicle.builded@1.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.build({"vin":"3GCUKDED9TG130308"})curl -X POST https://apis.vin/vehicles/build \
-H 'content-type: application/json' \
-d '{"vin":"3GCUKDED9TG130308"}'assemble
vehicle.assemble · POST /vehicles/assemble · gate offer · sandbox · answers VehicleAssemble@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Vehicle.assembled@1.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.assemble({"vin":"3GCUKDED9TG130308"})curl -X POST https://apis.vin/vehicles/assemble \
-H 'content-type: application/json' \
-d '{"vin":"3GCUKDED9TG130308"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehicleAssemble@1",
"value": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"assembly": {
"status": "scheduled",
"id": "FO-4e05193a",
"position": "Allocated"
}
},
"evidence": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"assembly": {
"status": "scheduled",
"id": "FO-4e05193a",
"position": "Allocated"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
retire
vehicle.retire · POST /vehicles/retire · gate key · sandbox · answers VehicleRetire@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Vehicle.retired@1.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.retire()curl -X POST https://apis.vin/vehicles/retire \
-H 'content-type: application/json' \
-d '{}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehicleRetire@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "vehicle",
"asOf": "2026-08-10",
"retirement": {
"status": "refused",
"reason": "not-end-of-life-iron",
"disposition": "retail"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "vehicle",
"asOf": "2026-08-10",
"retirement": {
"status": "refused",
"reason": "not-end-of-life-iron",
"disposition": "retail"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}dispose
vehicle.dispose · POST /vehicles/dispose · gate key · sandbox · answers VehicleDispose@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Lease.disposed@1 · Vehicle.disposed@1 · Vehicle.sold@1.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.dispose()curl -X POST https://apis.vin/vehicles/dispose \
-H 'content-type: application/json' \
-d '{}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehicleDispose@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "vehicle",
"asOf": "2026-08-10",
"disposal": {
"channel": "retail-sale",
"donor": "not-a-donor",
"disposition": "retail"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "vehicle",
"asOf": "2026-08-10",
"disposal": {
"channel": "retail-sale",
"donor": "not-a-donor",
"disposition": "retail"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [
"Lease.disposed@1",
"Vehicle.sold@1"
],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
acquire
vehicle.acquire · POST /vehicles/acquire · gate offer · sandbox · answers VehicleAcquire@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
Emits — Vehicle.acquired@1.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.acquire({"vin":"3GCUKDED9TG130308"})curl -X POST https://apis.vin/vehicles/acquire \
-H 'content-type: application/json' \
-d '{"vin":"3GCUKDED9TG130308"}'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehicleAcquire@1",
"value": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"acquisition": {
"status": "acquired",
"costCents": 1850000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"acquisition": {
"status": "acquired",
"costCents": 1850000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}enrich
vehicle.enrich · GET /vehicles/enrich · gate none · live · answers VehicleEnrich@1
Promoted — earned its own page: /catalog/vehicle.enrich (computed on every regen: live on the wire + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.enrich({"vin":"3GCUKDED9TG130308"})curl 'https://apis.vin/vehicles/enrich?vin=3GCUKDED9TG130308'identify
vehicle.identify · GET /vehicles/identify · gate none · live · answers VehicleIdentify@1
Promoted — earned its own page: /catalog/vehicle.identify (computed on every regen: live on the wire + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — live: answers on the wire today. A sandbox key still selects the deterministic simulated mode — drive the full outcome range with the magic triggers.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.identify({"vin":"3GCUKDED9TG130308"})curl 'https://apis.vin/vehicles/identify?vin=3GCUKDED9TG130308'provenance
vehicle.provenance · GET /vehicles/provenance · gate none · sandbox · answers VehicleProvenance@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — data.vin serves this noun on its two routes: / (the landing) · /3GCUKDED9TG130308 (the VIN lens).
Try it — sandbox: every call answers a deterministic, provenance-labeled simulated payload ({ environment, simulated } in the body). Force any documented outcome with the magic triggers. Going live is a connect, never a ballot: submit the credential at integrates.vin (dealer systems) or connects.vin (consumer accounts) — submissions enter the activation queue and rank live rollout.
import { vehicle } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.provenance({"vin":"3GCUKDED9TG130308"})curl 'https://apis.vin/vehicles/provenance?vin=3GCUKDED9TG130308'Receipt — the sandbox wire answered the request above with this exact body at build time. Captured by the receipts runner (timestamped, provenance in the payload), never authored; it re-executes only when this descriptor changes.
{
"type": "OK",
"answers": "VehicleProvenance@1",
"value": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"provenance": {
"chain": [],
"links": 0
}
},
"evidence": {
"vin": "3GCUKDED9TG130308",
"noun": "vehicle",
"asOf": "2026-08-10",
"provenance": {
"chain": [],
"links": 0
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "oem-factory-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Data model
The record shape behind this noun — one entity, each property an evidence field. See the whole estate model on the data model page.
Vehicle
Schema
| Property | Type | Notes |
|---|---|---|
vehicleId | id | vehicle_sqid |
vin | string | sameAs alias, 17ch |
year | int | — |
make | string | — |
model | string | — |
trim | string | — |
bodyStyle | string | — |
drivetrain | enum | — |
engine | string | — |
transmission | string | — |
exteriorColor | string | — |
interiorColor | string | — |
odometer | int | — |
condition | enum | — |
status | VehicleLifecycle | — |
currentOwnerId | ref→Party | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
vehicle | title | 1:0..1 | titled |
vehicle | registration | 1:0..* | registered |
vehicle | listing | 1:0..* | listed |
vehicle | inventory | 1:0..1 | stocked |
vehicle | inspection | 1:0..* | inspected |
vehicle | order | 1:0..* | serviced |
vehicle | vehicleRecord | 1:0..* | record folds |
deal | vehicle | *:1 | subject |
insuranceClaim | vehicle | *:1 | on |
Modeled
The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. 3 diagrams, rendered from the estate model.
Vehicle · Class model
Vehicle · State machine
Vehicle · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.