docs.vin

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

Nounloaner
PillarServices (facets: 4 data · 6 services · 2 commerce)
Capabilities12 — 0 live · 12 sandbox · 0 declared
EntitiesRental
Doorsaggregator.vin
SDKVin.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:

Discover & read

read

loaner.read · GET /loaners/read · gate none · sandbox · answers LoanerRead@1

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — loaner.availability
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"})
GET /loaners/availability
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — loaner.utilization
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"})
GET /loaners/utilization
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.

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

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) · /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.

EmitsLoaner.reserved@1.

the SDK — loaner.reserve
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"})
POST /loaners/reserve
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.

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

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) · /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.

EmitsLoaner.assigned@1.

the SDK — loaner.assign
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"})
POST /loaners/assign
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.

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

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) · /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.

EmitsLoaner.checkedIn@1.

the SDK — loaner.checkIn
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"})
POST /loaners/check-in
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.

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

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) · /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.

EmitsLoaner.checkedOut@1.

the SDK — loaner.checkOut
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"})
POST /loaners/check-out
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.

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

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) · /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.

EmitsLoaner.charged@1 · Loaner.failed@1.

the SDK — loaner.charge
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"})
POST /loaners/charge
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.

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

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) · /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.

EmitsLoaner.failed@1 · Loaner.warrantyBilled@1.

the SDK — loaner.warrantyBill
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"})
POST /loaners/warranty-bill
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.

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

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) · /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.

EmitsLoaner.inspected@1 · Loaner.requested@1.

the SDK — loaner.inspect
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"})
POST /loaners/inspect
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.

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

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) · /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.

EmitsLoaner.rotated@1.

the SDK — loaner.rotate
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"})
POST /loaners/rotate
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.

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