loaner
The loaner noun — identity, lifecycle, events, and every capability as an anchored section: 12 capabilities, 0 live, 12 sandbox, 0 declared.
loaner is one of the estate's 317 automotive nouns — a job a car needs done. It carries 12 capabilities: 0 live, 12 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | loaner |
| Pillar | Services (facets: 4 data · 6 services · 2 commerce) |
| Capabilities | 12 — 0 live · 12 sandbox · 0 declared |
| Entities | Rental |
| Doors | aggregator.vin |
| SDK | Vin.loaner.* from apis.vin |
| Address | /catalog/loaner#{action} — the anchor IS the wire name minus loaner. |
Events
The vocabulary this noun can append to the record — 10 past-tense, versioned event types, each linked to the capability that emits it:
Loaner.assigned@1— emitted byassignLoaner.charged@1— emitted bychargeLoaner.checkedIn@1— emitted bycheckInLoaner.checkedOut@1— emitted bycheckOutLoaner.failed@1— emitted bycharge·warrantyBillLoaner.inspected@1— emitted byinspectLoaner.requested@1— emitted byinspectLoaner.reserved@1— emitted byreserveLoaner.rotated@1— emitted byrotateLoaner.warrantyBilled@1— emitted bywarrantyBill
Discover & read
read
loaner.read · GET /loaners/read · gate none · sandbox · answers LoanerRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C6RR7TT5KS714006 (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 { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.read({"vin":"1C6RR7TT5KS714006"})curl 'https://apis.vin/loaners/read?vin=1C6RR7TT5KS714006'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": "LoanerRead@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"loaner": {
"id": "RNT-45319499",
"position": "Quoted",
"kind": "retail-rental"
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"loaner": {
"id": "RNT-45319499",
"position": "Quoted",
"kind": "retail-rental"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}status
loaner.status · GET /loaners/status · gate none · sandbox · answers LoanerStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C6RR7TT5KS714006 (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 { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.status({"vin":"1C6RR7TT5KS714006"})curl 'https://apis.vin/loaners/status?vin=1C6RR7TT5KS714006'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": "LoanerStatus@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"loaner": {
"id": "RNT-45319499",
"position": "Quoted",
"kind": "retail-rental"
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"loaner": {
"id": "RNT-45319499",
"position": "Quoted",
"kind": "retail-rental"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}availability
loaner.availability · GET /loaners/availability · gate key · sandbox · answers LoanerAvailability@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C6RR7TT5KS714006 (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 { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.availability({"vin":"1C6RR7TT5KS714006"})curl 'https://apis.vin/loaners/availability?vin=1C6RR7TT5KS714006'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": "LoanerAvailability@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"availability": {
"available": true,
"kind": "retail-rental",
"dayRateCents": 8756,
"currency": "USD"
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"availability": {
"available": true,
"kind": "retail-rental",
"dayRateCents": 8756,
"currency": "USD"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}utilization
loaner.utilization · GET /loaners/utilization · gate key · sandbox · answers LoanerUtilization@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1C6RR7TT5KS714006 (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 { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.utilization({"vin":"1C6RR7TT5KS714006"})curl 'https://apis.vin/loaners/utilization?vin=1C6RR7TT5KS714006'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": "LoanerUtilization@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"utilization": {
"stints": 8,
"out": 1,
"closed": 1
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"utilization": {
"stints": 8,
"out": 1,
"closed": 1
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
reserve
loaner.reserve · POST /loaners/reserve · gate offer · sandbox · answers LoanerReserve@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) · /1C6RR7TT5KS714006 (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 — Loaner.reserved@1.
import { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.reserve({"vin":"1C6RR7TT5KS714006"})curl -X POST https://apis.vin/loaners/reserve \
-H 'content-type: application/json' \
-d '{"vin":"1C6RR7TT5KS714006"}'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": "LoanerReserve@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"reservation": {
"status": "reserved",
"id": "RNT-45319499",
"renter": "Ava Good"
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"reservation": {
"status": "reserved",
"id": "RNT-45319499",
"renter": "Ava Good"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}assign
loaner.assign · POST /loaners/assign · gate offer · sandbox · answers LoanerAssign@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) · /1C6RR7TT5KS714006 (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 — Loaner.assigned@1.
import { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.assign({"vin":"1C6RR7TT5KS714006"})curl -X POST https://apis.vin/loaners/assign \
-H 'content-type: application/json' \
-d '{"vin":"1C6RR7TT5KS714006"}'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": "LoanerAssign@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"assignment": {
"status": "not-eligible-no-open-repair-order",
"kind": "retail-rental",
"basis": "wave-14-courtesy-story"
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"assignment": {
"status": "not-eligible-no-open-repair-order",
"kind": "retail-rental",
"basis": "wave-14-courtesy-story"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}checkIn
loaner.checkIn · POST /loaners/check-in · gate offer · sandbox · answers LoanerCheckIn@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) · /1C6RR7TT5KS714006 (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 — Loaner.checkedIn@1.
import { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.checkIn({"vin":"1C6RR7TT5KS714006"})curl -X POST https://apis.vin/loaners/check-in \
-H 'content-type: application/json' \
-d '{"vin":"1C6RR7TT5KS714006"}'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": "LoanerCheckIn@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"checkIn": {
"status": "not-checked-out",
"id": "RNT-45319499",
"position": "Quoted"
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"checkIn": {
"status": "not-checked-out",
"id": "RNT-45319499",
"position": "Quoted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}checkOut
loaner.checkOut · POST /loaners/check-out · gate offer · sandbox · answers LoanerCheckOut@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) · /1C6RR7TT5KS714006 (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 — Loaner.checkedOut@1.
import { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.checkOut({"vin":"1C6RR7TT5KS714006"})curl -X POST https://apis.vin/loaners/check-out \
-H 'content-type: application/json' \
-d '{"vin":"1C6RR7TT5KS714006"}'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": "LoanerCheckOut@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"checkOut": {
"status": "not-yet-booked",
"id": "RNT-45319499",
"position": "Quoted"
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"checkOut": {
"status": "not-yet-booked",
"id": "RNT-45319499",
"position": "Quoted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
charge
loaner.charge · POST /loaners/charge · gate offer · sandbox · answers LoanerCharge@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) · /1C6RR7TT5KS714006 (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 — Loaner.charged@1 · Loaner.failed@1.
import { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.charge({"vin":"1C6RR7TT5KS714006"})curl -X POST https://apis.vin/loaners/charge \
-H 'content-type: application/json' \
-d '{"vin":"1C6RR7TT5KS714006"}'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": "LoanerCharge@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"charge": {
"status": "stint-not-yet-inspected",
"id": "RNT-45319499",
"position": "Quoted"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"charge": {
"status": "stint-not-yet-inspected",
"id": "RNT-45319499",
"position": "Quoted"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}warrantyBill
loaner.warrantyBill · POST /loaners/warranty-bill · gate offer · sandbox · answers LoanerWarrantyBill@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) · /1C6RR7TT5KS714006 (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 — Loaner.failed@1 · Loaner.warrantyBilled@1.
import { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.warrantyBill({"vin":"1C6RR7TT5KS714006"})curl -X POST https://apis.vin/loaners/warranty-bill \
-H 'content-type: application/json' \
-d '{"vin":"1C6RR7TT5KS714006"}'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": "LoanerWarrantyBill@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"bill": {
"status": "billed-to-warranty",
"id": "LWB-9385ed1f",
"days": 2,
"dayRateCents": 3500,
"totalCents": 7000,
"currency": "USD",
"basis": "wave-6-claim-law"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"bill": {
"status": "billed-to-warranty",
"id": "LWB-9385ed1f",
"days": 2,
"dayRateCents": 3500,
"totalCents": 7000,
"currency": "USD",
"basis": "wave-6-claim-law"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
inspect
loaner.inspect · POST /loaners/inspect · gate offer · sandbox · answers LoanerInspect@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) · /1C6RR7TT5KS714006 (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 — Loaner.inspected@1 · Loaner.requested@1.
import { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.inspect({"vin":"1C6RR7TT5KS714006"})curl -X POST https://apis.vin/loaners/inspect \
-H 'content-type: application/json' \
-d '{"vin":"1C6RR7TT5KS714006"}'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": "LoanerInspect@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"inspection": {
"status": "not-yet-returned",
"id": "RNT-45319499",
"position": "Quoted"
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"inspection": {
"status": "not-yet-returned",
"id": "RNT-45319499",
"position": "Quoted"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}rotate
loaner.rotate · POST /loaners/rotate · gate offer · sandbox · answers LoanerRotate@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) · /1C6RR7TT5KS714006 (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 — Loaner.rotated@1.
import { loaner } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await loaner.rotate({"vin":"1C6RR7TT5KS714006"})curl -X POST https://apis.vin/loaners/rotate \
-H 'content-type: application/json' \
-d '{"vin":"1C6RR7TT5KS714006"}'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": "LoanerRotate@1",
"value": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"rotation": {
"status": "still-out",
"id": "RNT-45319499",
"position": "Quoted"
},
"pool": {
"stints": 8,
"out": 1,
"closed": 1
}
},
"evidence": {
"vin": "1C6RR7TT5KS714006",
"noun": "loaner",
"asOf": "2026-08-10",
"roId": "RO-91c612d1",
"rotation": {
"status": "still-out",
"id": "RNT-45319499",
"position": "Quoted"
},
"pool": {
"stints": 8,
"out": 1,
"closed": 1
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "courtesy-desk-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Data model
The record shape behind this noun — one entity, each property an evidence field. See the whole estate model on the data model page.
Rental
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.
loan
The loan noun — identity, lifecycle, events, and every capability as an anchored section: 19 capabilities, 0 live, 19 sandbox, 0 declared.
loanServicing
The loanServicing noun — identity, lifecycle, events, and every capability as an anchored section: 12 capabilities, 0 live, 12 sandbox, 0 declared.