docs.vin

odometer

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

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

Identity

Nounodometer
PillarData (facets: 8 data · 8 services · 3 commerce)
Capabilities19 — 0 live · 19 sandbox · 0 declared
EntitiesVehicleRecord
Doorsaggregator.vin
SDKVin.odometer.* from apis.vin
Address/catalog/odometer#{action} — the anchor IS the wire name minus odometer.

Events

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

Discover & read

read

odometer.read · GET /odometers/read · gate none · sandbox · answers OdometerRead@1

FieldTypeRequiredNotes
vinstringno

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

EmitsOdometer.readingCaptured@1.

the SDK — odometer.read
import { odometer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await odometer.read({"vin":"1C4RJHEG6R8556479"})
GET /odometers/read
curl 'https://apis.vin/odometers/read?vin=1C4RJHEG6R8556479'

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.482Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerRead@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "method": "self-report"
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "method": "self-report"
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

history

odometer.history · GET /odometers/history · gate none · sandbox · answers OdometerHistory@1

FieldTypeRequiredNotes
vinstringno

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

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

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.443Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerHistory@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "readings": [
      {
        "date": "2024-03-14",
        "miles": 49970
      },
      {
        "date": "2024-11-02",
        "miles": 55706
      },
      {
        "date": "2025-06-21",
        "miles": 59970
      }
    ],
    "lastReadingMiles": 59970
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "readings": [
      {
        "date": "2024-03-14",
        "miles": 49970
      },
      {
        "date": "2024-11-02",
        "miles": 55706
      },
      {
        "date": "2025-06-21",
        "miles": 59970
      }
    ],
    "lastReadingMiles": 59970
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

status

odometer.status · GET /odometers/status · gate none · sandbox · answers OdometerStatus@1

FieldTypeRequiredNotes
vinstringno

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

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

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.482Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerStatus@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "brand": "none",
    "accuracy": "actual"
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "brand": "none",
    "accuracy": "actual"
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

verify

odometer.verify · GET /odometers/verify · gate none · sandbox · answers OdometerVerify@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await odometer.verify({"vin":"1C4RJHEG6R8556479"})
GET /odometers/verify
curl 'https://apis.vin/odometers/verify?vin=1C4RJHEG6R8556479'

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.482Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerVerify@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "verified": true,
    "consistentWithHistory": true
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "verified": true,
    "consistentWithHistory": true
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

rollbackCheck

odometer.rollbackCheck · GET /odometers/rollback-check · gate none · sandbox · answers OdometerRollbackCheck@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await odometer.rollbackCheck({"vin":"1C4RJHEG6R8556479"})
GET /odometers/rollback-check
curl 'https://apis.vin/odometers/rollback-check?vin=1C4RJHEG6R8556479'

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.482Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerRollbackCheck@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "rollbackSuspected": false
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "rollbackSuspected": false
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

clusterSwapDetect

odometer.clusterSwapDetect · GET /odometers/cluster-swap-detect · gate none · sandbox · answers OdometerClusterSwapDetect@1

No input — this capability takes no request body.

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await odometer.clusterSwapDetect()
GET /odometers/cluster-swap-detect
curl 'https://apis.vin/odometers/cluster-swap-detect'

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.939Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerClusterSwapDetect@1",
  "value": {
    "vin": "1HGCM82633A004352",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 32490,
    "unit": "mi",
    "swapDetected": false
  },
  "evidence": {
    "vin": "1HGCM82633A004352",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 32490,
    "unit": "mi",
    "swapDetected": false
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Quote & price

fee

odometer.fee · POST /odometers/fee · gate offer · sandbox · answers OdometerFee@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) · /1C4RJHEG6R8556479 (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.

EmitsOdometer.feeCharged@1 · Odometer.feeRequested@1.

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

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

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.443Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerFee@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "fee": {
      "kind": "disclosure-filing",
      "amountCents": 500,
      "currency": "USD",
      "status": "charged"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "fee": {
      "kind": "disclosure-filing",
      "amountCents": 500,
      "currency": "USD",
      "status": "charged"
    },
    "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
  }
}

reportFee

odometer.reportFee · POST /odometers/report-fee · gate offer · sandbox · answers OdometerReportFee@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) · /1C4RJHEG6R8556479 (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.

EmitsOdometer.reportFeeCharged@1.

the SDK — odometer.reportFee
import { odometer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await odometer.reportFee({"vin":"1C4RJHEG6R8556479"})
POST /odometers/report-fee
curl -X POST https://apis.vin/odometers/report-fee \
  -H 'content-type: application/json' \
  -d '{"vin":"1C4RJHEG6R8556479"}'

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.482Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerReportFee@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "fee": {
      "kind": "odometer-report",
      "amountCents": 2000,
      "currency": "USD",
      "status": "charged"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "fee": {
      "kind": "odometer-report",
      "amountCents": 2000,
      "currency": "USD",
      "status": "charged"
    },
    "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
  }
}

Pay & settle

pay

odometer.pay · POST /odometers/pay · gate offer · sandbox · answers OdometerPay@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) · /1C4RJHEG6R8556479 (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.

EmitsOdometer.paid@1 · Odometer.payFailed@1 · Odometer.payRequested@1.

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

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

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.443Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerPay@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "payment": {
      "id": "PAY-c3c1073a",
      "status": "settled",
      "amountCents": 2000,
      "currency": "USD"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "payment": {
      "id": "PAY-c3c1073a",
      "status": "settled",
      "amountCents": 2000,
      "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
  }
}

capture

odometer.capture · POST /odometers/capture · gate offer · sandbox · answers OdometerCapture@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) · /1C4RJHEG6R8556479 (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.

EmitsOdometer.captured@1.

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

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

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.443Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerCapture@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "method": "photo-capture"
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "method": "photo-capture"
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Authorize & resolve

attest

odometer.attest · POST /odometers/attest · gate offer · sandbox · answers OdometerAttest@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) · /1C4RJHEG6R8556479 (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.

EmitsOdometer.attested@1.

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

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

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.442Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerAttest@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "attestation": {
      "id": "OA-c9383209",
      "status": "attested",
      "accuracy": "actual"
    }
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "attestation": {
      "id": "OA-c9383209",
      "status": "attested",
      "accuracy": "actual"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Lifecycle & state

disclose

odometer.disclose · POST /odometers/disclose · gate offer · sandbox · answers OdometerDisclose@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) · /1C4RJHEG6R8556479 (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.

EmitsOdometer.discloseRequested@1 · Odometer.disclosed@1.

the SDK — odometer.disclose
import { odometer } from 'apis.vin'

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

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.443Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerDisclose@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "disclosure": {
      "id": "OD-fb15be9c",
      "form": "paper",
      "accuracy": "actual",
      "status": "recorded"
    }
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "disclosure": {
      "id": "OD-fb15be9c",
      "form": "paper",
      "accuracy": "actual",
      "status": "recorded"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

More actions

brand

odometer.brand · POST /odometers/brand · gate offer · sandbox · answers OdometerBrand@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) · /1C4RJHEG6R8556479 (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.

EmitsOdometer.brandRequested@1 · Odometer.branded@1.

the SDK — odometer.brand
import { odometer } from 'apis.vin'

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

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.443Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerBrand@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "brand": {
      "status": "no-grounds",
      "reason": "no-discrepancy-on-file"
    }
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "brand": {
      "status": "no-grounds",
      "reason": "no-discrepancy-on-file"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

correction

odometer.correction · POST /odometers/correction · gate key · sandbox · answers OdometerCorrection@1

No input — this capability takes no request body.

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

EmitsOdometer.corrected@1.

the SDK — odometer.correction
import { odometer } from 'apis.vin'

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

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.939Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerCorrection@1",
  "value": {
    "vin": "1HGCM82633A004352",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 32490,
    "unit": "mi",
    "correction": {
      "status": "no-correction-needed"
    }
  },
  "evidence": {
    "vin": "1HGCM82633A004352",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 32490,
    "unit": "mi",
    "correction": {
      "status": "no-correction-needed"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

discrepancy

odometer.discrepancy · POST /odometers/discrepancy · gate offer · sandbox · answers OdometerDiscrepancy@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) · /1C4RJHEG6R8556479 (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.

EmitsOdometer.discrepancyFlagged@1.

the SDK — odometer.discrepancy
import { odometer } from 'apis.vin'

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

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.443Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerDiscrepancy@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "discrepancyFound": false
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "discrepancyFound": false
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

eDisclosure

odometer.eDisclosure · POST /odometers/e-disclosure · gate offer · sandbox · answers OdometerEDisclosure@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) · /1C4RJHEG6R8556479 (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.

EmitsOdometer.eDisclosed@1 · Odometer.eDisclosureRequested@1.

the SDK — odometer.eDisclosure
import { odometer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await odometer.eDisclosure({"vin":"1C4RJHEG6R8556479"})
POST /odometers/e-disclosure
curl -X POST https://apis.vin/odometers/e-disclosure \
  -H 'content-type: application/json' \
  -d '{"vin":"1C4RJHEG6R8556479"}'

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.443Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerEDisclosure@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "disclosure": {
      "id": "OD-4866fb62",
      "form": "electronic",
      "accuracy": "actual",
      "status": "recorded"
    }
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "disclosure": {
      "id": "OD-4866fb62",
      "form": "electronic",
      "accuracy": "actual",
      "status": "recorded"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

projected

odometer.projected · GET /odometers/projected · gate key · sandbox · answers OdometerProjected@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await odometer.projected({"vin":"1C4RJHEG6R8556479"})
GET /odometers/projected
curl 'https://apis.vin/odometers/projected?vin=1C4RJHEG6R8556479'

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.477Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerProjected@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "projection": {
      "basisMiles": 59970,
      "months": 12,
      "milesPerMonth": 1000,
      "projectedMiles": 71970
    }
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "projection": {
      "basisMiles": 59970,
      "months": 12,
      "milesPerMonth": 1000,
      "projectedMiles": 71970
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

retain

odometer.retain · POST /odometers/retain · gate offer · sandbox · answers OdometerRetain@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) · /1C4RJHEG6R8556479 (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.

EmitsOdometer.retained@1.

the SDK — odometer.retain
import { odometer } from 'apis.vin'

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

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.482Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerRetain@1",
  "value": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "retention": {
      "id": "OR-619fd9c9",
      "status": "retained",
      "years": 5
    }
  },
  "evidence": {
    "vin": "1C4RJHEG6R8556479",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 59970,
    "unit": "mi",
    "retention": {
      "id": "OR-619fd9c9",
      "status": "retained",
      "years": 5
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "ownership-upkeep-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

tmuBrand

odometer.tmuBrand · POST /odometers/tmu-brand · gate key · sandbox · answers OdometerTmuBrand@1

No input — this capability takes no request body.

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

EmitsOdometer.tmuBranded@1.

the SDK — odometer.tmuBrand
import { odometer } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await odometer.tmuBrand()
POST /odometers/tmu-brand
curl -X POST https://apis.vin/odometers/tmu-brand \
  -H 'content-type: application/json' \
  -d '{}'

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.940Z · HTTP 200
{
  "type": "OK",
  "answers": "OdometerTmuBrand@1",
  "value": {
    "vin": "1HGCM82633A004352",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 32490,
    "unit": "mi",
    "brand": {
      "status": "no-grounds",
      "reason": "no-discrepancy-on-file"
    }
  },
  "evidence": {
    "vin": "1HGCM82633A004352",
    "noun": "odometer",
    "asOf": "2026-08-10",
    "odometerMiles": 32490,
    "unit": "mi",
    "brand": {
      "status": "no-grounds",
      "reason": "no-discrepancy-on-file"
    }
  },
  "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.

VehicleRecord

Modeled

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

Odometer · Class model

Odometer · State machine


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