Power Demand (national / region rollup) API v1
Generated from
core.contract.describe_power_demand_rollup_v1()and checked fixture-backed examples. Do not hand-edit the example JSON files.
Capability
- Capability:
power.demand_rollup - Primitive:
query_power_demand_rollup_v1 - Status:
available - Current source:
energy.eia.eia930_rollup - Source publisher: U.S. Energy Information Administration
- Snapshot behavior:
as_of = latestresolves to an exact snapshot date in every response.
What It Can Answer
- Hourly observed electricity demand (MW) for the US48 national total — EIA's published Adjusted series, cited to the source record.
- Hourly observed demand for any of the 13 EIA regions (CAL, CAR, CENT, FLA, MIDA, MIDW, NE, NW, NY, SE, SW, TEN, TEX).
- The day-ahead demand forecast for the same respondent-hours, and forecast-vs-actual misses.
- National and regional demand shape over time (daily/seasonal profiles, growth) from EIA's own published totals.
- Row-level detail records when
include_recordsis true. - Raw JSON record evidence for any returned row-level citation.
Represented Facts
EIA-930 reports hourly observed electricity demand (MW) as EIA's own published rollup totals — US48 (the Lower-48 national total) and the 13 EIA regions (the Adjusted series, served verbatim, not a sum)EIA-930 reports the day-ahead demand forecast (MW) on the same respondent-hour rows
Data Point Contract
- Data point:
power.demand_rollup - Product spec:
blocks/power_demand_rollup/card.md - Grain:
respondent_hourly - Source basis:
energy.eia.eia930_rollup - Represented fact: EIA-930 reports hourly observed electricity demand (MW) as EIA's OWN published rollup totals — US48 (the Lower-48 national total) and the 13 EIA regions — the Adjusted series (same canonical definition as power.demand's demand_mw, verified against imputed hours), plus the same hour's day-ahead demand forecast. This is EIA's published total served verbatim as a cited atom, NOT a sum exascale computed and NOT the BA series — it closes power.demand's PD-021 refusal of national/region totals. History begins 2019-01-01 (this API route is ~3.5 years shorter than power.demand's BA history).
Does not answer:
balancing-authority-level demand (that is power.demand / EIA-930 BALANCE; this block serves only EIA's published US48 + region rollups)summing demand across respondents — US48 already contains the 13 regions, so a national+region sum double-counts (refused with a scope note, never computed)demand before 2019-01-01 (this API route's history floor; power.demand reaches 2015 H2 at BA grain)the raw (un-Adjusted) demand series — the route publishes the Adjusted series onlyplant, generator, county, state, or lat/lon attribution (structural — the rollup carries no such IDs)installed capacity (EIA-860M), monthly plant generation (EIA-923), retail sales (EIA-861), prices, transmissionlong-horizon demand forecasts (the EIA forecast is day-ahead only)finality (the most recent hours are preliminary and continuously revised)
REST Surface
GET /v1/healthGET /v1/capabilitiesGET /v1/power/demand-rollup/schemaPOST /v1/power/demand-rollup/queryPOST /v1/evidence/source-row
MCP Surface
list_capabilities_v1describe_power_demand_rollup_v1query_power_demand_rollup_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_ofrespondentdata_datehour_number
Group by:
respondentrespondent_leveldata_datehour_numberdatetime_utc
Date range parameters:
data_date_fromdata_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": [
"demand_mw",
"demand_forecast_mw",
"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:
demand_mwdemand_forecast_mwsource_record_count
Metric groups:
{
"demand_mw": [
"demand_mw",
"demand_forecast_mw"
],
"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 |
|---|---|---|---|---|---|---|
demand_mw |
demand_mw | MW | sum | false | summary.totals.demand_mw |
EIA's published hourly demand total (MW, Adjusted series) for the respondent in scope — US48 (the Lower-48 national total) or one of the 13 EIA regions. |
demand_forecast_mw |
demand_mw | MW | sum | false | summary.totals.demand_forecast_mw |
EIA's published day-ahead hourly demand forecast (MW) for the same respondent-hour. |
source_record_count |
records | count | count source records | true | summary.totals.source_record_count |
Count of normalized source records (respondent-hours) contributing to 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:
demand_mw,demand_forecast_mw.
Detail record fields returned when include_records is true:
source_idsheet_namesource_record_keyreport_periodrespondentrespondent_leveldata_datehour_numberdatetime_utcdemand_mwdemand_forecast_mwsource_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 |
|---|---|---|---|---|
respondent |
complete_for_gated_eia930_rollup_rows | 14 | CAL = California, CAR = Carolinas, CENT = Central, FLA = Florida, MIDA = Mid-Atlantic |
EIA's published demand respondents: US48 (the Lower-48 national total) and the 13 EIA regions. demand_mw is already each respondent's published total, so summing across respondents double-counts (US48 contains the 13 regions) — group_by respondent for the per-respondent series; a multi-respondent result carries a respondent_aggregation note. An EIA region is a grid grouping, not a state. A region named like a state is not guaranteed to equal it: TEX ('Texas') is the ERCOT grid alone — ~90% of Texas load — while non-ERCOT El Paso, the Panhandle, and East Texas fall in OTHER EIA regions. Some regions span several states (NE = New England's six; CAR = the Carolinas; MIDA ≈ the PJM footprint); others nearly match their namesake (NY ≈ New York via NYISO). Use respondent for a region/grid total and a state-grain source (power.retail_sales) for a jurisdiction. When a phrase like 'Texas demand' is ambiguous between the EIA region and the state, report both readings rather than guessing (PD-035). |
The complete machine-readable codebooks are included in capability-schema.json.
Checked Examples
| Agent question | Request params | Checked output |
|---|---|---|
| What was the US48 national hourly demand on 2026-06-10? | {"data_date": "2026-06-10", "group_by": ["datetime_utc"], "respondent": "US48"} |
us48-national-demand-curve.json |
| How does hourly demand compare across EIA regions on 2026-06-10? | {"data_date": "2026-06-10", "group_by": ["respondent", "datetime_utc"]} |
demand-by-region.json |
| How did the US48 day-ahead forecast compare to actual demand, hour by hour, on 2026-06-10? | {"data_date": "2026-06-10", "group_by": ["hour_number"], "respondent": "US48"} |
forecast-vs-actual-national.json |
| Return one US48 demand record with a row-level citation. | {"data_date": "2026-06-10", "include_records": true, "limit": 1, "respondent": "US48"} |
region-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.demand_rollup. - Call
describe_power_demand_rollup_v1to inspect valid filters, groupings, metrics, and citation fields. - Call
query_power_demand_rollup_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.