Receive Telemetry
Push one measurement or a batch of them.
Authentication
Send the API key Furo issued for your system in the X-API-Key header. One key
per system. The device_id in the body is the system's UUID, issued together
with the key.
Cadence and timestamps
Send each measurement as soon as it is available. Any resolution between
1 and 15 minutes works. Every _kw value is the average power over the
interval ending at timestamp, not an instantaneous reading. Timestamps are
ISO 8601 with a timezone offset (2026-09-14T10:15:00Z or
2026-09-14T12:15:00+02:00); UTC is preferred and a timestamp without an
offset is rejected.
Batching
The body is either a single object or an array of them — at most 5000 items and 2 MB per request.
Idempotency
Rows are upserted on (system, timestamp). Resending a point you already sent
is safe, and a field sent as null (or omitted) never overwrites a stored
value — so retries and backfills can never destroy data. Unknown fields are
ignored.
What to send
gross_load_kw, pv_kw, grid_import_kw and grid_export_kw are required
(pv_kw is 0 without PV). Add chp_kw where the site has a CHP/BHKW.
soc_percent and the battery_* fields describe a physical battery's measured
operation; leave them out when there is none.
Errors
| Status | Meaning |
|---|---|
| 422 | Payload failed validation |
| 401 | Missing or invalid X-API-Key |
| 404 | Unknown device_id |
| 413 | Body larger than 2 MB |
Authorization
APIKeyHeader In: header
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
One measurement at one timestamp.
Response Body
application/json
application/json
curl -X POST "https://example.com/v1/telemetry" \ -H "Content-Type: application/json" \ -d '{ "chp_kw": 55, "device_id": "3f2b9c14-7a55-4a0e-9f2a-5b1c8d7e4a10", "grid_export_kw": 0, "grid_import_kw": 261.2, "gross_load_kw": 412.5, "pv_kw": 96.3, "timestamp": "2026-09-14T10:15:00Z" }'{ "status": "ok", "measurements_stored": 0}{ "detail": [ { "loc": [ "string" ], "msg": "string", "type": "string", "input": null, "ctx": {} } ]}