part
The part noun — identity, lifecycle, events, and every capability as an anchored section: 37 capabilities, 0 live, 37 sandbox, 0 declared.
part is one of the estate's 317 automotive nouns — a job a car needs done. It carries 37 capabilities: 0 live, 37 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | part |
| Pillar | Data (facets: 17 data · 9 services · 11 commerce) |
| Capabilities | 37 — 0 live · 37 sandbox · 0 declared |
| Entities | Part |
| Doors | aggregator.vin |
| SDK | Vin.part.* from apis.vin |
| Address | /catalog/part#{action} — the anchor IS the wire name minus part. |
Lifecycle
Part — PartFSM: 7 states, 7 transitions — Ordered · Backordered · Stocked · Picked · Staged · Installed · Returned. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 50 past-tense, versioned event types, each linked to the capability that emits it:
Order.placed@1— emitted byorderPart.backorderRequested@1— emitted bybackorderPart.backordered@1— emitted bybackorderPart.charged@1— emitted bypayPart.completed@1— emitted byorderPart.coreChargeRequested@1— emitted bycoreChargePart.coreCharged@1— emitted bycoreChargePart.coreReturnRequested@1— emitted bycoreReturnPart.coreReturned@1— emitted bycoreReturnPart.cycleCountRequested@1— emitted bycycleCountPart.cycleCounted@1— emitted bycycleCountPart.dispatched@1— emitted byorderPart.expediteRequested@1— emitted byexpeditePart.expedited@1— emitted byexpeditePart.installFailed@1— emitted byinstallPart.installRequested@1— emitted byinstallPart.installed@1— emitted byinstallPart.invoiceFailed@1— emitted byinvoicePart.invoiceRequested@1— emitted byinvoicePart.invoiced@1— emitted byinvoicePart.matrixPriced@1— emitted bymatrixPricePart.oeDecoded@1— emitted byoeDecodePart.ordered@1— emitted byorderPart.paid@1— emitted bypayPart.payFailed@1— emitted bypayPart.payRequested@1— emitted bypayPart.perpetualInventoried@1— emitted byperpetualInventoryPart.pickRequested@1— emitted bypickPart.picked@1— emitted bypickPart.quoteRequested@1— emitted byquotePart.quoted@1— emitted byquotePart.refundFailed@1— emitted byrefundPart.refundRequested@1— emitted byrefundPart.refunded@1— emitted byrefundPart.returnRequested@1— emitted byreturnPart.returned@1— emitted byreturnPart.stageRequested@1— emitted bystagePart.staged@1— emitted bystagePart.stockRequested@1— emitted bystockPart.stocked@1— emitted bystockPart.subscribed@1— emitted bysubscribePart.transferFailed@1— emitted bytransferPart.transferRequested@1— emitted bytransferPart.transferred@1— emitted bytransferPart.warrantyReturnRequested@1— emitted bywarrantyReturnPart.warrantyReturned@1— emitted bywarrantyReturnPart.wholesalePriced@1— emitted bywholesalePriceRepairOrder.partsOrdered@1— emitted byorderRepairOrder.partsReceived@1— emitted byorderServiceOrder.settled@1— emitted byorder·pay
Discover & read
lookup
part.lookup · GET /parts/lookup · gate none · sandbox · answers PartLookup@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.lookup({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/lookup?vin=KNDPVCAG3P7076312'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": "PartLookup@1",
"value": {
"partNumber": "PN-000000",
"description": "Filter assembly",
"category": "electrical",
"source": "oe",
"unitPriceCents": 14363,
"currency": "USD"
},
"evidence": {
"partNumber": "PN-000000",
"description": "Filter assembly",
"category": "electrical",
"source": "oe",
"unitPriceCents": 14363,
"currency": "USD"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "services-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}spec
part.spec · GET /parts/spec · gate none · sandbox · answers PartSpec@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.spec({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/spec?vin=KNDPVCAG3P7076312'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": "PartSpec@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "spec",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "spec",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}history
part.history · GET /parts/history · gate none · sandbox · answers PartHistory@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.history({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/history?vin=KNDPVCAG3P7076312'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": "PartHistory@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"verdict": "pass",
"events": [
{
"date": "2024-03-14",
"kind": "maintenance",
"description": "scheduled replacement component service"
}
],
"count": 1
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"verdict": "pass",
"events": [
{
"date": "2024-03-14",
"kind": "maintenance",
"description": "scheduled replacement component service"
}
],
"count": 1
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}availability
part.availability · GET /parts/availability · gate none · sandbox · answers PartAvailability@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
partNumber | string | no | OEM/aftermarket part number — the PartsCatalog SKU the price/availability/supersession lookup keys on. |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.availability({"vin":"KNDPVCAG3P7076312","partNumber":"partnumber"})curl 'https://apis.vin/parts/availability?vin=KNDPVCAG3P7076312&partNumber=partnumber'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": "PartAvailability@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"onHand": 9,
"binLocation": "B-33",
"status": "counted"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"onHand": 9,
"binLocation": "B-33",
"status": "counted"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}fitment
part.fitment · GET /parts/fitment · gate none · sandbox · answers PartFitment@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.fitment({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/fitment?vin=KNDPVCAG3P7076312'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": "PartFitment@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"partNumber": "PN-000000",
"fits": false,
"notes": "check trim/engine variant"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"partNumber": "PN-000000",
"fits": false,
"notes": "check trim/engine variant"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "services-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}diagramLookup
part.diagramLookup · GET /parts/diagram-lookup · gate none · sandbox · answers PartDiagramLookup@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.diagramLookup({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/diagram-lookup?vin=KNDPVCAG3P7076312'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": "PartDiagramLookup@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "diagramLookup",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe",
"diagramRef": "DG-b924c2d8"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "diagramLookup",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe",
"diagramRef": "DG-b924c2d8"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}oeDecode
part.oeDecode · GET /parts/oe-decode · gate none · sandbox · answers PartOeDecode@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.oeDecoded@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.oeDecode({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/oe-decode?vin=KNDPVCAG3P7076312'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": "PartOeDecode@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "oeDecode",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "oeDecode",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}stockCheck
part.stockCheck · GET /parts/stock-check · gate none · sandbox · answers PartStockCheck@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.stockCheck({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/stock-check?vin=KNDPVCAG3P7076312'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": "PartStockCheck@1",
"value": {
"partNumber": "PN-000000",
"onHand": 12,
"available": 12,
"backordered": false,
"location": "C-07"
},
"evidence": {
"partNumber": "PN-000000",
"onHand": 12,
"available": 12,
"backordered": false,
"location": "C-07"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "services-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}aftermarketMatch
part.aftermarketMatch · GET /parts/aftermarket-match · gate none · sandbox · answers PartAftermarketMatch@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.aftermarketMatch({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/aftermarket-match?vin=KNDPVCAG3P7076312'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": "PartAftermarketMatch@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "aftermarketMatch",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "aftermarket"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "aftermarketMatch",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "aftermarket"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
quote
part.quote · POST /parts/quote · gate offer · sandbox · answers PartQuote@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.quoteRequested@1 · Part.quoted@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.quote({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/quote \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartQuote@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"verdict": "pass",
"band": "pass",
"quoteId": "PQ-1bb9f8fd",
"partNumber": "P-970c72fa",
"subtotalCents": 24000,
"partSource": "aftermarket",
"currency": "USD"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"verdict": "pass",
"band": "pass",
"quoteId": "PQ-1bb9f8fd",
"partNumber": "P-970c72fa",
"subtotalCents": 24000,
"partSource": "aftermarket",
"currency": "USD"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}price
part.price · GET /parts/price · gate none · sandbox · answers PartPrice@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.price({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/price?vin=KNDPVCAG3P7076312'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": "PartPrice@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"unitPriceCents": 24000,
"currency": "USD",
"priceLevel": "retail"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"unitPriceCents": 24000,
"currency": "USD",
"priceLevel": "retail"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}priceLookup
part.priceLookup · GET /parts/price-lookup · gate none · sandbox · answers PartPriceLookup@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
partNumber | string | no | OEM/aftermarket part number — the PartsCatalog SKU the price/availability/supersession lookup keys on. |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.priceLookup({"vin":"KNDPVCAG3P7076312","partNumber":"partnumber"})curl 'https://apis.vin/parts/price-lookup?vin=KNDPVCAG3P7076312&partNumber=partnumber'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": "BLOCKED",
"reason": "RAIL_FAULT",
"message": "part.priceLookup — the estimator sandbox has no seeded answer for the given input (unknown-part)",
"events": [],
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "sandbox"
}
}matrixPrice
part.matrixPrice · POST /parts/matrix-price · gate offer · sandbox · answers PartMatrixPrice@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.matrixPriced@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.matrixPrice({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/matrix-price \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartMatrixPrice@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"unitPriceCents": 24000,
"currency": "USD",
"priceLevel": "matrix"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"unitPriceCents": 24000,
"currency": "USD",
"priceLevel": "matrix"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}wholesalePrice
part.wholesalePrice · POST /parts/wholesale-price · gate offer · sandbox · answers PartWholesalePrice@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.wholesalePriced@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.wholesalePrice({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/wholesale-price \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartWholesalePrice@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"unitPriceCents": 16800,
"currency": "USD",
"priceLevel": "wholesale"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"unitPriceCents": 16800,
"currency": "USD",
"priceLevel": "wholesale"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
order
part.order · POST /parts/order · gate offer · sandbox · answers PartOrder@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 · Part.completed@1 · Part.dispatched@1 · Part.ordered@1 · RepairOrder.partsOrdered@1 · RepairOrder.partsReceived@1 · ServiceOrder.settled@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.order({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/order \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartOrder@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"order": {
"id": "ORD-56ad2ddd",
"item": "replacement component",
"status": "placed",
"amountCents": 24000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"order": {
"id": "ORD-56ad2ddd",
"item": "replacement component",
"status": "placed",
"amountCents": 24000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [
"RepairOrder.partsOrdered@1"
],
"meter": {
"charged": "0.00",
"posted": false
}
}subscribe
part.subscribe · POST /parts/subscribe · gate key · sandbox · answers PartSubscribe@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.subscribed@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.subscribe()curl -X POST https://apis.vin/parts/subscribe \
-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": "PartSubscribe@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "part",
"asOf": "2026-08-10",
"subscription": {
"id": "SB-007f6ce3",
"topic": "part-availability",
"status": "active"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "part",
"asOf": "2026-08-10",
"subscription": {
"id": "SB-007f6ce3",
"topic": "part-availability",
"status": "active"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}stage
part.stage · POST /parts/stage · gate offer · sandbox · answers PartStage@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.stageRequested@1 · Part.staged@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.stage({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/stage \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartStage@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"movement": {
"id": "MV-290f9d37",
"operation": "stage",
"status": "completed"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"movement": {
"id": "MV-290f9d37",
"operation": "stage",
"status": "completed"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}backorder
part.backorder · POST /parts/backorder · gate offer · sandbox · answers PartBackorder@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.backorderRequested@1 · Part.backordered@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.backorder({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/backorder \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartBackorder@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"status": "backordered",
"etaDays": 4
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"status": "backordered",
"etaDays": 4
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
part.pay · POST /parts/pay · gate offer · sandbox · answers PartPay@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.charged@1 · Part.paid@1 · Part.payFailed@1 · Part.payRequested@1 · ServiceOrder.settled@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.pay({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/pay \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartPay@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-5dc0c0ab",
"status": "settled",
"amountCents": 24000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-5dc0c0ab",
"status": "settled",
"amountCents": 24000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}invoice
part.invoice · POST /parts/invoice · gate offer · sandbox · answers PartInvoice@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.invoiceFailed@1 · Part.invoiceRequested@1 · Part.invoiced@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.invoice({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/invoice \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartInvoice@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"invoice": {
"id": "INV-b1660fd2",
"status": "issued",
"amountCents": 24000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"invoice": {
"id": "INV-b1660fd2",
"status": "issued",
"amountCents": 24000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}refund
part.refund · POST /parts/refund · gate offer · sandbox · answers PartRefund@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.refundFailed@1 · Part.refundRequested@1 · Part.refunded@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.refund({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/refund \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartRefund@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"refund": {
"id": "RF-9cd7a789",
"kind": "return",
"status": "issued",
"amountCents": 24000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"refund": {
"id": "RF-9cd7a789",
"kind": "return",
"status": "issued",
"amountCents": 24000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}coreCharge
part.coreCharge · POST /parts/core-charge · gate offer · sandbox · answers PartCoreCharge@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.coreChargeRequested@1 · Part.coreCharged@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.coreCharge({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/core-charge \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartCoreCharge@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"fee": {
"kind": "core-deposit",
"amountCents": 3500,
"currency": "USD",
"status": "charged"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"fee": {
"kind": "core-deposit",
"amountCents": 3500,
"currency": "USD",
"status": "charged"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
install
part.install · POST /parts/install · gate offer · sandbox · answers PartInstall@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.installFailed@1 · Part.installRequested@1 · Part.installed@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.install({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/install \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartInstall@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"verdict": "pass",
"workOrder": {
"id": "WO-c4acccba",
"operation": "install",
"status": "scheduled",
"costCents": 12000,
"currency": "USD"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"verdict": "pass",
"workOrder": {
"id": "WO-c4acccba",
"operation": "install",
"status": "scheduled",
"costCents": 12000,
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
transfer
part.transfer · POST /parts/transfer · gate offer · sandbox · answers PartTransfer@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.transferFailed@1 · Part.transferRequested@1 · Part.transferred@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.transfer({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/transfer \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartTransfer@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"movement": {
"id": "MV-e3cc4590",
"operation": "transfer",
"status": "completed"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"movement": {
"id": "MV-e3cc4590",
"operation": "transfer",
"status": "completed"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}return
part.return · POST /parts/return · gate offer · sandbox · answers PartReturn@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.returnRequested@1 · Part.returned@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.return({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/return \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartReturn@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"refund": {
"id": "RF-10bdba29",
"kind": "return",
"status": "issued",
"amountCents": 24000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"refund": {
"id": "RF-10bdba29",
"kind": "return",
"status": "issued",
"amountCents": 24000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}coreReturn
part.coreReturn · POST /parts/core-return · gate offer · sandbox · answers PartCoreReturn@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.coreReturnRequested@1 · Part.coreReturned@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.coreReturn({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/core-return \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartCoreReturn@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"refund": {
"id": "RF-ed315096",
"kind": "core-deposit",
"status": "issued",
"amountCents": 3500,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"refund": {
"id": "RF-ed315096",
"kind": "core-deposit",
"status": "issued",
"amountCents": 3500,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}warrantyReturn
part.warrantyReturn · POST /parts/warranty-return · gate offer · sandbox · answers PartWarrantyReturn@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.warrantyReturnRequested@1 · Part.warrantyReturned@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.warrantyReturn({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/warranty-return \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartWarrantyReturn@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"return": {
"id": "WR-2832495a",
"decision": "accepted"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"return": {
"id": "WR-2832495a",
"decision": "accepted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
crossReference
part.crossReference · GET /parts/cross-reference · gate none · sandbox · answers PartCrossReference@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.crossReference({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/cross-reference?vin=KNDPVCAG3P7076312'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": "PartCrossReference@1",
"value": {
"partNumber": "PN-000000",
"equivalents": [
{
"source": "oe",
"number": "PN-000000"
},
{
"source": "aftermarket",
"number": "X189925"
}
]
},
"evidence": {
"partNumber": "PN-000000",
"equivalents": [
{
"source": "oe",
"number": "PN-000000"
},
{
"source": "aftermarket",
"number": "X189925"
}
]
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "services-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}cycleCount
part.cycleCount · POST /parts/cycle-count · gate offer · sandbox · answers PartCycleCount@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.cycleCountRequested@1 · Part.cycleCounted@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.cycleCount({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/cycle-count \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartCycleCount@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"onHand": 12,
"binLocation": "B-33",
"status": "counted"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"onHand": 12,
"binLocation": "B-33",
"status": "counted"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}diagram
part.diagram · GET /parts/diagram · gate none · sandbox · answers PartDiagram@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.diagram({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/diagram?vin=KNDPVCAG3P7076312'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": "PartDiagram@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "diagram",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe",
"diagramRef": "DG-b924c2d8"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "diagram",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe",
"diagramRef": "DG-b924c2d8"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}expedite
part.expedite · POST /parts/expedite · gate offer · sandbox · answers PartExpedite@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.expediteRequested@1 · Part.expedited@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.expedite({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/expedite \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartExpedite@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"status": "expedited",
"etaDays": 2
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"status": "expedited",
"etaDays": 2
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}fits
part.fits · GET /parts/fits · gate none · sandbox · answers PartFits@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.fits({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/fits?vin=KNDPVCAG3P7076312'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": "PartFits@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "fits",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "fits",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}image
part.image · GET /parts/image · gate none · sandbox · answers PartImage@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.image({"vin":"KNDPVCAG3P7076312"})curl 'https://apis.vin/parts/image?vin=KNDPVCAG3P7076312'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": "PartImage@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "image",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe",
"imageRef": "IMG-5a0bfc20"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"lookup": "image",
"partNumber": "P-970c72fa",
"component": "replacement component",
"fits": true,
"partSource": "oe",
"imageRef": "IMG-5a0bfc20"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}perpetualInventory
part.perpetualInventory · POST /parts/perpetual-inventory · gate key · sandbox · answers PartPerpetualInventory@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.perpetualInventoried@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.perpetualInventory()curl -X POST https://apis.vin/parts/perpetual-inventory \
-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": "PartPerpetualInventory@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-75699500",
"onHand": 8,
"binLocation": "B-7",
"status": "counted"
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-75699500",
"onHand": 8,
"binLocation": "B-7",
"status": "counted"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}pick
part.pick · POST /parts/pick · gate offer · sandbox · answers PartPick@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.pickRequested@1 · Part.picked@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.pick({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/pick \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartPick@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"movement": {
"id": "MV-df98f56e",
"operation": "pick",
"status": "completed"
}
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"movement": {
"id": "MV-df98f56e",
"operation": "pick",
"status": "completed"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}stock
part.stock · POST /parts/stock · gate offer · sandbox · answers PartStock@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 — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 — Part.stockRequested@1 · Part.stocked@1.
import { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.stock({"vin":"KNDPVCAG3P7076312"})curl -X POST https://apis.vin/parts/stock \
-H 'content-type: application/json' \
-d '{"vin":"KNDPVCAG3P7076312"}'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": "PartStock@1",
"value": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"onHand": 4,
"binLocation": "B-33",
"status": "counted"
},
"evidence": {
"vin": "KNDPVCAG3P7076312",
"noun": "part",
"asOf": "2026-08-10",
"partNumber": "P-970c72fa",
"onHand": 4,
"binLocation": "B-33",
"status": "counted"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}supersession
part.supersession · GET /parts/supersession · gate none · sandbox · answers PartSupersession@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
partNumber | string | no | OEM/aftermarket part number — the PartsCatalog SKU the price/availability/supersession lookup keys on. |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /KNDPVCAG3P7076312 (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 { part } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await part.supersession({"vin":"KNDPVCAG3P7076312","partNumber":"partnumber"})curl 'https://apis.vin/parts/supersession?vin=KNDPVCAG3P7076312&partNumber=partnumber'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": "BLOCKED",
"reason": "RAIL_FAULT",
"message": "part.supersession — the estimator sandbox has no seeded answer for the given input (unknown-part)",
"events": [],
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "sandbox"
}
}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.
Part
Schema
| Property | Type | Notes |
|---|---|---|
id | id | part_ |
partNumber | string | — |
vin | string | — |
repairOrderId | ref→RepairOrder | — |
price | money | — |
status | PartFSM | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
part | repairOrder | *:0..1 | fulfills |
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.
parking
The parking noun — identity, lifecycle, events, and every capability as an anchored section: 14 capabilities, 0 live, 14 sandbox, 0 declared.
partCatalog
The partCatalog noun — identity, lifecycle, events, and every capability as an anchored section: 10 capabilities, 0 live, 10 sandbox, 0 declared.