deal
The deal noun — identity, lifecycle, events, and every capability as an anchored section: 24 capabilities, 0 live, 24 sandbox, 0 declared.
deal is one of the estate's 317 automotive nouns — a job a car needs done. It carries 24 capabilities: 0 live, 24 sandbox, 0 declared · doors buy.vin · aggregator.vin · desking.vin.
Identity
| Noun | deal |
| Pillar | Services (facets: 8 data · 10 services · 6 commerce) |
| Capabilities | 24 — 0 live · 24 sandbox · 0 declared |
| Entities | Deal |
| Doors | aggregator.vin · buy.vin · desking.vin |
| SDK | Vin.deal.* from apis.vin |
| Address | /catalog/deal#{action} — the anchor IS the wire name minus deal. |
Lifecycle
Deal — DealLifecycle: 12 states, 14 transitions — QUOTED · CREDIT_PENDING · DESKED · CONTRACTED · FUNDED · IN_FULFILLMENT · DELIVERED · CLOSED · ON_HOLD · CANCELLED · UNWOUND · DECLINED. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 27 past-tense, versioned event types, each linked to the capability that emits it:
Deal.advanced@1— emitted byopenDeal.buyersOrderIssued@1— emitted bybuyersOrderDeal.canceled@1— emitted byopenDeal.contingencySet@1— emitted bycontingencyDeal.dependencyLinked@1— emitted bylinkDeal.desked@1— emitted bydeskDeal.failed@1— emitted byfinalize·fund·open·quote·rescind·unwindDeal.finalized@1— emitted byfinalizeDeal.funded@1— emitted byfundDeal.held@1— emitted byopenDeal.linked@1— emitted byopenDeal.onlineCheckedOut@1— emitted byonlineCheckoutDeal.opened@1— emitted byopenDeal.quoted@1— emitted byquoteDeal.reContracted@1— emitted byspotDeliverDeal.rehashed@1— emitted byrehashDeal.repriced@1— emitted byrepriceDeal.rescinded@1— emitted byrescindDeal.resumed@1— emitted byresumeDeal.settled@1— emitted byfinalize·openDeal.spotDelivered@1— emitted byspotDeliverDeal.structured@1— emitted bystructureDeal.unwound@1— emitted byunwindDeal.yoyoUnwindProtected@1— emitted byyoyoUnwindProtectLien.unwound@1— emitted byrescind·unwindPayment.refunded@1— emitted byrescind·unwindProtectionProduct.canceled@1— emitted byrescind·unwind
Discover & read
read
deal.read · GET /deals/read · gate none · sandbox · answers DealRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.read({"vin":"1C4HJXEN4LW202273"})curl 'https://apis.vin/deals/read?vin=1C4HJXEN4LW202273'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": "DealRead@1",
"value": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"deal": {
"id": "DL-ef6558d1",
"position": "QUOTED",
"orderId": "ORD-e54ea3d9",
"askingCents": 2300000,
"currency": "USD"
}
},
"evidence": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"deal": {
"id": "DL-ef6558d1",
"position": "QUOTED",
"orderId": "ORD-e54ea3d9",
"askingCents": 2300000,
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}status
deal.status · GET /deals/status · gate none · sandbox · answers DealStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.status({"vin":"1C4HJXEN4LW202273"})curl 'https://apis.vin/deals/status?vin=1C4HJXEN4LW202273'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": "DealStatus@1",
"value": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"deal": {
"id": "DL-ef6558d1",
"position": "QUOTED",
"orderId": "ORD-e54ea3d9",
"askingCents": 2300000,
"currency": "USD"
}
},
"evidence": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"deal": {
"id": "DL-ef6558d1",
"position": "QUOTED",
"orderId": "ORD-e54ea3d9",
"askingCents": 2300000,
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}complianceCheck
deal.complianceCheck · GET /deals/compliance-check · gate key · sandbox · answers DealComplianceCheck@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.complianceCheck({"vin":"1C4HJXEN4LW202273"})curl 'https://apis.vin/deals/compliance-check?vin=1C4HJXEN4LW202273'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": "DealComplianceCheck@1",
"value": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"compliance": {
"id": "DL-ef6558d1",
"compliant": true,
"checks": [
"tila",
"ecoa",
"state-disclosures"
],
"position": "QUOTED"
}
},
"evidence": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"compliance": {
"id": "DL-ef6558d1",
"compliant": true,
"checks": [
"tila",
"ecoa",
"state-disclosures"
],
"position": "QUOTED"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
quote
deal.quote · POST /deals/quote · gate offer · sandbox · answers DealQuote@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 — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.failed@1 · Deal.quoted@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.quote({"vin":"1C4HJXEN4LW202273"})curl -X POST https://apis.vin/deals/quote \
-H 'content-type: application/json' \
-d '{"vin":"1C4HJXEN4LW202273"}'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": "DealQuote@1",
"value": {
"vin": "1C4HJXEN4LW202273",
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
},
"termMonths": 72,
"apr": 6.9,
"dueAtSigning": {
"amount": "3699.00",
"currency": "USD"
},
"expiresInDays": 3
},
"evidence": {
"vin": "1C4HJXEN4LW202273",
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
},
"termMonths": 72,
"apr": 6.9,
"dueAtSigning": {
"amount": "3699.00",
"currency": "USD"
},
"expiresInDays": 3
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "desking-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}reprice
deal.reprice · POST /deals/reprice · gate offer · sandbox · answers DealReprice@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 — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.repriced@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.reprice({"vin":"1C4HJXEN4LW202273"})curl -X POST https://apis.vin/deals/reprice \
-H 'content-type: application/json' \
-d '{"vin":"1C4HJXEN4LW202273"}'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": "DealReprice@1",
"value": {
"vin": "1C4HJXEN4LW202273",
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
},
"priorPayment": {
"amount": "533.90",
"currency": "USD"
},
"delta": {
"amount": "0.00",
"currency": "USD"
},
"apr": 6.9,
"termMonths": 72
},
"evidence": {
"vin": "1C4HJXEN4LW202273",
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
},
"priorPayment": {
"amount": "533.90",
"currency": "USD"
},
"delta": {
"amount": "0.00",
"currency": "USD"
},
"apr": 6.9,
"termMonths": 72
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "desking-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
open
deal.open · POST /deals/open · gate key · sandbox · answers Deal@1
Promoted — earned its own page: /catalog/deal.open (computed on every regen: price posted + carries its own stateSet).
| Field | Type | Required | Notes |
|---|---|---|---|
workflow | string | yes | one of buy, sell-trade, wholesale-dropship, wholesale-d2d, concierge-broker, consignment, private-party, refinance, new-vehicle-build, lease-return, dealer-stocking |
vin | string | yes | length 17–17 |
dealType | string | no | one of CONCIERGE_BUY, INSTANT_CASH_OFFER, DROPSHIP, WHOLESALE, CONCIERGE_SEARCH, CONSIGNMENT, PRIVATE_PARTY, REFINANCE, BUILD, LEASE_RETURN |
buyer | object | no | — |
seller | object | no | — |
authority | string | no | — |
Delegated calls require a typed Mandate — { ceiling, perAction, expires, tripwires }; the ceiling is a field, not a conversation.
Door — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.advanced@1 · Deal.canceled@1 · Deal.failed@1 · Deal.held@1 · Deal.linked@1 · Deal.opened@1 · Deal.settled@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.open({"workflow":"buy","vin":"1C4HJXEN4LW202273"})curl -X POST https://apis.vin/deals/open \
-H 'content-type: application/json' \
-d '{"workflow":"buy","vin":"1C4HJXEN4LW202273"}'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": "Deal@1",
"value": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"deal": {
"status": "already-open",
"id": "DL-ef6558d1",
"position": "QUOTED"
}
},
"evidence": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"deal": {
"status": "already-open",
"id": "DL-ef6558d1",
"position": "QUOTED"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": true
}
}buyersOrder
deal.buyersOrder · POST /deals/buyers-order · gate offer · sandbox · answers DealBuyersOrder@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 — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.buyersOrderIssued@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.buyersOrder({"vin":"1C4HJXEN4LW202273"})curl -X POST https://apis.vin/deals/buyers-order \
-H 'content-type: application/json' \
-d '{"vin":"1C4HJXEN4LW202273"}'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": "DealBuyersOrder@1",
"value": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"buyersOrder": {
"id": "DL-ef6558d1",
"orderId": "ORD-e54ea3d9",
"items": [
{
"kind": "vehicle",
"vin": "1C4HJXEN4LW202273",
"amountCents": 2300000
},
{
"kind": "doc-fee",
"amountCents": 8500
},
{
"kind": "sales-tax",
"amountCents": 189750
}
],
"totalCents": 2498250,
"currency": "USD",
"status": "issued"
}
},
"evidence": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"buyersOrder": {
"id": "DL-ef6558d1",
"orderId": "ORD-e54ea3d9",
"items": [
{
"kind": "vehicle",
"vin": "1C4HJXEN4LW202273",
"amountCents": 2300000
},
{
"kind": "doc-fee",
"amountCents": 8500
},
{
"kind": "sales-tax",
"amountCents": 189750
}
],
"totalCents": 2498250,
"currency": "USD",
"status": "issued"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}onlineCheckout
deal.onlineCheckout · POST /deals/online-checkout · gate key · sandbox · answers DealOnlineCheckout@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.onlineCheckedOut@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.onlineCheckout()curl -X POST https://apis.vin/deals/online-checkout \
-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": "DealOnlineCheckout@1",
"value": {
"checkout": {
"$type": "CheckoutSession",
"$id": "checkoutsession_cs_1",
"intentRef": "intent_1",
"reference": "magic-clear",
"url": "https://checkout.settlement-rail.sandbox/cs_1",
"status": "open",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "settlement-rail"
},
"providerData": {
"externalId": "cs_1"
}
}
},
"evidence": {
"checkout": {
"$type": "CheckoutSession",
"$id": "checkoutsession_cs_1",
"intentRef": "intent_1",
"reference": "magic-clear",
"url": "https://checkout.settlement-rail.sandbox/cs_1",
"status": "open",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "settlement-rail"
},
"providerData": {
"externalId": "cs_1"
}
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "settlement-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
fund
deal.fund · POST /deals/fund · gate offer · sandbox · answers DealFund@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 — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.failed@1 · Deal.funded@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.fund({"vin":"1C4HJXEN4LW202273"})curl -X POST https://apis.vin/deals/fund \
-H 'content-type: application/json' \
-d '{"vin":"1C4HJXEN4LW202273"}'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": "DealFund@1",
"value": {
"funding": {
"$type": "Settlement",
"$id": "settlement_pi_1",
"intentRef": "intent_1",
"reference": "1C4HJXEN4LW202273",
"amount": {
"amount": "3150000",
"currency": "USD"
},
"status": "settled",
"payeeRef": "payee-sandbox",
"settledAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "settlement-rail"
},
"providerData": {
"externalId": "pi_1"
},
"ledgerRef": "ledgerentry_pi_1"
}
},
"evidence": {
"funding": {
"$type": "Settlement",
"$id": "settlement_pi_1",
"intentRef": "intent_1",
"reference": "1C4HJXEN4LW202273",
"amount": {
"amount": "3150000",
"currency": "USD"
},
"status": "settled",
"payeeRef": "payee-sandbox",
"settledAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "settlement-rail"
},
"providerData": {
"externalId": "pi_1"
},
"ledgerRef": "ledgerentry_pi_1"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "settlement-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
spotDeliver
deal.spotDeliver · POST /deals/spot-deliver · gate offer · sandbox · answers DealSpotDeliver@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 — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.reContracted@1 · Deal.spotDelivered@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.spotDeliver({"vin":"1C4HJXEN4LW202273"})curl -X POST https://apis.vin/deals/spot-deliver \
-H 'content-type: application/json' \
-d '{"vin":"1C4HJXEN4LW202273"}'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": "DealSpotDeliver@1",
"value": {
"deposit": {
"$type": "Deposit",
"$id": "deposit_dep_1",
"reference": "1C4HJXEN4LW202273",
"payerRef": "payer-sandbox",
"amount": {
"amount": "100000",
"currency": "USD"
},
"status": "collected",
"collectedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "invoicing-rail"
},
"providerData": {
"externalId": "dep_1"
}
}
},
"evidence": {
"deposit": {
"$type": "Deposit",
"$id": "deposit_dep_1",
"reference": "1C4HJXEN4LW202273",
"payerRef": "payer-sandbox",
"amount": {
"amount": "100000",
"currency": "USD"
},
"status": "collected",
"collectedAt": "2026-08-10T00:00:00.000Z",
"provenance": {
"environment": "sandbox",
"simulated": true,
"provider": "invoicing-rail"
},
"providerData": {
"externalId": "dep_1"
}
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "invoicing-rail-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
unwind
deal.unwind · POST /deals/unwind · gate offer · sandbox · answers DealUnwind@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 — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.failed@1 · Deal.unwound@1 · Lien.unwound@1 · Payment.refunded@1 · ProtectionProduct.canceled@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.unwind({"vin":"1C4HJXEN4LW202273"})curl -X POST https://apis.vin/deals/unwind \
-H 'content-type: application/json' \
-d '{"vin":"1C4HJXEN4LW202273"}'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": "DealUnwind@1",
"value": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"unwind": {
"status": "not-yet-funded-rescind-instead",
"id": "DL-ef6558d1",
"position": "QUOTED"
}
},
"evidence": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"unwind": {
"status": "not-yet-funded-rescind-instead",
"id": "DL-ef6558d1",
"position": "QUOTED"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
contingency
deal.contingency · POST /deals/contingency · gate key · sandbox · answers DealContingency@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.contingencySet@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.contingency()curl -X POST https://apis.vin/deals/contingency \
-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": "DealContingency@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"contingency": {
"id": "DL-4ade9a56",
"decision": "approved",
"items": [],
"status": "none-outstanding"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"contingency": {
"id": "DL-4ade9a56",
"decision": "approved",
"items": [],
"status": "none-outstanding"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}desk
deal.desk · POST /deals/desk · gate human · sandbox · answers DealDesk@1
| Field | Type | Required | Notes |
|---|---|---|---|
subject | string | no | — |
salesPrice | string | yes | decimal string |
downPayment | string | no | — |
term | integer | no | months |
apr | string | no | — |
tradeAllowance | string | no | — |
structure | string | no | one of retail, lease, cash, bhph |
The gate is a 403 NEEDS_HUMAN — the human verb authorize (credential: desk-manager) · supply side, routed to a named, staffed, priced terminus with a poll rail. Never a dead end. Price: not posted — see /pricing.
Door — desking.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.desked@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.desk({"salesPrice":"salesprice"})curl -X POST https://apis.vin/deals/desk \
-H 'content-type: application/json' \
-d '{"salesPrice":"salesprice"}'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": "DealDesk@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"desking": {
"status": "no-deal-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"desking": {
"status": "no-deal-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}finalize
deal.finalize · POST /deals/finalize · gate offer · sandbox · answers DealFinalize@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 — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.failed@1 · Deal.finalized@1 · Deal.settled@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.finalize({"vin":"1C4HJXEN4LW202273"})curl -X POST https://apis.vin/deals/finalize \
-H 'content-type: application/json' \
-d '{"vin":"1C4HJXEN4LW202273"}'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": "DealFinalize@1",
"value": {
"deal": "deal-1C4HJXEN4LW202273",
"vin": "1C4HJXEN4LW202273",
"amountFinanced": {
"amount": "31404.00",
"currency": "USD"
},
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
},
"termMonths": 72,
"apr": 6.9,
"state": "finalized"
},
"evidence": {
"deal": "deal-1C4HJXEN4LW202273",
"vin": "1C4HJXEN4LW202273",
"amountFinanced": {
"amount": "31404.00",
"currency": "USD"
},
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
},
"termMonths": 72,
"apr": 6.9,
"state": "finalized"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "desking-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}grossprofit
deal.grossprofit · GET /deals/grossprofit · gate key · sandbox · answers DealGrossprofit@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.grossprofit({"vin":"1C4HJXEN4LW202273"})curl 'https://apis.vin/deals/grossprofit?vin=1C4HJXEN4LW202273'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": "DealGrossprofit@1",
"value": {
"vin": "1C4HJXEN4LW202273",
"frontGross": {
"amount": "2520.00",
"currency": "USD"
},
"backGross": {
"amount": "1450.00",
"currency": "USD"
},
"totalGross": {
"amount": "3970.00",
"currency": "USD"
}
},
"evidence": {
"vin": "1C4HJXEN4LW202273",
"frontGross": {
"amount": "2520.00",
"currency": "USD"
},
"backGross": {
"amount": "1450.00",
"currency": "USD"
},
"totalGross": {
"amount": "3970.00",
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "desking-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}link
deal.link · POST /deals/link · gate key · sandbox · answers DealLink@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.dependencyLinked@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.link()curl -X POST https://apis.vin/deals/link \
-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": "DealLink@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"link": {
"status": "no-deal-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"link": {
"status": "no-deal-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}paymentCalculator
deal.paymentCalculator · GET /deals/payment-calculator · gate none · sandbox · answers DealPaymentCalculator@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.paymentCalculator()curl 'https://apis.vin/deals/payment-calculator'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": "DealPaymentCalculator@1",
"value": {
"amountFinanced": {
"amount": "31404.00",
"currency": "USD"
},
"apr": 6.9,
"termMonths": 72,
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
},
"currency": "USD"
},
"evidence": {
"amountFinanced": {
"amount": "31404.00",
"currency": "USD"
},
"apr": 6.9,
"termMonths": 72,
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
},
"currency": "USD"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "desking-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}recap
deal.recap · GET /deals/recap · gate key · sandbox · answers DealRecap@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.recap({"vin":"1C4HJXEN4LW202273"})curl 'https://apis.vin/deals/recap?vin=1C4HJXEN4LW202273'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": "DealRecap@1",
"value": {
"deal": "deal-1C4HJXEN4LW202273",
"vin": "1C4HJXEN4LW202273",
"amountFinanced": {
"amount": "31404.00",
"currency": "USD"
},
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
},
"totalGross": {
"amount": "3970.00",
"currency": "USD"
},
"status": "recapped"
},
"evidence": {
"deal": "deal-1C4HJXEN4LW202273",
"vin": "1C4HJXEN4LW202273",
"amountFinanced": {
"amount": "31404.00",
"currency": "USD"
},
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
},
"totalGross": {
"amount": "3970.00",
"currency": "USD"
},
"status": "recapped"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "desking-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}rehash
deal.rehash · POST /deals/rehash · gate offer · sandbox · answers DealRehash@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 — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.rehashed@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.rehash({"vin":"1C4HJXEN4LW202273"})curl -X POST https://apis.vin/deals/rehash \
-H 'content-type: application/json' \
-d '{"vin":"1C4HJXEN4LW202273"}'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": "DealRehash@1",
"value": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"rehash": {
"status": "no-credit-on-the-table",
"id": "DL-ef6558d1",
"position": "QUOTED"
}
},
"evidence": {
"vin": "1C4HJXEN4LW202273",
"noun": "deal",
"asOf": "2026-08-10",
"rehash": {
"status": "no-credit-on-the-table",
"id": "DL-ef6558d1",
"position": "QUOTED"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}rescind
deal.rescind · POST /deals/rescind · gate offer · sandbox · answers RescissionMoneyMap@1
| Field | Type | Required | Notes |
|---|---|---|---|
subject | string | yes | — |
reason | string | yes | one of cooling-off, spot-delivery-unwind, financing-fell-through, buyer-request, compliance |
authority | 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.
Delegated calls require a typed Mandate — { ceiling, perAction, expires, tripwires }; the ceiling is a field, not a conversation.
Door — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.failed@1 · Deal.rescinded@1 · Lien.unwound@1 · Payment.refunded@1 · ProtectionProduct.canceled@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.rescind({"subject":"subject","reason":"cooling-off"})curl -X POST https://apis.vin/deals/rescind \
-H 'content-type: application/json' \
-d '{"subject":"subject","reason":"cooling-off"}'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": "RescissionMoneyMap@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"rescission": {
"status": "no-deal-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"rescission": {
"status": "no-deal-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}resume
deal.resume · POST /deals/resume · gate key · sandbox · answers DealResume@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.resumed@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.resume()curl -X POST https://apis.vin/deals/resume \
-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": "DealResume@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"resumption": {
"status": "no-deal-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"resumption": {
"status": "no-deal-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}structure
deal.structure · POST /deals/structure · gate offer · sandbox · answers DealStructure@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 — buy.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.structured@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.structure({"vin":"1C4HJXEN4LW202273"})curl -X POST https://apis.vin/deals/structure \
-H 'content-type: application/json' \
-d '{"vin":"1C4HJXEN4LW202273"}'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": "DealStructure@1",
"value": {
"vin": "1C4HJXEN4LW202273",
"price": {
"amount": "31500.00",
"currency": "USD"
},
"downPayment": {
"amount": "3000.00",
"currency": "USD"
},
"tradeAllowance": {
"amount": "0.00",
"currency": "USD"
},
"tradePayoff": {
"amount": "0.00",
"currency": "USD"
},
"tradeEquity": {
"amount": "0.00",
"currency": "USD"
},
"tax": {
"amount": "2205.00",
"currency": "USD"
},
"fees": {
"amount": "699.00",
"currency": "USD"
},
"amountFinanced": {
"amount": "31404.00",
"currency": "USD"
},
"apr": 6.9,
"termMonths": 72,
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
}
},
"evidence": {
"vin": "1C4HJXEN4LW202273",
"price": {
"amount": "31500.00",
"currency": "USD"
},
"downPayment": {
"amount": "3000.00",
"currency": "USD"
},
"tradeAllowance": {
"amount": "0.00",
"currency": "USD"
},
"tradePayoff": {
"amount": "0.00",
"currency": "USD"
},
"tradeEquity": {
"amount": "0.00",
"currency": "USD"
},
"tax": {
"amount": "2205.00",
"currency": "USD"
},
"fees": {
"amount": "699.00",
"currency": "USD"
},
"amountFinanced": {
"amount": "31404.00",
"currency": "USD"
},
"apr": 6.9,
"termMonths": 72,
"monthlyPayment": {
"amount": "533.90",
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "desking-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}washout
deal.washout · GET /deals/washout · gate none · sandbox · answers DealWashout@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.washout()curl 'https://apis.vin/deals/washout'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": "DealWashout@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"washout": {
"status": "no-deal-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"washout": {
"status": "no-deal-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}yoyoUnwindProtect
deal.yoyoUnwindProtect · POST /deals/yoyo-unwind-protect · gate key · sandbox · answers DealYoyoUnwindProtect@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C4HJXEN4LW202273 (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 — Deal.yoyoUnwindProtected@1.
import { deal } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await deal.yoyoUnwindProtect()curl -X POST https://apis.vin/deals/yoyo-unwind-protect \
-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": "DealYoyoUnwindProtect@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"protection": {
"status": "no-deal-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "deal",
"asOf": "2026-08-10",
"protection": {
"status": "no-deal-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "car-desk-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.
Deal
Schema
| Property | Type | Notes |
|---|---|---|
dealId | id | deal_ |
workflow | string | — |
dealType | DealType | — |
vehicleId | ref→Vehicle | — |
buyerId | ref→Party | — |
sellerId | ref→Party | — |
dealerOfRecordId | ref→Dealer | — |
authority | ref→Mandate | — |
structure | DealStructure | — |
state | DealLifecycle | — |
correlationId | W0-EVT | — |
dependsOn | ref→Deal[] | deal→deal DAG |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
deal | vehicle | *:1 | subject |
deal | party | *:* w/ role | buyer/seller/dealerOfRecord |
deal | offer | 1:0..1 | trade |
deal | appraisal | 1:0..1 | trade-in |
deal | creditApplication | 1:0..1 | financed |
deal | loan | 1:0..1 | funds |
deal | lease | 1:0..1 | leased |
deal | fiMenu | 1:0..1 | protected |
deal | escrow | 1:0..1 | escrowed |
deal | payment | 1:0..* | settled |
deal | document | 1:0..* | papered |
deal | stips | 1:0..* | gated |
deal | transport | 1:0..* | moved |
deal | dealJacket | 1:1 | jacket |
deal | deal | *:* self | dependsOn (DAG) |
deal | deal | *:* self | dependsOn (DAG) |
ledger | deal | *:1 | streamed on |
deal | ledger | *:* | workflow step→lifecycle event/state (steps[] carry no guard/event/state edge) |
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.
Deal · Class model
Deal · State machine
Deal · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.
crmEvent
The crmEvent noun — identity, lifecycle, events, and every capability as an anchored section: 9 capabilities, 0 live, 9 sandbox, 0 declared.
deceasedAccount
The deceasedAccount noun — identity, lifecycle, events, and every capability as an anchored section: 5 capabilities, 0 live, 5 sandbox, 0 declared.