Responses

Understanding the forecast API response
View as Markdown

TimeseriesResponse

All forecast and historical data endpoints return a standardized TimeseriesResponse object. This format efficiently represents matrix-like timeseries data with parallel arrays for timestamps and values, optimized for client-side processing and visualization.

All timeseries data uses the period-beginning convention. This is in contrast to the common “hour ending” convention often used by ISOs.

Structure

1{
2 "model": "optimized",
3 "created_at": "2026-03-17T06:00:00Z",
4 "units": "MW",
5 "timezone": "America/Chicago",
6 "time_utc": [
7 "2026-03-17T07:00:00Z",
8 "2026-03-17T08:00:00Z",
9 "2026-03-17T09:00:00Z"
10 ],
11 "time_local": [
12 "2026-03-17T01:00:00-06:00",
13 "2026-03-17T02:00:00-06:00",
14 "2026-03-17T03:00:00-06:00"
15 ],
16 "columns": [
17 ["ercot_total"],
18 ["ercot_north"]
19 ],
20 "values": [
21 [45230.5, 44890.1, 44520.8],
22 [18200.3, 17950.7, 17800.2]
23 ]
24}

Fields

FieldTypeDescription
modelstring | nullWeather model used for this forecast (e.g., optimized, iso, normal). Null for historical actuals.
created_atstring | nullUTC timestamp when the forecast was created/published. Represents the time the forecast was generated. Null for continuous forecasts or historical actuals.
unitsstringMeasurement units for all data values. Common values: MW, °C, USD/MWh, $/MMBtu.
timezonestringIANA timezone identifier used for the time_local field (e.g., America/New_York, America/Chicago). Selected based on operating timezone of the ISO.
time_utcstring[]Array of UTC timestamps. Each entry corresponds to one position in each series inside values.
time_localstring[]Array of local timestamps (timezone specified in timezone field). Parallel to time_utc.
columnsstring[][]Metadata describing each series in the values matrix. Each entry is a list of one or more level labels — single-level columns are returned as length-1 sublists (e.g., ["pjm_total"]); naturally multi-level data uses one entry per level. The summary endpoint returns [target_id, metric, region_type, kind] because it mixes heterogeneous series (e.g., forecast and actual); the ensemble endpoint returns [target_id, member_index] to distinguish ensemble members (e.g., ["pjm_total", "0"], ["pjm_total", "1"]). Clients can rebuild a pandas MultiIndex via pd.MultiIndex.from_tuples(columns).
valuesnumber[][]2D matrix of numeric values. The outer index matches columnsvalues[j] is the full timeseries for columns[j]. The inner index matches time_utc. Missing data is represented as null.

Reading the values matrix

The values matrix is organized series-first:

  • Outer index corresponds to series — values[j] is the full timeseries for columns[j]
  • Inner index corresponds to timestamps — values[j][i] is the value for columns[j] at time_utc[i]

For example, given the response above:

ercot_totalercot_north
2026-03-17T07:00:00Z45230.518200.3
2026-03-17T08:00:00Z44890.117950.7
2026-03-17T09:00:00Z44520.817800.2

Working with the TimeSeriesResponse

The response structure makes it easy to convert directly to a pandas DataFrame.

1import requests
2import pandas as pd
3
4response = requests.get(
5 "https://api.isoview.io/v1/region/ercot/demand/forecast?id=ercot_total",
6 headers={"X-API-Key": "YOUR_API_KEY"},
7)
8data = response.json()
9
10# Convert to a pandas DataFrame
11df = pd.DataFrame(
12 data["values"],
13 columns=pd.to_datetime(data["time_utc"]),
14 index=pd.MultiIndex.from_tuples(data["columns"]),
15).T
16
17print(f"Model: {data['model']}")
18print(f"Units: {data['units']}")
19print(df.head())

Null values

Some data points may be null in the values matrix. This occurs when:

  • Data is not yet available for a future timestamp
  • A specific series does not have coverage for the full time range
  • The source data has gaps or reporting delays

Always handle null values in your client code when processing the response.

Units by metric

MetricUnitsDescription
demandMWElectricity demand in megawatts
windMWWind generation capacity in megawatts
solarMWSolar generation capacity in megawatts
outageMWGeneration outages in megawatts
poptemp°CPopulation-weighted temperature in degrees Celsius
dalmpUSD/MWhDay-ahead locational marginal price
rtlmpUSD/MWhReal-time locational marginal price
wind_icing%Wind icing risk coverage percentage (0–100)
solar_snow%Solar snow/ice risk coverage percentage (0–100)
gas$/MMBtuNatural gas price per million BTU