# PJM Interconnection > PJM Interconnection is the regional transmission organization (RTO) operating the largest competitive wholesale electricity market in the United States, coordinating the grid across all or parts of 13 states and the District of Columbia for roughly 67 million people. Its API posture is "rich data, universally gated": a large machine-readable wholesale market data catalogue (Data Miner 2) behind a free-but-approved Azure API Management subscription key, a FERC Order 889 / NAESB WEQ OASIS node, member-only browserless eTools, and one genuinely anonymous public REST service for planned-change notices. Generated by API Evangelist on 2026-07-27. PJM does not publish an llms.txt of its own (GET https://www.pjm.com/llms.txt -> 404, GET https://apiportal.pjm.com/llms.txt -> 404), so this file is generated from the catalog entry and the artifacts in this repository. Everything below was verified anonymously on 2026-07-27; HTTP statuses are recorded where a surface is gated. ## Access model in one paragraph Nothing in Data Miner 2 answers anonymously — every feed returns HTTP 401 without a key, and an unknown feed name returns 404, which is how you tell a gated feed from a typo. The key is free but not self-serve: register a PJM Tools username, then either request Data Miner API access in PJM Account Manager (member companies) or email accountmanager@pjm.com with an internal-use-only statement (non-member companies), and wait for a Customer Account Manager to approve. Commercial use, publishing or derivative works require at minimum a PJM Associate Membership. The eTools surfaces (OASIS, InSchedule, eDART) sit behind a ForgeRock OpenAM session token, and custom-code REST clients additionally require a PKI client certificate. ## APIs - [PJM Data Miner 2 API](https://www.pjm.com/markets-and-operations/etools/data-miner-2): wholesale market and system data — day-ahead and real-time hourly and five-minute LMPs, ancillary service prices and market results, generation by fuel type, metered/estimated/preliminary load, load forecasts, generation and transmission outages, FTR auction bids, pnode and aggregate definitions, uplift and billing determinants. Base URL https://api.pjm.com/api/v1 (HTTP 401 anonymously). 79 feed short names catalogued in data-model/. - [PJM Messages Public Web Service](https://www.pjm.com/markets-and-operations/etools/upcoming-changes): the only fully anonymous PJM REST API found. GET https://messages.pjm.com/messages/rest/public/messages returns the current planned-outage and impact notices for the PJM tool estate — XML by default, JSON with `Accept: application/json`. Verified HTTP 200. - [PJM OASIS Template API](https://www.pjm.com/markets-and-operations/etools/oasis.aspx): the FERC Order 889 obligation, implemented against NAESB WEQ-002 and WEQ-003 versions 2.0, 2.1, 2.2 and 3.3. Template base URL https://pjmoasis.pjm.com/OASIS/PJM/data/, training at https://oasistrain.pjm.com/OASIS/PJM/data/. Three PJM custom templates: pjmannulment, pjmtransreq, pjmtsrcomment. The mandated public posting at https://pjmoasis.pjm.com/OASIS/PJM/INFO.HTM is anonymous (HTTP 200); template submission is not. - [PJM Browserless Authentication API](https://www.pjm.com/markets-and-operations/etools/security.aspx): POST https://sso.pjm.com/access/authenticate/ with X-OpenAM-Username and X-OpenAM-Password headers returns a tokenId presented as the pjmauth cookie (pjmauthtrain on train); POST https://sso.pjm.com/access/logout/ releases it. GET returns HTTP 405, confirming the POST-only contract. - [PJM InSchedule Browserless API](https://www.pjm.com/markets-and-operations/etools/inschedule.aspx): bilateral internal energy transaction schedules — CSV upload under /inschedule/rest/secure/upload/file/{filename}, CSV retrieval under /inschedule/rest/secure/download/csv/contracts. Member-only. - [PJM eDART Browserless API](https://www.pjm.com/markets-and-operations/etools/edart.aspx): XML-over-HTTP transmission and generator outage tickets, voltage schedules and reliability data at https://edartsso.pjm.com/edart/. Endpoints are participant-only but the XML document definitions are public. ## Specs and machine-readable contracts - No OpenAPI, Swagger, AsyncAPI, GraphQL SDL or MCP manifest can be retrieved anonymously. PJM does generate a spec: the API Guide states the definition is available in Swagger and WADL formats inside the API Management portal, and a public Swagger UI shell exists at https://services.pjm.com/PJMDataminerApi/swagger — but its discovery path swagger/docs/v1 returns HTTP 500, and https://apiportal.pjm.com/developer/apis?api-version=2022-04-01-preview returns `{"value":[],"nextLink":null}` to anonymous callers. Nothing has been fabricated to stand in for it. - [eDART XML document definitions](https://www.pjm.com/pjmfiles/pub/etools/edart/xmldocs/xmldoc.html) — public HTML documentation of the eDART XML documents (no XSD). - [json-schema/pjm-message.json](https://raw.githubusercontent.com/api-evangelist/pjm/refs/heads/main/json-schema/pjm-message.json) — derived by API Evangelist from the verbatim Messages web service response. ## Official documentation - [Data Miner 2 eTool page](https://www.pjm.com/markets-and-operations/etools/data-miner-2) - [Data Miner API Guide (PDF, v15, 2026-02-10)](https://www.pjm.com/-/media/DotCom/etools/data-miner-2/data-miner-2-api-guide.ashx) - [Data Miner Getting Started Guide (PDF)](https://www.pjm.com/-/media/DotCom/etools/data-miner-2/data-miner-2-getting-started-guide.pdf) - [Data Miner Historic Data Guide (PDF)](https://www.pjm.com/-/media/DotCom/etools/data-miner-2/data-miner-2-historic-data-guide.pdf) - [Data Miner Release Notes](https://www.pjm.com/markets-and-operations/etools/data-miner-2/data-miner-2-release-notes.aspx) - [Data Miner Data Availability](https://www.pjm.com/markets-and-operations/etools/data-miner-2/data-availability) - [Data Miner FAQs](https://learn.pjm.com/three-priorities/keeping-the-lights-on/data-miner-faqs.aspx) - [OASIS API User Guide (PDF, Rev 04)](https://www.pjm.com/-/media/DotCom/etools/oasis/pjm-oasis-api-user-guide.pdf) - [Browserless Authentication Guide (PDF)](https://www.pjm.com/-/media/DotCom/etools/pjm-browserless-authentication-guide.pdf) - [PKI Authentication Guide (PDF)](https://www.pjm.com/-/media/DotCom/etools/security/pki-authentication-guide.pdf) - [eDART Browserless User Guide (PDF)](https://www.pjm.com/-/media/DotCom/etools/edart/dart-browserless-user-guide.pdf) - [API Portal (Azure API Management)](https://apiportal.pjm.com/) - [PJM Glossary](https://www.pjm.com/glossary) ## Getting a key - [Register a PJM Tools username](https://accountmanager.pjm.com/accountmanager/pages/public/new-user.jsf) - [Membership enrollment](https://www.pjm.com/about-pjm/member-services/membership-enrollment) — required for commercial use, publishing or derivatives. - Non-member internal use: email accountmanager@pjm.com with the statement "I confirm that the PJM Data will be used for internal business purposes only", plus your Account Manager user id and subscribing email address. ## Calling conventions (Data Miner 2) - Auth: `Ocp-Apim-Subscription-Key: ` header, or `&subscription-key=` on the URL. - Paging: `rowCount` (max 50,000) and `startRow` (1-based); both required when any other parameter is present. Next fetch uses startRow + rowCount. Total count is in the `TotalRows` body field, or the `X-TotalRows` header when `download=true`. - Dates: `datetime_beginning_ept` or `datetime_beginning_utc`, formatted `mm-dd-yyyy to mm-dd-yyyy`; range must be under 366 days. A datetime filter is mandatory on the archived feeds. - Field selection: `fields=` as a CSV list. Multi-value filters are semicolon separated. `&` inside a value must be sent as `%26`. - Sorting: `sort=` and `order=` (asc|desc, default asc). Sort on the same field you filter on; filter on pnode_id rather than pnode name. - Output: JSON by default, `format=csv` for CSV. With `download=true` responses are normally gzip — inspect `Content-Encoding` rather than assuming. - Archived data (rt_hrl_lmps and da_hrl_lmps past 731 days, rt_fivemin_hrl_lmps past 186 days): one calendar year per request, no sort/order, filters limited to dates, type, row_is_current and version_nbr. - Rate limit: 600 connections per minute per user, published in prose only — there are no RateLimit or Retry-After response headers. - Errors: `{"errors":[{"field":"...","message":"...","detail":["..."]}]}` — not RFC 9457. - TLS 1.2 minimum. From 2025-11-01 an HTTP GET carrying a request body is rejected. ## API Evangelist artifacts in this repository - authentication/pjm-authentication.yml — every auth scheme across the five surfaces. - conventions/pjm-conventions.yml — paging, filtering, content negotiation, error envelopes, versioning. - errors/pjm-error-catalog.yml — the documented validation errors and every observed HTTP status. - rate-limits/pjm-rate-limits.yml — 600 connections/minute, 50,000 rows/fetch, date-range caps, redistribution restriction. - lifecycle/pjm-lifecycle.yml — versioning, archived-data cutoffs, retired feeds, status surface, roadmap. - changelog/pjm-changelog.yml — structured Data Miner releases 22.04 through 25.11. - sandbox/pjm-sandbox.yml — the parallel train environments and the pjmauthtrain cookie. - data-model/pjm-data-model.yml — 79 feed short names, the pnode/aggregate/tie-line entity map. - conformance/pjm-conformance.yml — NAESB WEQ-002/003, FERC Order 889, and what PJM does not do. - security/, well-known/ — RFC 9116 security.txt, the vulnerability disclosure programme, TLS/DNS posture. - skills/ — packaged agent skills for the two flows that can actually be executed. ## Not present (recorded, not fabricated) - No official SDK in any language, no package on any registry, no GitHub organisation. - No public Postman collection or workspace. - No MCP server. - No webhooks, AsyncAPI, event stream or callback registration — notices are polled or emailed. - No OAuth 2.0 or OpenID Connect; no /.well-known/api-catalog. - No uptime/incident status page and no published SLA; the Upcoming Changes page carries planned outages only. - No formal deprecation policy and no RFC 8594 Sunset headers; feed retirements are announced per release.