Data is organized by plant. This page explains the concepts, lists the endpoints and shows two typical responses: instantaneous power and energy totals.
Concepts
- Plant. The unit of every request. Each plant has a stable
plant_id(UUID), a name, a country and an IANA time zone. - Gateway. The device on site that sends the plant's data, identified by the serial printed on the unit (for example
2527-35520819PH). A plant has one or more gateways. Serials appear in connectivity, in battery state of charge and in alarms; data is otherwise reported per plant. - Batteries. State of charge is reported per gateway, as a list
batteries: [{serial, soc_pct}]. It is never averaged across gateways: with batteries of different capacity an average would be misleading. - Plants with several gateways. PV and battery power are the sum over the gateways. Grid and load power are those of the shared grid connection.
- Periods. Historical data is requested with a fixed
period, not a free date range:
| Data | Period | Window |
|---|---|---|
| Energy | day, week, month |
calendar, in the plant's time zone: from local midnight (day), Monday (week) or the 1st (month) up to now |
| Power series | hour, day |
rolling: last 60 minutes, last 24 hours |
| Alarm history | day, week, month |
rolling: last 24 hours, 7 days, 30 days |
Endpoints for many plants (bulk)
Use these three endpoints for any periodic reading of more than one plant. For a page of up to 100 plants they return exactly what the per-plant endpoint returns for each of them, and they count as a single request.
| Endpoint | Scope | Parameters | Returns |
|---|---|---|---|
GET /v1/telemetry/latest |
read:telemetry | plant_ids, limit (1–100), cursor |
latest power and state of charge |
GET /v1/connectivity |
read:plants | plant_ids, limit (1–100), cursor |
online / offline per plant and gateway |
GET /v1/energy/totals |
read:energy | period, plant_ids, limit (1–100), cursor |
energy totals |
Without plant_ids they cover every plant visible to your client. Identifiers that are not visible are left out of the result without error. Results are ordered by plant_id.
Endpoints per plant
| Endpoint | Scope | Parameters | Returns |
|---|---|---|---|
GET /v1/plants |
read:plants | limit (1–200), cursor |
plants, paginated |
GET /v1/plants/{plant_id} |
read:plants | — | plant detail with address |
GET /v1/plants/{plant_id}/connectivity |
read:plants | — | online / offline per plant and gateway |
GET /v1/plants/{plant_id}/telemetry/latest |
read:telemetry | — | latest power and state of charge |
GET /v1/plants/{plant_id}/telemetry/series |
read:telemetry | period (hour, day), measures |
power series |
GET /v1/plants/{plant_id}/energy/totals |
read:energy | period (day, week, month) |
energy totals |
GET /v1/plants/{plant_id}/energy/series |
read:energy | period (day, month), include_previous |
energy per sub-period |
GET /v1/plants/{plant_id}/alarms/active |
read:alarms | — | alarms currently open |
GET /v1/plants/{plant_id}/alarms/history |
read:alarms | period (day, week, month), severity |
alarms raised in the window |
Example: instantaneous power
GET /v1/plants/7b0728a9-853c-4b31-8446-a4eb00607566/telemetry/latest
{
"plant_id": "7b0728a9-853c-4b31-8446-a4eb00607566",
"timestamp": "2026-10-13T12:21:00Z",
"measurements": {
"grid_power_w": 0,
"battery_power_w": 18,
"batteries": [ { "serial": "2527-35520819PH", "soc_pct": 100.0 } ],
"pv_power_w": 2521,
"load_power_w": 2503
}
}
Midday, battery full: the PV covers the load, nothing is exchanged with the grid. telemetry/series returns the same fields as a list of samples, each with its timestamp: one sample per minute with period=hour, one every 15 minutes with period=day (resolution_seconds states which). measures restricts the fields, for example measures=pv_power_w,load_power_w.
Example: energy totals
GET /v1/plants/7b0728a9-853c-4b31-8446-a4eb00607566/energy/totals?period=day
{
"plant_id": "7b0728a9-853c-4b31-8446-a4eb00607566",
"period": "day",
"period_start": "2026-10-13T00:00:00+02:00",
"period_end": "2026-10-13T14:23:15+02:00",
"totals_wh": {
"consumed": 4950, "produced": 10380,
"imported": 100, "exported": 0,
"charged": 8070, "discharged": 3350
}
}
| Field | Meaning |
|---|---|
produced |
energy produced by the PV system |
consumed |
energy used by the site's loads, from any source |
imported / exported |
energy taken from / delivered to the grid |
charged / discharged |
energy stored into / released from the batteries |
A value is null when the plant reported no data for it in the window. energy/series splits the same window into one-hour sub-periods (resolution_seconds); include_previous=true adds the whole previous day or month. The sum of a series equals the totals over the same window.
Connectivity and alarms
A gateway is online when it sent data in the last 5 minutes, otherwise offline; the plant is online when at least one gateway is. unknown means the status could not be determined, for example for a plant with no gateway. last_seen_at covers the last 7 days and is null beyond.
Each alarm carries the device's code and message, raised_at, cleared_at and source, the component that raised it (gateway, inverter, meter). Severity is in severity:
severity |
Meaning |
|---|---|
W |
warning |
A |
alarm |
F |
fault |
Treat any other value as significant. The severity parameter filters case-insensitively (severity=F). alarms/active returns the alarms still open, without cleared_at; in the history, cleared_at is null for an alarm still open.