# PJM Nowcast — Historical Descriptive Statistics

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

Returns trailing descriptive statistics on PJM RTO LMP (locational marginal prices), zonal LMP spreads, and RTO load over a configurable look-back window.

## Facts

- Endpoint: POST https://pjm-nowcast-production.up.railway.app/v1/nowcast/history
- Price: $0.1/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-historical-descriptive-statistics-1ad57a5a
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_3UH_Zg16AbV1KsIvgnNK-

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-historical-descriptive-statistics-1ad57a5a -d '<json body>'
```

Example prompt: Pull me the PJM nowcast history for all data families — RTO LMP, zonal spreads, and load — over the last 48 hours so I can see the trailing descriptive stats.

## When to prefer this

Choose this endpoint when you need quick, aggregated descriptive statistics on PJM RTO electricity prices, zonal spreads, or load over a configurable trailing window without needing official PJM data-feed access. Prefer it for lightweight market monitoring, dashboards, or agent workflows that need semi-live summaries rather than tick-level or forecast data. Not suitable when official PJM certified data is required, when a price forecast is needed, or when look-back windows exceed 72 hours.

## Known failure modes

- Data may be stale if the background poll has not refreshed recently (stale: true in response)
- windowHours exceeding 72 may be rejected at L2 tier
- Invalid family names in the families field may result in empty or error responses
- Service downtime on Railway hosting may cause HTTP 5xx errors
- Figures are aggregated from public sources and may not match official PJM data products exactly

## 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 descriptive statistics (mean, min, max, etc.) for the requested data families (rto_lmp, zonal_spread, rto_load) over the specified trailing window. Always includes asOf timestamp, polledAt timestamp, ageSeconds, maxAgeSeconds, staleness flag, observation count, timezone, resolution, and a disclaimer. Also includes a prior period comparison object.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "families": {
   "type": "string",
   "description": "Subset of rto_lmp, zonal_spread, rto_load. Default: all."
  },
  "windowHours": {
   "type": "integer",
   "description": "Trailing window in hours. L2 maximum is 72."
  }
 }
}
```

## 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-historical-descriptive-statistics-1ad57a5a/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)
