docs.vin

maintenance

The maintenance noun — identity, lifecycle, events, and every capability as an anchored section: 24 capabilities, 0 live, 24 sandbox, 0 declared.

maintenance is one of the estate's 317 automotive nouns — a job a car needs done. It carries 24 capabilities: 0 live, 24 sandbox, 0 declared · doors maintenance.vin · aggregator.vin.

Identity

Nounmaintenance
PillarData (facets: 11 data · 6 services · 7 commerce)
Capabilities24 — 0 live · 24 sandbox · 0 declared
EntitiesRepairOrder
Doorsaggregator.vin · maintenance.vin
SDKVin.maintenance.* from apis.vin
Address/catalog/maintenance#{action} — the anchor IS the wire name minus maintenance.

Events

The vocabulary this noun can append to the record — 33 past-tense, versioned event types, each linked to the capability that emits it:

Discover & read

history

maintenance.history · GET /maintenances/history · gate none · sandbox · answers MaintenanceHistory@1

FieldTypeRequiredNotes
vinstringno

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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 — maintenance.history
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.history({"vin":"3GCPYCEL6MG114923"})
GET /maintenances/history
curl 'https://apis.vin/maintenances/history?vin=3GCPYCEL6MG114923'

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:14.056Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceHistory@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "events": [
      {
        "date": "2024-03-14",
        "kind": "routine",
        "description": "routine scheduled service record"
      },
      {
        "date": "2024-11-02",
        "kind": "routine",
        "description": "routine scheduled service record"
      }
    ]
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "events": [
      {
        "date": "2024-03-14",
        "kind": "routine",
        "description": "routine scheduled service record"
      },
      {
        "date": "2024-11-02",
        "kind": "routine",
        "description": "routine scheduled service record"
      }
    ]
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

status

maintenance.status · GET /maintenances/status · gate none · sandbox · answers MaintenanceStatus@1

FieldTypeRequiredNotes
vinstringno

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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 — maintenance.status
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.status({"vin":"3GCPYCEL6MG114923"})
GET /maintenances/status
curl 'https://apis.vin/maintenances/status?vin=3GCPYCEL6MG114923'

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:14.103Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceStatus@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "maintenance": {
      "dueNow": true,
      "warranty": "expired",
      "appointment": "none",
      "nextServiceMiles": 23409
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "maintenance": {
      "dueNow": true,
      "warranty": "expired",
      "appointment": "none",
      "nextServiceMiles": 23409
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

predict

maintenance.predict · GET /maintenances/predict · gate none · sandbox · answers MaintenancePredict@1

No input — this capability takes no request body.

Dooraggregator.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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 — maintenance.predict
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.predict()
GET /maintenances/predict
curl 'https://apis.vin/maintenances/predict'

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-16T14:50:09.922Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenancePredict@1",
  "value": {
    "vin": "1HGCM82633A004352",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": false,
    "prediction": {
      "failureRisk": "low",
      "horizonDays": 180
    }
  },
  "evidence": {
    "vin": "1HGCM82633A004352",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": false,
    "prediction": {
      "failureRisk": "low",
      "horizonDays": 180
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

declinedLookup

maintenance.declinedLookup · GET /maintenances/declined-lookup · gate none · sandbox · answers MaintenanceDeclinedLookup@1

FieldTypeRequiredNotes
vinstringno

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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 — maintenance.declinedLookup
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.declinedLookup({"vin":"3GCPYCEL6MG114923"})
GET /maintenances/declined-lookup
curl 'https://apis.vin/maintenances/declined-lookup?vin=3GCPYCEL6MG114923'

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:14.055Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceDeclinedLookup@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "declinedServices": []
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "declinedServices": []
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

intervalLookup

maintenance.intervalLookup · GET /maintenances/interval-lookup · gate none · sandbox · answers MaintenanceIntervalLookup@1

FieldTypeRequiredNotes
vinstringno

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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 — maintenance.intervalLookup
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.intervalLookup({"vin":"3GCPYCEL6MG114923"})
GET /maintenances/interval-lookup
curl 'https://apis.vin/maintenances/interval-lookup?vin=3GCPYCEL6MG114923'

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:14.056Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceIntervalLookup@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "intervals": [
      {
        "service": "oilChange",
        "everyMiles": 7500,
        "everyMonths": 12
      },
      {
        "service": "tireRotation",
        "everyMiles": 7500
      },
      {
        "service": "brakeFluid",
        "everyMonths": 36
      },
      {
        "service": "transmissionFluid",
        "everyMiles": 60000
      },
      {
        "service": "engineAirFilter",
        "everyMiles": 30000
      }
    ]
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "intervals": [
      {
        "service": "oilChange",
        "everyMiles": 7500,
        "everyMonths": 12
      },
      {
        "service": "tireRotation",
        "everyMiles": 7500
      },
      {
        "service": "brakeFluid",
        "everyMonths": 36
      },
      {
        "service": "transmissionFluid",
        "everyMiles": 60000
      },
      {
        "service": "engineAirFilter",
        "everyMiles": 30000
      }
    ]
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

oemSpecLookup

maintenance.oemSpecLookup · GET /maintenances/oem-spec-lookup · gate none · sandbox · answers MaintenanceOemSpecLookup@1

FieldTypeRequiredNotes
vinstringno

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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 — maintenance.oemSpecLookup
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.oemSpecLookup({"vin":"3GCPYCEL6MG114923"})
GET /maintenances/oem-spec-lookup
curl 'https://apis.vin/maintenances/oem-spec-lookup?vin=3GCPYCEL6MG114923'

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:14.063Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceOemSpecLookup@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "oilViscosity": "5W-20",
    "oilCapacityQuarts": 6,
    "coolantType": "HOAT",
    "tirePressureFrontPsi": 31,
    "tirePressureRearPsi": 34
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "oilViscosity": "5W-20",
    "oilCapacityQuarts": 6,
    "coolantType": "HOAT",
    "tirePressureFrontPsi": 31,
    "tirePressureRearPsi": 34
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

scheduleLookup

maintenance.scheduleLookup · GET /maintenances/schedule-lookup · gate none · sandbox · answers MaintenanceScheduleLookup@1

FieldTypeRequiredNotes
vinstringno

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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 — maintenance.scheduleLookup
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.scheduleLookup({"vin":"3GCPYCEL6MG114923"})
GET /maintenances/schedule-lookup
curl 'https://apis.vin/maintenances/schedule-lookup?vin=3GCPYCEL6MG114923'

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:14.103Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceScheduleLookup@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "appointment": {
      "status": "no-appointment-on-file"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "appointment": {
      "status": "no-appointment-on-file"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

oemSpec

maintenance.oemSpec · GET /maintenances/oem-spec · gate none · sandbox · answers MaintenanceOemSpec@1

FieldTypeRequiredNotes
vinstringno

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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 — maintenance.oemSpec
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.oemSpec({"vin":"3GCPYCEL6MG114923"})
GET /maintenances/oem-spec
curl 'https://apis.vin/maintenances/oem-spec?vin=3GCPYCEL6MG114923'

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:14.061Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceOemSpec@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "spec": {
      "oilGrade": "0W-20",
      "oilCapacityTenthsQt": 48,
      "coolant": "long-life",
      "intervalMiles": 7500
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "spec": {
      "oilGrade": "0W-20",
      "oilCapacityTenthsQt": 48,
      "coolant": "long-life",
      "intervalMiles": 7500
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

dueCheck

maintenance.dueCheck · GET /maintenances/due-check · gate none · sandbox · answers MaintenanceDueCheck@1

FieldTypeRequiredNotes
vinstringno
asOfstringnoformat date-time; observation instant (≡ the x-world-as-of header); the answer states the world AT this instant — absent, at, or before the fixed as-of answers the unmoved world

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsVehicle.maintenanceDue@1.

the SDK — maintenance.dueCheck
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.dueCheck({"vin":"3GCPYCEL6MG114923","asOf":"asof"})
GET /maintenances/due-check
curl 'https://apis.vin/maintenances/due-check?vin=3GCPYCEL6MG114923&asOf=asof'

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:14.055Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceDueCheck@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "mileage": 45000,
    "due": [],
    "nextServiceMiles": 52500,
    "milesToNext": 7500
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "mileage": 45000,
    "due": [],
    "nextServiceMiles": 52500,
    "milesToNext": 7500
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "services-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Quote & price

quote

maintenance.quote · POST /maintenances/quote · gate offer · sandbox · answers MaintenanceQuote@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.quoteRequested@1 · Maintenance.quoted@1.

the SDK — maintenance.quote
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.quote({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/quote
curl -X POST https://apis.vin/maintenances/quote \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.097Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceQuote@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "quoteId": "DQ-1",
    "serviceType": "repair",
    "costCents": 54470,
    "priceCents": 70811,
    "marginCents": 16341,
    "currency": "USD",
    "etaMinDays": 1,
    "etaMaxDays": 5,
    "rush": false,
    "expires": "2026-08-17T00:00:00.000Z"
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "quoteId": "DQ-1",
    "serviceType": "repair",
    "costCents": 54470,
    "priceCents": 70811,
    "marginCents": 16341,
    "currency": "USD",
    "etaMinDays": 1,
    "etaMaxDays": 5,
    "rush": false,
    "expires": "2026-08-17T00:00:00.000Z"
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "field-services-rail-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

estimate

maintenance.estimate · POST /maintenances/estimate · gate offer · sandbox · answers MaintenanceEstimate@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.estimated@1.

the SDK — maintenance.estimate
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.estimate({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/estimate
curl -X POST https://apis.vin/maintenances/estimate \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.056Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceEstimate@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "estimate": {
      "id": "ME-58d0db56",
      "amountCents": 24500,
      "currency": "USD"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "estimate": {
      "id": "ME-58d0db56",
      "amountCents": 24500,
      "currency": "USD"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Apply & book

order

maintenance.order · POST /maintenances/order · gate offer · sandbox · answers MaintenanceOrder@1

FieldTypeRequiredNotes
vinstringyes
servicestringyesone of oil, tires, brakes, factory-interval
preAuthorizedstringnooverage ceiling amount
authoritystringno

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.

Delegated calls require a typed Mandate{ ceiling, perAction, expires, tripwires }; the ceiling is a field, not a conversation.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.completed@1 · Maintenance.dispatched@1 · Maintenance.ordered@1 · Order.placed@1 · ServiceOrder.ordered@1 · ServiceOrder.settled@1.

the SDK — maintenance.order
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.order({"vin":"3GCPYCEL6MG114923","service":"oil"})
POST /maintenances/order
curl -X POST https://apis.vin/maintenances/order \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923","service":"oil"}'

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:14.078Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceOrder@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "order": {
      "id": "ORD-4adbf778",
      "service": "scheduled service",
      "status": "placed",
      "amountCents": 24500,
      "currency": "USD"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "order": {
      "id": "ORD-4adbf778",
      "service": "scheduled service",
      "status": "placed",
      "amountCents": 24500,
      "currency": "USD"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

schedule

maintenance.schedule · POST /maintenances/schedule · gate offer · sandbox · answers MaintenanceSchedule@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.scheduleRequested@1 · Maintenance.scheduled@1.

the SDK — maintenance.schedule
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.schedule({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/schedule
curl -X POST https://apis.vin/maintenances/schedule \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.098Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceSchedule@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "orderId": "serviceorder_EMVh3MmY1dFQ",
    "serviceType": "repair",
    "scheduled": true,
    "status": "Active",
    "slotDays": 1,
    "expires": "2026-08-17T00:00:00.000Z"
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "orderId": "serviceorder_EMVh3MmY1dFQ",
    "serviceType": "repair",
    "scheduled": true,
    "status": "Active",
    "slotDays": 1,
    "expires": "2026-08-17T00:00:00.000Z"
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "field-services-rail-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

subscribe

maintenance.subscribe · POST /maintenances/subscribe · gate offer · sandbox · answers MaintenanceSubscribe@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.subscribeRequested@1 · Maintenance.subscribed@1.

the SDK — maintenance.subscribe
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.subscribe({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/subscribe
curl -X POST https://apis.vin/maintenances/subscribe \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.103Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceSubscribe@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "subscription": {
      "id": "SB-c7476508",
      "topic": "maintenance-reminders",
      "status": "active"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "subscription": {
      "id": "SB-c7476508",
      "topic": "maintenance-reminders",
      "status": "active"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

stampBook

maintenance.stampBook · POST /maintenances/stamp-book · gate offer · sandbox · answers MaintenanceStampBook@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.bookStamped@1 · Maintenance.stampBookFailed@1 · Maintenance.stampBookRequested@1.

the SDK — maintenance.stampBook
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.stampBook({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/stamp-book
curl -X POST https://apis.vin/maintenances/stamp-book \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.103Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceStampBook@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "book": {
      "stamps": 2,
      "lastStampDate": "2024-11-02"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "book": {
      "stamps": 2,
      "lastStampDate": "2024-11-02"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Pay & settle

pay

maintenance.pay · POST /maintenances/pay · gate offer · sandbox · answers MaintenancePay@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.charged@1 · Maintenance.paid@1 · Maintenance.payFailed@1 · Maintenance.payRequested@1 · ServiceOrder.settled@1.

the SDK — maintenance.pay
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.pay({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/pay
curl -X POST https://apis.vin/maintenances/pay \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.082Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenancePay@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "payment": {
      "id": "PAY-e70fd70e",
      "status": "settled",
      "amountCents": 24500,
      "currency": "USD"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "payment": {
      "id": "PAY-e70fd70e",
      "status": "settled",
      "amountCents": 24500,
      "currency": "USD"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

prepay

maintenance.prepay · POST /maintenances/prepay · gate offer · sandbox · answers MaintenancePrepay@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.prepaid@1 · Maintenance.prepayRequested@1.

the SDK — maintenance.prepay
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.prepay({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/prepay
curl -X POST https://apis.vin/maintenances/prepay \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.097Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenancePrepay@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "plan": {
      "id": "MP-8696c345",
      "kind": "prepaid-maintenance",
      "services": 5,
      "amountCents": 49500,
      "currency": "USD",
      "status": "active"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "plan": {
      "id": "MP-8696c345",
      "kind": "prepaid-maintenance",
      "services": 5,
      "amountCents": 49500,
      "currency": "USD",
      "status": "active"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

planBuy

maintenance.planBuy · POST /maintenances/plan-buy · gate offer · sandbox · answers MaintenancePlanBuy@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.planBuyRequested@1 · Maintenance.planPurchased@1.

the SDK — maintenance.planBuy
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.planBuy({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/plan-buy
curl -X POST https://apis.vin/maintenances/plan-buy \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.097Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenancePlanBuy@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "plan": {
      "id": "MP-db089a61",
      "kind": "prepaid-maintenance",
      "services": 5,
      "amountCents": 49500,
      "currency": "USD",
      "status": "active"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "plan": {
      "id": "MP-db089a61",
      "kind": "prepaid-maintenance",
      "services": 5,
      "amountCents": 49500,
      "currency": "USD",
      "status": "active"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Fulfill & operate

perform

maintenance.perform · POST /maintenances/perform · gate offer · sandbox · answers MaintenancePerform@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.performFailed@1 · Maintenance.performRequested@1 · Maintenance.performed@1.

the SDK — maintenance.perform
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.perform({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/perform
curl -X POST https://apis.vin/maintenances/perform \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.090Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenancePerform@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "work": {
      "id": "MW-1142f8ad",
      "operation": "perform",
      "status": "performed"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "work": {
      "id": "MW-1142f8ad",
      "operation": "perform",
      "status": "performed"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

complete

maintenance.complete · POST /maintenances/complete · gate offer · sandbox · answers MaintenanceComplete@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.completeRequested@1 · Maintenance.completed@1.

the SDK — maintenance.complete
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.complete({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/complete
curl -X POST https://apis.vin/maintenances/complete \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.055Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceComplete@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "work": {
      "id": "MW-85df6677",
      "operation": "complete",
      "status": "completed"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "work": {
      "id": "MW-85df6677",
      "operation": "complete",
      "status": "completed"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

remind

maintenance.remind · POST /maintenances/remind · gate offer · sandbox · answers MaintenanceRemind@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.reminded@1.

the SDK — maintenance.remind
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.remind({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/remind
curl -X POST https://apis.vin/maintenances/remind \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.097Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceRemind@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "reminder": {
      "id": "MR-ae2f6405",
      "channel": "message",
      "status": "sent"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "reminder": {
      "id": "MR-ae2f6405",
      "channel": "message",
      "status": "sent"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

More actions

interval

maintenance.interval · GET /maintenances/interval · gate none · sandbox · answers MaintenanceInterval@1

FieldTypeRequiredNotes
vinstringno

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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 — maintenance.interval
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.interval({"vin":"3GCPYCEL6MG114923"})
GET /maintenances/interval
curl 'https://apis.vin/maintenances/interval?vin=3GCPYCEL6MG114923'

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:14.056Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceInterval@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "interval": {
      "intervalMiles": 7500,
      "currentMiles": 23409,
      "nextServiceMiles": 23409,
      "milesToNext": 0
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "interval": {
      "intervalMiles": 7500,
      "currentMiles": 23409,
      "nextServiceMiles": 23409,
      "milesToNext": 0
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

mileageProject

maintenance.mileageProject · GET /maintenances/mileage-project · gate none · sandbox · answers MaintenanceMileageProject@1

FieldTypeRequiredNotes
vinstringno

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.mileageProjected@1.

the SDK — maintenance.mileageProject
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.mileageProject({"vin":"3GCPYCEL6MG114923"})
GET /maintenances/mileage-project
curl 'https://apis.vin/maintenances/mileage-project?vin=3GCPYCEL6MG114923'

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:14.057Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceMileageProject@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "projection": {
      "basisMiles": 23409,
      "months": 12,
      "milesPerMonth": 1000,
      "projectedMiles": 35409
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "projection": {
      "basisMiles": 23409,
      "months": 12,
      "milesPerMonth": 1000,
      "projectedMiles": 35409
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

resetIndicator

maintenance.resetIndicator · POST /maintenances/reset-indicator · gate offer · sandbox · answers MaintenanceResetIndicator@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.

Doormaintenance.vin serves this noun on its two routes: / (the landing) · /3GCPYCEL6MG114923 (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.

EmitsMaintenance.indicatorReset@1 · Maintenance.resetIndicatorRequested@1.

the SDK — maintenance.resetIndicator
import { maintenance } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await maintenance.resetIndicator({"vin":"3GCPYCEL6MG114923"})
POST /maintenances/reset-indicator
curl -X POST https://apis.vin/maintenances/reset-indicator \
  -H 'content-type: application/json' \
  -d '{"vin":"3GCPYCEL6MG114923"}'

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:14.098Z · HTTP 200
{
  "type": "OK",
  "answers": "MaintenanceResetIndicator@1",
  "value": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "reset": {
      "status": "reset"
    }
  },
  "evidence": {
    "vin": "3GCPYCEL6MG114923",
    "noun": "maintenance",
    "asOf": "2026-08-10",
    "dueNow": true,
    "reset": {
      "status": "reset"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-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.

RepairOrder


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