snap
{ "t": "snap", "seq": 1042, "ts": 1754668800123, "v": { "0": 6820, "1": 98.4 }, "age": { "0": 40, "1": 900 } }Full state. `age` is milliseconds since each channel last changed.
Kels Telemetry
73 channels straight off the car's CAN bus, decoded, scaled, and pushed to any client that connects. Ten updates a second, typically under 300 bytes each. No key, no rate limit, no SDK.
| Endpoint | What it gives you |
|---|---|
wss://kels-telemetry-hub.sanis-c48.workers.dev/live | The live stream. Start here — a full snapshot on connect, then changes as they happen. |
https://kels-telemetry-hub.sanis-c48.workers.dev/api/latest | Current values as plain JSON. For tools that would rather poll than hold a socket open. |
https://kels-telemetry-hub.sanis-c48.workers.dev/api/signals | The channel table: id, name, unit, range. Fetch once at startup. |
https://kels-telemetry-hub.sanis-c48.workers.dev/api/health | Whether the car is currently streaming, and viewer count. |
CORS is open on all of them. Current channel table version: d869729a7cb8.
const socket = new WebSocket("wss://kels-telemetry-hub.sanis-c48.workers.dev/live");
// Signal ids are stable. Fetch the table once to map id -> name/unit/range.
const table = await (await fetch("https://kels-telemetry-hub.sanis-c48.workers.dev/api/signals")).json();
const byId = Object.fromEntries(table.signals.map((s) => [s.id, s]));
const latest = {};
socket.onmessage = (event) => {
const msg = JSON.parse(event.data);
if (msg.t === "snap" || msg.t === "delta") {
// A delta carries ONLY what changed. Merge, never replace.
Object.assign(latest, msg.v);
const speed = latest[table.byName.Vehicle_Speed];
const rpm = latest[table.byName.Engine_RPM];
render(speed, rpm);
}
if (msg.t === "status" && !msg.car) {
// The car stopped streaming. Show that -- do not keep painting old numbers.
showOffline();
}
};{ "t": "ping", "id": 1 } — we reply { "t": "pong", "id": 1 }, so you can measure latency.{ "t": "resync" } — asks for a fresh snapshot. Send this if seq ever skips a number, which means you missed an update.status message rather than zeros. A channel that stops updating simply stops appearing in deltas — check its age rather than assuming it is current.Ids are stable but are regenerated if the car's CAN database changes. Fetch /api/signals at startup rather than hardcoding them; the table below is the current state.
| Id | Name | Description | Unit | Typical range |
|---|---|---|---|---|
| 0 | Engine_RPM | RPM | rpm | 0 to 9000 |
| 5 | Engine_Power | Engine Power | kW | -50 to 700 |
| 22 | Lambda_Bank_1 | Lambda B1 | LA | 0.7 to 1.2 |
| 23 | Lambda_Bank_2 | Lambda B2 | LA | 0.7 to 1.2 |
| Id | Name | Description | Unit | Typical range |
|---|---|---|---|---|
| 1 | Driver_Pedal | Throttle Pedal | % | 0 to 100 |
| 2 | Driver_Steering | Steering | deg | -360 to 360 |
| 3 | Brake_Pres_F | Brake Front | bar | 0 to 100 |
| 4 | Brake_Pres_R | Brake Rear | bar | 0 to 100 |
| 8 | Throttle_Position | Throttle Position | % | 0 to 100 |
| 17 | Vehicle_Speed | Speed | km/h | 0 to 300 |
| 18 | Gear | Gear | — | -1 to 8 |
| Id | Name | Description | Unit | Typical range |
|---|---|---|---|---|
| 6 | Battery_Power | Battery Power | kW | -50 to 150 |
| 7 | Battery_Voltage | Battery Volts | V | 250 to 900 |
| 63 | Battery_Energy | State of Charge | % | 0 to 100 |
| Id | Name | Description | Unit | Typical range |
|---|---|---|---|---|
| 9 | Coolant_Temp | Coolant | C | 60 to 130 |
| 10 | Oil_Temp | Engine Oil | C | 60 to 150 |
| 11 | Battery_Temp | Battery | C | 20 to 70 |
| 12 | Motor_Temp | Motor | C | 20 to 160 |
| 13 | Trans_Temp | Transmission | C | 40 to 150 |
| 14 | Diff_Temp | Differential | C | 40 to 160 |
| 15 | Hy_Coolant_Temp | Hybrid Coolant | C | 20 to 80 |
| 16 | Inverter_Temp | Inverter | C | 20 to 100 |
| Id | Name | Description | Unit | Typical range |
|---|---|---|---|---|
| 19 | Shift_Tank_Pressure | Shift Tank | kpa | 0 to 1000 |
| 20 | Oil_Pressure | Oil Pressure | kpa | 0 to 800 |
| 21 | Crankcase_Pressure | Crankcase | kpa | 0 to 150 |
| 24 | Fuel_Pressure | Fuel Pressure | kPa | 0 to 700 |
| Id | Name | Description | Unit | Typical range |
|---|---|---|---|---|
| 25 | Knock_Warning | Knock | — | 0 to 255 |
| 26 | Warning_Light | Warning Light | — | 0 to 255 |
| 27 | Warning_Source | Warning Source | — | 0 to 255 |
| Id | Name | Description | Unit | Typical range |
|---|---|---|---|---|
| 28 | ABS_Map | ABS | — | 0 to 12 |
| 29 | Hybrid_Map | Hybrid | — | 0 to 12 |
| 30 | Regen_Map | Regen | — | 0 to 12 |
| 31 | Traction_Map | Traction | — | 0 to 12 |
| 32 | DRS_Position | DRS | deg | 0 to 40 |
| 33 | Rear_Steer_Left | Rear Steer L | mm | -10 to 10 |
| 34 | Rear_Steer_Right | Rear Steer R | mm | -10 to 10 |
| Id | Name | Description | Unit | Typical range |
|---|---|---|---|---|
| 35 | LF_Tire_Pres | Left Front Pressure | kpa | 100 to 300 |
| 36 | RF_Tire_Pres | Right Front Pressure | kpa | 100 to 300 |
| 37 | LR_Tire_Pres | Left Rear Pressure | kpa | 100 to 300 |
| 38 | RR_Tire_Pres | Right Rear Pressure | kpa | 100 to 300 |
| 39 | LF_Tire_Temp_Inside | Left Front Tread Inside | C | 40 to 140 |
| 40 | LF_Tire_Temp_Middle | Left Front Tread Middle | C | 40 to 140 |
| 41 | LF_Tire_Temp_Outside | Left Front Tread Outside | C | 40 to 140 |
| 42 | RF_Tire_Temp_Inside | Right Front Tread Inside | C | 40 to 140 |
| 43 | RF_Tire_Temp_Middle | Right Front Tread Middle | C | 40 to 140 |
| 44 | RF_Tire_Temp_Outside | Right Front Tread Outside | C | 40 to 140 |
| 45 | LR_Tire_Temp_Inside | Left Rear Tread Inside | C | 40 to 140 |
| 46 | LR_Tire_Temp_Middle | Left Rear Tread Middle | C | 40 to 140 |
| 47 | LR_Tire_Temp_Outside | Left Rear Tread Outside | C | 40 to 140 |
| 48 | RR_Tire_Temp_Inside | Right Rear Tread Inside | C | 40 to 140 |
| 49 | RR_Tire_Temp_Middle | Right Rear Tread Middle | C | 40 to 140 |
| 50 | RR_Tire_Temp_Outside | Right Rear Tread Outside | C | 40 to 140 |
| 51 | LF_Tire_Temp_Carcass_Inside | Left Front Carcass Inside | C | 40 to 140 |
| 52 | LF_Tire_Temp_Carcass_Middle | Left Front Carcass Middle | C | 40 to 140 |
| 53 | LF_Tire_Temp_Carcass_Outside | Left Front Carcass Outside | C | 40 to 140 |
| 54 | RF_Tire_Temp_Carcass_Inside | Right Front Carcass Inside | C | 40 to 140 |
| 55 | RF_Tire_Temp_Carcass_Middle | Right Front Carcass Middle | C | 40 to 140 |
| 56 | RF_Tire_Temp_Carcass_Outside | Right Front Carcass Outside | C | 40 to 140 |
| 57 | LR_Tire_Temp_Carcass_Inside | Left Rear Carcass Inside | C | 40 to 140 |
| 58 | LR_Tire_Temp_Carcass_Middle | Left Rear Carcass Middle | C | 40 to 140 |
| 59 | LR_Tire_Temp_Carcass_Outside | Left Rear Carcass Outside | C | 40 to 140 |
| 60 | RR_Tire_Temp_Carcass_Inside | Right Rear Carcass Inside | C | 40 to 140 |
| 61 | RR_Tire_Temp_Carcass_Middle | Right Rear Carcass Middle | C | 40 to 140 |
| 62 | RR_Tire_Temp_Carcass_Outside | Right Rear Carcass Outside | C | 40 to 140 |
| Id | Name | Description | Unit | Typical range |
|---|---|---|---|---|
| 64 | VBOX_LapTime_Disp | Lap Time | s | 0 to 240 |
| 65 | Sector_1_State | Sector 1 | — | 0 to 3 |
| 66 | Sector_2_State | Sector 2 | — | 0 to 3 |
| 67 | Sector_3_State | Sector 3 | — | 0 to 3 |
| 68 | Lap_Number | Lap | — | 0 to 255 |
| 69 | LastLapTime | Last Lap | s | 0 to 240 |
| 70 | Sector | Sector | — | 0 to 3 |
| 71 | LapGainLossRunning | Gain / Loss | s | -1.5 to 1.5 |
| 72 | LapTimePredicted | Predicted Lap | s | 0 to 240 |