rental
The rental noun — identity, lifecycle, events, and every capability as an anchored section: 19 capabilities, 0 live, 19 sandbox, 0 declared.
rental is one of the estate's 317 automotive nouns — a job a car needs done. It carries 19 capabilities: 0 live, 19 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | rental |
| Pillar | Services (facets: 5 data · 7 services · 7 commerce) |
| Capabilities | 19 — 0 live · 19 sandbox · 0 declared |
| Entities | Rental |
| Doors | aggregator.vin |
| SDK | Vin.rental.* from apis.vin |
| Address | /catalog/rental#{action} — the anchor IS the wire name minus rental. |
Lifecycle
Rental — RentalFSM: 8 states, 7 transitions — Quoted · Reserved · Booked · CheckedOut · CheckedIn · ReturnInspected · Charged · Closed. 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:
Rental.booked@1— emitted bybookRental.charged@1— emitted bychargeRental.checkedIn@1— emitted bycheckInRental.checkedOut@1— emitted bycheckOutRental.extended@1— emitted byextendRental.failed@1— emitted bybook·charge·hold·incidentalCharge·pay·quote·refundRental.held@1— emitted byholdRental.incidentalCharged@1— emitted byincidentalChargeRental.paid@1— emitted bypayRental.quoted@1— emitted byquoteRental.refunded@1— emitted byrefundRental.reserved@1— emitted byreserveRental.returnInspected@1— emitted byinspectReturnRental.swapped@1— emitted byswapRental.upgraded@1— emitted byupgrade
Discover & read
read
rental.read · GET /rentals/read · gate none · sandbox · answers RentalRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1G1YE2D33T5601116 (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 { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.read({"vin":"1G1YE2D33T5601116"})curl 'https://apis.vin/rentals/read?vin=1G1YE2D33T5601116'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": "RentalRead@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"rental": {
"id": "RNT-c87cc4ea",
"position": "Quoted",
"kind": "retail-rental"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"rental": {
"id": "RNT-c87cc4ea",
"position": "Quoted",
"kind": "retail-rental"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}status
rental.status · GET /rentals/status · gate none · sandbox · answers RentalStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1G1YE2D33T5601116 (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 { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.status({"vin":"1G1YE2D33T5601116"})curl 'https://apis.vin/rentals/status?vin=1G1YE2D33T5601116'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": "RentalStatus@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"rental": {
"id": "RNT-c87cc4ea",
"position": "Quoted",
"kind": "retail-rental"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"rental": {
"id": "RNT-c87cc4ea",
"position": "Quoted",
"kind": "retail-rental"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}availability
rental.availability · GET /rentals/availability · gate key · sandbox · answers RentalAvailability@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1G1YE2D33T5601116 (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 { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.availability({"vin":"1G1YE2D33T5601116"})curl 'https://apis.vin/rentals/availability?vin=1G1YE2D33T5601116'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": "RentalAvailability@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"availability": {
"available": true,
"kind": "retail-rental",
"dayRateCents": 7392,
"currency": "USD"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"availability": {
"available": true,
"kind": "retail-rental",
"dayRateCents": 7392,
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}utilization
rental.utilization · GET /rentals/utilization · gate key · sandbox · answers RentalUtilization@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1G1YE2D33T5601116 (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 { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.utilization({"vin":"1G1YE2D33T5601116"})curl 'https://apis.vin/rentals/utilization?vin=1G1YE2D33T5601116'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": "RentalUtilization@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"utilization": {
"stints": 8,
"out": 1,
"closed": 1
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"utilization": {
"stints": 8,
"out": 1,
"closed": 1
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}upgrade
rental.upgrade · POST /rentals/upgrade · gate offer · sandbox · answers RentalUpgrade@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) · /1G1YE2D33T5601116 (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 — Rental.upgraded@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.upgrade({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/upgrade \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalUpgrade@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"upgrade": {
"status": "no-active-stint",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"upgrade": {
"status": "no-active-stint",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
quote
rental.quote · POST /rentals/quote · gate offer · sandbox · answers RentalQuote@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) · /1G1YE2D33T5601116 (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 — Rental.failed@1 · Rental.quoted@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.quote({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/quote \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalQuote@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"quote": {
"id": "RNT-c87cc4ea",
"kind": "retail-rental",
"dayRateCents": 7392,
"currency": "USD",
"depositCents": 20000
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"quote": {
"id": "RNT-c87cc4ea",
"kind": "retail-rental",
"dayRateCents": 7392,
"currency": "USD",
"depositCents": 20000
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}rate
rental.rate · GET /rentals/rate · gate key · sandbox · answers RentalRate@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1G1YE2D33T5601116 (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 { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.rate({"vin":"1G1YE2D33T5601116"})curl 'https://apis.vin/rentals/rate?vin=1G1YE2D33T5601116'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": "RentalRate@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"quote": {
"id": "RNT-c87cc4ea",
"kind": "retail-rental",
"dayRateCents": 7392,
"currency": "USD",
"depositCents": 20000
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"quote": {
"id": "RNT-c87cc4ea",
"kind": "retail-rental",
"dayRateCents": 7392,
"currency": "USD",
"depositCents": 20000
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
book
rental.book · POST /rentals/book · gate offer · sandbox · answers RentalBook@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) · /1G1YE2D33T5601116 (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 — Rental.booked@1 · Rental.failed@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.book({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/book \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalBook@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"booking": {
"status": "booked",
"id": "RNT-c87cc4ea"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"booking": {
"status": "booked",
"id": "RNT-c87cc4ea"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}reserve
rental.reserve · POST /rentals/reserve · gate offer · sandbox · answers RentalReserve@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) · /1G1YE2D33T5601116 (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 — Rental.reserved@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.reserve({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/reserve \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalReserve@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"reservation": {
"status": "reserved",
"id": "RNT-c87cc4ea",
"renter": "Ava Good"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"reservation": {
"status": "reserved",
"id": "RNT-c87cc4ea",
"renter": "Ava Good"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}checkIn
rental.checkIn · POST /rentals/check-in · gate offer · sandbox · answers RentalCheckIn@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) · /1G1YE2D33T5601116 (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 — Rental.checkedIn@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.checkIn({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/check-in \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalCheckIn@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"checkIn": {
"status": "not-checked-out",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"checkIn": {
"status": "not-checked-out",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}checkOut
rental.checkOut · POST /rentals/check-out · gate offer · sandbox · answers RentalCheckOut@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) · /1G1YE2D33T5601116 (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 — Rental.checkedOut@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.checkOut({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/check-out \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalCheckOut@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"checkOut": {
"status": "not-yet-booked",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"checkOut": {
"status": "not-yet-booked",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
rental.pay · POST /rentals/pay · gate offer · sandbox · answers RentalPay@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) · /1G1YE2D33T5601116 (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 — Rental.failed@1 · Rental.paid@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.pay({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/pay \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalPay@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-91eea896",
"amountCents": 7392,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"payment": {
"id": "PAY-91eea896",
"amountCents": 7392,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}charge
rental.charge · POST /rentals/charge · gate offer · sandbox · answers RentalCharge@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) · /1G1YE2D33T5601116 (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 — Rental.charged@1 · Rental.failed@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.charge({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/charge \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalCharge@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"charge": {
"status": "stint-not-yet-inspected",
"id": "RNT-c87cc4ea",
"position": "Quoted"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"charge": {
"status": "stint-not-yet-inspected",
"id": "RNT-c87cc4ea",
"position": "Quoted"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}refund
rental.refund · POST /rentals/refund · gate offer · sandbox · answers RentalRefund@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) · /1G1YE2D33T5601116 (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 — Rental.failed@1 · Rental.refunded@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.refund({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/refund \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalRefund@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"refund": {
"status": "stint-still-open",
"id": "RNT-c87cc4ea",
"position": "Quoted"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"refund": {
"status": "stint-still-open",
"id": "RNT-c87cc4ea",
"position": "Quoted"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}incidentalCharge
rental.incidentalCharge · POST /rentals/incidental-charge · gate offer · sandbox · answers RentalIncidentalCharge@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) · /1G1YE2D33T5601116 (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 — Rental.failed@1 · Rental.incidentalCharged@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.incidentalCharge({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/incidental-charge \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalIncidentalCharge@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"charge": {
"status": "charged",
"id": "IC-79e4447b",
"kind": "fuel",
"amountCents": 4782,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"charge": {
"status": "charged",
"id": "IC-79e4447b",
"kind": "fuel",
"amountCents": 4782,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Authorize & resolve
hold
rental.hold · POST /rentals/hold · gate offer · sandbox · answers RentalHold@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) · /1G1YE2D33T5601116 (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 — Rental.failed@1 · Rental.held@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.hold({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/hold \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalHold@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"hold": {
"id": "HLD-81b776c5",
"amountCents": 20000,
"currency": "USD",
"status": "held"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"hold": {
"id": "HLD-81b776c5",
"amountCents": 20000,
"currency": "USD",
"status": "held"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
inspectReturn
rental.inspectReturn · POST /rentals/inspect-return · gate offer · sandbox · answers RentalInspectReturn@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) · /1G1YE2D33T5601116 (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 — Rental.returnInspected@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.inspectReturn({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/inspect-return \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalInspectReturn@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"inspection": {
"status": "not-yet-returned",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"inspection": {
"status": "not-yet-returned",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
extend
rental.extend · POST /rentals/extend · gate offer · sandbox · answers RentalExtend@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) · /1G1YE2D33T5601116 (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 — Rental.extended@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.extend({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/extend \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalExtend@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"extend": {
"status": "no-active-stint",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"extend": {
"status": "no-active-stint",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}swap
rental.swap · POST /rentals/swap · gate offer · sandbox · answers RentalSwap@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) · /1G1YE2D33T5601116 (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 — Rental.swapped@1.
import { rental } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await rental.swap({"vin":"1G1YE2D33T5601116"})curl -X POST https://apis.vin/rentals/swap \
-H 'content-type: application/json' \
-d '{"vin":"1G1YE2D33T5601116"}'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": "RentalSwap@1",
"value": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"swap": {
"status": "no-active-stint",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"evidence": {
"vin": "1G1YE2D33T5601116",
"noun": "rental",
"asOf": "2026-08-10",
"swap": {
"status": "no-active-stint",
"id": "RNT-c87cc4ea",
"position": "Quoted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "risk-money-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.
Rental
Schema
| Property | Type | Notes |
|---|---|---|
id | id | rent_ |
vin | string | — |
renterId | ref→Party | — |
providerId | ref→Provider | — |
dailyRate | money | — |
status | RentalFSM | — |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
rental | vehicle | *:1 | rents |
rental | party | *:1 | rented-by |
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.
registration
The registration noun — identity, lifecycle, events, and every capability as an anchored section: 14 capabilities, 1 live, 13 sandbox, 0 declared.
repairOrder
The repairOrder noun — identity, lifecycle, events, and every capability as an anchored section: 3 capabilities, 0 live, 3 sandbox, 0 declared.