appointment
The appointment noun — identity, lifecycle, events, and every capability as an anchored section: 21 capabilities, 0 live, 21 sandbox, 0 declared.
appointment is one of the estate's 317 automotive nouns — a job a car needs done. It carries 21 capabilities: 0 live, 21 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | appointment |
| Pillar | Services (facets: 8 data · 10 services · 3 commerce) |
| Capabilities | 21 — 0 live · 21 sandbox · 0 declared |
| Entities | Appointment |
| Doors | aggregator.vin |
| SDK | Vin.appointment.* from apis.vin |
| Address | /catalog/appointment#{action} — the anchor IS the wire name minus appointment. |
Events
The vocabulary this noun can append to the record — 30 past-tense, versioned event types, each linked to the capability that emits it:
Appointment.cancelRequested@1— emitted bycancelAppointment.canceled@1— emitted bycancelAppointment.checkInRequested@1— emitted bycheckInAppointment.checkOutRequested@1— emitted bycheckOutAppointment.checkedIn@1— emitted bycheckInAppointment.checkedOut@1— emitted bycheckOutAppointment.completed@1— emitted bybookAppointment.confirmRequested@1— emitted byconfirmAppointment.confirmed@1— emitted byconfirmAppointment.depositRequested@1— emitted bydepositAppointment.deposited@1— emitted bydepositAppointment.dispatched@1— emitted bybookAppointment.failed@1— emitted bydeposit·refundAppointment.noShowRequested@1— emitted bynoShowAppointment.noShowed@1— emitted bynoShowAppointment.ordered@1— emitted bybookAppointment.paid@1— emitted bypayAppointment.payFailed@1— emitted bypayAppointment.payRequested@1— emitted bypayAppointment.refundFailed@1— emitted byrefundAppointment.refundRequested@1— emitted byrefundAppointment.refunded@1— emitted byrefundAppointment.remindRequested@1— emitted byremindAppointment.reminded@1— emitted byremindAppointment.rescheduleRequested@1— emitted byrescheduleAppointment.rescheduled@1— emitted byrescheduleAppointment.set@1— emitted bysetAppointment.shown@1— emitted bymarkShownAppointment.waitEstimated@1— emitted bywaitEstimateServiceOrder.settled@1— emitted bybook
Discover & read
read
appointment.read · GET /appointments/read · gate none · sandbox · answers AppointmentRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FTFW1RG5PFA59714 (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 { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.read({"vin":"1FTFW1RG5PFA59714"})curl 'https://apis.vin/appointments/read?vin=1FTFW1RG5PFA59714'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": "AppointmentRead@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "booked"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "booked"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}history
appointment.history · GET /appointments/history · gate none · sandbox · answers AppointmentHistory@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FTFW1RG5PFA59714 (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 { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.history({"vin":"1FTFW1RG5PFA59714"})curl 'https://apis.vin/appointments/history?vin=1FTFW1RG5PFA59714'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": "AppointmentHistory@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"events": [
{
"date": "2024-03-14",
"kind": "routine",
"description": "routine appointment record"
},
{
"date": "2024-11-02",
"kind": "routine",
"description": "routine appointment record"
}
]
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"events": [
{
"date": "2024-03-14",
"kind": "routine",
"description": "routine appointment record"
},
{
"date": "2024-11-02",
"kind": "routine",
"description": "routine appointment record"
}
]
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}status
appointment.status · GET /appointments/status · gate none · sandbox · answers AppointmentStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FTFW1RG5PFA59714 (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 { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.status({"vin":"1FTFW1RG5PFA59714"})curl 'https://apis.vin/appointments/status?vin=1FTFW1RG5PFA59714'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": "AppointmentStatus@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "booked"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "booked"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}availability
appointment.availability · GET /appointments/availability · gate none · sandbox · answers AppointmentAvailability@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FTFW1RG5PFA59714 (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 { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.availability({"vin":"1FTFW1RG5PFA59714"})curl 'https://apis.vin/appointments/availability?vin=1FTFW1RG5PFA59714'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": "AppointmentAvailability@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"slotsOpen": 5,
"nextSlotDate": "2026-08-12"
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"slotsOpen": 5,
"nextSlotDate": "2026-08-12"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}capacity
appointment.capacity · GET /appointments/capacity · gate none · sandbox · answers AppointmentCapacity@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FTFW1RG5PFA59714 (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 { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.capacity({"vin":"1FTFW1RG5PFA59714"})curl 'https://apis.vin/appointments/capacity?vin=1FTFW1RG5PFA59714'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": "AppointmentCapacity@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"slotsOpen": 5,
"nextSlotDate": "2026-08-12"
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"slotsOpen": 5,
"nextSlotDate": "2026-08-12"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Quote & price
waitEstimate
appointment.waitEstimate · GET /appointments/wait-estimate · gate key · sandbox · answers AppointmentWaitEstimate@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FTFW1RG5PFA59714 (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 — Appointment.waitEstimated@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.waitEstimate({"vin":"1FTFW1RG5PFA59714"})curl 'https://apis.vin/appointments/wait-estimate?vin=1FTFW1RG5PFA59714'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": "AppointmentWaitEstimate@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"waitMinutes": 0
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"waitMinutes": 0
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
book
appointment.book · POST /appointments/book · gate offer · sandbox · answers AppointmentBook@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) · /1FTFW1RG5PFA59714 (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 — Appointment.completed@1 · Appointment.dispatched@1 · Appointment.ordered@1 · ServiceOrder.settled@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.book({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/book \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentBook@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "booked"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "booked"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}checkIn
appointment.checkIn · POST /appointments/check-in · gate offer · sandbox · answers AppointmentCheckIn@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) · /1FTFW1RG5PFA59714 (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 — Appointment.checkInRequested@1 · Appointment.checkedIn@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.checkIn({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/check-in \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentCheckIn@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"checkIn": {
"status": "checked-in"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"checkIn": {
"status": "checked-in"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}checkOut
appointment.checkOut · POST /appointments/check-out · gate offer · sandbox · answers AppointmentCheckOut@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) · /1FTFW1RG5PFA59714 (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 — Appointment.checkOutRequested@1 · Appointment.checkedOut@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.checkOut({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/check-out \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentCheckOut@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"checkOut": {
"status": "not-checked-in"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"checkOut": {
"status": "not-checked-in"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}reschedule
appointment.reschedule · POST /appointments/reschedule · gate offer · sandbox · answers AppointmentReschedule@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) · /1FTFW1RG5PFA59714 (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 — Appointment.rescheduleRequested@1 · Appointment.rescheduled@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.reschedule({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/reschedule \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentReschedule@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "rescheduled"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "rescheduled"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
appointment.pay · POST /appointments/pay · gate offer · sandbox · answers AppointmentPay@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) · /1FTFW1RG5PFA59714 (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 — Appointment.paid@1 · Appointment.payFailed@1 · Appointment.payRequested@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.pay({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/pay \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentPay@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"payment": {
"id": "PAY-24957378",
"status": "settled",
"amountCents": 5000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"payment": {
"id": "PAY-24957378",
"status": "settled",
"amountCents": 5000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}deposit
appointment.deposit · POST /appointments/deposit · gate offer · sandbox · answers AppointmentDeposit@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) · /1FTFW1RG5PFA59714 (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 — Appointment.depositRequested@1 · Appointment.deposited@1 · Appointment.failed@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.deposit({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/deposit \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentDeposit@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"deposit": {
"id": "DEP-9c289050",
"amountCents": 5000,
"currency": "USD",
"status": "held"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"deposit": {
"id": "DEP-9c289050",
"amountCents": 5000,
"currency": "USD",
"status": "held"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}refund
appointment.refund · POST /appointments/refund · gate offer · sandbox · answers AppointmentRefund@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) · /1FTFW1RG5PFA59714 (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 — Appointment.failed@1 · Appointment.refundFailed@1 · Appointment.refundRequested@1 · Appointment.refunded@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.refund({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/refund \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentRefund@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"refund": {
"id": "RFD-9dedee0c",
"status": "issued",
"amountCents": 5000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"refund": {
"id": "RFD-9dedee0c",
"status": "issued",
"amountCents": 5000,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
confirm
appointment.confirm · POST /appointments/confirm · gate offer · sandbox · answers AppointmentConfirm@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) · /1FTFW1RG5PFA59714 (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 — Appointment.confirmRequested@1 · Appointment.confirmed@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.confirm({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/confirm \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentConfirm@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "confirmed"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "confirmed"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}remind
appointment.remind · POST /appointments/remind · gate offer · sandbox · answers AppointmentRemind@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) · /1FTFW1RG5PFA59714 (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 — Appointment.remindRequested@1 · Appointment.reminded@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.remind({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/remind \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentRemind@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"reminder": {
"id": "RM-491568f3",
"channel": "message",
"status": "sent"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"reminder": {
"id": "RM-491568f3",
"channel": "message",
"status": "sent"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Lifecycle & state
cancel
appointment.cancel · POST /appointments/cancel · gate offer · sandbox · answers AppointmentCancel@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) · /1FTFW1RG5PFA59714 (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 — Appointment.cancelRequested@1 · Appointment.canceled@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.cancel({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/cancel \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentCancel@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"cancel": {
"status": "cancelled"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"cancel": {
"status": "cancelled"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
calendar
appointment.calendar · GET /appointments/calendar · gate key · sandbox · answers AppointmentCalendar@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FTFW1RG5PFA59714 (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 { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.calendar({"vin":"1FTFW1RG5PFA59714"})curl 'https://apis.vin/appointments/calendar?vin=1FTFW1RG5PFA59714'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": "AppointmentCalendar@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "booked"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "booked"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}markShown
appointment.markShown · POST /appointments/mark-shown · gate offer · sandbox · answers AppointmentMarkShown@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) · /1FTFW1RG5PFA59714 (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 — Appointment.shown@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.markShown({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/mark-shown \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentMarkShown@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"shown": false
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"shown": false
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}noShow
appointment.noShow · POST /appointments/no-show · gate offer · sandbox · answers AppointmentNoShow@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) · /1FTFW1RG5PFA59714 (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 — Appointment.noShowRequested@1 · Appointment.noShowed@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.noShow({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/no-show \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentNoShow@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"noShow": false
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"noShow": false
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}set
appointment.set · POST /appointments/set · gate offer · sandbox · answers AppointmentSet@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) · /1FTFW1RG5PFA59714 (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 — Appointment.set@1.
import { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.set({"vin":"1FTFW1RG5PFA59714"})curl -X POST https://apis.vin/appointments/set \
-H 'content-type: application/json' \
-d '{"vin":"1FTFW1RG5PFA59714"}'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": "AppointmentSet@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "booked"
}
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"appointment": {
"id": "APT-1f603de3",
"date": "2026-08-12",
"status": "booked"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}slots
appointment.slots · GET /appointments/slots · gate none · sandbox · answers AppointmentSlots@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1FTFW1RG5PFA59714 (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 { appointment } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await appointment.slots({"vin":"1FTFW1RG5PFA59714"})curl 'https://apis.vin/appointments/slots?vin=1FTFW1RG5PFA59714'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": "AppointmentSlots@1",
"value": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"slotsOpen": 5,
"nextSlotDate": "2026-08-12"
},
"evidence": {
"vin": "1FTFW1RG5PFA59714",
"noun": "appointment",
"asOf": "2026-08-10",
"standing": "booked",
"slotsOpen": 5,
"nextSlotDate": "2026-08-12"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "shop-arc-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.
Appointment
Schema
| Property | Type |
|---|---|
id | id |
vin | string |
scheduledAt | datetime |
bay | string |
technicianId | ref→Provider |
Relationships
| From | To | Cardinality | As |
|---|---|---|---|
repairOrder | appointment | 1:0..1 | scheduled |
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.