Power Interconnection Queue (SPP) API v1
Generated from
core.contract.describe_power_interconnection_queue_spp_v1()and checked fixture-backed examples. Do not hand-edit the example JSON files.
Capability
- Capability:
power.interconnection_queue_spp - Primitive:
query_power_interconnection_queue_spp_v1 - Status:
available - Current source:
energy.spp.queue - Source publisher: Southwest Power Pool (SPP)
- Snapshot behavior:
as_of = latestresolves to an exact snapshot date in every response.
What It Can Answer
- Which generation projects have REQUESTED to connect to the SPP grid, by state, county, generation type, fuel, study cluster, and status.
- The requested capacity (MW) of each queued SPP project (plus five other labeled MW columns), cited to its source row.
- The as-reported SPP status (SPP's own vocabulary, kept verbatim), so an agent can scope active vs withdrawn vs terminated.
- The study cluster (DISIS-YYYY-NNN / Surplus / RTOE Transitional) and SPP regional cluster group, as SPP reports them.
- Row-level detail records when
include_recordsis true. - Raw CSV row evidence for any returned row-level citation.
Represented Facts
SPP's GI Summary lists each generation project's REQUESTED interconnection capacity (capacity_mw — SPP's headline figure, with five other labeled MW columns served and never blended); a request, not built capacitySPP publishes a native Status column whose vocabulary it controls, so native_status is served VERBATIM with a codebook (never mapped to a lifecycle enum); ~66% of rows are WITHDRAWN, so a total is scoped by native_status, never read as builtSPP spans ~14 central-US states (state is a real anchor), carries only a free-text town-or-county (county_fips derived by name where it resolves, else null), encodes hybrids natively as a Hybrid generation_type (no is_hybrid invented), and is generation-only (no load/data-center type)
Data Point Contract
- Data point:
power.interconnection_queue_spp - Product spec:
blocks/power_interconnection_queue_spp/card.md - Grain:
project_snapshot - Source basis:
energy.spp.queue - Represented fact: The SPP generator interconnection queue — Southwest Power Pool's public GI Summary report, the waiting line of every generation project that has REQUESTED to connect to the SPP grid (the ~14-state central-US RTO), served as-reported, project by project. SPP's full published structure is carried faithfully, in SPP's own words, across all 27 columns of the report: the six labeled megawatt readings (
capacity_mw,max_summer_mw,max_winter_mw,requested_max_injection_mw,requested_nrd_mw,nameplate_capacity_mw, kept SEPARATE — SPP publishes several and we never blend them), the as-reportednative_status(SPP's own vocabulary — WITHDRAWN, IA FULLY EXECUTED/ON SCHEDULE, IA FULLY EXECUTED/COMMERCIAL OPERATION, DISIS STAGE, IA PENDING, SPECIAL STUDY, TERMINATED, FACILITY STUDY STAGE, ERAS, IA FULLY EXECUTED/ON SUSPENSION, …, kept verbatim with a per-source codebook, never mapped to a lifecycle enum), thegeneration_typeand free-textfuel_type(kept verbatim, including SPP's ownHybridgeneration type and slash-delimited fuel combos — no is-hybrid flag is invented), the studycurrent_cluster(DISIS-YYYY-NNN / Surplus / RTOE Transitional …) and SPP regionalcluster_group, the transmission owner at the point of interconnection (to_at_poi), theservice_type, the substation, and the lifecycle dates (request received, in-service, commercial operation, withdrawn, cessation). This is a REQUEST, not built capacity: historically the large majority of queued MW withdraws before it is built (in the SPP file, ~66% of rows are WITHDRAWN). This is a forward-looking slice (capacity/generation/demand are backward-looking actuals). SPP genuinely spans many states, sostateis a real dimension and anchor; SPP carries no county_fips and no lat/lon, only a free-text "Nearest Town or County" —county_fipsis derived by name where it resolves and left null otherwise (towns, multi-county labels, and unresolved names stay null, never guessed — the derivation is LOSSY by design). The grain key is SPP's Generation Interconnection Number (globally unique). SPP publishes no load/data-center request type — the queue is generation-only — so no load or data-center signal is inferred; that interpretation is the analyst's. SPP keeps no per-vintage archive (the CSV is regenerated on demand), so history accrues forward from first capture — this serves a CURRENT snapshot, not deep as_of time-travel.
Does not answer:
built/operating/nameplate capacity as a queue total (the MW columns are REQUESTED interconnection, not built; for operating capacity use power.capacity / EIA-860M)a single nameplate figure (SPP publishes six MW columns — capacity, max summer, max winter, requested max injection, requested network resource deliverability, nameplate — all served and never collapsed)a sum of MW treated as planned or operating capacity (most queued MW withdraws — ~66% of SPP rows are WITHDRAWN — totals are scoped by native_status, never read as built)a cross-ISO or national queue total (methodologies, inclusion, and withdrawal rates differ per ISO — never summed or deduped across ISOs; for MISO use query_power_interconnection_queue_v1, for PJM query_power_interconnection_queue_pjm_v1 (or query_power_interconnection_queue_pjm_cycle_v1), for CAISO query_power_interconnection_queue_caiso_v1, for NYISO query_power_interconnection_queue_nyiso_v1, for ISO-NE query_power_interconnection_queue_isone_v1, for ERCOT query_power_interconnection_queue_ercot_v1)which projects are "data-center driven" or load requests (SPP's GI queue publishes no load/data-center request type — it is generation-only; that inference is the analyst's, never tagged here)the probability that a queued project will actually be built or reach commercial operationgeneration MWh, demand, prices, retail sales, or transmission flowslat/lon or plant-level attribution (SPP supplies no coordinate; only a free-text town-or-county, the State column, and derived county_fips)queues for other ISOs/RTOs (MISO, PJM, CAISO, NYISO, ISO-NE, ERCOT) — each is a separate block under the same gate
REST Surface
GET /v1/healthGET /v1/capabilitiesGET /v1/power/interconnection-queue-spp/schemaPOST /v1/power/interconnection-queue-spp/queryPOST /v1/evidence/source-row
MCP Surface
list_capabilities_v1describe_power_interconnection_queue_spp_v1query_power_interconnection_queue_spp_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_ofstatecounty_fipsnative_statusgeneration_typefuel_typeservice_typecurrent_clustercluster_groupto_at_poirequest_receivedcommercial_operation_date
Group by:
statecounty_fipsnative_statusgeneration_typefuel_typeservice_typecurrent_clustercluster_groupto_at_poi
Date range parameters:
request_received_fromrequest_received_tocommercial_operation_date_fromcommercial_operation_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": [
"capacity_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:
capacity_mwsource_record_count
Metric groups:
{
"records": [
"source_record_count"
],
"requested_mw": [
"capacity_mw"
]
}
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 |
|---|---|---|---|---|---|---|
capacity_mw |
requested_mw | MW | sum | true | summary.totals.capacity_mw |
The project's requested interconnection capacity in MW, as SPP reports it (the Capacity column — SPP's headline MW figure). |
source_record_count |
records | count | count source records | true | summary.totals.source_record_count |
Count of SPP GI queue rows in the current result scope (one atom = one project row). |
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.
Detail record fields returned when include_records is true:
source_idisogeneration_interconnection_numbersource_record_keynative_statusstatestate_rawnearest_town_or_countycounty_fipscounty_fips_sourcecounty_fips_unresolvedifs_queue_numbercurrent_clustercluster_groupto_at_poiservice_typegeneration_typefuel_typesubstation_or_linejtiq_participantjtiq_commitmentcause_of_delaycapacity_mwmax_summer_mwmax_winter_mwrequested_max_injection_mwrequested_nrd_mwnameplate_capacity_mwin_service_datecommercial_operation_datecessation_dateoriginal_generator_commercial_op_daterequest_receiveddate_withdrawnreport_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 |
|---|---|---|---|---|
native_status |
the status values observed in the SPP snapshot (live; SPP may add more) | 12 | WITHDRAWN = Withdrawn — left the queue (the dominant class, ~66%), IA FULLY EXECUTED/ON SCHEDULE = Interconnection Agreement signed, on schedule, IA FULLY EXECUTED/COMMERCIAL OPERATION = IA signed, in commercial operation, IA FULLY EXECUTED/ON SUSPENSION = IA signed, suspended, IA PENDING = Interconnection Agreement not yet executed |
ALWAYS scope by native_status. Served VERBATIM (never mapped to a lifecycle enum, never a derived active/withdrawn boolean — that equivalence is the analyst's). ~66% of rows are WITHDRAWN. A queue-MW total is REQUESTED capacity, never built — for built/operating capacity use query_power_capacity_v1. Filter by SPP's EXACT string. |
generation_type |
the distinct generation types served from the SPP snapshot | 0 | SPP's own values, served verbatim — e.g. Wind, Solar, Battery/Storage, Thermal, Hybrid, Hydro. SPP encodes hybrids NATIVELY as Hybrid (no is_hybrid is invented). SPP's own case inconsistencies (WIND/wind vs Wind) are surfaced as-reported, not normalized. Filter by SPP's EXACT value. |
|
fuel_type |
the distinct fuel-type strings served from the SPP snapshot | 0 | Free-text and often blank; slash-delimited combos (e.g. Solar/Storage, Wind/Storage) are kept WHOLE, never split. Filter by SPP's EXACT string. |
|
service_type |
the distinct service types served from the SPP snapshot | 0 | SPP's request service type, e.g. ER/NR (Energy Resource / Network Resource), ER, NR. Filter by SPP's EXACT value. |
|
current_cluster |
the distinct clusters served from the SPP snapshot | 0 | SPP's study cluster, e.g. DISIS-2024-001, Surplus, RTOE Transitional Cluster (blank for un-clustered rows). Filter by SPP's EXACT value. |
|
cluster_group |
the distinct cluster groups served from the SPP snapshot | 0 | SPP's regional cluster group, e.g. 01 NORTH, 02 NEBRASKA, 03 CENTRAL, 04 SOUTHEAST, 05 SOUTHWEST. Filter by SPP's EXACT value. |
The complete machine-readable codebooks are included in capability-schema.json.
Checked Examples
| Agent question | Request params | Checked output |
|---|---|---|
| How much requested capacity and how many rows sit in the SPP queue, by SPP's native status? | {"group_by": ["native_status"]} |
spp-queue-by-status.json |
| What generation types lead SPP's DISIS-stage study requests, by requested MW? | {"group_by": ["generation_type"], "native_status": "DISIS STAGE", "order_by": "capacity_mw", "top_n": 5} |
disis-by-gentype.json |
| Which SPP states have the most requested interconnection capacity in the study pipeline? | {"group_by": ["state"], "native_status": "DISIS STAGE", "order_by": "capacity_mw", "top_n": 10} |
requested-mw-by-state.json |
| Return one SPP DISIS-stage queue project with a row-level citation. | {"include_records": true, "limit": 1, "native_status": "DISIS STAGE"} |
queue-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.interconnection_queue_spp. - Call
describe_power_interconnection_queue_spp_v1to inspect valid filters, groupings, metrics, and citation fields. - Call
query_power_interconnection_queue_spp_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.