docs.vin

serviceRecord

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

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

Identity

NounserviceRecord
PillarData (facets: 5 data · 4 services · 2 commerce)
Capabilities11 — 0 live · 11 sandbox · 0 declared
EntitiesVehicleRecord
Doorsaggregator.vin
SDKVin.serviceRecord.* from apis.vin
Address/catalog/serviceRecord#{action} — the anchor IS the wire name minus serviceRecord.

Events

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

Discover & read

lookup

serviceRecord.lookup · GET /service-records/lookup · gate none · sandbox · answers ServiceRecordLookup@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await serviceRecord.lookup({"vin":"5TFLA5DA3NX028075"})
GET /service-records/lookup
curl 'https://apis.vin/service-records/lookup?vin=5TFLA5DA3NX028075'

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:17.377Z · HTTP 200
{
  "type": "OK",
  "answers": "ServiceRecordLookup@1",
  "value": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "visits": [
      {
        "date": "2025-05-09",
        "mileage": 7500,
        "operation": "interval-service",
        "servicer": {
          "kind": "independent-shop"
        }
      },
      {
        "date": "2025-11-17",
        "mileage": 15000,
        "operation": "interval-service",
        "servicer": {
          "kind": "independent-shop"
        }
      },
      {
        "date": "2026-05-28",
        "mileage": 22500,
        "operation": "interval-service",
        "servicer": {
          "kind": "dealer-service-drive",
          "dealerId": "DLR-b9066ade"
        }
      }
    ],
    "count": 3,
    "basis": "one-service-drawer"
  },
  "evidence": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "visits": [
      {
        "date": "2025-05-09",
        "mileage": 7500,
        "operation": "interval-service",
        "servicer": {
          "kind": "independent-shop"
        }
      },
      {
        "date": "2025-11-17",
        "mileage": 15000,
        "operation": "interval-service",
        "servicer": {
          "kind": "independent-shop"
        }
      },
      {
        "date": "2026-05-28",
        "mileage": 22500,
        "operation": "interval-service",
        "servicer": {
          "kind": "dealer-service-drive",
          "dealerId": "DLR-b9066ade"
        }
      }
    ],
    "count": 3,
    "basis": "one-service-drawer"
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "records-cabinet-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

read

serviceRecord.read · GET /service-records/read · gate none · sandbox · answers ServiceRecordRead@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await serviceRecord.read({"vin":"5TFLA5DA3NX028075"})
GET /service-records/read
curl 'https://apis.vin/service-records/read?vin=5TFLA5DA3NX028075'

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:17.381Z · HTTP 200
{
  "type": "OK",
  "answers": "ServiceRecordRead@1",
  "value": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "visits": [
      {
        "date": "2025-05-09",
        "mileage": 7500,
        "operation": "interval-service",
        "servicer": {
          "kind": "independent-shop"
        }
      },
      {
        "date": "2025-11-17",
        "mileage": 15000,
        "operation": "interval-service",
        "servicer": {
          "kind": "independent-shop"
        }
      },
      {
        "date": "2026-05-28",
        "mileage": 22500,
        "operation": "interval-service",
        "servicer": {
          "kind": "dealer-service-drive",
          "dealerId": "DLR-b9066ade"
        }
      }
    ],
    "count": 3,
    "basis": "one-service-drawer"
  },
  "evidence": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "visits": [
      {
        "date": "2025-05-09",
        "mileage": 7500,
        "operation": "interval-service",
        "servicer": {
          "kind": "independent-shop"
        }
      },
      {
        "date": "2025-11-17",
        "mileage": 15000,
        "operation": "interval-service",
        "servicer": {
          "kind": "independent-shop"
        }
      },
      {
        "date": "2026-05-28",
        "mileage": 22500,
        "operation": "interval-service",
        "servicer": {
          "kind": "dealer-service-drive",
          "dealerId": "DLR-b9066ade"
        }
      }
    ],
    "count": 3,
    "basis": "one-service-drawer"
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "records-cabinet-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

verify

serviceRecord.verify · GET /service-records/verify · gate none · sandbox · answers ServiceRecordVerify@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await serviceRecord.verify({"vin":"5TFLA5DA3NX028075"})
GET /service-records/verify
curl 'https://apis.vin/service-records/verify?vin=5TFLA5DA3NX028075'

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:17.391Z · HTTP 200
{
  "type": "OK",
  "answers": "ServiceRecordVerify@1",
  "value": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "verification": {
      "verified": true,
      "contentHash": "0a0bd30c",
      "visits": 3
    }
  },
  "evidence": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "verification": {
      "verified": true,
      "contentHash": "0a0bd30c",
      "visits": 3
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "records-cabinet-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Quote & price

fee

serviceRecord.fee · POST /service-records/fee · gate offer · sandbox · answers ServiceRecordFee@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) · /5TFLA5DA3NX028075 (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.

EmitsServiceRecord.feeCharged@1.

the SDK — serviceRecord.fee
import { serviceRecord } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await serviceRecord.fee({"vin":"5TFLA5DA3NX028075"})
POST /service-records/fee
curl -X POST https://apis.vin/service-records/fee \
  -H 'content-type: application/json' \
  -d '{"vin":"5TFLA5DA3NX028075"}'

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:17.368Z · HTTP 200
{
  "type": "OK",
  "answers": "ServiceRecordFee@1",
  "value": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "fee": {
      "amountCents": 900,
      "currency": "USD",
      "basis": "posted-cabinet-fee-sheet"
    }
  },
  "evidence": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "fee": {
      "amountCents": 900,
      "currency": "USD",
      "basis": "posted-cabinet-fee-sheet"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "records-cabinet-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Pay & settle

pay

serviceRecord.pay · POST /service-records/pay · gate offer · sandbox · answers ServiceRecordPay@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) · /5TFLA5DA3NX028075 (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.

EmitsServiceOrder.settled@1 · ServiceRecord.charged@1.

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

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

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:17.380Z · HTTP 200
{
  "type": "OK",
  "answers": "ServiceRecordPay@1",
  "value": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "payment": {
      "id": "PAY-b9a1abf0",
      "status": "settled",
      "amountCents": 900,
      "currency": "USD"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "payment": {
      "id": "PAY-b9a1abf0",
      "status": "settled",
      "amountCents": 900,
      "currency": "USD"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "records-cabinet-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

capture

serviceRecord.capture · POST /service-records/capture · gate offer · sandbox · answers ServiceRecordCapture@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) · /5TFLA5DA3NX028075 (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.

EmitsServiceRecord.captured@1.

the SDK — serviceRecord.capture
import { serviceRecord } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await serviceRecord.capture({"vin":"5TFLA5DA3NX028075"})
POST /service-records/capture
curl -X POST https://apis.vin/service-records/capture \
  -H 'content-type: application/json' \
  -d '{"vin":"5TFLA5DA3NX028075"}'

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:17.367Z · HTTP 200
{
  "type": "OK",
  "answers": "ServiceRecordCapture@1",
  "value": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "intake": {
      "status": "accepted-pending-verification",
      "id": "EVD-6026c56a",
      "recordId": "VR-feb7d71d",
      "facet": "service",
      "grading": "evidence-graded-never-asserted",
      "channel": "capture"
    }
  },
  "evidence": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "intake": {
      "status": "accepted-pending-verification",
      "id": "EVD-6026c56a",
      "recordId": "VR-feb7d71d",
      "facet": "service",
      "grading": "evidence-graded-never-asserted",
      "channel": "capture"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "records-cabinet-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Fulfill & operate

upload

serviceRecord.upload · POST /service-records/upload · gate offer · sandbox · answers ServiceRecordUpload@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) · /5TFLA5DA3NX028075 (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.

EmitsServiceRecord.uploaded@1.

the SDK — serviceRecord.upload
import { serviceRecord } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await serviceRecord.upload({"vin":"5TFLA5DA3NX028075"})
POST /service-records/upload
curl -X POST https://apis.vin/service-records/upload \
  -H 'content-type: application/json' \
  -d '{"vin":"5TFLA5DA3NX028075"}'

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:17.391Z · HTTP 200
{
  "type": "OK",
  "answers": "ServiceRecordUpload@1",
  "value": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "intake": {
      "status": "accepted-pending-verification",
      "id": "EVD-6026c56a",
      "recordId": "VR-feb7d71d",
      "facet": "service",
      "grading": "evidence-graded-never-asserted",
      "channel": "upload"
    }
  },
  "evidence": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "intake": {
      "status": "accepted-pending-verification",
      "id": "EVD-6026c56a",
      "recordId": "VR-feb7d71d",
      "facet": "service",
      "grading": "evidence-graded-never-asserted",
      "channel": "upload"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "records-cabinet-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Authorize & resolve

attest

serviceRecord.attest · POST /service-records/attest · gate offer · sandbox · answers ServiceRecordAttest@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) · /5TFLA5DA3NX028075 (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.

EmitsServiceRecord.attested@1.

the SDK — serviceRecord.attest
import { serviceRecord } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await serviceRecord.attest({"vin":"5TFLA5DA3NX028075"})
POST /service-records/attest
curl -X POST https://apis.vin/service-records/attest \
  -H 'content-type: application/json' \
  -d '{"vin":"5TFLA5DA3NX028075"}'

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:17.367Z · HTTP 200
{
  "type": "OK",
  "answers": "ServiceRecordAttest@1",
  "value": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "attestation": {
      "contentHash": "0a0bd30c",
      "visits": 3,
      "attestedAt": "2026-08-10"
    }
  },
  "evidence": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "attestation": {
      "contentHash": "0a0bd30c",
      "visits": 3,
      "attestedAt": "2026-08-10"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "records-cabinet-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

More actions

gapAnalysis

serviceRecord.gapAnalysis · GET /service-records/gap-analysis · gate key · sandbox · answers ServiceRecordGapAnalysis@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await serviceRecord.gapAnalysis({"vin":"5TFLA5DA3NX028075"})
GET /service-records/gap-analysis
curl 'https://apis.vin/service-records/gap-analysis?vin=5TFLA5DA3NX028075'

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:17.377Z · HTTP 200
{
  "type": "OK",
  "answers": "ServiceRecordGapAnalysis@1",
  "value": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "gapAnalysis": {
      "status": "no-gap-open",
      "odometerMiles": 25319,
      "intervalMiles": 7500,
      "nextServiceMiles": 30000,
      "basis": "wave-9-maintenance-law"
    }
  },
  "evidence": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "gapAnalysis": {
      "status": "no-gap-open",
      "odometerMiles": 25319,
      "intervalMiles": 7500,
      "nextServiceMiles": 30000,
      "basis": "wave-9-maintenance-law"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "records-cabinet-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

normalize

serviceRecord.normalize · POST /service-records/normalize · gate offer · sandbox · answers ServiceRecordNormalize@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) · /5TFLA5DA3NX028075 (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.

EmitsServiceRecord.normalized@1.

the SDK — serviceRecord.normalize
import { serviceRecord } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await serviceRecord.normalize({"vin":"5TFLA5DA3NX028075"})
POST /service-records/normalize
curl -X POST https://apis.vin/service-records/normalize \
  -H 'content-type: application/json' \
  -d '{"vin":"5TFLA5DA3NX028075"}'

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:17.377Z · HTTP 200
{
  "type": "OK",
  "answers": "ServiceRecordNormalize@1",
  "value": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "normalization": {
      "status": "normalized",
      "visits": 3
    }
  },
  "evidence": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "normalization": {
      "status": "normalized",
      "visits": 3
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "records-cabinet-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

summarize

serviceRecord.summarize · GET /service-records/summarize · gate key · sandbox · answers ServiceRecordSummarize@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await serviceRecord.summarize({"vin":"5TFLA5DA3NX028075"})
GET /service-records/summarize
curl 'https://apis.vin/service-records/summarize?vin=5TFLA5DA3NX028075'

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:17.384Z · HTTP 200
{
  "type": "OK",
  "answers": "ServiceRecordSummarize@1",
  "value": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "summary": {
      "visits": 3,
      "lastVisit": {
        "date": "2026-05-28",
        "mileage": 22500,
        "operation": "interval-service",
        "servicer": {
          "kind": "dealer-service-drive",
          "dealerId": "DLR-b9066ade"
        }
      },
      "odometerMiles": 25319,
      "intervalMiles": 7500
    }
  },
  "evidence": {
    "vin": "5TFLA5DA3NX028075",
    "noun": "serviceRecord",
    "asOf": "2026-08-10",
    "recordId": "VR-feb7d71d",
    "summary": {
      "visits": 3,
      "lastVisit": {
        "date": "2026-05-28",
        "mileage": 22500,
        "operation": "interval-service",
        "servicer": {
          "kind": "dealer-service-drive",
          "dealerId": "DLR-b9066ade"
        }
      },
      "odometerMiles": 25319,
      "intervalMiles": 7500
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "records-cabinet-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.

VehicleRecord

Modeled

The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. One diagram, rendered from the estate model.

ServiceRecord · Class model


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