# PJM Nowcast – Real-Time LMP & Load Descriptive Statistics

> PJM Nowcast – Real-Time 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-15).

Returns trailing and semi-live descriptive statistics on PJM RTO Locational Marginal Prices (LMP), zonal LMP spreads, and RTO load as of a specified ISO-8601 timestamp.

## Facts

- Endpoint: POST https://pjm-nowcast-production.up.railway.app/v1/nowcast/asof
- Price: $0.02/call
- Payment: x402
- Status: unknown
- Last checked: 2026-09-15
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/pjm-nowcast-real-time-lmp-load-descriptive-statistics-60111bfa
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_OAEeBNYcz2L3GlvspUsN0

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-real-time-lmp-load-descriptive-statistics-60111bfa -d '<json body>'
```

Example prompt: Pull the PJM nowcast statistics as of right now — I want to see the current RTO LMP, price volatility, zonal spreads, and whether the data is fresh or stale.

## When to prefer this

Use this endpoint when you need near-real-time descriptive statistics on PJM wholesale electricity prices and load — specifically RTO LMP, zonal spreads, and rolling realized volatility — without building your own PJM data pipeline. Prefer this over scraping PJM directly when you need a structured JSON response with pre-computed statistics. Note it is not a forecast, not a trading signal, and not a substitute for official PJM data products; use it for informational monitoring or enrichment only.

## Known failure modes

- Missing or malformed asOf field returns a 400-level error
- Stale data when background poller has not refreshed recently (stale: true, ageSeconds > maxAgeSeconds)
- price_vol is null when price_vol_missing is true (insufficient recent prints)
- Service may be temporarily unavailable if the Railway.app deployment is down
- Payment failure (x402 protocol) if insufficient USDC balance or misconfigured payment header

## 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: always-present fields (asOf, polledAt, ageSeconds, maxAgeSeconds, stale); RTO LMP descriptive stats object; RTO load stats object; zonal LMP spread object; prior period comparison object; rolling realized LMP std (price_vol in $/MWh); mixture std of LMP (mix_std_price); observation count (mix_n_obs); HMM regime fields (kStar, entropy, posteriors); resolution, windowHours, product, timezone, and disclaimer strings. Returns null for optional fields when data is unavailable.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "asOf"
 ],
 "properties": {
  "asOf": {
   "type": "string",
   "description": "ISO-8601 observation clock. Required. No interpolation."
  }
 }
}
```

## 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-real-time-lmp-load-descriptive-statistics-60111bfa/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)
