Site Telemetry
1. Getting Started
The Site Telemetry endpoint provides time-series energy data for Generac-monitored sites. Typical integrations use it to stream live readings, pull historical data for reporting, or fetch the most recent system snapshot. This section walks through each use case with practical guidance on how to structure your requests.
1.1 Streaming Current Telemetry
For applications that need a continuous feed of telemetry — dashboards, alerting pipelines, or data warehouses — set up a polling job that runs periodically. Telemetry records are every 5 minutes, so polling once a minute is not recommended as its unnecessary. Each cycle should issue one or more requests:
Fetch new data. Set startTime to the endTime of the last record you received, and endTime to the current time (or slightly into the future). This captures any records generated since your last poll.
Because both edges of the query interval are exclusive, aligning your boundaries to existing record timestamps avoids duplicates and makes stitching seamless.
Example: Incremental Poll
Your last stored record covers 14:10:00–14:15:00. Your next request:
GET /v1/sites/{siteId}/telemetry
?startTime=2025-12-01T14:15:00Z
&endTime=2025-12-01T14:20:00Z
The 14:10–14:15 record will not be returned again because its endTime does not fall within the exclusive query window.
1.2 Fetching Historical Telemetry
Fill gaps. If you detect a gap between stored records, request the missing interval. Set startTime to the endTime of the record before the gap, and endTime to the startTime of the first record after the gap. Maximum query range is 24 hours. Exceeding this returns a 400 Bad Request.
To pull a full day of data, query from midnight to midnight:
GET /v1/sites/{siteId}/telemetry
?startTime=2025-12-01T00:00:00Z
&endTime=2025-12-02T00:00:00Z
Since the system's records are typically clock-aligned (typical for Generac systems), you'll get exactly the records for that calendar day. For some telemetry records the timestamp may not be clock aligned and you may receive an extra record on each edge where a record partially overlaps the boundary. These partial-overlap records can be identified by comparing their timestamps to your query window and be filtered out or deduplicated as needed.
The maximum query range is 24 hours. For multi-day retrieval, issue one request per day.
1.3 Getting the Most Recent Value
To fetch a current reading — for example, to display a live status card — request a padded interval around the current time and take the last record in the response:
GET /v1/sites/{siteId}/telemetry
?startTime=2025-12-01T11:45:00Z // ~15 min ago
&endTime=2025-12-01T12:15:00Z // ~15 min from now
The padding accounts for variable record timing and the fact that the most recent record may still be in progress. The last element of the response array is your freshest data point.
2. Reference
2.1 Interval Matching
A telemetry record is returned if it overlaps with the query window. Both boundaries are strict — a record that only touches the query interval without overlapping is excluded.
Matching Rule
record.startTime < query.endTime AND record.endTime > query.startTime
Visual Example
Records at 5-minute intervals, queried from 00:10 to 00:25:
Records: |00:00-00:05|00:05-00:10|00:10-00:15|00:15-00:20|00:20-00:25|00:25-00:30|
Query: (00:10 ======================= 00:25)
Returned: |00:10-00:15|00:15-00:20|00:20-00:25|
✗ 00:05-00:10 → endTime (00:10) is not > query startTime (00:10)
✗ 00:25-00:30 → startTime (00:25) is not < query endTime (00:25)
2.2 Query Window Quick Reference
| Use Case | startTime | endTime | Take |
|---|---|---|---|
| Stream / Poll | endTime of last record | Now (or slightly future) | All records |
| Fill Gap | endTime of record before gap | startTime of record after gap | All records |
| Historical Day | Day start (midnight) | Next day (midnight) | All records |
| Latest Value | ~15 min ago | ~15 min from now | Last record |
2.3 Response Structure
Each record in the response data array covers a discrete time interval and includes measurement groups depending on the site's equipment:
| Field | Description |
|---|---|
startTime | Start of the record interval (ISO 8601) |
endTime | End of the record interval (ISO 8601) |
grid | Import/export energy & power, connectivity status. Null if N/A. |
solar | Solar production energy & power. Null if N/A. |
consumption | Load energy & power. Null if N/A. |
storage | Battery charge/discharge, state of charge, reserve. Null if N/A. |
- Energy values are in watt-hours. Power values are in watts, averaged over the record interval.
- Signed fields: for
gridandstorage, positive = import/discharge, negative = export/charge. - State of charge and minimum reserve are percentages out of 100.
- Lifetime counters are cumulative and monotonically increasing, reflecting totals as of the record's end.
2.4 Constraints & Notes
- Maximum query range is 24 hours. Exceeding this returns a
400 Bad Request. - Timestamps must be ISO 8601 with offset (UTC recommended, e.g.
2025-12-01T00:00:00Z). - Records are typically 5 minutes in duration, but this is not guaranteed. Always use
startTimeandendTimeon each record rather than assuming a fixed interval. - Measurement groups are
nullwhen the corresponding equipment is not present at the site.