sale
The sale noun — identity, lifecycle, events, and every capability as an anchored section: 18 capabilities, 0 live, 18 sandbox, 0 declared.
sale is one of the estate's 317 automotive nouns — a job a car needs done. It carries 18 capabilities: 0 live, 18 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | sale |
| Pillar | Commerce (facets: 4 data · 5 services · 9 commerce) |
| Capabilities | 18 — 0 live · 18 sandbox · 0 declared |
| Entities | Sale |
| Doors | aggregator.vin |
| SDK | Vin.sale.* from apis.vin |
| Address | /catalog/sale#{action} — the anchor IS the wire name minus sale. |
Lifecycle
Sale — SaleFSM: 8 states, 8 transitions — Knockdown · Confirmed · Invoiced · Paid · GatePassed · Settled · Returned · Voided. Each transition is a past-tense event on the record.
Events
The vocabulary this noun can append to the record — 15 past-tense, versioned event types, each linked to the capability that emits it:
Sale.buybackGuaranteed@1— emitted bybuybackGuaranteeSale.buyerFeeAssessed@1— emitted bybuyerFeeSale.coBrokered@1— emitted bycoBrokeSale.confirmed@1— emitted byconfirmSale.failed@1— emitted bybuyerFee·invoice·pay·refund·sellerFee·settleSale.gatePassIssued@1— emitted bygatePassIssueSale.invoiced@1— emitted byinvoiceSale.knockedDown@1— emitted byknockdownSale.paid@1— emitted bypaySale.refunded@1— emitted byrefundSale.returned@1— emitted byreturnSale.saleBacked@1— emitted bybackSale.sellerFeeAssessed@1— emitted bysellerFeeSale.settled@1— emitted bysettleSale.voided@1— emitted byvoid
Discover & read
read
sale.read · GET /sales/read · gate none · sandbox · answers SaleRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5NMP24GL8SH096995 (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 { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.read({"vin":"5NMP24GL8SH096995"})curl 'https://apis.vin/sales/read?vin=5NMP24GL8SH096995'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": "SaleRead@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"sale": {
"id": "SL-c8a19ef6",
"position": "Knockdown",
"hammerCents": 1850000,
"currency": "USD"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"sale": {
"id": "SL-c8a19ef6",
"position": "Knockdown",
"hammerCents": 1850000,
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}status
sale.status · GET /sales/status · gate none · sandbox · answers SaleStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5NMP24GL8SH096995 (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 { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.status({"vin":"5NMP24GL8SH096995"})curl 'https://apis.vin/sales/status?vin=5NMP24GL8SH096995'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": "SaleStatus@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"sale": {
"id": "SL-c8a19ef6",
"position": "Knockdown",
"hammerCents": 1850000,
"currency": "USD"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"sale": {
"id": "SL-c8a19ef6",
"position": "Knockdown",
"hammerCents": 1850000,
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}returnEligibility
sale.returnEligibility · GET /sales/return-eligibility · gate none · sandbox · answers SaleReturnEligibility@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5NMP24GL8SH096995 (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 { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.returnEligibility()curl 'https://apis.vin/sales/return-eligibility'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": "SaleReturnEligibility@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "sale",
"asOf": "2026-08-10",
"eligibility": {
"status": "no-sale-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "sale",
"asOf": "2026-08-10",
"eligibility": {
"status": "no-sale-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
terms
sale.terms · GET /sales/terms · gate none · sandbox · answers SaleTerms@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5NMP24GL8SH096995 (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 { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.terms({"vin":"5NMP24GL8SH096995"})curl 'https://apis.vin/sales/terms?vin=5NMP24GL8SH096995'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": "SaleTerms@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"terms": {
"saleId": "SL-c8a19ef6",
"paymentDueDays": 2,
"buyerFeeCents": 92500,
"sellerFeeCents": 74000,
"currency": "USD",
"arbitrationWindowDays": 7
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"terms": {
"saleId": "SL-c8a19ef6",
"paymentDueDays": 2,
"buyerFeeCents": 92500,
"sellerFeeCents": 74000,
"currency": "USD",
"arbitrationWindowDays": 7
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}buyerFee
sale.buyerFee · POST /sales/buyer-fee · gate offer · sandbox · answers SaleBuyerFee@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) · /5NMP24GL8SH096995 (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 — Sale.buyerFeeAssessed@1 · Sale.failed@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.buyerFee({"vin":"5NMP24GL8SH096995"})curl -X POST https://apis.vin/sales/buyer-fee \
-H 'content-type: application/json' \
-d '{"vin":"5NMP24GL8SH096995"}'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": "SaleBuyerFee@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"fee": {
"saleId": "SL-c8a19ef6",
"side": "buyer",
"amountCents": 92500,
"currency": "USD",
"basis": "hammer"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"fee": {
"saleId": "SL-c8a19ef6",
"side": "buyer",
"amountCents": 92500,
"currency": "USD",
"basis": "hammer"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}sellerFee
sale.sellerFee · POST /sales/seller-fee · gate offer · sandbox · answers SaleSellerFee@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) · /5NMP24GL8SH096995 (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 — Sale.failed@1 · Sale.sellerFeeAssessed@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.sellerFee({"vin":"5NMP24GL8SH096995"})curl -X POST https://apis.vin/sales/seller-fee \
-H 'content-type: application/json' \
-d '{"vin":"5NMP24GL8SH096995"}'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": "SaleSellerFee@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"fee": {
"saleId": "SL-c8a19ef6",
"side": "seller",
"amountCents": 74000,
"currency": "USD",
"basis": "hammer"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"fee": {
"saleId": "SL-c8a19ef6",
"side": "seller",
"amountCents": 74000,
"currency": "USD",
"basis": "hammer"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
sale.pay · POST /sales/pay · gate offer · sandbox · answers SalePay@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) · /5NMP24GL8SH096995 (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 — Sale.failed@1 · Sale.paid@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.pay({"vin":"5NMP24GL8SH096995"})curl -X POST https://apis.vin/sales/pay \
-H 'content-type: application/json' \
-d '{"vin":"5NMP24GL8SH096995"}'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": "SalePay@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"payment": {
"status": "not-yet-invoiced",
"saleId": "SL-c8a19ef6",
"position": "Knockdown"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"payment": {
"status": "not-yet-invoiced",
"saleId": "SL-c8a19ef6",
"position": "Knockdown"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}invoice
sale.invoice · POST /sales/invoice · gate offer · sandbox · answers SaleInvoice@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) · /5NMP24GL8SH096995 (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 — Sale.failed@1 · Sale.invoiced@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.invoice({"vin":"5NMP24GL8SH096995"})curl -X POST https://apis.vin/sales/invoice \
-H 'content-type: application/json' \
-d '{"vin":"5NMP24GL8SH096995"}'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": "SaleInvoice@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"invoice": {
"status": "not-yet-confirmed",
"saleId": "SL-c8a19ef6",
"position": "Knockdown"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"invoice": {
"status": "not-yet-confirmed",
"saleId": "SL-c8a19ef6",
"position": "Knockdown"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}settle
sale.settle · POST /sales/settle · gate offer · sandbox · answers SaleSettle@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) · /5NMP24GL8SH096995 (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 — Sale.failed@1 · Sale.settled@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.settle({"vin":"5NMP24GL8SH096995"})curl -X POST https://apis.vin/sales/settle \
-H 'content-type: application/json' \
-d '{"vin":"5NMP24GL8SH096995"}'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": "SaleSettle@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"settlement": {
"status": "not-yet-paid",
"saleId": "SL-c8a19ef6",
"position": "Knockdown"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"settlement": {
"status": "not-yet-paid",
"saleId": "SL-c8a19ef6",
"position": "Knockdown"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}refund
sale.refund · POST /sales/refund · gate offer · sandbox · answers SaleRefund@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) · /5NMP24GL8SH096995 (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 — Sale.failed@1 · Sale.refunded@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.refund({"vin":"5NMP24GL8SH096995"})curl -X POST https://apis.vin/sales/refund \
-H 'content-type: application/json' \
-d '{"vin":"5NMP24GL8SH096995"}'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": "SaleRefund@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"refund": {
"status": "nothing-to-refund",
"saleId": "SL-c8a19ef6"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"refund": {
"status": "nothing-to-refund",
"saleId": "SL-c8a19ef6"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
confirm
sale.confirm · POST /sales/confirm · gate offer · sandbox · answers SaleConfirm@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) · /5NMP24GL8SH096995 (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 — Sale.confirmed@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.confirm({"vin":"5NMP24GL8SH096995"})curl -X POST https://apis.vin/sales/confirm \
-H 'content-type: application/json' \
-d '{"vin":"5NMP24GL8SH096995"}'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": "SaleConfirm@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"confirmation": {
"status": "confirmed",
"saleId": "SL-c8a19ef6"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"confirmation": {
"status": "confirmed",
"saleId": "SL-c8a19ef6"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}gatePassIssue
sale.gatePassIssue · POST /sales/gate-pass-issue · gate offer · sandbox · answers SaleGatePassIssue@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) · /5NMP24GL8SH096995 (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 — Sale.gatePassIssued@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.gatePassIssue({"vin":"5NMP24GL8SH096995"})curl -X POST https://apis.vin/sales/gate-pass-issue \
-H 'content-type: application/json' \
-d '{"vin":"5NMP24GL8SH096995"}'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": "SaleGatePassIssue@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"gatePass": {
"status": "not-yet-paid",
"saleId": "SL-c8a19ef6",
"position": "Knockdown"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"gatePass": {
"status": "not-yet-paid",
"saleId": "SL-c8a19ef6",
"position": "Knockdown"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
return
sale.return · POST /sales/return · gate key · sandbox · answers SaleReturn@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5NMP24GL8SH096995 (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 — Sale.returned@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.return()curl -X POST https://apis.vin/sales/return \
-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": "SaleReturn@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "sale",
"asOf": "2026-08-10",
"saleReturn": {
"status": "no-sale-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "sale",
"asOf": "2026-08-10",
"saleReturn": {
"status": "no-sale-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}void
sale.void · POST /sales/void · gate offer · sandbox · answers SaleVoid@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) · /5NMP24GL8SH096995 (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 — Sale.voided@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.void({"vin":"5NMP24GL8SH096995"})curl -X POST https://apis.vin/sales/void \
-H 'content-type: application/json' \
-d '{"vin":"5NMP24GL8SH096995"}'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": "SaleVoid@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"voiding": {
"status": "no-grounds-to-void",
"saleId": "SL-c8a19ef6",
"basis": "arbitration-lane-only"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"voiding": {
"status": "no-grounds-to-void",
"saleId": "SL-c8a19ef6",
"basis": "arbitration-lane-only"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
back
sale.back · POST /sales/back · gate offer · sandbox · answers SaleBack@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) · /5NMP24GL8SH096995 (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 — Sale.saleBacked@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.back({"vin":"5NMP24GL8SH096995"})curl -X POST https://apis.vin/sales/back \
-H 'content-type: application/json' \
-d '{"vin":"5NMP24GL8SH096995"}'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": "SaleBack@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"backOut": {
"status": "backed-out",
"saleId": "SL-c8a19ef6"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"backOut": {
"status": "backed-out",
"saleId": "SL-c8a19ef6"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}buybackGuarantee
sale.buybackGuarantee · POST /sales/buyback-guarantee · gate key · sandbox · answers SaleBuybackGuarantee@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5NMP24GL8SH096995 (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 — Sale.buybackGuaranteed@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.buybackGuarantee()curl -X POST https://apis.vin/sales/buyback-guarantee \
-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": "SaleBuybackGuarantee@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "sale",
"asOf": "2026-08-10",
"guarantee": {
"status": "no-sale-on-file"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "sale",
"asOf": "2026-08-10",
"guarantee": {
"status": "no-sale-on-file"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}coBroke
sale.coBroke · POST /sales/co-broke · gate key · sandbox · answers SaleCoBroke@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /5NMP24GL8SH096995 (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 — Sale.coBrokered@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.coBroke()curl -X POST https://apis.vin/sales/co-broke \
-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": "SaleCoBroke@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "sale",
"asOf": "2026-08-10",
"coBroke": {
"saleId": "SL-5bed1175",
"splitCents": [
12500,
12500
],
"currency": "USD",
"status": "co-brokered"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "sale",
"asOf": "2026-08-10",
"coBroke": {
"saleId": "SL-5bed1175",
"splitCents": [
12500,
12500
],
"currency": "USD",
"status": "co-brokered"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}knockdown
sale.knockdown · POST /sales/knockdown · gate offer · sandbox · answers SaleKnockdown@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) · /5NMP24GL8SH096995 (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 — Sale.knockedDown@1.
import { sale } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.knockdown({"vin":"5NMP24GL8SH096995"})curl -X POST https://apis.vin/sales/knockdown \
-H 'content-type: application/json' \
-d '{"vin":"5NMP24GL8SH096995"}'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": "SaleKnockdown@1",
"value": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"knockdown": {
"saleId": "SL-c8a19ef6",
"hammerCents": 1850000,
"currency": "USD",
"status": "hammered"
}
},
"evidence": {
"vin": "5NMP24GL8SH096995",
"noun": "sale",
"asOf": "2026-08-10",
"knockdown": {
"saleId": "SL-c8a19ef6",
"hammerCents": 1850000,
"currency": "USD",
"status": "hammered"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "paper-commerce-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.
Sale
Schema
| Property | Type | Notes |
|---|---|---|
id | id | sale_ |
auctionId | ref→Auction | — |
vin | string | — |
buyerId | ref→Party | — |
sellerId | ref→Party | — |
hammer | money | — |
buyerFee | money | — |
sellerFee | money | — |
status | SaleFSM | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
sale | auction | *:1 | at |
sale | party | *:1 | bought-by |
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.