ERCOT logo

Fuel Mix (Unified)

Realized ERCOT generation in megawatts by fuel type (coal, hydro, nuclear, storage, solar, wind, gas, other), one row per (event_time, fuel_type, quality).

Native record
ERCOT system x fuel type x 5-minute (live) or 15-minute (settled) interval
5-minute (live only, pending settled backfill) publication cadence
Evidence
Observed market data
Published observations from the named source
Time basis
Point-in-time records
UTC · event_time

Overview

Long-format unification of the live 5-minute feed and the settlement-grade Fuel Mix Report — but quality='settled' is TEMPORARILY DISABLED: ercot.fuel_mix_report's gen_mw was found to be ~4x too low (ERCOT publishes MWh delivered per 15-min interval, not average MW, and the writer didn't convert). The write-path bug is fixed, but existing report rows are still wrong pending a full historical backfill, so this view currently emits quality='live' only (the 5-minute feed, which reads a separate MW-native source and is correct). The settled branch will return once the backfill is verified. Always filter by event_time; this is a view, and an unbounded scan is expensive. This is the table the SQL agent actually queries; ercot_fuel_mix_report and ercot_fuel_mix_5min remain in the public catalog as the underlying raw sources.

Query contract

Select one exact event_time and one quality ('live' or 'settled'); never mix quality within one snapshot or sum across it. gen_mw is already the collapsed, revision-resolved value for that (event_time, fuel_type, quality) — no further argMax/vintage reduction is needed or correct.

Analysis rules

  • For a current fuel mix, use every fuel_type row at the same latest event_time and quality; do not combine values from different snapshots or different quality levels.
  • Calculate shares against the sum of gen_mw across fuel_type at that (event_time, quality).

Interpretation

  • quality='settled' is temporarily unavailable (returns no rows): the underlying ercot.fuel_mix_report source had a ~4x unit bug (MWh-per-interval stored as if it were average MW). Only quality='live' is currently exposed. Do not describe historical/settled fuel-mix data as unavailable in general — this is a known, temporary gap being backfilled, not a product boundary.
  • gen_mw for fuel_type='storage' is net fleet output: positive is discharging into the grid, negative is charging from the grid.

Access

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

Schema4

Column
Type
event_timeDateTime64(6, 'UTC')
fuel_typeString
gen_mwNullable(Float64)
qualityString

Sample data

event_timefuel_typegen_mwquality
2026-10-21 06:10:00.000000coal6052.4501953125live
2026-10-21 06:10:00.000000hydro0live
2026-10-21 06:10:00.000000nuclear3837.35327148437live
2026-10-21 06:10:00.000000storage-2747.24072265625live
2026-10-21 06:10:00.000000solar1.03515601158142live
2026-10-21 06:10:00.000000wind15750.322265625live
2026-10-21 06:10:00.000000gas22034.22621154786live
2026-10-21 06:10:00.000000other50live
2026-10-21 06:05:00.000000coal6160.25732421875live
2026-10-21 06:05:00.000000hydro0live
2026-10-21 06:05:00.000000nuclear3837.6220703125live
2026-10-21 06:05:00.000000storage-2848.09252929687live
2026-10-21 06:05:00.000000solar1.08969783782959live
2026-10-21 06:05:00.000000wind15776.2578125live
2026-10-21 06:05:00.000000gas22223.88475036622live
2026-10-21 06:05:00.000000other50.0999984741211live
2026-10-21 06:00:00.000000coal6213.42431640625live
2026-10-21 06:00:00.000000hydro4.96399974822998live
2026-10-21 06:00:00.000000nuclear3835.02172851562live
2026-10-21 06:00:00.000000storage-2776.21899414063live
2026-10-21 06:00:00.000000solar1.36057424545288live
2026-10-21 06:00:00.000000wind15853.021484375live
2026-10-21 06:00:00.000000gas22173.15440368653live
2026-10-21 06:00:00.000000other50.0999984741211live
2026-10-21 05:55:00.000000coal6200.33837890625live

Coverage

100.0% complete0 gap days135 days with data
Show coverage history
Coverage: 100.0%Days with data: 135Gaps: 0
2026
gaplessmore