Docs API reference

Power Demand API v1

Generated from core.contract.describe_power_demand_v1() and checked fixture-backed examples. Do not hand-edit the example JSON files.

Capability

What It Can Answer

Represented Facts

Data Point Contract

Does not answer:

REST Surface

MCP Surface

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:

Input field semantics:

Field Answer Label Source Field Semantics Definition Counting Definition
is_imputed EIA-imputed hour Demand (MW) (Imputed) eia930_adjusted_demand_origin_flag True where EIA's Adjusted demand came from EIA's Imputed series (fills AND overrides of reported raw values — PD-018); false where the Adjusted value passed through the reported raw value; null on forecast-only rows that carry no demand value yet. The filter accepts true, false, or {"is_null": true} for the forecast-only rows. A count of is_imputed=true rows counts BA-hours whose served demand is EIA-imputed, including EIA overrides of reported raw values, not just fills of missing ones.

Group by:

Date range parameters:

Controls:

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:

Metric groups:

{
  "demand_mw": [
    "demand_mw",
    "demand_forecast_mw"
  ],
  "records": [
    "source_record_count"
  ]
}

Response summary fields:

Accepted fact policy:

Metric metadata:

Metric Category Unit Aggregation Additive Across Groups Authoritative Total Definition
demand_mw demand_mw MW sum false summary.totals.demand_mw Sum of EIA-930 hourly demand (MW, EIA's Adjusted series) within the current result scope.
demand_forecast_mw demand_mw MW sum false summary.totals.demand_forecast_mw Sum of EIA-930 day-ahead hourly demand forecast (MW) within the current result scope.
source_record_count records count count source records true summary.totals.source_record_count Count of normalized source rows (BA-hours) contributing to the current result scope.

Rollup rules:

Detail record fields returned when include_records is true:

Row-level citation fields:

Aggregate citation fields:

Codebooks

Field Coverage Codes Examples Note
balancing_authority_code complete_for_gated_eia930_balance_rows 72 AEC = PowerSouth Energy Cooperative, AECI = Associated Electric Cooperative, Inc., AVA = Avista Corporation, AVRN = Avangrid Renewables, LLC, AZPS = Arizona Public Service Company EIA-930's BA code is the reporting entity itself, valid only inside its [activation, retirement) window (PD-020) — a retired BA's later months are honestly empty, never zero, and successor folds are not stitched. generation_only BAs report no demand (PD-021). A balancing authority is not a state. ERCO (ERCOT) lies wholly within Texas and covers ~90% of its load, but state=TX is the larger jurisdiction — it also includes non-ERCOT El Paso (WECC), the Panhandle (SPP), and East Texas (MISO), a material (~20%+) difference. Use balancing_authority_code for a grid and state for a jurisdiction; they are not interchangeable. When a phrase like 'the Texas grid' is ambiguous between the two, report both readings rather than guessing one (PD-009).
region complete_for_gated_eia930_balance_rows 13 CAL = California, CAR = Carolinas, CENT = Central, FLA = Florida, MIDA = Mid-Atlantic EIA's 13 display regions for the lower-48 grid. A region is a display grouping of BAs, not a jurisdiction; region demand sums carry the same PD-021 non-additivity note as any other cross-BA sum.

The complete machine-readable codebooks are included in capability-schema.json.

Checked Examples

Agent question Request params Checked output
What was PJM's hourly demand on 2026-03-07? {"balancing_authority_code": "PJM", "data_date": "2026-03-07", "group_by": ["datetime_utc"]} hourly-demand-curve.json
How does daily demand compare across balancing authorities for 2026-03-07 through 2026-03-09? {"data_date_from": "2026-03-07", "data_date_to": "2026-03-09", "group_by": ["balancing_authority_code", "data_date"]} demand-by-ba.json
How did PJM's day-ahead forecast compare to actual demand, hour by hour, on 2026-03-08? {"balancing_authority_code": "PJM", "data_date": "2026-03-08", "group_by": ["hour_number"]} forecast-vs-actual-day.json
Which IID hours on 2026-05-20 carry EIA-imputed demand? {"balancing_authority_code": "IID", "data_date": "2026-05-20", "group_by": ["datetime_utc"], "is_imputed": true} imputed-hours-only.json
Return one PJM demand row with a row-level citation. {"balancing_authority_code": "PJM", "data_date": "2026-03-07", "include_records": true, "limit": 1} demand-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

  1. Call list_capabilities_v1 and select power.demand.
  2. Call describe_power_demand_v1 to inspect valid filters, groupings, metrics, and citation fields.
  3. Call query_power_demand_v1 with bounded JSON params.
  4. If the answer needs proof, pass a returned row-level citation object to get_source_evidence_v1.
  5. Answer with the resolved as_of and relevant citations. Present returned metrics as authoritative for their declared source, snapshot, grain, and aggregation.
Generated from the tested API contract. Compare with the live capability map ↗