Overview

Every PJM location that carries a price, as three columns: location_id, name, and kind. 14,977 rows — load (12,159), generator (2,255), aggregate (293), bus (153), interface (82), zone (23), hub (12). This is the dimension the PJM price, and where applicable constraint, tables join to, and it is the one place a location's type is decided: resolve "which hubs exist", "is this a zone or a node", or "give me the readable name for this id" here rather than inferring a type from a name prefix. For PJM, location_id is the numeric pnode_id and name is the pnode name (e.g. WESTERN HUB). Join on location_id; report name. The same three columns exist for every market, so the equivalent question in another ISO is the same query against that ISO's table.

Use with MCP

This table is readable two ways, over the same guarded boundary. Over HTTP: POST /api/v1/datasets/pjm_locations/query, described in the API reference. Or from an MCP client: connect a market below, then use search_data or describe_data to load its query contract before calling query_data.

Schema3

Column
Type
location_idLowCardinality(String)
nameLowCardinality(String)
kindLowCardinality(String)

Sample rows

location_idnamekind
1PJM-RTOzone
101560795HAYROAD 8CCaggregate
1047909TOSCOGISload
1047910AMTRAKload
1047911AMTRAKload
1047912BETZWOODload
1047913LLANERCHload
1047914LLANERCHload
1047915LLANERCHload
1047916UPPERPROload
1047919EXETERload
1047920EXETERload
1047921HUNLOCKload
1047925POPETALBload
1047926COURTDALload
1047927DALLASload
1047928GLENVIEWload
1047929HANOVERload
1047930HANOVERload
1047932KING UGIload
1047933KING UGIload
1047934KOONSVILload
1047935KOONSVILload
1047936KUNKLEload
1047937LINC UGIload

Coverage

No time-indexed data — coverage isn’t applicable to this dataset.