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 by default (see timezone in the response).
Pass ?timezone=utc to receive UTC timestamps ending in Z instead.
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. |
timezone | Timezone of the timestamps: local (default) or utc. utc returns UTC timestamps ending in Z. |
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.