ERCOT logo

ERCOT Day-Ahead Ancillary Prices

Cleared day-ahead ancillary-service capacity prices in ERCOT, one row per hour and product.

Native record
product x delivery hour
hourly (day-ahead) publication cadence
Evidence
Cleared day-ahead market
A market outcome, not a physical observation
Time basis
Interval-start records
UTC · event_time

Overview

365,717 rows, 2017-01 to the next delivery day. Products: reg_up, reg_down, spin, non_spin, ecrs. ERCOT procures ancillary services system-wide, so there is no region column — one price per product per hour. price_usd_mw is a price for CAPACITY held in reserve — dollars per megawatt of commitment — not dollars per megawatt-hour of energy delivered. The two are different units and are not comparable to an LMP.

Query contract

Select one product before aggregating. Each row is already the canonical cleared price for that combination.

Analysis rules

  • Never sum prices across products. Reserve products are separately procured markets and their prices do not add to a meaningful total.
  • Averaging over hours gives a simple average clearing price, not a procurement-weighted cost. Say which you computed.

Interpretation

  • price_usd_mw is $/MW of capacity held, not $/MWh of energy. Do not compare it directly to an LMP, and do not multiply it by megawatt-hours.
  • A cleared price is what the day-ahead market settled at. It is not the quantity procured, not a scarcity measurement, and not evidence that reserves were short.

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_ancillary_da/query

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

Schema3

Column
Type
event_timeDateTime64(6, 'UTC')
productLowCardinality(String)
price_usd_mwNullable(Float64)

Sample data

event_timeproductprice_usd_mw
2026-10-13 05:00:00.000000reg_up4.9
2026-10-13 05:00:00.000000ecrs4.39
2026-10-13 05:00:00.000000non_spin8.86
2026-10-13 05:00:00.000000reg_down1
2026-10-13 05:00:00.000000spin4.24
2026-10-13 04:00:00.000000spin4.94
2026-10-13 04:00:00.000000reg_up4.57
2026-10-13 04:00:00.000000reg_down1
2026-10-13 04:00:00.000000ecrs5.1
2026-10-13 04:00:00.000000non_spin17.99
2026-10-13 03:00:00.000000reg_up10.01
2026-10-13 03:00:00.000000ecrs10
2026-10-13 03:00:00.000000reg_down1.81
2026-10-13 03:00:00.000000spin9.11
2026-10-13 03:00:00.000000non_spin22.02
2026-10-13 02:00:00.000000reg_up3.34
2026-10-13 02:00:00.000000reg_down1.05
2026-10-13 02:00:00.000000spin3.95
2026-10-13 02:00:00.000000ecrs5.3
2026-10-13 02:00:00.000000non_spin20.2
2026-10-13 01:00:00.000000ecrs2.21
2026-10-13 01:00:00.000000reg_down0.76
2026-10-13 01:00:00.000000spin2
2026-10-13 01:00:00.000000reg_up2
2026-10-13 01:00:00.000000non_spin15.87

Coverage

100.0% complete0 gap days4,548 days with data
Show coverage history
Coverage: 100.0%Days with data: 4,548Gaps: 0
2026
2025
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
gaplessmore