Power Prices (ERCOT day-ahead) API v1
Generated from
core.contract.describe_power_price_ercot_v1()and checked fixture-backed examples. Do not hand-edit the example JSON files.
Capability
- Capability:
power.price_ercot - Primitive:
query_power_price_ercot_v1 - Status:
available - Current source:
energy.ercot.prices - Source publisher: Electric Reliability Council of Texas (ERCOT)
- Snapshot behavior:
as_of = latestresolves to an exact snapshot date in every response.
What It Can Answer
- The day-ahead wholesale price ($/MWh) at an ERCOT settlement point for a given delivery day and hour, cited to its source row.
- The price at a named hub (HB_NORTH, HB_HOUSTON) or load zone (LZ_HOUSTON) — the regional benchmark prices.
- The daily price shape (24 hourly day-ahead prices) and the average / minimum / maximum price over a window.
- How a settlement point is classified by ERCOT (Hub / Load Zone / Resource Node / DC-tie, as ERCOT's own verbatim code).
- Row-level detail records when
include_recordsis true. - Raw capture row evidence for any returned row-level citation.
Represented Facts
ERCOT's Day-Ahead Market Settlement Point Prices (NP4-190-CD) — the price ($/MWh) cleared the day before each operating day at every ERCOT settlement point, served hourly and point by point as a TOTAL (no energy/congestion/loss split; none is synthesized)a price is intensive ($/MWh): it is averaged / min'd / max'd over a scope, never summed; ERCOT's own hour-ending label and DST flag are carried verbatim (24 hours normally, 25 on the fall-back date, 23 on spring-forward)settlement_point_type is ERCOT's OWN verbatim classification (HU hub / LZ load zone / RN resource node / DC-tie …), joined from ERCOT's published settlement-points list and never collapsed; a settlement point is electrical/aggregate, not a plant — the only geography anchor is state = TXhistorical delivery coverage begins 2014-05-02 from ERCOT's Data Access Portal archives; settlement-point names remain exactly as published in each vintage, and an older name absent from the current type reference receives a null type rather than a rewrite or guess
Data Point Contract
- Data point:
power.price_ercot - Product spec:
blocks/power_price_ercot/card.md - Grain:
settlement_point_hourly - Source basis:
energy.ercot.prices - Represented fact: The Texas wholesale price signal — ERCOT's Day-Ahead Market Settlement Point Prices (EMIL NP4-190-CD), the price ($/MWh) cleared the day before each operating day at every ERCOT settlement point, served hourly, point by point, exactly as ERCOT publishes it. ERCOT's day-ahead feed is structurally a TOTAL settlement-point price only — there is NO energy/congestion/loss component split and NO loss component (confirmed against live cells), so the flatter structure is served faithfully and the components are never synthesized. Historical coverage begins 2014-05-02, the first delivery day in ERCOT's Data Access Portal archive. Older settlement-point names are served exactly as published; names absent from the current pinned type reference retain a null type rather than being rewritten or guessed. One atom is one (delivery_date, hour_ending, settlement_point) price; ERCOT's own hour-ending label ("01:00".."24:00") and DST flag are carried verbatim (the fall-back duplicate hour is distinguished by
dst_flag, so a day carries 24 hours normally, 25 on the fall-back date, 23 on the spring-forward date).settlement_pointis ERCOT's own location id (a Hub like HB_NORTH, a Load Zone like LZ_HOUSTON, a Resource Node named for one generator, or a DC-tie);settlement_point_typeis ERCOT's own verbatim classification code, joined by name from ERCOT's published settlement-points list and cited to it, never collapsed and never guessed. A settlement point is an ELECTRICAL/aggregate location, not a plant — ERCOT supplies no county, no lat/lon: the only geography anchor isstate= TX. Price is an intensive quantity ($/MWh): it is averaged, min'd, and max'd across a scope, never summed (summing prices is meaningless). This is ERCOT only — never blended, averaged, or compared across ISOs.
Does not answer:
real-time or 5-minute prices (this is the DAY-AHEAD hourly market only; ERCOT's real-time settlement is 15-minute, deliberately not served — "hourly is fine, not real-time trading")an energy / congestion / loss component breakdown (ERCOT's day-ahead settlement-point price is published as a TOTAL only — there is no component split and no loss component; we never synthesize one)a SUM of prices (price is intensive, $/MWh — it is averaged/min'd/max'd over a scope, never added; a "total price" is meaningless)bus-level nodal LMP (the >18,000-bus firehose, NP4-183-CD, is not served; settlement points are the settlement-relevant grain)prices for any other ISO/RTO, or a cross-ISO blended/average price (ERCOT only — methodologies and licenses differ; never merged or compared across ISOs)county, plant, lat/lon, or generator attribution of a price (a settlement point is an electrical/aggregate location, not a plant — ERCOT supplies no such id; the only anchor is state = TX)capacity (MW) or generation (MWh) — a price ($/MWh) is none of these (for installed capacity use query_power_capacity_v1; for generation use query_power_generation_v1)a forecast of future prices, or any claim that a past price predicts a future one
REST Surface
GET /v1/healthGET /v1/capabilitiesGET /v1/power/price-ercot/schemaPOST /v1/power/price-ercot/queryPOST /v1/evidence/source-row
MCP Surface
list_capabilities_v1describe_power_price_ercot_v1query_power_price_ercot_v1get_source_evidence_v1
Local MCP Setup
Some MCP clients launch servers from the user's home directory or ignore a configured cwd. Use uv run --directory so the server always starts from the repository project.
{
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/OSINT",
"python",
"-m",
"core.mcp_server"
]
}
Leave EXASCALE_PARQUET_BASE / EXASCALE_RAW_BASE unset: the one server hosts every data point's tools, and with no override it resolves each block's promoted snapshots and raw archive from the repository layout. Setting either env var points ALL tools at one directory — a per-block path breaks every other block's tools. They exist only for single-source sandboxes and tests.
Request Schema
Filters:
as_ofdelivery_datehour_endingsettlement_pointsettlement_point_typestate
Group by:
settlement_pointsettlement_point_typedelivery_datehour_ending
Date range parameters:
delivery_date_fromdelivery_date_to
Controls:
include_recordsinclude_evidencelimitorder_bytop_norderrollup_other
Ranking (how order_by / top_n / order join — order_by ranks groups by a metric, never a group_by dimension; top_n needs both a group_by and an order_by):
{
"no_ranking": "Omit order_by and top_n to return all groups in group-key order.",
"order": {
"default": "desc",
"valid_values": [
"desc",
"asc"
]
},
"order_by": {
"accepts": "one of output.metrics",
"note": "Ranks the groups by a metric (a measure). Not a group_by dimension \u2014 rows already come back grouped by each group_by field.",
"requires": [
"group_by"
],
"valid_values": [
"avg_price_usd_per_mwh",
"min_price_usd_per_mwh",
"max_price_usd_per_mwh",
"source_record_count"
]
},
"top_n": {
"note": "Keeps the top N groups by order_by; the rest fold into one (other) remainder (additive metrics sum into it, non-additive ones are nulled) so the result still reconciles to summary.totals.",
"requires": [
"group_by",
"order_by"
],
"type": "positive integer"
}
}
Output Schema
Aggregate metrics:
avg_price_usd_per_mwhmin_price_usd_per_mwhmax_price_usd_per_mwhsource_record_count
Metric groups:
{
"price": [
"avg_price_usd_per_mwh",
"min_price_usd_per_mwh",
"max_price_usd_per_mwh"
],
"records": [
"source_record_count"
]
}
Response summary fields:
group_counttotals
Accepted fact policy:
- Query responses contain accepted, gate-passed facts only.
- Gate, monitor, and audit quality signals are internal controls, not agent-facing answer caveats.
- If a source snapshot is not fit to serve, the source must fail closed before it reaches this API.
Metric metadata:
| Metric | Category | Unit | Aggregation | Additive Across Groups | Authoritative Total | Definition |
|---|---|---|---|---|---|---|
avg_price_usd_per_mwh |
price | USD/MWh | average | false | summary.totals.avg_price_usd_per_mwh |
The average ERCOT day-ahead settlement-point price ($/MWh) over the result scope. |
min_price_usd_per_mwh |
price | USD/MWh | minimum | false | summary.totals.min_price_usd_per_mwh |
The minimum ERCOT day-ahead settlement-point price ($/MWh) over the result scope. |
max_price_usd_per_mwh |
price | USD/MWh | maximum | false | summary.totals.max_price_usd_per_mwh |
The maximum ERCOT day-ahead settlement-point price ($/MWh) over the result scope. |
source_record_count |
records | count | count source records | true | summary.totals.source_record_count |
Count of (settlement_point, delivery_date, hour_ending) day-ahead prices in the current result scope. |
Rollup rules:
summary.totals.<metric>is the authoritative total for the full matched query.- Grouped row metrics may be summed only when
additive_across_groupsistrue. - Do not sum grouped values for these non-additive metrics:
avg_price_usd_per_mwh,min_price_usd_per_mwh,max_price_usd_per_mwh.
Detail record fields returned when include_records is true:
source_idsheet_nameisomarketstatesettlement_pointsettlement_point_typesource_record_keydelivery_datehour_endingdst_flagprice_usd_per_mwhreport_periodsource_row_numberas_ofraw_file_sha256citation
Row-level citation fields:
source_idsource_urlsource_filesheetsource_rowraw_file_sha256as_of
Aggregate citation fields:
source_idpublishersource_urlsource_fileraw_file_sha256as_ofsource_rows_countsource_rows_sampleverifylineage_filter
Codebooks
| Field | Coverage | Codes | Examples | Note |
|---|---|---|---|---|
settlement_point_type |
the distinct ERCOT type codes served from the pinned settlement-points mapping | 11 | HU = Trading Hub — a regional benchmark price (e.g. HB_NORTH, HB_HOUSTON, HB_WEST), LZ = Load Zone — a load-aggregation zone (e.g. LZ_HOUSTON, LZ_NORTH), RN = Resource Node — a single generating resource's settlement point, PUN = Private Use Network resource node (served verbatim), LZ_DC = DC-tie load zone — a settlement point at a DC interconnection (e.g. DC_E) |
ERCOT's OWN verbatim codes, never collapsed. The common classes: HU = trading Hub (a regional benchmark, e.g. HB_NORTH/HB_HOUSTON), LZ = Load Zone (e.g. LZ_HOUSTON), RN = Resource Node (a single generating resource's connection point), LZ_DC = a DC-tie zone (a settlement point at a DC interconnection to a neighboring grid, e.g. DC_E). The finer codes — PCCRN, LCCRN, PUN, AH, SH, LZ_DCEW, LZEW — are ERCOT's own subclassifications, served as-is (see ERCOT's settlement-points list for their precise definitions); we never guess or collapse them. Filter by ERCOT's EXACT code. |
market |
DAM only | 1 | DAM = Day-Ahead Market (hourly, cleared the day before the operating day) |
Every price in this block is a DAY-AHEAD (DAM) settlement-point price. Real-time / 5-minute prices are not served. |
The complete machine-readable codebooks are included in capability-schema.json.
Checked Examples
| Agent question | Request params | Checked output |
|---|---|---|
| What were the hourly day-ahead prices at the ERCOT North hub (HB_NORTH) on 2026-06-20? | {"delivery_date": "2026-06-20", "group_by": ["hour_ending"], "settlement_point": "HB_NORTH"} |
hub-hourly-day-ahead-price.json |
| What was the average ERCOT day-ahead price by settlement-point type on 2026-06-20? | {"delivery_date": "2026-06-20", "group_by": ["settlement_point_type"]} |
avg-price-by-location-type.json |
| What was the average day-ahead price at each ERCOT trading hub (type HU) on 2026-06-20? | {"delivery_date": "2026-06-20", "group_by": ["settlement_point"], "settlement_point_type": "HU"} |
hub-prices-by-point.json |
| Return one ERCOT day-ahead price at HB_NORTH with a row-level citation. | {"delivery_date": "2026-06-20", "include_records": true, "limit": 1, "settlement_point": "HB_NORTH"} |
price-detail-with-citation.json |
| Verify the raw workbook row behind a returned citation | citations[ref].verify (aggregate) or records[0].citation (detail) |
source-row-evidence.json |
| Dogfood the tool sequence as an agent | list -> describe -> query -> evidence |
agent-dogfood-transcript.json |
The checked schema output is capability-schema.json.
Agent Workflow
- Call
list_capabilities_v1and selectpower.price_ercot. - Call
describe_power_price_ercot_v1to inspect valid filters, groupings, metrics, and citation fields. - Call
query_power_price_ercot_v1with bounded JSON params. - If the answer needs proof, pass a returned row-level
citationobject toget_source_evidence_v1. - Answer with the resolved
as_ofand relevant citations. Present returned metrics as authoritative for their declared source, snapshot, grain, and aggregation.