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
location_idLowCardinality(String)nameLowCardinality(String)kindLowCardinality(String)Sample rows
| location_id | name | kind |
|---|---|---|
| 1 | PJM-RTO | zone |
| 101560795 | HAYROAD 8CC | aggregate |
| 1047909 | TOSCOGIS | load |
| 1047910 | AMTRAK | load |
| 1047911 | AMTRAK | load |
| 1047912 | BETZWOOD | load |
| 1047913 | LLANERCH | load |
| 1047914 | LLANERCH | load |
| 1047915 | LLANERCH | load |
| 1047916 | UPPERPRO | load |
| 1047919 | EXETER | load |
| 1047920 | EXETER | load |
| 1047921 | HUNLOCK | load |
| 1047925 | POPETALB | load |
| 1047926 | COURTDAL | load |
| 1047927 | DALLAS | load |
| 1047928 | GLENVIEW | load |
| 1047929 | HANOVER | load |
| 1047930 | HANOVER | load |
| 1047932 | KING UGI | load |
| 1047933 | KING UGI | load |
| 1047934 | KOONSVIL | load |
| 1047935 | KOONSVIL | load |
| 1047936 | KUNKLE | load |
| 1047937 | LINC UGI | load |
Coverage
No time-indexed data — coverage isn’t applicable to this dataset.