What is the gridstatus library?#

gridstatus logo

Tests Code Coverage PyPI Version

The gridstatus open-source library is a Python library maintained by Grid Status that provides a consistent API for accessing raw electricity supply, demand, and pricing data for the major Independent System Operators (ISOs) in the United States and Canada. It currently supports data from CAISO, SPP, ISONE, MISO, ERCOT, NYISO, PJM, IESO, AESO, and the EIA.

GridStatus.io and Hosted API#

This library provides minimally-processed data. If you need production-ready data, consider using our hosted API or visit GridStatus.io to see the data in a web interface.

If you are trying to use our hosted API, you might want to check out the gridstatusio library.

5 Minute Overview#

First, we can see all of the ISOs that are supported

import gridstatus
gridstatus.list_isos()
Name Id Class
0 Midcontinent ISO miso MISO
1 California ISO caiso CAISO
2 PJM pjm PJM
3 Electric Reliability Council of Texas ercot Ercot
4 Southwest Power Pool spp SPP
5 New York ISO nyiso NYISO
6 ISO New England isone ISONE
7 Independent Electricity System Operator ieso IESO

Next, we can select an ISO we want to use

caiso = gridstatus.CAISO()

Fuel Mix#

ISOs share a common API with methods like get_fuel_mix and get_load. Here is how we can get the fuel mix

caiso.get_fuel_mix("today")
2026-07-27 00:12:47 - INFO - Fetching URL: https://www.caiso.com/outlook/current/fuelsource.csv?_=1785111167
Time Interval Start Interval End Solar Wind Geothermal Biomass Biogas Small Hydro Coal Nuclear Natural Gas Large Hydro Batteries Imports Other
0 2026-07-26 00:00:00-07:00 2026-07-26 00:00:00-07:00 2026-07-26 00:05:00-07:00 -68 5014 719 238 161 298 0 2279 13041 2825 1765 3267 0
1 2026-07-26 00:05:00-07:00 2026-07-26 00:05:00-07:00 2026-07-26 00:10:00-07:00 -66 5013 724 240 163 297 0 2279 12975 2770 2129 3220 0
2 2026-07-26 00:10:00-07:00 2026-07-26 00:10:00-07:00 2026-07-26 00:15:00-07:00 -66 5017 733 240 162 294 0 2280 13006 2788 2312 2980 0
3 2026-07-26 00:15:00-07:00 2026-07-26 00:15:00-07:00 2026-07-26 00:20:00-07:00 -65 4987 733 240 162 295 0 2279 13061 2764 2140 3036 0
4 2026-07-26 00:20:00-07:00 2026-07-26 00:20:00-07:00 2026-07-26 00:25:00-07:00 -65 4936 732 245 162 293 0 2279 13121 2768 1882 3159 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
201 2026-07-26 16:45:00-07:00 2026-07-26 16:45:00-07:00 2026-07-26 16:50:00-07:00 14659 2988 779 241 165 298 0 2279 11478 2483 1305 -3256 0
202 2026-07-26 16:50:00-07:00 2026-07-26 16:50:00-07:00 2026-07-26 16:55:00-07:00 14610 2978 773 241 165 298 0 2279 11639 2548 1681 -3564 0
203 2026-07-26 16:55:00-07:00 2026-07-26 16:55:00-07:00 2026-07-26 17:00:00-07:00 15012 2970 756 240 164 297 0 2279 11736 2532 1867 -3849 0
204 2026-07-26 17:00:00-07:00 2026-07-26 17:00:00-07:00 2026-07-26 17:05:00-07:00 15069 2991 757 240 164 294 0 2279 11552 2614 2051 -3884 0
205 2026-07-26 17:05:00-07:00 2026-07-26 17:05:00-07:00 2026-07-26 17:10:00-07:00 14833 3010 756 242 165 296 0 2279 11302 2915 1398 -3085 0

206 rows × 16 columns

Load#

or the energy demand throughout the current day as a Pandas DataFrame

caiso.get_load("today")
2026-07-27 00:12:48 - INFO - Fetching URL: https://www.caiso.com/outlook/current/demand.csv?_=1785111168
Time Interval Start Interval End Load
0 2026-07-26 00:00:00-07:00 2026-07-26 00:00:00-07:00 2026-07-26 00:05:00-07:00 29634.0
1 2026-07-26 00:05:00-07:00 2026-07-26 00:05:00-07:00 2026-07-26 00:10:00-07:00 29811.0
2 2026-07-26 00:10:00-07:00 2026-07-26 00:10:00-07:00 2026-07-26 00:15:00-07:00 29845.0
3 2026-07-26 00:15:00-07:00 2026-07-26 00:15:00-07:00 2026-07-26 00:20:00-07:00 29704.0
4 2026-07-26 00:20:00-07:00 2026-07-26 00:20:00-07:00 2026-07-26 00:25:00-07:00 29600.0
... ... ... ... ...
201 2026-07-26 16:45:00-07:00 2026-07-26 16:45:00-07:00 2026-07-26 16:50:00-07:00 32972.0
202 2026-07-26 16:50:00-07:00 2026-07-26 16:50:00-07:00 2026-07-26 16:55:00-07:00 33254.0
203 2026-07-26 16:55:00-07:00 2026-07-26 16:55:00-07:00 2026-07-26 17:00:00-07:00 33637.0
204 2026-07-26 17:00:00-07:00 2026-07-26 17:00:00-07:00 2026-07-26 17:05:00-07:00 33781.0
205 2026-07-26 17:05:00-07:00 2026-07-26 17:05:00-07:00 2026-07-26 17:10:00-07:00 33893.0

206 rows × 4 columns

Load Forecast#

Another dataset we can query is the load forecast

nyiso = gridstatus.NYISO()
nyiso.get_load_forecast("today")
2026-07-27 00:12:48 - INFO - Requesting http://mis.nyiso.com/public/csv/isolf/20260726isolf.csv
/home/docs/checkouts/readthedocs.org/user_builds/isodata/checkouts/latest/gridstatus/nyiso.py:1515: FutureWarning: Parsed string "07/25/26 07:45 EDT" included an un-recognized timezone "EDT". Dropping unrecognized timezones is deprecated; in a future version this will raise. Instead pass the string without the timezone, then use .tz_localize to convert to a recognized timezone.
  return pd.Timestamp(last_updated_date, tz=self.default_timezone)
Time Interval Start Interval End Forecast Time Load Forecast
0 2026-07-26 00:00:00-04:00 2026-07-26 00:00:00-04:00 2026-07-26 01:00:00-04:00 2026-07-25 07:45:00-04:00 16447
1 2026-07-26 01:00:00-04:00 2026-07-26 01:00:00-04:00 2026-07-26 02:00:00-04:00 2026-07-25 07:45:00-04:00 15677
2 2026-07-26 02:00:00-04:00 2026-07-26 02:00:00-04:00 2026-07-26 03:00:00-04:00 2026-07-25 07:45:00-04:00 15099
3 2026-07-26 03:00:00-04:00 2026-07-26 03:00:00-04:00 2026-07-26 04:00:00-04:00 2026-07-25 07:45:00-04:00 14680
4 2026-07-26 04:00:00-04:00 2026-07-26 04:00:00-04:00 2026-07-26 05:00:00-04:00 2026-07-25 07:45:00-04:00 14438
... ... ... ... ... ...
139 2026-07-31 19:00:00-04:00 2026-07-31 19:00:00-04:00 2026-07-31 20:00:00-04:00 2026-07-25 07:45:00-04:00 23988
140 2026-07-31 20:00:00-04:00 2026-07-31 20:00:00-04:00 2026-07-31 21:00:00-04:00 2026-07-25 07:45:00-04:00 23555
141 2026-07-31 21:00:00-04:00 2026-07-31 21:00:00-04:00 2026-07-31 22:00:00-04:00 2026-07-25 07:45:00-04:00 22759
142 2026-07-31 22:00:00-04:00 2026-07-31 22:00:00-04:00 2026-07-31 23:00:00-04:00 2026-07-25 07:45:00-04:00 21535
143 2026-07-31 23:00:00-04:00 2026-07-31 23:00:00-04:00 2026-08-01 00:00:00-04:00 2026-07-25 07:45:00-04:00 20225

144 rows × 5 columns

Historical Data#

You can use the historical method calls to get data for a specific day in the past. For example,

caiso.get_load("Jan 1, 2020")
2026-07-27 00:12:48 - INFO - Fetching URL: https://www.caiso.com/outlook/history/20200101/demand.csv?_=1785111168
Time Interval Start Interval End Load
0 2020-01-01 00:00:00-08:00 2020-01-01 00:00:00-08:00 2020-01-01 00:05:00-08:00 21533
1 2020-01-01 00:05:00-08:00 2020-01-01 00:05:00-08:00 2020-01-01 00:10:00-08:00 21429
2 2020-01-01 00:10:00-08:00 2020-01-01 00:10:00-08:00 2020-01-01 00:15:00-08:00 21320
3 2020-01-01 00:15:00-08:00 2020-01-01 00:15:00-08:00 2020-01-01 00:20:00-08:00 21272
4 2020-01-01 00:20:00-08:00 2020-01-01 00:20:00-08:00 2020-01-01 00:25:00-08:00 21193
... ... ... ... ...
283 2020-01-01 23:35:00-08:00 2020-01-01 23:35:00-08:00 2020-01-01 23:40:00-08:00 20494
284 2020-01-01 23:40:00-08:00 2020-01-01 23:40:00-08:00 2020-01-01 23:45:00-08:00 20383
285 2020-01-01 23:45:00-08:00 2020-01-01 23:45:00-08:00 2020-01-01 23:50:00-08:00 20297
286 2020-01-01 23:50:00-08:00 2020-01-01 23:50:00-08:00 2020-01-01 23:55:00-08:00 20242
287 2020-01-01 23:55:00-08:00 2020-01-01 23:55:00-08:00 2020-01-02 00:00:00-08:00 20128

288 rows × 4 columns

Frequently, we want to get data across multiple days. We can do that by providing a start and end parameter to any iso.get_* method

caiso_load = caiso.get_load(start="Jan 1, 2021", end="Feb 1, 2021")
caiso_load
Time Interval Start Interval End Load
0 2021-01-01 00:00:00-08:00 2021-01-01 00:00:00-08:00 2021-01-01 00:05:00-08:00 21937.0
1 2021-01-01 00:05:00-08:00 2021-01-01 00:05:00-08:00 2021-01-01 00:10:00-08:00 21858.0
2 2021-01-01 00:10:00-08:00 2021-01-01 00:10:00-08:00 2021-01-01 00:15:00-08:00 21827.0
3 2021-01-01 00:15:00-08:00 2021-01-01 00:15:00-08:00 2021-01-01 00:20:00-08:00 21757.0
4 2021-01-01 00:20:00-08:00 2021-01-01 00:20:00-08:00 2021-01-01 00:25:00-08:00 21664.0
... ... ... ... ...
8923 2021-01-31 23:35:00-08:00 2021-01-31 23:35:00-08:00 2021-01-31 23:40:00-08:00 20054.0
8924 2021-01-31 23:40:00-08:00 2021-01-31 23:40:00-08:00 2021-01-31 23:45:00-08:00 19952.0
8925 2021-01-31 23:45:00-08:00 2021-01-31 23:45:00-08:00 2021-01-31 23:50:00-08:00 19859.0
8926 2021-01-31 23:50:00-08:00 2021-01-31 23:50:00-08:00 2021-01-31 23:55:00-08:00 19763.0
8927 2021-01-31 23:55:00-08:00 2021-01-31 23:55:00-08:00 2021-02-01 00:00:00-08:00 19650.0

8928 rows × 4 columns

We can now see there is data for all of January 2021

import plotly.express as px

fig = px.line(caiso_load, x="Time", y="Load", title="CAISO Load - Jan '21")
fig

Next Steps#

The best part is these APIs work in the same way across all the supported ISOs!

Examples