telematics
The telematics noun — identity, lifecycle, events, and every capability as an anchored section: 31 capabilities, 0 live, 31 sandbox, 0 declared.
telematics is one of the estate's 317 automotive nouns — a job a car needs done. It carries 31 capabilities: 0 live, 31 sandbox, 0 declared · doors aggregator.vin.
Identity
| Noun | telematics |
| Pillar | Services (facets: 13 data · 14 services · 4 commerce) |
| Capabilities | 31 — 0 live · 31 sandbox · 0 declared |
| Entities | Connection |
| Doors | aggregator.vin |
| SDK | Vin.telematics.* from apis.vin |
| Address | /catalog/telematics#{action} — the anchor IS the wire name minus telematics. |
Events
The vocabulary this noun can append to the record — 20 past-tense, versioned event types, each linked to the capability that emits it:
ServiceOrder.settled@1— emitted bypayTelematics.alerted@1— emitted byalertTelematics.charged@1— emitted bypayTelematics.dataSold@1— emitted bydataSellTelematics.deprovisioned@1— emitted bydeprovisionTelematics.enrolled@1— emitted byenrollTelematics.failed@1— emitted bypay·usageBillTelematics.geofenceSet@1— emitted bygeofenceSet·setGeofenceTelematics.otaUpdated@1— emitted byotaUpdateTelematics.paid@1— emitted bypayTelematics.paymentReminded@1— emitted bypaymentReminderTelematics.provisioned@1— emitted byprovisionTelematics.remoteLocked@1— emitted byremoteLockTelematics.remoteStarted@1— emitted byremoteStartTelematics.remoteUnlocked@1— emitted byremoteUnlockTelematics.reported@1— emitted byreportTelematics.starterDisabled@1— emitted bystarterDisableTelematics.starterEnabled@1— emitted bystarterEnableTelematics.subscribed@1— emitted bysubscribeTelematics.usageBilled@1— emitted byusageBill
Discover & read
read
telematics.read · GET /telematics/read · gate none · sandbox · answers TelematicsRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.read({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/read?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsRead@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"channels": [
"location",
"odometer",
"battery",
"diagnostics"
],
"freshness": "stale"
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"channels": [
"location",
"odometer",
"battery",
"diagnostics"
],
"freshness": "stale"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}locate
telematics.locate · GET /telematics/locate · gate none · sandbox · answers TelematicsLocate@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.locate({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/locate?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsLocate@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"position": {
"latE5": 3776783,
"lonE5": -12242258
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"position": {
"latE5": 3776783,
"lonE5": -12242258
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}report
telematics.report · POST /telematics/report · gate offer · sandbox · answers TelematicsReport@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.reported@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.report({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/report \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsReport@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"channels": [
"location",
"odometer",
"battery",
"diagnostics"
],
"freshness": "stale"
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"channels": [
"location",
"odometer",
"battery",
"diagnostics"
],
"freshness": "stale"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}drivingBehaviorRead
telematics.drivingBehaviorRead · GET /telematics/driving-behavior-read · gate none · sandbox · answers TelematicsDrivingBehaviorRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.drivingBehaviorRead({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/driving-behavior-read?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsDrivingBehaviorRead@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"behaviorScore": 54
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"behaviorScore": 54
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}healthRead
telematics.healthRead · GET /telematics/health-read · gate none · sandbox · answers TelematicsHealthRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.healthRead({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/health-read?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsHealthRead@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"findings": [
"vehicle telemetry flags a system needing service"
]
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"findings": [
"vehicle telemetry flags a system needing service"
]
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}odometerRead
telematics.odometerRead · GET /telematics/odometer-read · gate none · sandbox · answers TelematicsOdometerRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.odometerRead({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/odometer-read?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsOdometerRead@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"odometerMiles": 35353,
"unit": "mi"
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"odometerMiles": 35353,
"unit": "mi"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}tripRead
telematics.tripRead · GET /telematics/trip-read · gate none · sandbox · answers TelematicsTripRead@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.tripRead({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/trip-read?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsTripRead@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"trips": 8,
"totalMiles": 266,
"windowDays": 30
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"trips": 8,
"totalMiles": 266,
"windowDays": 30
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}geofenceStatus
telematics.geofenceStatus · GET /telematics/geofence-status · gate none · sandbox · answers TelematicsGeofenceStatus@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.geofenceStatus({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/geofence-status?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsGeofenceStatus@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"geofence": {
"id": "GF-5a9e5868",
"inside": false
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"geofence": {
"id": "GF-5a9e5868",
"inside": false
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Apply & book
enroll
telematics.enroll · POST /telematics/enroll · gate offer · sandbox · answers TelematicsEnroll@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.enrolled@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.enroll({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/enroll \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsEnroll@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-7727dfcd",
"name": "enroll",
"status": "queued-offline"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-7727dfcd",
"name": "enroll",
"status": "queued-offline"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}subscribe
telematics.subscribe · POST /telematics/subscribe · gate offer · sandbox · answers TelematicsSubscribe@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.subscribed@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.subscribe({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/subscribe \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsSubscribe@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-a325a74b",
"name": "subscribe",
"status": "queued-offline"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-a325a74b",
"name": "subscribe",
"status": "queued-offline"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}provision
telematics.provision · POST /telematics/provision · gate offer · sandbox · answers TelematicsProvision@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.provisioned@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.provision({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/provision \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsProvision@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-a7d4bf08",
"name": "provision",
"status": "queued-offline"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-a7d4bf08",
"name": "provision",
"status": "queued-offline"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}deprovision
telematics.deprovision · POST /telematics/deprovision · gate offer · sandbox · answers TelematicsDeprovision@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.deprovisioned@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.deprovision({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/deprovision \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsDeprovision@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-be8807ad",
"name": "deprovision",
"status": "queued-offline"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-be8807ad",
"name": "deprovision",
"status": "queued-offline"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Pay & settle
pay
telematics.pay · POST /telematics/pay · gate offer · sandbox · answers TelematicsPay@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — ServiceOrder.settled@1 · Telematics.charged@1 · Telematics.failed@1 · Telematics.paid@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.pay({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/pay \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsPay@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"payment": {
"id": "PAY-d1716a71",
"status": "settled",
"amountCents": 2400,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"payment": {
"id": "PAY-d1716a71",
"status": "settled",
"amountCents": 2400,
"currency": "USD"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}usageBill
telematics.usageBill · POST /telematics/usage-bill · gate offer · sandbox · answers TelematicsUsageBill@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.failed@1 · Telematics.usageBilled@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.usageBill({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/usage-bill \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsUsageBill@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"bill": {
"id": "UB-e28e859d",
"amountCents": 2400,
"currency": "USD",
"status": "issued"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"bill": {
"id": "UB-e28e859d",
"amountCents": 2400,
"currency": "USD",
"status": "issued"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}dataSell
telematics.dataSell · POST /telematics/data-sell · gate offer · sandbox · answers TelematicsDataSell@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.dataSold@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.dataSell({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/data-sell \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsDataSell@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"sale": {
"id": "DS-d08e7c8d",
"records": 764,
"amountCents": 1200,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"sale": {
"id": "DS-d08e7c8d",
"records": 764,
"amountCents": 1200,
"currency": "USD",
"status": "settled"
},
"payer": {
"name": "Ava Good",
"castRow": "super-prime",
"creditTier": "super-prime"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}Fulfill & operate
otaUpdate
telematics.otaUpdate · POST /telematics/ota-update · gate offer · sandbox · answers TelematicsOtaUpdate@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.otaUpdated@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.otaUpdate({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/ota-update \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsOtaUpdate@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-7c2b5f24",
"name": "otaUpdate",
"status": "queued-offline"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-7c2b5f24",
"name": "otaUpdate",
"status": "queued-offline"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}More actions
alert
telematics.alert · POST /telematics/alert · gate offer · sandbox · answers TelematicsAlert@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.alerted@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.alert({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/alert \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsAlert@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-defe3fe1",
"name": "alert",
"status": "queued-offline"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-defe3fe1",
"name": "alert",
"status": "queued-offline"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}compliance
telematics.compliance · GET /telematics/compliance · gate key · sandbox · answers TelematicsCompliance@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.compliance({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/compliance?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsCompliance@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"compliant": false,
"regime": "hours-of-service"
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"compliant": false,
"regime": "hours-of-service"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}geofenceEvents
telematics.geofenceEvents · GET /telematics/geofence-events · gate key · sandbox · answers TelematicsGeofenceEvents@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.geofenceEvents({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/geofence-events?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsGeofenceEvents@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"events": 1,
"windowDays": 30
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"events": 1,
"windowDays": 30
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}geofenceSet
telematics.geofenceSet · POST /telematics/geofence-set · gate offer · sandbox · answers TelematicsGeofenceSet@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.geofenceSet@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.geofenceSet({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/geofence-set \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsGeofenceSet@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-7413fe99",
"name": "geofenceSet",
"status": "queued-offline"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-7413fe99",
"name": "geofenceSet",
"status": "queued-offline"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}harshEvents
telematics.harshEvents · GET /telematics/harsh-events · gate key · sandbox · answers TelematicsHarshEvents@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.harshEvents({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/harsh-events?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsHarshEvents@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"harshEventCount": 3,
"windowDays": 90
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"harshEventCount": 3,
"windowDays": 90
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}idle
telematics.idle · GET /telematics/idle · gate key · sandbox · answers TelematicsIdle@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.idle({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/idle?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsIdle@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"idleMinutes": 187,
"windowDays": 30
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"idleMinutes": 187,
"windowDays": 30
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}paymentReminder
telematics.paymentReminder · POST /telematics/payment-reminder · gate key · sandbox · answers TelematicsPaymentReminder@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.paymentReminded@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.paymentReminder()curl -X POST https://apis.vin/telematics/payment-reminder \
-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.
{
"type": "OK",
"answers": "TelematicsPaymentReminder@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "active",
"command": {
"id": "CMD-a4c87311",
"name": "paymentReminder",
"status": "executed"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "active",
"command": {
"id": "CMD-a4c87311",
"name": "paymentReminder",
"status": "executed"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}remoteLock
telematics.remoteLock · POST /telematics/remote-lock · gate offer · sandbox · answers TelematicsRemoteLock@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.remoteLocked@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.remoteLock({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/remote-lock \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsRemoteLock@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-5c714734",
"name": "remoteLock",
"status": "queued-offline"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-5c714734",
"name": "remoteLock",
"status": "queued-offline"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}remoteStart
telematics.remoteStart · POST /telematics/remote-start · gate offer · sandbox · answers TelematicsRemoteStart@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.remoteStarted@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.remoteStart({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/remote-start \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsRemoteStart@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-d3b6ce19",
"name": "remoteStart",
"status": "queued-offline"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-d3b6ce19",
"name": "remoteStart",
"status": "queued-offline"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}remoteUnlock
telematics.remoteUnlock · POST /telematics/remote-unlock · gate offer · sandbox · answers TelematicsRemoteUnlock@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.remoteUnlocked@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.remoteUnlock({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/remote-unlock \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsRemoteUnlock@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-4507c8a3",
"name": "remoteUnlock",
"status": "queued-offline"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-4507c8a3",
"name": "remoteUnlock",
"status": "queued-offline"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}setGeofence
telematics.setGeofence · POST /telematics/set-geofence · gate offer · sandbox · answers TelematicsSetGeofence@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
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.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.geofenceSet@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.setGeofence({"vin":"1GKS2JKL4MR268409"})curl -X POST https://apis.vin/telematics/set-geofence \
-H 'content-type: application/json' \
-d '{"vin":"1GKS2JKL4MR268409"}'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.
{
"type": "OK",
"answers": "TelematicsSetGeofence@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-ba740685",
"name": "setGeofence",
"status": "queued-offline"
}
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"command": {
"id": "CMD-ba740685",
"name": "setGeofence",
"status": "queued-offline"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}starterDisable
telematics.starterDisable · POST /telematics/starter-disable · gate key · sandbox · answers TelematicsStarterDisable@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.starterDisabled@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.starterDisable()curl -X POST https://apis.vin/telematics/starter-disable \
-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.
{
"type": "OK",
"answers": "TelematicsStarterDisable@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "active",
"command": {
"id": "CMD-76246276",
"name": "starterDisable",
"status": "executed"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "active",
"command": {
"id": "CMD-76246276",
"name": "starterDisable",
"status": "executed"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}starterEnable
telematics.starterEnable · POST /telematics/starter-enable · gate key · sandbox · answers TelematicsStarterEnable@1
No input — this capability takes no request body.
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
Emits — Telematics.starterEnabled@1.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.starterEnable()curl -X POST https://apis.vin/telematics/starter-enable \
-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.
{
"type": "OK",
"answers": "TelematicsStarterEnable@1",
"value": {
"vin": "1HGCM82633A004352",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "active",
"command": {
"id": "CMD-f0662d3d",
"name": "starterEnable",
"status": "executed"
}
},
"evidence": {
"vin": "1HGCM82633A004352",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "active",
"command": {
"id": "CMD-f0662d3d",
"name": "starterEnable",
"status": "executed"
}
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}stream
telematics.stream · GET /telematics/stream · gate none · sandbox · answers TelematicsStream@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.stream({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/stream?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsStream@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"channels": [
"location",
"odometer",
"battery",
"diagnostics"
],
"freshness": "stale"
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"verdict": "attention",
"channels": [
"location",
"odometer",
"battery",
"diagnostics"
],
"freshness": "stale"
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-sandbox"
},
"events": [],
"meter": {
"charged": "0.00",
"posted": false
}
}usage
telematics.usage · GET /telematics/usage · gate key · sandbox · answers TelematicsUsage@1
| Field | Type | Required | Notes |
|---|---|---|---|
vin | string | no | — |
Door — aggregator.vin serves this noun on its two routes: / (the landing) · /1GKS2JKL4MR268409 (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.
import { telematics } from 'apis.vin'
// the gate law is in the type system: Answer<T> = Ok | Empty | Blocked | Offer
const answer = await telematics.usage({"vin":"1GKS2JKL4MR268409"})curl 'https://apis.vin/telematics/usage?vin=1GKS2JKL4MR268409'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.
{
"type": "OK",
"answers": "TelematicsUsage@1",
"value": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"meteredMiles": 931,
"windowDays": 30
},
"evidence": {
"vin": "1GKS2JKL4MR268409",
"noun": "telematics",
"asOf": "2026-08-10",
"connection": "expired",
"meteredMiles": 931,
"windowDays": 30
},
"provenance": {
"simulated": true,
"environment": "sandbox",
"source": "aftersales-data-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.
Connection
Modeled
The noun drawn out — its record shape, its lifecycle, and how it is exercised end to end. 3 diagrams, rendered from the estate model.
Telematics · Class model
Telematics · State machine
Telematics · Sequence
Generated from the catalog. Every capability, answer, gate, and entity on this page is a rendered descriptor — it cannot drift from the wire.
technician
The technician noun — identity, lifecycle, events, and every capability as an anchored section: 16 capabilities, 0 live, 16 sandbox, 0 declared.
tempTag
The tempTag noun — identity, lifecycle, events, and every capability as an anchored section: 9 capabilities, 0 live, 9 sandbox, 0 declared.