docs.vin

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

Nounsale
PillarCommerce (facets: 4 data · 5 services · 9 commerce)
Capabilities18 — 0 live · 18 sandbox · 0 declared
EntitiesSale
Doorsaggregator.vin
SDKVin.sale.* from apis.vin
Address/catalog/sale#{action} — the anchor IS the wire name minus sale.

Lifecycle

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

Discover & read

read

sale.read · GET /sales/read · gate none · sandbox · answers SaleRead@1

FieldTypeRequiredNotes
vinstringno

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

the SDK — sale.read
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"})
GET /sales/read
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — sale.status
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"})
GET /sales/status
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.

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

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

the SDK — sale.returnEligibility
import { sale } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.returnEligibility()
GET /sales/return-eligibility
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — sale.terms
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"})
GET /sales/terms
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsSale.buyerFeeAssessed@1 · Sale.failed@1.

the SDK — sale.buyerFee
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"})
POST /sales/buyer-fee
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsSale.failed@1 · Sale.sellerFeeAssessed@1.

the SDK — sale.sellerFee
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"})
POST /sales/seller-fee
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsSale.failed@1 · Sale.paid@1.

the SDK — sale.pay
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"})
POST /sales/pay
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsSale.failed@1 · Sale.invoiced@1.

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

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsSale.failed@1 · Sale.settled@1.

the SDK — sale.settle
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"})
POST /sales/settle
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsSale.failed@1 · Sale.refunded@1.

the SDK — sale.refund
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"})
POST /sales/refund
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsSale.confirmed@1.

the SDK — sale.confirm
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"})
POST /sales/confirm
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsSale.gatePassIssued@1.

the SDK — sale.gatePassIssue
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"})
POST /sales/gate-pass-issue
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.

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

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

EmitsSale.returned@1.

the SDK — sale.return
import { sale } from 'apis.vin'

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

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsSale.voided@1.

the SDK — sale.void
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"})
POST /sales/void
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsSale.saleBacked@1.

the SDK — sale.back
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"})
POST /sales/back
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.

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

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

EmitsSale.buybackGuaranteed@1.

the SDK — sale.buybackGuarantee
import { sale } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.buybackGuarantee()
POST /sales/buyback-guarantee
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.

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

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

EmitsSale.coBrokered@1.

the SDK — sale.coBroke
import { sale } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await sale.coBroke()
POST /sales/co-broke
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.

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

FieldTypeRequiredNotes
vinstringno

The gate is a 402 OFFER — the price and a hard ceiling on the wire, with a durable intent that executes on settlement. Never a wall, never "contact sales". Price: not posted — see /pricing.

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

EmitsSale.knockedDown@1.

the SDK — sale.knockdown
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"})
POST /sales/knockdown
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.

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

PropertyTypeNotes
ididsale_
auctionIdref→Auction
vinstring
buyerIdref→Party
sellerIdref→Party
hammermoney
buyerFeemoney
sellerFeemoney
statusSaleFSM

Relationships

FromToCardinalityAs
saleauction*:1at
saleparty*:1bought-by

Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.