# PJM Nowcast — RTO LMP & Load Descriptive Statistics

> PJM Nowcast — RTO LMP & Load Descriptive Statistics is a paid API for AI agents from pjm-nowcast-production.up.railway.app, paid per call via x402, $0.02/call, status unknown (last checked 2026-09-14).

Returns trailing and semi-live descriptive statistics on PJM RTO Locational Marginal Prices (LMP), selected zonal LMP price spreads, and RTO load.

## Facts

- Endpoint: POST https://pjm-nowcast-production.up.railway.app/v1/nowcast/latest
- Price: $0.02/call
- Payment: x402
- Status: unknown
- Last checked: 2026-09-14
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/pjm-nowcast-rto-lmp-load-descriptive-statistics-66b21573
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_U1c5-pJq_VKIP44yhrZ5Z

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability pjm-nowcast-rto-lmp-load-descriptive-statistics-66b21573 -d '<json body>'
```

Example prompt: Pull the latest PJM nowcast stats for RTO LMP and zonal spreads — I want to see current descriptive statistics including how stale the data is.

## When to prefer this

Choose this endpoint when you need a quick, low-cost snapshot of PJM RTO LMP, zonal spread, or load descriptive statistics without building your own PJM data pipeline. It is ideal for agents that need near-real-time energy market context for research, dashboards, or monitoring workflows. It is not suitable when you require official, certified PJM data, precise tick-level data, or forecasts.

## Known failure modes

- Stale data: the 'stale' flag is true when the background poll has not refreshed within maxAgeSeconds — data may be outdated
- No data returned for a specific family if not available or if an invalid family name is supplied
- Network or server error from the Railway deployment causing a non-200 response
- Payment failure via x402 protocol resulting in a 402 Payment Required response before data is delivered

## How this service works

Trailing and semi-live descriptive statistics on PJM RTO LMP, selected zonal LMP price spreads, and RTO load. Not a forecast, signal, trading recommendation, or advice. Not a substitute for official PJM data products. Buyer beware: figures are aggregated from public market sources; freshness equals the last successful background poll. Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll.

## Output

A JSON envelope containing a timestamp (asOf), a staleness flag, age in seconds, the poll timestamp, timezone, window hours, observation count, and optional objects for rtoLmp (LMP descriptive statistics), zonalSpread (zonal LMP spread statistics), and rtoLoad (load statistics), plus prior period comparisons and a disclaimer string.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "families": {
   "type": "string",
   "description": "Subset of rto_lmp, zonal_spread, rto_load. Default: all."
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "object",
 "example": {
  "stale": false,
  "mix_n_obs": 40,
  "price_vol": 2.5,
  "ageSeconds": 120,
  "mix_std_price": 8.1,
  "price_vol_missing": false
 },
 "properties": {
  "asOf": {
   "type": "string",
   "format": "date-time"
  },
  "kStar": {
   "type": [
    "integer",
    "null"
   ],
   "description": "Regime route. Dominant state index."
  },
  "stale": {
   "type": "boolean"
  },
  "rtoLmp": {
   "type": "object"
  },
  "entropy": {
   "type": [
    "number",
    "null"
   ],
   "description": "Regime route. HMM entropy; not a forecast."
  },
  "product": {
   "type": "string"
  },
  "rtoLoad": {
   "type": "object"
  },
  "polledAt": {
   "type": "string",
   "format": "date-time"
  },
  "timezone": {
   "type": "string"
  },
  "mix_n_obs": {
   "type": [
    "integer",
    "null"
   ],
   "description": "Latest only. Observation count paired with mix_std_price."
  },
  "price_vol": {
   "type": [
    "number",
    "null"
   ],
   "description": "Latest only. Rolling realized LMP std in $/MWh from the last 8 SQLite RTO LMP prints (RMS of successive diffs; not annualized Black vol, not rtoLmp.std). Null when price_vol_missing is true."
  },
  "ageSeconds": {
   "type": "integer"
  },
  "disclaimer": {
   "type": "string"
  },
  "posteriors": {
   "type": "array",
   "items": {
    "type": "number"
   },
   "description": "Regime route. State posteriors."
  },
  "resolution": {
   "type": "string"
  },
  "priorPeriod": {
   "type": "object"
  },
  "windowHours": {
   "type": "integer"
  },
  "zonalSpread": {
   "type": "object"
  },
  "maxAgeSeconds": {
   "type": "integer"
  },
  "mix_std_price": {
   "type": [
    "number",
    "null"
   ],
   "description": "Latest only. Mixture std of RTO LMP in $/MWh from the poller mix.json sidecar. Not price_vol and not rtoLmp.std."
  },
  "observationCount": {
   "type": "integer"
  },
  "price_vol_missing": {
   "type": "boolean"
  }
 },
 "description": "Descriptive statistics envelope. Fields asOf, polledAt, ageSeconds, maxAgeSeconds, stale are always present."
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/pjm-nowcast-rto-lmp-load-descriptive-statistics-66b21573/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from pjm-nowcast-production.up.railway.app](https://www.zero.xyz/host/pjm-nowcast-production.up.railway.app/llms.txt)
