Line sensors and the smart-meter head-end send data to LEC.
/api/v1/sensors/{code}/readings
Line sensor reading or fault indication
Secret: LEC_SENSOR_SECRET. A reading with an event raises a fault on the sensor's feeder, alerts Dispatch/TND and SMSes affected customers.
| Parameter | In | Description |
| code* | path | e.g. S-F-PV2-1 |
| X-LEC-Timestamp* | header | Unix time in seconds. |
| X-LEC-Signature* | header | Hex HMAC-SHA256 of "{X-LEC-Timestamp}.{raw request body}" using the shared secret. Requests older than 5 minutes are rejected. |
Request body
{
"type": "object",
"properties": {
"value": {
"type": "number",
"example": 1240.5
},
"unit": {
"type": "string",
"example": "A"
},
"event": {
"type": "string",
"nullable": true,
"enum": [
"overcurrent",
"earth_fault",
"voltage_loss",
"line_down",
"overload",
"transformer_overheat"
]
},
"severity": {
"type": "string",
"enum": [
"low",
"medium",
"high",
"critical"
]
}
}
}
Responses
- 200 Reading stored
{"ok":true,"event":null}
- 201 Fault raised
{"ok":true,"event":"FLT-2026-000031"}
- 401 Missing or invalid signature / timestamp
{"error":"unauthorised"}
- 404 Unknown sensor code
/api/v1/meter-events
Smart-meter events (last gasp, restore, tamper…)
Secret: LEC_METER_EVENT_SECRET (falls back to LEC_SENSOR_SECRET). Up to 500 events per call; duplicates (same meter, type and time) are ignored. Power-off events from several meters on one transformer within LEC_OUTAGE_WINDOW minutes create a suspected outage; tamper events open a Revenue Protection lead.
| Parameter | In | Description |
| X-LEC-Timestamp* | header | Unix time in seconds. |
| X-LEC-Signature* | header | Hex HMAC-SHA256 of "{X-LEC-Timestamp}.{raw request body}" using the shared secret. Requests older than 5 minutes are rejected. |
Request body
{
"type": "object",
"required": [
"events"
],
"properties": {
"events": {
"type": "array",
"maxItems": 500,
"items": {
"type": "object",
"required": [
"meter_no",
"type",
"occurred_at"
],
"properties": {
"meter_no": {
"type": "string",
"example": "04100000043"
},
"type": {
"type": "string",
"enum": [
"power_off",
"power_restored",
"tamper",
"cover_open",
"reverse_energy",
"low_credit"
]
},
"occurred_at": {
"type": "string",
"format": "date-time",
"example": "2026-10-26T19:52:04Z"
},
"payload": {
"type": "object"
}
}
}
}
}
}
Responses
- 202 Accepted
{"ok":true,"stored":4,"duplicates":0,"unknown":0,"outages":["OUT-2026-000002"]}
- 401 Missing or invalid signature / timestamp
{"error":"unauthorised"}
- 422 Validation error
/api/v1/meter-readings
Smart-meter register reads
Same signing as meter events. Postpaid meters feed monthly billing (unusual reads are flagged for review); prepaid meters update the register only. Up to 1000 reads per call.
| Parameter | In | Description |
| X-LEC-Timestamp* | header | Unix time in seconds. |
| X-LEC-Signature* | header | Hex HMAC-SHA256 of "{X-LEC-Timestamp}.{raw request body}" using the shared secret. Requests older than 5 minutes are rejected. |
Request body
{
"type": "object",
"required": [
"readings"
],
"properties": {
"readings": {
"type": "array",
"maxItems": 1000,
"items": {
"type": "object",
"required": [
"meter_no",
"reading_kwh",
"read_at"
],
"properties": {
"meter_no": {
"type": "string",
"example": "05200000001"
},
"reading_kwh": {
"type": "number",
"example": 18452.6
},
"read_at": {
"type": "string",
"format": "date-time"
}
}
}
}
}
}
Responses
- 202 Accepted
{"ok":true,"accepted":98,"flagged":1,"skipped":1,"unknown":0}
- 401 Missing or invalid signature / timestamp
{"error":"unauthorised"}