docs.vin

softwareUpdate

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

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

Identity

NounsoftwareUpdate
PillarData (facets: 6 data · 5 services · 4 commerce)
Capabilities15 — 0 live · 15 sandbox · 0 declared
EntitiesRepairOrder
Doorsaggregator.vin
SDKVin.softwareUpdate.* from apis.vin
Address/catalog/softwareUpdate#{action} — the anchor IS the wire name minus softwareUpdate.

Events

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

Discover & read

status

softwareUpdate.status · GET /software-updates/status · gate none · sandbox · answers SoftwareUpdateStatus@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await softwareUpdate.status({"vin":"5TDKDRBH5SS579913"})
GET /software-updates/status
curl 'https://apis.vin/software-updates/status?vin=5TDKDRBH5SS579913'

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.466Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateStatus@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "software": {
      "version": "4.5.0",
      "readiness": "ready",
      "connection": "active",
      "updateAvailable": false
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "software": {
      "version": "4.5.0",
      "readiness": "ready",
      "connection": "active",
      "updateAvailable": false
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

verify

softwareUpdate.verify · POST /software-updates/verify · gate offer · sandbox · answers SoftwareUpdateVerify@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) · /5TDKDRBH5SS579913 (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.

EmitsSoftwareUpdate.verified@1 · SoftwareUpdate.verifyRequested@1.

the SDK — softwareUpdate.verify
import { softwareUpdate } from 'apis.vin'

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

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.469Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateVerify@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "verification": {
      "installed": "4.5.0",
      "valid": true,
      "readiness": "ready"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "verification": {
      "installed": "4.5.0",
      "valid": true,
      "readiness": "ready"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

changelogRead

softwareUpdate.changelogRead · GET /software-updates/changelog-read · gate none · sandbox · answers SoftwareUpdateChangelogRead@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await softwareUpdate.changelogRead({"vin":"5TDKDRBH5SS579913"})
GET /software-updates/changelog-read
curl 'https://apis.vin/software-updates/changelog-read?vin=5TDKDRBH5SS579913'

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.441Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateChangelogRead@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "changelog": {
      "entries": [],
      "installed": "4.5.0"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "changelog": {
      "entries": [],
      "installed": "4.5.0"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

statusRead

softwareUpdate.statusRead · GET /software-updates/status-read · gate none · sandbox · answers SoftwareUpdateStatusRead@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await softwareUpdate.statusRead({"vin":"5TDKDRBH5SS579913"})
GET /software-updates/status-read
curl 'https://apis.vin/software-updates/status-read?vin=5TDKDRBH5SS579913'

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.466Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateStatusRead@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "software": {
      "version": "4.5.0",
      "readiness": "ready",
      "connection": "active",
      "updateAvailable": false
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "software": {
      "version": "4.5.0",
      "readiness": "ready",
      "connection": "active",
      "updateAvailable": false
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

availableCheck

softwareUpdate.availableCheck · GET /software-updates/available-check · gate none · sandbox · answers SoftwareUpdateAvailableCheck@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await softwareUpdate.availableCheck({"vin":"5TDKDRBH5SS579913"})
GET /software-updates/available-check
curl 'https://apis.vin/software-updates/available-check?vin=5TDKDRBH5SS579913'

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.430Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateAvailableCheck@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "availability": {
      "available": false,
      "installed": "4.5.0"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "availability": {
      "available": false,
      "installed": "4.5.0"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

versionCheck

softwareUpdate.versionCheck · GET /software-updates/version-check · gate none · sandbox · answers SoftwareUpdateVersionCheck@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await softwareUpdate.versionCheck({"vin":"5TDKDRBH5SS579913"})
GET /software-updates/version-check
curl 'https://apis.vin/software-updates/version-check?vin=5TDKDRBH5SS579913'

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.469Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateVersionCheck@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "version": {
      "installed": "4.5.0",
      "latest": "4.5.0",
      "current": true
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "version": {
      "installed": "4.5.0",
      "latest": "4.5.0",
      "current": true
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Apply & book

order

softwareUpdate.order · POST /software-updates/order · gate offer · sandbox · answers SoftwareUpdateOrder@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) · /5TDKDRBH5SS579913 (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.

EmitsOrder.placed@1 · ServiceOrder.settled@1 · SoftwareUpdate.completed@1 · SoftwareUpdate.dispatched@1 · SoftwareUpdate.ordered@1.

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

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

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.445Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateOrder@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "order": {
      "id": "SO-feb96046",
      "line": "feature-update",
      "amountCents": 24900,
      "currency": "USD",
      "status": "ordered"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "order": {
      "id": "SO-feb96046",
      "line": "feature-update",
      "amountCents": 24900,
      "currency": "USD",
      "status": "ordered"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

schedule

softwareUpdate.schedule · POST /software-updates/schedule · gate offer · sandbox · answers SoftwareUpdateSchedule@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) · /5TDKDRBH5SS579913 (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.

EmitsSoftwareUpdate.scheduleRequested@1 · SoftwareUpdate.scheduled@1.

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

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

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.461Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateSchedule@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "appointment": {
      "status": "nothing-to-schedule",
      "installed": "4.5.0"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "appointment": {
      "status": "nothing-to-schedule",
      "installed": "4.5.0"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

subscribe

softwareUpdate.subscribe · POST /software-updates/subscribe · gate offer · sandbox · answers SoftwareUpdateSubscribe@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) · /5TDKDRBH5SS579913 (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.

EmitsSoftwareUpdate.subscribeRequested@1 · SoftwareUpdate.subscribed@1.

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

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

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.467Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateSubscribe@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "subscription": {
      "id": "SS-86db1c22",
      "topic": "software-updates",
      "status": "active"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "subscription": {
      "id": "SS-86db1c22",
      "topic": "software-updates",
      "status": "active"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Pay & settle

pay

softwareUpdate.pay · POST /software-updates/pay · gate offer · sandbox · answers SoftwareUpdatePay@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) · /5TDKDRBH5SS579913 (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 · SoftwareUpdate.charged@1 · SoftwareUpdate.paid@1 · SoftwareUpdate.payFailed@1 · SoftwareUpdate.payRequested@1.

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

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

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.452Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdatePay@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "payment": {
      "id": "PAY-598f0d08",
      "amountCents": 24900,
      "currency": "USD",
      "status": "settled"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "payment": {
      "id": "PAY-598f0d08",
      "amountCents": 24900,
      "currency": "USD",
      "status": "settled"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

warrantyBill

softwareUpdate.warrantyBill · POST /software-updates/warranty-bill · gate offer · sandbox · answers SoftwareUpdateWarrantyBill@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) · /5TDKDRBH5SS579913 (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.

EmitsSoftwareUpdate.warrantyBillRequested@1 · SoftwareUpdate.warrantyBilled@1.

the SDK — softwareUpdate.warrantyBill
import { softwareUpdate } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await softwareUpdate.warrantyBill({"vin":"5TDKDRBH5SS579913"})
POST /software-updates/warranty-bill
curl -X POST https://apis.vin/software-updates/warranty-bill \
  -H 'content-type: application/json' \
  -d '{"vin":"5TDKDRBH5SS579913"}'

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.471Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateWarrantyBill@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "bill": {
      "id": "SB-9d0b01a6",
      "status": "billed-to-warranty",
      "amountCents": 24900,
      "currency": "USD",
      "billTo": "pty_0AZTSWI",
      "warranty": "active"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "bill": {
      "id": "SB-9d0b01a6",
      "status": "billed-to-warranty",
      "amountCents": 24900,
      "currency": "USD",
      "billTo": "pty_0AZTSWI",
      "warranty": "active"
    },
    "payer": {
      "name": "Ava Good",
      "castRow": "super-prime",
      "creditTier": "super-prime"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

Lifecycle & state

rollback

softwareUpdate.rollback · POST /software-updates/rollback · gate offer · sandbox · answers SoftwareUpdateRollback@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) · /5TDKDRBH5SS579913 (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.

EmitsSoftwareUpdate.rollbackRequested@1 · SoftwareUpdate.rollbacked@1.

the SDK — softwareUpdate.rollback
import { softwareUpdate } from 'apis.vin'

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

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.457Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateRollback@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "rollback": {
      "status": "rolled-back",
      "toVersion": "4.5.0"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "rollback": {
      "status": "rolled-back",
      "toVersion": "4.5.0"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

More actions

changelog

softwareUpdate.changelog · GET /software-updates/changelog · gate none · sandbox · answers SoftwareUpdateChangelog@1

FieldTypeRequiredNotes
vinstringno

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

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await softwareUpdate.changelog({"vin":"5TDKDRBH5SS579913"})
GET /software-updates/changelog
curl 'https://apis.vin/software-updates/changelog?vin=5TDKDRBH5SS579913'

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.434Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateChangelog@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "changelog": {
      "entries": [],
      "installed": "4.5.0"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "changelog": {
      "entries": [],
      "installed": "4.5.0"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

flash

softwareUpdate.flash · POST /software-updates/flash · gate offer · sandbox · answers SoftwareUpdateFlash@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) · /5TDKDRBH5SS579913 (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.

EmitsSoftwareUpdate.flashFailed@1 · SoftwareUpdate.flashRequested@1 · SoftwareUpdate.flashed@1.

the SDK — softwareUpdate.flash
import { softwareUpdate } from 'apis.vin'

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

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.441Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateFlash@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "flash": {
      "status": "nothing-to-flash",
      "installed": "4.5.0"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "flash": {
      "status": "nothing-to-flash",
      "installed": "4.5.0"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-sandbox"
  },
  "events": [],
  "meter": {
    "charged": "0.00",
    "posted": false
  }
}

otaPush

softwareUpdate.otaPush · POST /software-updates/ota-push · gate offer · sandbox · answers SoftwareUpdateOtaPush@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) · /5TDKDRBH5SS579913 (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.

EmitsSoftwareUpdate.otaPushFailed@1 · SoftwareUpdate.otaPushRequested@1 · SoftwareUpdate.otaPushed@1.

the SDK — softwareUpdate.otaPush
import { softwareUpdate } from 'apis.vin'

// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await softwareUpdate.otaPush({"vin":"5TDKDRBH5SS579913"})
POST /software-updates/ota-push
curl -X POST https://apis.vin/software-updates/ota-push \
  -H 'content-type: application/json' \
  -d '{"vin":"5TDKDRBH5SS579913"}'

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.451Z · HTTP 200
{
  "type": "OK",
  "answers": "SoftwareUpdateOtaPush@1",
  "value": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "push": {
      "status": "nothing-to-flash",
      "installed": "4.5.0"
    }
  },
  "evidence": {
    "vin": "5TDKDRBH5SS579913",
    "noun": "softwareUpdate",
    "asOf": "2026-08-10",
    "push": {
      "status": "nothing-to-flash",
      "installed": "4.5.0"
    }
  },
  "provenance": {
    "simulated": true,
    "environment": "sandbox",
    "source": "oem-factory-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.