What is the gridstatus library?#
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-02-10 19:27:44 - INFO - Fetching URL: https://www.caiso.com/outlook/current/fuelsource.csv?_=1770751664
| Time | Interval Start | Interval End | Solar | Wind | Geothermal | Biomass | Biogas | Small Hydro | Coal | Nuclear | Natural Gas | Large Hydro | Batteries | Imports | Other | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2026-02-10 00:00:00-08:00 | 2026-02-10 00:00:00-08:00 | 2026-02-10 00:05:00-08:00 | -54 | 2408 | 763 | 212 | 160 | 309 | 0 | 2262 | 5635 | 1872 | -177 | 8349 | 0 |
| 1 | 2026-02-10 00:05:00-08:00 | 2026-02-10 00:05:00-08:00 | 2026-02-10 00:10:00-08:00 | -53 | 2455 | 763 | 211 | 161 | 310 | 0 | 2261 | 5933 | 1532 | 156 | 8343 | 0 |
| 2 | 2026-02-10 00:10:00-08:00 | 2026-02-10 00:10:00-08:00 | 2026-02-10 00:15:00-08:00 | -53 | 2468 | 763 | 212 | 159 | 311 | 0 | 2262 | 6292 | 1195 | 248 | 8296 | 0 |
| 3 | 2026-02-10 00:15:00-08:00 | 2026-02-10 00:15:00-08:00 | 2026-02-10 00:20:00-08:00 | -53 | 2478 | 763 | 211 | 160 | 311 | 0 | 2261 | 6334 | 1225 | 203 | 8205 | 0 |
| 4 | 2026-02-10 00:20:00-08:00 | 2026-02-10 00:20:00-08:00 | 2026-02-10 00:25:00-08:00 | -53 | 2463 | 763 | 210 | 159 | 310 | 0 | 2261 | 6228 | 1328 | 251 | 8143 | 0 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 132 | 2026-02-10 11:00:00-08:00 | 2026-02-10 11:00:00-08:00 | 2026-02-10 11:05:00-08:00 | 8520 | 895 | 751 | 229 | 157 | 285 | 0 | 2258 | 6533 | 1695 | -3660 | 4822 | 0 |
| 133 | 2026-02-10 11:05:00-08:00 | 2026-02-10 11:05:00-08:00 | 2026-02-10 11:10:00-08:00 | 8497 | 947 | 752 | 227 | 158 | 284 | 0 | 2258 | 6515 | 1604 | -3784 | 5107 | 0 |
| 134 | 2026-02-10 11:10:00-08:00 | 2026-02-10 11:10:00-08:00 | 2026-02-10 11:15:00-08:00 | 8726 | 962 | 751 | 228 | 158 | 284 | 0 | 2259 | 6482 | 1555 | -3664 | 4962 | 0 |
| 135 | 2026-02-10 11:15:00-08:00 | 2026-02-10 11:15:00-08:00 | 2026-02-10 11:20:00-08:00 | 8919 | 977 | 750 | 228 | 158 | 284 | 0 | 2258 | 6469 | 1572 | -3891 | 5001 | 0 |
| 136 | 2026-02-10 11:20:00-08:00 | 2026-02-10 11:20:00-08:00 | 2026-02-10 11:25:00-08:00 | 9263 | 993 | 751 | 228 | 157 | 284 | 0 | 2257 | 6460 | 1571 | -3994 | 4932 | 0 |
137 rows × 16 columns
Load#
or the energy demand throughout the current day as a Pandas DataFrame
caiso.get_load("today")
2026-02-10 19:27:44 - INFO - Fetching URL: https://www.caiso.com/outlook/current/demand.csv?_=1770751664
| Time | Interval Start | Interval End | Load | |
|---|---|---|---|---|
| 0 | 2026-02-10 00:00:00-08:00 | 2026-02-10 00:00:00-08:00 | 2026-02-10 00:05:00-08:00 | 20913.0 |
| 1 | 2026-02-10 00:05:00-08:00 | 2026-02-10 00:05:00-08:00 | 2026-02-10 00:10:00-08:00 | 21267.0 |
| 2 | 2026-02-10 00:10:00-08:00 | 2026-02-10 00:10:00-08:00 | 2026-02-10 00:15:00-08:00 | 21353.0 |
| 3 | 2026-02-10 00:15:00-08:00 | 2026-02-10 00:15:00-08:00 | 2026-02-10 00:20:00-08:00 | 21245.0 |
| 4 | 2026-02-10 00:20:00-08:00 | 2026-02-10 00:20:00-08:00 | 2026-02-10 00:25:00-08:00 | 21227.0 |
| ... | ... | ... | ... | ... |
| 132 | 2026-02-10 11:00:00-08:00 | 2026-02-10 11:00:00-08:00 | 2026-02-10 11:05:00-08:00 | 22358.0 |
| 133 | 2026-02-10 11:05:00-08:00 | 2026-02-10 11:05:00-08:00 | 2026-02-10 11:10:00-08:00 | 22435.0 |
| 134 | 2026-02-10 11:10:00-08:00 | 2026-02-10 11:10:00-08:00 | 2026-02-10 11:15:00-08:00 | 22580.0 |
| 135 | 2026-02-10 11:15:00-08:00 | 2026-02-10 11:15:00-08:00 | 2026-02-10 11:20:00-08:00 | 22524.0 |
| 136 | 2026-02-10 11:20:00-08:00 | 2026-02-10 11:20:00-08:00 | 2026-02-10 11:25:00-08:00 | 22663.0 |
137 rows × 4 columns
Load Forecast#
Another dataset we can query is the load forecast
nyiso = gridstatus.NYISO()
nyiso.get_load_forecast("today")
2026-02-10 19:27:45 - INFO - Requesting http://mis.nyiso.com/public/csv/isolf/20260210isolf.csv
/home/docs/checkouts/readthedocs.org/user_builds/isodata/checkouts/latest/gridstatus/nyiso.py:1226: FutureWarning: Parsed string "02/09/26 07:10 EST" included an un-recognized timezone "EST". 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-02-10 00:00:00-05:00 | 2026-02-10 00:00:00-05:00 | 2026-02-10 01:00:00-05:00 | 2026-02-09 07:10:00-05:00 | 18703 |
| 1 | 2026-02-10 01:00:00-05:00 | 2026-02-10 01:00:00-05:00 | 2026-02-10 02:00:00-05:00 | 2026-02-09 07:10:00-05:00 | 18241 |
| 2 | 2026-02-10 02:00:00-05:00 | 2026-02-10 02:00:00-05:00 | 2026-02-10 03:00:00-05:00 | 2026-02-09 07:10:00-05:00 | 17971 |
| 3 | 2026-02-10 03:00:00-05:00 | 2026-02-10 03:00:00-05:00 | 2026-02-10 04:00:00-05:00 | 2026-02-09 07:10:00-05:00 | 17868 |
| 4 | 2026-02-10 04:00:00-05:00 | 2026-02-10 04:00:00-05:00 | 2026-02-10 05:00:00-05:00 | 2026-02-09 07:10:00-05:00 | 18058 |
| ... | ... | ... | ... | ... | ... |
| 139 | 2026-02-15 19:00:00-05:00 | 2026-02-15 19:00:00-05:00 | 2026-02-15 20:00:00-05:00 | 2026-02-09 07:10:00-05:00 | 19326 |
| 140 | 2026-02-15 20:00:00-05:00 | 2026-02-15 20:00:00-05:00 | 2026-02-15 21:00:00-05:00 | 2026-02-09 07:10:00-05:00 | 18917 |
| 141 | 2026-02-15 21:00:00-05:00 | 2026-02-15 21:00:00-05:00 | 2026-02-15 22:00:00-05:00 | 2026-02-09 07:10:00-05:00 | 18352 |
| 142 | 2026-02-15 22:00:00-05:00 | 2026-02-15 22:00:00-05:00 | 2026-02-15 23:00:00-05:00 | 2026-02-09 07:10:00-05:00 | 17601 |
| 143 | 2026-02-15 23:00:00-05:00 | 2026-02-15 23:00:00-05:00 | 2026-02-16 00:00:00-05:00 | 2026-02-09 07:10:00-05:00 | 16858 |
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-02-10 19:27:45 - INFO - Fetching URL: https://www.caiso.com/outlook/history/20200101/demand.csv?_=1770751665
| 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!
Getting Started
Examples
- CAISO Examples
- ERCOT Examples
- ERCOT API Examples
- NYISO Examples
- PJM Examples
- SPP Examples
- LMP Data Examples
- Walkthrough on how to query LMP data from SPP using gridstatus
- Available Markets
- Available Location Types
- Query Latest Real-Time LMPs by Hub
- Query Latest Real-Time LMPs by Settlement Location
- Query Latest Real-Time LMPs by Interface
- Query Today’s Real-Time LMPs by Interface
- Query Day-Ahead LMPs by Hub
- Query Day-Ahead LMPs by Interface
- LMP Data Examples
- IESO Examples
- Other Examples
Reference