Forecasts
The forecast delivers the expected PV power for a site in 15-minute intervals.
You query it via the site_id; site, strings and configuration come from the
stored site.
Code
Timestamps are in the site's local timezone (see timezone in the response).
The full parameter and field list is in the API Reference. This page explains the concepts.
Parameters
| Parameter | Meaning |
|---|---|
forecast_days | Forecast horizon in days. Without a value, the plan maximum. Hard limit 7, additionally capped to the plan limit. |
past_days | Past days before today (archived forecast). Default 0. Hard limit 30, capped to the plan limit. |
include | Which field groups come back (repeatable). Default default. |
past_days delivers archived forecast data, not actual measurements. For real past
yields use the Historical Data.
include groups
include is repeatable and selects field groups — not individual columns:
Code
| Group | Fields |
|---|---|
default | pv_power (PV power in W). |
weather | temp, weather_code, wind_speed, relative_humidity, precipitation_mm, snow_water_equivalent. |
irradiance | ghi, dhi, bni (horizontal irradiance). |
clearsky | pv_power_clearsky (power under a cloudless sky). |
strings | Adds the separate strings block (see below). values stays unchanged. |
variability | Adds the min/max band (see below). Paid feature, never part of all. |
all | All field groups and the strings block (but not variability). |
default is not added automatically. If you only request weather, you get
weather data without pv_power. The included field in the response reflects the resolved selection.
Response structure
Response (abridged)
daily— daily aggregates (energy in kWh, min/max temperature, dominant weather code).values— time series per 15 minutes.pv_poweris the sum over all strings.
The strings block
With include=strings (or all) you get a separate top-level array strings in
long/tidy format — one row per time step and string:
Code
string_indexrefers position-based tosite.strings[i]— same order as inGET /v2/sites/{site_id}. Always present.string_idis the string's stable id — the join key to its measurements. Present for saved sites; on the inline endpoint it appears only if you supplied anidon the string.- The tilted irradiance (
gti,gti_shaded) lives here, not invalues, because it depends on the string's orientation. - Each string delivers a row in every time step (0.0 at night), so there are no gaps.
values.pv_poweris the sum of the string powers.
In a DataFrame the block can be loaded directly and pivoted on string_index:
Code
Variability band (include=variability)
The band delivers a lower/upper bound of the PV power, if
available in your plan. A request with include=variability on a plan without this feature returns
403.
- Fields:
pv_power_min/pv_power_maxin everyvaluesandstringsrow, pluspv_energy_kwh_min/pv_energy_kwh_maxindaily. - Horizon: covers roughly the next 48 h. Outside that (and for
past_days)min == max == pv_power(flat band). Sites not covered also receive a flat band — not an error. variabilityis never included byall, only on explicit request.
Caching & computed_at
Forecasts are not recomputed on every request, but only as often as your plan allows.
Repeated requests in the same slot return the same cached result; computed_at shows the
computation time.
The cache is automatically invalidated when the site changes (coordinates, strings, config) or the plan changes.
Limits & errors
| Limit / error | Behavior |
|---|---|
| Forecast access | Without forecast access in the plan → 403. |
| Monthly requests | Monthly request limit (per user & endpoint), reset on the 1st of the month → 429 when exceeded. |
forecast_days / past_days | Values are capped to the plan limit. |
| Site not found | 404. |
You'll find your specific limits on the Usage & Limits page.