docs.vin

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

Nounappointment
PillarServices (facets: 8 data · 10 services · 3 commerce)
Capabilities21 — 0 live · 21 sandbox · 0 declared
EntitiesAppointment
Doorsaggregator.vin
SDKVin.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:

Discover & read

read

appointment.read · GET /appointments/read · gate none · sandbox · answers AppointmentRead@1

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — appointment.history
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"})
GET /appointments/history
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.

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

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

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

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — appointment.capacity
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"})
GET /appointments/capacity
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.

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

FieldTypeRequiredNotes
vinstringno

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

EmitsAppointment.waitEstimated@1.

the SDK — appointment.waitEstimate
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"})
GET /appointments/wait-estimate
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.

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

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

EmitsAppointment.completed@1 · Appointment.dispatched@1 · Appointment.ordered@1 · ServiceOrder.settled@1.

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

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

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

EmitsAppointment.checkInRequested@1 · Appointment.checkedIn@1.

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

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

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

EmitsAppointment.checkOutRequested@1 · Appointment.checkedOut@1.

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

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

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

EmitsAppointment.rescheduleRequested@1 · Appointment.rescheduled@1.

the SDK — appointment.reschedule
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"})
POST /appointments/reschedule
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.

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

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

EmitsAppointment.paid@1 · Appointment.payFailed@1 · Appointment.payRequested@1.

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

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

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

EmitsAppointment.depositRequested@1 · Appointment.deposited@1 · Appointment.failed@1.

the SDK — appointment.deposit
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"})
POST /appointments/deposit
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.

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

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

EmitsAppointment.failed@1 · Appointment.refundFailed@1 · Appointment.refundRequested@1 · Appointment.refunded@1.

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

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

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

EmitsAppointment.confirmRequested@1 · Appointment.confirmed@1.

the SDK — appointment.confirm
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"})
POST /appointments/confirm
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.

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

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

EmitsAppointment.remindRequested@1 · Appointment.reminded@1.

the SDK — appointment.remind
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"})
POST /appointments/remind
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.

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

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

EmitsAppointment.cancelRequested@1 · Appointment.canceled@1.

the SDK — appointment.cancel
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"})
POST /appointments/cancel
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — appointment.calendar
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"})
GET /appointments/calendar
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.

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

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

EmitsAppointment.shown@1.

the SDK — appointment.markShown
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"})
POST /appointments/mark-shown
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.

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

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

EmitsAppointment.noShowRequested@1 · Appointment.noShowed@1.

the SDK — appointment.noShow
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"})
POST /appointments/no-show
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.

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

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

EmitsAppointment.set@1.

the SDK — appointment.set
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"})
POST /appointments/set
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.

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

FieldTypeRequiredNotes
vinstringno

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

the SDK — appointment.slots
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"})
GET /appointments/slots
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.

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

PropertyType
idid
vinstring
scheduledAtdatetime
baystring
technicianIdref→Provider

Relationships

FromToCardinalityAs
repairOrderappointment1:0..1scheduled

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