docs.vin

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

Nounvehicle
PillarData (facets: 11 data · 5 services · 4 commerce)
Capabilities20 — 8 live · 12 sandbox · 0 declared
EntitiesVehicle
Doorsaggregator.vin · build.vin · data.vin · specs.vin
SDKVin.vehicle.* from apis.vin
Address/catalog/vehicle#{action} — the anchor IS the wire name minus vehicle.

Lifecycle

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

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).

FieldTypeRequiredNotes
vinstringno

Doordata.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.

the SDK — vehicle.lookup
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"})
GET /vehicles/lookup
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).

FieldTypeRequiredNotes
vinstringyeslength 11–17
squishbooleanno

Doordata.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.

the SDK — vehicle.decode
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"})
GET /vehicles/decode
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).

FieldTypeRequiredNotes
vinstringno

Doordata.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.

the SDK — vehicle.spec
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"})
GET /vehicles/spec
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).

FieldTypeRequiredNotes
vinstringyes
styleIdstringno

Doorspecs.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.

the SDK — vehicle.specs
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"})
GET /vehicles/specs
curl 'https://apis.vin/vehicles/specs?vin=3GCUKDED9TG130308'

history

vehicle.history · GET /vehicles/history · gate none · sandbox · answers VehicleHistory@1

FieldTypeRequiredNotes
vinstringno

Doordata.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.

the SDK — vehicle.history
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"})
GET /vehicles/history
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.

receipt · executed 2026-08-17T12:42:18.788Z · HTTP 200
{
  "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).

FieldTypeRequiredNotes
vinstringno

Doordata.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.

the SDK — vehicle.verify
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"})
GET /vehicles/verify
curl 'https://apis.vin/vehicles/verify?vin=3GCUKDED9TG130308'

locate

vehicle.locate · GET /vehicles/locate · gate none · sandbox · answers VehicleLocate@1

FieldTypeRequiredNotes
vinstringno

Doordata.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.

the SDK — vehicle.locate
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"})
GET /vehicles/locate
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.

receipt · executed 2026-08-17T12:42:18.797Z · HTTP 200
{
  "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.

Dooraggregator.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.

the SDK — vehicle.photoDecode
import { vehicle } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.photoDecode()
GET /vehicles/photo-decode
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.

receipt · executed 2026-08-16T14:50:10.086Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doordata.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.

EmitsOrder.placed@1 · ServiceOrder.settled@1 · Vehicle.ordered@1.

the SDK — vehicle.order
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"})
POST /vehicles/order
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.

receipt · executed 2026-08-17T12:42:18.807Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doordata.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.

EmitsVehicle.staged@1.

the SDK — vehicle.stage
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"})
POST /vehicles/stage
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.

receipt · executed 2026-08-17T12:42:18.807Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doordata.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.

EmitsVehicle.invoiced@1.

the SDK — vehicle.invoice
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"})
POST /vehicles/invoice
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.

receipt · executed 2026-08-17T12:42:18.797Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doordata.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.

EmitsVehicle.transported@1.

the SDK — vehicle.transport
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"})
POST /vehicles/transport
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.

receipt · executed 2026-08-17T12:42:18.807Z · HTTP 200
{
  "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).

FieldTypeRequiredNotes
vinstringyes

Doorbuild.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.

EmitsVehicle.builded@1.

the SDK — vehicle.build
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"})
POST /vehicles/build
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

FieldTypeRequiredNotes
vinstringno

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.

Doordata.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.

EmitsVehicle.assembled@1.

the SDK — vehicle.assemble
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"})
POST /vehicles/assemble
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.

receipt · executed 2026-08-17T12:42:18.788Z · HTTP 200
{
  "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.

Dooraggregator.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.

EmitsVehicle.retired@1.

the SDK — vehicle.retire
import { vehicle } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.retire()
POST /vehicles/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.

receipt · executed 2026-08-16T14:50:10.086Z · HTTP 200
{
  "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.

Dooraggregator.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.

EmitsLease.disposed@1 · Vehicle.disposed@1 · Vehicle.sold@1.

the SDK — vehicle.dispose
import { vehicle } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await vehicle.dispose()
POST /vehicles/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.

receipt · executed 2026-08-16T14:50:10.085Z · HTTP 200
{
  "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

FieldTypeRequiredNotes
vinstringno

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.

Doordata.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.

EmitsVehicle.acquired@1.

the SDK — vehicle.acquire
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"})
POST /vehicles/acquire
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.

receipt · executed 2026-08-17T12:42:18.771Z · HTTP 200
{
  "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).

FieldTypeRequiredNotes
vinstringno

Doordata.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.

the SDK — vehicle.enrich
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"})
GET /vehicles/enrich
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).

FieldTypeRequiredNotes
vinstringno

Doordata.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.

the SDK — vehicle.identify
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"})
GET /vehicles/identify
curl 'https://apis.vin/vehicles/identify?vin=3GCUKDED9TG130308'

provenance

vehicle.provenance · GET /vehicles/provenance · gate none · sandbox · answers VehicleProvenance@1

FieldTypeRequiredNotes
vinstringno

Doordata.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.

the SDK — vehicle.provenance
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"})
GET /vehicles/provenance
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.

receipt · executed 2026-08-17T12:42:18.807Z · HTTP 200
{
  "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

PropertyTypeNotes
vehicleIdidvehicle_sqid
vinstringsameAs alias, 17ch
yearint
makestring
modelstring
trimstring
bodyStylestring
drivetrainenum
enginestring
transmissionstring
exteriorColorstring
interiorColorstring
odometerint
conditionenum
statusVehicleLifecycle
currentOwnerIdref→Party

Relationships

FromToCardinalityAs
vehicletitle1:0..1titled
vehicleregistration1:0..*registered
vehiclelisting1:0..*listed
vehicleinventory1:0..1stocked
vehicleinspection1:0..*inspected
vehicleorder1:0..*serviced
vehiclevehicleRecord1:0..*record folds
dealvehicle*:1subject
insuranceClaimvehicle*:1on

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.