# pjm-nowcast Trailing and semi-live descriptive statistics on PJM RTO LMP, selected zonal LMP price spreads, and RTO load. Base: https://pjm-nowcast-production.up.railway.app When to use: You need a PJM window nowcast — load, prints, or realized window volatility — for a named hub or node, as inputs to mark or risk a power window or forward. When not to use: You already have model inputs (S or forward mark, K, times, r, σ or a premium) and only need fair value, Greeks, or an IV surface; you want a generic ticker screener or “price any stock.” ## MCP - Transport: Streamable HTTP JSON-RPC - URL: https://pjm-nowcast-production.up.railway.app/mcp - Alias: https://pjm-nowcast-production.up.railway.app/api/mcp - Server card: https://pjm-nowcast-production.up.railway.app/.well-known/mcp/server-card.json - Connect: POST JSON-RPC (`initialize`, `tools/list`, `tools/call`). No API key for discovery. - Accept: application/json, text/event-stream - Example: curl -sS -H 'Accept: application/json, text/event-stream' -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}' https://pjm-nowcast-production.up.railway.app/mcp - Free tools: health, service_info, demo_sample, nowcast_weather_summary (GET /v1/nowcast/weather-summary). GET /v1/demo/sample is an unpaid synthetic fixture, not live PJM. - Paid tools: nowcast_latest, nowcast_history, nowcast_history_extended, nowcast_regime, nowcast_spreads, nowcast_asof, nowcast_snapshots, nowcast_weather_sensitivity, spread_probability_card (x402 USDC exact; unpaid → paymentStatus=required). Gate on stale/ageSeconds. Directory reviewer path: unpaid nowcast_weather_sensitivity → paymentStatus=required; do not settle. ## Free discovery - GET /v1/demo/sample is an unpaid synthetic fixture for schema inspection only; not live PJM and not a nowcast. - GET / - GET /health - GET /ready - GET /docs - GET /privacy - GET /support - GET /sitemap.xml - GET /openapi.json - GET /swagger.json - GET /llms.txt - GET /llm.txt - GET /.well-known/x402 - GET /.well-known/x402.json - GET /.well-known/agent.json - GET /.well-known/x402-resources - GET /x402-resources - GET /.well-known/mcp/server-card.json - GET /.well-known/llms.txt - GET /.well-known/llm.txt - GET /skill.md - GET /SKILL.md - GET /robots.txt - GET /v1/discovery - GET /v1/demo/sample - GET /v1/capabilities - GET /v1/nowcast/weather-summary - GET /api/mcp ## Paid (x402 USDC exact on configured networks) | Path | Price | Purpose | |---|---|---| | POST /v1/nowcast/latest | $0.02 | Latest PJM RTO LMP, zonal spreads, RTO load, and nested regime snapshot | | POST /v1/nowcast/history | $0.10 | 1–72h PJM RTO LMP, zonal spread, and load history | | POST /v1/nowcast/history/extended | $0.25 | Extended PJM history within the retention window | | POST /v1/nowcast/regime | $0.02 | Proprietary latent-state snapshot with asOf and ageSeconds | | POST /v1/nowcast/spreads | $0.02 | Zone-level LMP spread table for the latest print | | POST /v1/nowcast/asof | $0.02 | Descriptive snapshot pinned to a historical asOf | | POST /v1/nowcast/snapshots | $0.10 | Append-only /latest snapshots by EPT hour | | POST /v1/nowcast/weather-sensitivity | 0.10 | Weather sensitivity series, bands, and degree-day path | | POST /v1/spread/probability-card | 0.25 | On-peak zonal spread jump probability card | - POST /v1/nowcast/latest — $0.02 — MCP nowcast_latest - POST /v1/nowcast/history — $0.10 — MCP nowcast_history - POST /v1/nowcast/history/extended — $0.25 — MCP nowcast_history_extended - POST /v1/nowcast/regime — $0.02 — MCP nowcast_regime - POST /v1/nowcast/spreads — $0.02 — MCP nowcast_spreads - POST /v1/nowcast/asof — $0.02 — MCP nowcast_asof - POST /v1/nowcast/snapshots — $0.10 — MCP nowcast_snapshots (append-only EPT-hour archive, 90-day cap, no backfill) - POST /v1/nowcast/weather-sensitivity — 0.10 — MCP nowcast_weather_sensitivity - POST /v1/spread/probability-card — 0.25 — MCP spread_probability_card — PJM zonal spread jump probability; empirical probability card for the evening congestion bar. whenToUse: next on-peak day or trailing congestion-season check. whenNotToUse: month-ahead, season-ahead, Black vol, a price forecast. Example: {"lookbackDays": 5} ## When to call which route - POST /v1/nowcast/latest: Need the current print, freshness, and 24h trailing stats. Start here before history, as-of, or the spread card. - POST /v1/nowcast/history: Need a short trailing window (hours, not days) with native poll points. Use extended history for multi-day or hourly buckets. - POST /v1/nowcast/history/extended: Need more than 72 hours, hourly buckets, or a prior-period comparison for a backtest. Cap is retention (default 90 days). - POST /v1/nowcast/regime: Check regime confidence and the dominant state before quoting. Pair with /latest for the print itself. - POST /v1/nowcast/spreads: Need this print's zone map and lastSpread without a history dump. Use /latest when you also need RTO LMP, load, and 24h stats. - POST /v1/nowcast/asof: Pin a historical hour and compare it to /latest to judge whether the print drifted. Fail closed: do not interpolate. - POST /v1/nowcast/snapshots: Monitor what /latest said each EPT hour, or join snapshots to settled actuals. Do not treat a missing hour as zero. - POST /v1/nowcast/weather-sensitivity: Inspect the hourly weather join, residual band, and degree-day path. Do not treat the driven path as a market forecast. - POST /v1/spread/probability-card: next on-peak day or trailing congestion-season check. Do not use for month-ahead, season-ahead, Black vol, a price forecast. ## Notes Paid payloads are descriptive last/min/max/mean/std/percentiles for RTO LMP (USD/MWh), zonal LMP spread (USD/MWh, plus zone map), and RTO load (MW), with asOf/polledAt/stale. Trailing mean/std is a mix of the stored sample, not a live forecast F. Do not treat that mix as live F while entropy is near ln(5) (~1.609); the internal state mix is then uninformative. POST /v1/nowcast/latest and MCP nowcast_latest also return last price_vol ($/MWh rolling realized LMP std over the last 8 prints, RMS of successive diffs — same formula as the poller, not annualized Black vol, not rtoLmp.std / mix std) and price_vol_missing. After restart, last price_vol is rebuilt from those SQLite RTO LMP diffs when the in-memory window is empty. When vol is missing, non-finite, or <= 0, price_vol_missing is true and price_vol is null. Latest also returns mix_std_price (model-implied dispersion of RTO LMP, $/MWh, proprietary) and mix_n_obs from mix.json; that is not price_vol. POST /v1/nowcast/latest also returns nested regime: entropy (uncertainty of the state estimate, nats), posteriors (regime state probabilities), kStar (most likely state), and stateMeans (average conditions in each state, raw MW and USD/MWh). Same entropy/posteriors/kStar as POST /v1/nowcast/regime. high-spread is an internal zonal flag, not returned on HTTP/MCP nowcast bodies. Docs: https://pjm-nowcast-production.up.railway.app/openapi.json https://pjm-nowcast-production.up.railway.app/skill.md https://pjm-nowcast-production.up.railway.app/.well-known/x402