ERCOT logo

ERCOT Generation Mix by Fuel

What is physically generating in ERCOT, in megawatts by fuel, one row per interval.

Native record
one row per interval, wide by fuel
5-minute (live) and 15-minute (settled) publication cadence
Evidence
Observed market data
Published observations from the named source
Time basis
Interval-start records
UTC · event_time

Overview

691,109 intervals, 2007-01 to now. Columns: coal_mw, gas_mw, nuclear_mw, hydro_mw, wind_mw, solar_mw, storage_mw, other_mw. Wide rather than long: a whole interval's mix is one row, so shares are computed across columns in that row and the timestamp does not repeat once per fuel. "Which fuel is largest" is greatest() across the columns, or simply reading the row.

Query contract

Select one exact event_time and read every fuel column from that row. A mix assembled from more than one timestamp is not a mix that ever existed.

Analysis rules

  • Compute each fuel's share against the sum of the fuel columns in that same row, not against demand and not against a total from another interval.
  • For a change over a period, resolve complete buckets and compare their canonical observations; do not query two wall-clock instants separately.

Interpretation

  • The `source` column marks which feed a row came from: 'report' is ERCOT's settlement-grade Fuel Mix Report (15-minute interval averages, about 27 days behind) and 'live' is the 5-minute operational feed. The two are merged at a watermark so they never overlap, but they are different kinds of measurement — settled rows are interval averages, live rows are instantaneous snapshots landing at irregular seconds. Bucket to the hour or day before comparing across the seam; never join them on event_time.
  • storage_mw is populated only in the live half. The settlement report classifies battery discharge into `other` and battery charging into a separate wholesale-storage-load series, and that cannot be reconciled from the data, so settled rows carry NULL storage rather than a wrong number. Correspondingly, other_mw is roughly 900 MW higher on the settled side.

Access

Query from your own tools

Use the guarded HTTP endpoint directly, or connect an MCP client and load the dataset contract with describe_data before calling query_data.

HTTP endpoint
POST /api/v1/datasets/ercot_generation_mix/query

Need the full history of this dataset in Snowflake, Databricks or your own storage? Data services delivers it on a schedule.

Schema10

Column
Type
event_timeDateTime64(6, 'UTC')
coal_mwNullable(Float64)
gas_mwNullable(Float64)
nuclear_mwNullable(Float64)
hydro_mwNullable(Float64)
wind_mwNullable(Float64)
solar_mwNullable(Float64)
storage_mwNullable(Float64)
other_mwNullable(Float64)
sourceLowCardinality(String)

Sample data

event_timecoal_mwgas_mwnuclear_mwhydro_mwwind_mwsolar_mwstorage_mwother_mwsource
2026-10-12 07:15:00.0000003737.4350585937521153.3760337829634945.30029296875024133.0839843750.791428923606873-2223.2995605468849.5999984741211live
2026-10-12 07:10:00.0000003747.3024902343821011.2990875244184945.91650390625024179.5488281255.38558769226074-2068.2502441406249.5999984741211live
2026-10-12 07:05:00.0000003757.6999511718821091.127389907844944.69970703125024196.480468750.90972363948822-2130.6528320312549.7999992370605live
2026-10-12 07:00:00.0000003728.3371582031320852.1732902526824947.351074218750.0058595519512891824295.558593750.823290884494781-1817.1890869140649.7999992370605live
2026-10-12 06:55:00.0000003736.766601562521005.541725158694947.1328125024308.9550781250.771061539649963-1805.7514648437549.5live
2026-10-12 06:50:00.0000003738.7351074218721048.376390457164946.833984375024316.4394531250.610981404781342-1729.8200683593849.7000007629395live
2026-10-12 06:45:00.0000003742.2387695312521039.9093341827364946.927734375024340.058593750.764612793922424-1727.4262695312549.7000007629395live
2026-10-12 06:40:00.0000003758.0773925781321022.4537410736124945.5361328125024399.808593750.758810937404633-1580.0395507812549.5999984741211live
2026-10-12 06:35:00.0000003768.0122070312520881.337387084974948.16455078125024575.9238281250.764070510864258-1555.3634033203149.7000007629395live
2026-10-12 06:30:00.0000003762.3835449218821022.7605533599964947.5361328125024666.46093750.837200045585632-1762.3148193359449.7000007629395live
2026-10-12 06:25:00.0000003737.4094238281320859.9461860656774949.181640625024822.03906250.629423975944519-1630.22460937549.7999992370605live
2026-10-12 06:20:00.0000003736.13085937520896.2424316406184948.07470703125024893.871093750.815248847007751-1471.0190429687549.7000007629395live
2026-10-12 06:15:00.0000003733.1599121093821026.5568866729774947.69970703125024934.7441406250.992216169834137-1498.8592529296949.7999992370605live
2026-10-12 06:10:00.0000003747.5607910156221152.07144165044947.88671875024987.71093750.592330574989319-1571.8443603515649.5999984741211live
2026-10-12 06:05:00.0000003772.8684082031321277.008380889894948.7763671875024899.511718750.642935752868652-1424.6352539062549.9000015258789live
2026-10-12 06:00:00.0000003753.0432128906220743.203140258794947.2714843750.0029297759756445924886.0468750.566132426261902-778.48468017578149.7999992370605live
2026-10-12 05:55:00.0000003735.3549804687520692.6060390472384946.16748046875024938.9843750.79309469461441-627.28424072265649.5999984741211live
2026-10-12 05:50:00.0000003749.745117187520796.835849761964946.597656250.0029297759756445924898.5468750.916019678115845-530.38287353515649.5live
2026-10-12 05:45:00.0000003761.1574707031321023.5294780731244947.636230468750.0058595519512891824845.0136718750.615907907485962-451.1655273437549.5999984741211live
2026-10-12 05:40:00.0000003771.8999023437521055.827657699594946.46240234375024928.7871093750.784061014652252-400.56698608398449.5999984741211live
2026-10-12 05:35:00.0000003792.901367187521124.45048141484947.3222656250.0029297759756445924991.5527343750.726900517940521-414.53024291992249.5999984741211live
2026-10-12 05:30:00.0000003810.8967285156321405.0774192810064946.69042968750.0029297759756445924840.2519531250.661790430545807-476.29766845703149.9000015258789live
2026-10-12 05:25:00.0000003844.8532714843821629.561969757084947.59130859375024897.6191406250.622107684612274-478.16397094726649.9000015258789live
2026-10-12 05:20:00.0000003893.2036132812521854.478393554694947.123535156250.0029297759756445924909.480468750.577534794807434-532.51287841796949.7000007629395live
2026-10-12 05:15:00.0000003948.8979492187521977.559234619144948.048828125024863.9902343750.601628959178925-463.10177612304749.7000007629395live

Coverage

100.0% complete0 gap days7,225 days with data
Show coverage history
Coverage: 100.0%Days with data: 7,225Gaps: 0
2026
2025
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011
2010
2009
2008
2007
gaplessmore