docs.vin

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

Nounrental
PillarServices (facets: 5 data · 7 services · 7 commerce)
Capabilities19 — 0 live · 19 sandbox · 0 declared
EntitiesRental
Doorsaggregator.vin
SDKVin.rental.* from apis.vin
Address/catalog/rental#{action} — the anchor IS the wire name minus rental.

Lifecycle

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

Discover & read

read

rental.read · GET /rentals/read · gate none · sandbox · answers RentalRead@1

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

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

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

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

EmitsRental.upgraded@1.

the SDK — rental.upgrade
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"})
POST /rentals/upgrade
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.

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

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

EmitsRental.failed@1 · Rental.quoted@1.

the SDK — rental.quote
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"})
POST /rentals/quote
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — rental.rate
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"})
GET /rentals/rate
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.

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

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

EmitsRental.booked@1 · Rental.failed@1.

the SDK — rental.book
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"})
POST /rentals/book
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.

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

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

EmitsRental.reserved@1.

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

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

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

EmitsRental.checkedIn@1.

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

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

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

EmitsRental.checkedOut@1.

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

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

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

EmitsRental.failed@1 · Rental.paid@1.

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

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

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

EmitsRental.charged@1 · Rental.failed@1.

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

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

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

EmitsRental.failed@1 · Rental.refunded@1.

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

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

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

EmitsRental.failed@1 · Rental.incidentalCharged@1.

the SDK — rental.incidentalCharge
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"})
POST /rentals/incidental-charge
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.

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

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

EmitsRental.failed@1 · Rental.held@1.

the SDK — rental.hold
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"})
POST /rentals/hold
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.

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

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

EmitsRental.returnInspected@1.

the SDK — rental.inspectReturn
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"})
POST /rentals/inspect-return
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.

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

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

EmitsRental.extended@1.

the SDK — rental.extend
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"})
POST /rentals/extend
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.

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

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

EmitsRental.swapped@1.

the SDK — rental.swap
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"})
POST /rentals/swap
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.

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

PropertyTypeNotes
ididrent_
vinstring
renterIdref→Party
providerIdref→Provider
dailyRatemoney
statusRentalFSM

Relationships

FromToCardinalityAs
rentalvehicle*:1rents
rentalparty*:1rented-by

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