{"openapi":"3.1.0","info":{"title":"pjm-nowcast","version":"1.0.0","description":"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."},"paths":{"/health":{"get":{"tags":["free"],"summary":"Process, store, and poll freshness","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Health Get"}}}}},"security":[],"description":"Liveness. Returns process status, store freshness (asOf, ageSeconds, stale), facilitators, and paymentRails. No market fetch and no x402. Always 200 when the process is up. Railway healthcheck uses GET /ready."}},"/ready":{"get":{"tags":["free"],"summary":"Payment-rails readiness. Railway healthcheck","operationId":"ready_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[],"description":"Payment-rails readiness used as the Railway healthcheck (timeout 90s). 200 after payment rails are up and the startup CDP probe PASS. 503 until then. Does not fetch PJM. No wallets in the body."}},"/":{"get":{"tags":["free"],"summary":"Service card for agents","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Root  Get"}}}}},"security":[],"description":"JSON service card: what this API is and is not, networks, prices, endpoint list, MCP mount, and staleness fields. Free. Alias: GET /v1/discovery."}},"/v1/discovery":{"get":{"tags":["free"],"summary":"Service card (alias)","operationId":"discovery_v1_discovery_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Discovery V1 Discovery Get"}}}}},"security":[]}},"/swagger.json":{"get":{"tags":["free"],"summary":"OpenAPI alias","operationId":"swagger_swagger_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/llms.txt":{"get":{"tags":["free"],"summary":"LLM discovery index","operationId":"llms_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/x402":{"get":{"tags":["free"],"summary":"x402 well-known","operationId":"well_known__well_known_x402_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/agent.json":{"get":{"tags":["free"],"summary":"Agent card","operationId":"well_known_agent__well_known_agent_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/x402-resources":{"get":{"tags":["free"],"summary":"x402 paid resources","operationId":"well_known_resources__well_known_x402_resources_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/.well-known/mcp/server-card.json":{"get":{"tags":["free"],"summary":"MCP server card","operationId":"mcp_server_card_route__well_known_mcp_server_card_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/capabilities":{"get":{"tags":["free"],"summary":"Fetch nowcast capabilities matrix","operationId":"capabilities_v1_capabilities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[]}},"/v1/demo/sample":{"get":{"tags":["free"],"summary":"Fetch a synthetic unpaid nowcast sample fixture","operationId":"demo_sample_v1_demo_sample_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[],"description":"Unpaid synthetic fixture for schema inspection only. Not live PJM and not a nowcast. Paid routes are POST /v1/nowcast/*."}},"/v1/nowcast/latest":{"post":{"tags":["nowcast"],"summary":"Latest PJM RTO LMP, zonal spreads, RTO load, and nested regime snapshot","operationId":"latest_v1_nowcast_latest_post","responses":{"200":{"description":"Latest PJM RTO LMP, zonal spreads, RTO load, and nested regime snapshot","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Service name. Always pjm-nowcast."},"disclaimer":{"type":"string","description":"Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll."},"timezone":{"type":"string","description":"Always America/New_York. asOf is Eastern Time (ET / EPT).","example":"America/New_York"},"asOf":{"type":"string","description":"Observation clock of the stored sample, ISO-8601 with offset, America/New_York (ET).","format":"date-time","example":"2026-10-09T18:00:00-04:00"},"polledAt":{"type":"string","description":"Wall time the background poller wrote this sample, ISO-8601 with offset.","format":"date-time"},"ageSeconds":{"type":"integer","description":"Seconds since polledAt. Gate marks and hedges on this and stale.","example":120},"maxAgeSeconds":{"type":"integer","description":"Stale threshold in seconds. Default 10800 (3 hours).","example":10800},"stale":{"type":"boolean","description":"true when ageSeconds > maxAgeSeconds. Payload is still returned.","example":false},"observationCount":{"type":"integer","description":"Number of observations in the stats window."},"price_vol":{"type":["number","null"],"description":"Rolling realized RTO LMP std, USD/MWh, last 8 prints, RMS of successive diffs. Not annualized Black vol and not rtoLmp.std. Null when price_vol_missing is true.","example":2.5},"price_vol_missing":{"type":"boolean","description":"true when price_vol is missing, non-finite, or <= 0.","example":false},"mix_std_price":{"type":["number","null"],"description":"Model-implied dispersion of RTO LMP, USD/MWh (proprietary). Not price_vol and not rtoLmp.std.","example":8.1},"mix_n_obs":{"type":["integer","null"],"description":"Observation count paired with mix_std_price.","example":40},"regime":{"type":"object","description":"Nested regime snapshot for this print: state probabilities, dominant state, and average conditions in each state. Same entropy/posteriors/kStar as POST /v1/nowcast/regime. Null fields when the sidecar is not warm or missing.","properties":{"entropy":{"type":["number","null"],"description":"Uncertainty of the state estimate, nats. Lower means a more decisive regime. Null when missing.","example":1.1},"posteriors":{"type":["array","null"],"description":"Regime state probabilities (sum to 1). Null when missing.","items":{"type":"number"},"example":[0.1,0.2,0.1,0.1,0.5]},"kStar":{"type":["integer","null"],"description":"Most likely regime state. Null when missing.","example":4},"stateMeans":{"type":["array","null"],"description":"Average conditions in each state, raw units (MW and USD/MWh). Null when missing.","items":{"type":"object","properties":{"state":{"type":"integer","description":"Regime state index.","example":0},"load_mw":{"type":"number","description":"Average RTO load in this state, MW."},"load_ramp_mw":{"type":"number","description":"Average RTO load ramp in this state, MW."},"price_usd_mwh":{"type":"number","description":"Average RTO LMP in this state, USD/MWh."},"price_vol_usd_mwh":{"type":"number","description":"Average rolling realized RTO LMP std in this state, USD/MWh."}},"required":["state"]}}},"required":["entropy","posteriors","kStar","stateMeans"]},"rtoLmp":{"type":"object","description":"Trailing descriptive stats for PJM RTO real-time LMP, USD/MWh.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"points":{"type":"array","description":"Optional native or hourly series of RTO LMP. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"value":{"type":"number","description":"Series value at t (USD/MWh or MW)."}}}}}},"zonalSpread":{"type":"object","description":"Trailing descriptive stats for zonal LMP spread, USD/MWh, plus this-print zone map.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"lastSpread":{"type":["number","null"],"description":"This print's zonal p95 minus p05, USD/MWh."},"lastP05":{"type":["number","null"],"description":"This print's 5th percentile of zonal LMPs, USD/MWh."},"lastP95":{"type":["number","null"],"description":"This print's 95th percentile of zonal LMPs, USD/MWh."},"zones":{"type":"object","description":"This print's zonal LMP map, USD/MWh. Keys are zone names from the scrape.","additionalProperties":{"type":"number"}},"points":{"type":"array","description":"Optional native or hourly spread series. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"spread":{"type":"number","description":"Zonal p95 minus p05 at t, USD/MWh."},"p05":{"type":["number","null"],"description":"5th percentile of zonal LMPs at t, USD/MWh."},"p95":{"type":["number","null"],"description":"95th percentile of zonal LMPs at t, USD/MWh."}}}}}},"rtoLoad":{"type":"object","description":"Trailing descriptive stats for PJM RTO load, MW.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"sourcePublishedPeakTodayMw":{"type":["number","null"],"description":"Source-published PJM peak load today, MW. Not produced by this service."},"sourcePublishedPeakTomorrowMw":{"type":["number","null"],"description":"Source-published PJM peak load tomorrow, MW. Not produced by this service."},"vsPublishedPeakTodayMw":{"type":["number","null"],"description":"sourcePublishedPeakTodayMw minus last load, MW. Null when either is missing."},"points":{"type":"array","description":"Optional native or hourly load series. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"value":{"type":"number","description":"Series value at t (USD/MWh or MW)."}}}}}}},"description":"Latest PJM RTO LMP ($/MWh), zonal spreads, RTO load (MW), nested regime (state probabilities, dominant state, average conditions). asOf is ET. Not a forecast."},"example":{"product":"pjm-nowcast","timezone":"America/New_York","asOf":"2026-10-09T18:00:00-04:00","ageSeconds":120,"maxAgeSeconds":10800,"stale":false,"price_vol":2.5,"price_vol_missing":false,"mix_std_price":8.1,"mix_n_obs":40,"regime":{"entropy":1.1,"posteriors":[0.1,0.2,0.1,0.1,0.5],"kStar":4,"stateMeans":[{"state":0,"load_mw":93000.0,"load_ramp_mw":-1500.0,"price_usd_mwh":50.0,"price_vol_usd_mwh":6.0}]},"rtoLmp":{"unit":"USD/MWh","last":41.0,"mean":38.2,"p95":52.0},"zonalSpread":{"unit":"USD/MWh","lastSpread":5.1,"zones":{"AECO":42.0,"BGE":46.0,"PEPCO":44.0}},"rtoLoad":{"unit":"MW","last":90000.0}}}}},"402":{"$ref":"#/components/responses/PaymentRequired"},"503":{"$ref":"#/components/responses/DataUnavailable"}},"security":[{"x402":[]}],"description":"Point snapshot of the last successful scrape for that print's EPT hour — not a forward forecast of the next hour or day. Returns RTO LMP (USD/MWh), selected zonal LMPs and the zonal spread statistic (USD/MWh), and RTO load (MW), plus trailing 24h last/min/max/mean/std/p05/p50/p95. asOf is the observation clock in America/New_York (ET). The background poller refreshes about every 30 minutes (1800s ± 60s jitter) from the public PJM markets page. Not an official PJM data feed. Use ageSeconds versus maxAgeSeconds (default 10800). stale is true when the print is older; the payload is still returned. RTO LMP is PJM RTO real-time LMP, USD/MWh. RTO load is PJM RTO load, MW. zonalSpread.zones is this print's zonal LMP map (typically AECO, BGE, COMED, DOM, PEPCO, PSEG, JCPL — the set follows the scrape). lastSpread is zonal p95 minus p05, USD/MWh. Also returns price_vol (rolling realized LMP std, $/MWh, last 8 prints, RMS of successive diffs — not annualized Black vol) and mix_std_price (model-implied RTO LMP dispersion, $/MWh, proprietary). Nested regime: entropy (uncertainty of the state estimate, nats), posteriors (regime state probabilities, sum to 1), 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. Nulls when the sidecar is not warm or missing. Optional families subsets rto_lmp, zonal_spread, rto_load. Why call: a current PJM window mark or realized-vol input before quoting or hedging. Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll.","x-payment-info":{"scheme":"exact","asset":"USDC","price":"$0.02","facilitator":"https://facilitator.payai.network","networks":["solana","base"],"note":"x402 USDC exact on configured networks. Decode PAYMENT-REQUIRED on unpaid POST."},"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LatestRequest"},"example":{"families":["rto_lmp","zonal_spread","rto_load"]}}}}}},"/v1/nowcast/history":{"post":{"tags":["nowcast"],"summary":"1–72h PJM RTO LMP, zonal spread, and load history","operationId":"history_v1_nowcast_history_post","responses":{"200":{"description":"1–72h PJM RTO LMP, zonal spread, and load history","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Service name. Always pjm-nowcast."},"disclaimer":{"type":"string","description":"Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll."},"timezone":{"type":"string","description":"Always America/New_York. asOf is Eastern Time (ET / EPT).","example":"America/New_York"},"asOf":{"type":"string","description":"Observation clock of the stored sample, ISO-8601 with offset, America/New_York (ET).","format":"date-time","example":"2026-10-09T18:00:00-04:00"},"polledAt":{"type":"string","description":"Wall time the background poller wrote this sample, ISO-8601 with offset.","format":"date-time"},"ageSeconds":{"type":"integer","description":"Seconds since polledAt. Gate marks and hedges on this and stale.","example":120},"maxAgeSeconds":{"type":"integer","description":"Stale threshold in seconds. Default 10800 (3 hours).","example":10800},"stale":{"type":"boolean","description":"true when ageSeconds > maxAgeSeconds. Payload is still returned.","example":false},"observationCount":{"type":"integer","description":"Number of observations in the stats window."},"windowHours":{"type":"integer","description":"Echo of the requested trailing window, hours."},"resolution":{"type":"string","description":"Always native on this route (one point per poll)."},"rtoLmp":{"type":"object","description":"Trailing descriptive stats for PJM RTO real-time LMP, USD/MWh.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"points":{"type":"array","description":"Optional native or hourly series of RTO LMP. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"value":{"type":"number","description":"Series value at t (USD/MWh or MW)."}}}}}},"zonalSpread":{"type":"object","description":"Trailing descriptive stats for zonal LMP spread, USD/MWh, plus this-print zone map.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"lastSpread":{"type":["number","null"],"description":"This print's zonal p95 minus p05, USD/MWh."},"lastP05":{"type":["number","null"],"description":"This print's 5th percentile of zonal LMPs, USD/MWh."},"lastP95":{"type":["number","null"],"description":"This print's 95th percentile of zonal LMPs, USD/MWh."},"zones":{"type":"object","description":"This print's zonal LMP map, USD/MWh. Keys are zone names from the scrape.","additionalProperties":{"type":"number"}},"points":{"type":"array","description":"Optional native or hourly spread series. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"spread":{"type":"number","description":"Zonal p95 minus p05 at t, USD/MWh."},"p05":{"type":["number","null"],"description":"5th percentile of zonal LMPs at t, USD/MWh."},"p95":{"type":["number","null"],"description":"95th percentile of zonal LMPs at t, USD/MWh."}}}}}},"rtoLoad":{"type":"object","description":"Trailing descriptive stats for PJM RTO load, MW.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"sourcePublishedPeakTodayMw":{"type":["number","null"],"description":"Source-published PJM peak load today, MW. Not produced by this service."},"sourcePublishedPeakTomorrowMw":{"type":["number","null"],"description":"Source-published PJM peak load tomorrow, MW. Not produced by this service."},"vsPublishedPeakTodayMw":{"type":["number","null"],"description":"sourcePublishedPeakTodayMw minus last load, MW. Null when either is missing."},"points":{"type":"array","description":"Optional native or hourly load series. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"value":{"type":"number","description":"Series value at t (USD/MWh or MW)."}}}}}}},"description":"1–72h native-poll history of RTO LMP ($/MWh), zonal spreads, and RTO load (MW). asOf is ET. Descriptive stats plus points. Not a forecast."},"example":{"asOf":"2026-10-09T18:00:00-04:00","ageSeconds":120,"stale":false,"windowHours":24,"resolution":"native","rtoLmp":{"unit":"USD/MWh","n":48,"last":41.0,"points":[{"t":"2026-10-09T17:00:00-04:00","value":40.0}]}}}}},"402":{"$ref":"#/components/responses/PaymentRequired"},"503":{"$ref":"#/components/responses/DataUnavailable"},"400":{"description":"Paid request with invalid window or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"x402":[]}],"description":"Trailing 1–72 hour descriptive history at native poll resolution (about one point every 30 minutes). Default windowHours is 24; maximum 72. Returns the same families as /latest (RTO LMP USD/MWh, zonal spread USD/MWh, RTO load MW) with last/min/max/mean/std/p05/p50/p95 plus a points series. asOf is America/New_York (ET). The background poller refreshes about every 30 minutes (1800s ± 60s jitter) from the public PJM markets page. Not an official PJM data feed. Use ageSeconds versus maxAgeSeconds (default 10800). stale is true when the print is older; the payload is still returned. RTO LMP is PJM RTO real-time LMP, USD/MWh. RTO load is PJM RTO load, MW. zonalSpread.zones is this print's zonal LMP map (typically AECO, BGE, COMED, DOM, PEPCO, PSEG, JCPL — the set follows the scrape). lastSpread is zonal p95 minus p05, USD/MWh. Why call: a short realized window for mark, residual, or vol input. Descriptive only. Not a forecast of the next hour or day. Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll.","x-payment-info":{"scheme":"exact","asset":"USDC","price":"$0.10","facilitator":"https://facilitator.payai.network","networks":["solana","base"],"note":"x402 USDC exact on configured networks. Decode PAYMENT-REQUIRED on unpaid POST."},"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryRequest"},"example":{"families":["rto_lmp"],"windowHours":24}}}}}},"/v1/nowcast/history/extended":{"post":{"tags":["nowcast"],"summary":"Extended PJM history within the retention window","operationId":"history_extended_v1_nowcast_history_extended_post","responses":{"200":{"description":"Extended PJM history within the retention window","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Service name. Always pjm-nowcast."},"disclaimer":{"type":"string","description":"Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll."},"timezone":{"type":"string","description":"Always America/New_York. asOf is Eastern Time (ET / EPT).","example":"America/New_York"},"asOf":{"type":"string","description":"Observation clock of the stored sample, ISO-8601 with offset, America/New_York (ET).","format":"date-time","example":"2026-10-09T18:00:00-04:00"},"polledAt":{"type":"string","description":"Wall time the background poller wrote this sample, ISO-8601 with offset.","format":"date-time"},"ageSeconds":{"type":"integer","description":"Seconds since polledAt. Gate marks and hedges on this and stale.","example":120},"maxAgeSeconds":{"type":"integer","description":"Stale threshold in seconds. Default 10800 (3 hours).","example":10800},"stale":{"type":"boolean","description":"true when ageSeconds > maxAgeSeconds. Payload is still returned.","example":false},"observationCount":{"type":"integer","description":"Number of observations in the stats window."},"windowHours":{"type":"integer","description":"Echo of the requested trailing window, hours."},"resolution":{"type":"string","description":"native or hourly, as requested."},"priorPeriod":{"type":"object","description":"Equal-length window immediately before, when compare=prior_period."},"rtoLmp":{"type":"object","description":"Trailing descriptive stats for PJM RTO real-time LMP, USD/MWh.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"points":{"type":"array","description":"Optional native or hourly series of RTO LMP. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"value":{"type":"number","description":"Series value at t (USD/MWh or MW)."}}}}}},"zonalSpread":{"type":"object","description":"Trailing descriptive stats for zonal LMP spread, USD/MWh, plus this-print zone map.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"lastSpread":{"type":["number","null"],"description":"This print's zonal p95 minus p05, USD/MWh."},"lastP05":{"type":["number","null"],"description":"This print's 5th percentile of zonal LMPs, USD/MWh."},"lastP95":{"type":["number","null"],"description":"This print's 95th percentile of zonal LMPs, USD/MWh."},"zones":{"type":"object","description":"This print's zonal LMP map, USD/MWh. Keys are zone names from the scrape.","additionalProperties":{"type":"number"}},"points":{"type":"array","description":"Optional native or hourly spread series. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"spread":{"type":"number","description":"Zonal p95 minus p05 at t, USD/MWh."},"p05":{"type":["number","null"],"description":"5th percentile of zonal LMPs at t, USD/MWh."},"p95":{"type":["number","null"],"description":"95th percentile of zonal LMPs at t, USD/MWh."}}}}}},"rtoLoad":{"type":"object","description":"Trailing descriptive stats for PJM RTO load, MW.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"sourcePublishedPeakTodayMw":{"type":["number","null"],"description":"Source-published PJM peak load today, MW. Not produced by this service."},"sourcePublishedPeakTomorrowMw":{"type":["number","null"],"description":"Source-published PJM peak load tomorrow, MW. Not produced by this service."},"vsPublishedPeakTodayMw":{"type":["number","null"],"description":"sourcePublishedPeakTodayMw minus last load, MW. Null when either is missing."},"points":{"type":"array","description":"Optional native or hourly load series. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"value":{"type":"number","description":"Series value at t (USD/MWh or MW)."}}}}}}},"description":"Up to 90-day history of RTO LMP, zonal spreads, and RTO load. Optional hourly buckets and prior-period compare. asOf is ET. Not a forecast."},"example":{"asOf":"2026-10-09T18:00:00-04:00","ageSeconds":120,"stale":false,"windowHours":168,"resolution":"native","rtoLmp":{"unit":"USD/MWh","n":200,"last":41.0}}}}},"402":{"$ref":"#/components/responses/PaymentRequired"},"503":{"$ref":"#/components/responses/DataUnavailable"},"400":{"description":"Paid request with invalid window or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"x402":[]}],"description":"Descriptive history up to the configured retention window (default 90 days). Default windowHours is 168. resolution=native is one point per poll; hourly is the mean per clock hour. compare=prior_period attaches the equal-length window immediately before. Same families and units as /latest. asOf is America/New_York (ET). The background poller refreshes about every 30 minutes (1800s ± 60s jitter) from the public PJM markets page. Not an official PJM data feed. Use ageSeconds versus maxAgeSeconds (default 10800). stale is true when the print is older; the payload is still returned. RTO LMP is PJM RTO real-time LMP, USD/MWh. RTO load is PJM RTO load, MW. zonalSpread.zones is this print's zonal LMP map (typically AECO, BGE, COMED, DOM, PEPCO, PSEG, JCPL — the set follows the scrape). lastSpread is zonal p95 minus p05, USD/MWh. Why call: a backtest window or prior-period residual. Descriptive only. Not a forecast of the next hour or day. Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll.","x-payment-info":{"scheme":"exact","asset":"USDC","price":"$0.25","facilitator":"https://facilitator.payai.network","networks":["solana","base"],"note":"x402 USDC exact on configured networks. Decode PAYMENT-REQUIRED on unpaid POST."},"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendedHistoryRequest"},"example":{"families":["rto_load"],"windowHours":168,"resolution":"hourly","compare":"prior_period"}}}}}},"/v1/nowcast/regime":{"post":{"tags":["nowcast"],"summary":"Proprietary latent-state snapshot with asOf and ageSeconds","operationId":"regime_v1_nowcast_regime_post","responses":{"200":{"description":"Proprietary latent-state snapshot with asOf and ageSeconds","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Service name. Always pjm-nowcast."},"disclaimer":{"type":"string","description":"Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll."},"timezone":{"type":"string","description":"Always America/New_York. asOf is Eastern Time (ET / EPT).","example":"America/New_York"},"asOf":{"type":"string","description":"Observation clock of the stored sample, ISO-8601 with offset, America/New_York (ET).","format":"date-time","example":"2026-10-09T18:00:00-04:00"},"polledAt":{"type":"string","description":"Wall time the background poller wrote this sample, ISO-8601 with offset.","format":"date-time"},"ageSeconds":{"type":"integer","description":"Seconds since polledAt. Gate marks and hedges on this and stale.","example":120},"maxAgeSeconds":{"type":"integer","description":"Stale threshold in seconds. Default 10800 (3 hours).","example":10800},"stale":{"type":"boolean","description":"true when ageSeconds > maxAgeSeconds. Payload is still returned.","example":false},"observationCount":{"type":"integer","description":"Number of observations in the stats window."},"entropy":{"type":["number","null"],"description":"Regime uncertainty; lower means a more decisive regime. Not a forecast.","example":1.1},"posteriors":{"type":"array","description":"Regime state weights (sum to 1).","items":{"type":"number"},"example":[0.1,0.2,0.1,0.1,0.5]},"kStar":{"type":["integer","null"],"description":"Index of the dominant regime state.","example":4}},"description":"Proprietary latent-state snapshot: regime confidence (entropy), state weights, dominant state, asOf, ageSeconds. Descriptive, not a forecast."},"example":{"asOf":"2026-10-09T18:00:00-04:00","ageSeconds":120,"stale":false,"entropy":1.1,"posteriors":[0.1,0.2,0.1,0.1,0.5],"kStar":4}}}},"402":{"$ref":"#/components/responses/PaymentRequired"},"503":{"$ref":"#/components/responses/DataUnavailable"},"400":{"description":"Paid request with invalid window or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"x402":[]}],"description":"Proprietary latent market-regime snapshot for the latest print. Returns entropy (regime confidence; lower means a more decisive regime), posteriors (state weights that sum to 1), kStar (index of the dominant state), asOf, ageSeconds, and stale. asOf is America/New_York (ET). The background poller refreshes about every 30 minutes (1800s ± 60s jitter) from the public PJM markets page. Not an official PJM data feed. Use ageSeconds versus maxAgeSeconds (default 10800). stale is true when the print is older; the payload is still returned. POST {}. Why call: check the current PJM East price regime before quoting. Descriptive only. Not a forecast. Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll.","x-payment-info":{"scheme":"exact","asset":"USDC","price":"$0.02","facilitator":"https://facilitator.payai.network","networks":["solana","base"],"note":"x402 USDC exact on configured networks. Decode PAYMENT-REQUIRED on unpaid POST."},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"description":"Empty body. POST {}."},"example":{}}}}}},"/v1/nowcast/spreads":{"post":{"tags":["nowcast"],"summary":"Zone-level LMP spread table for the latest print","operationId":"spreads_v1_nowcast_spreads_post","responses":{"200":{"description":"Zone-level LMP spread table for the latest print","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Service name. Always pjm-nowcast."},"disclaimer":{"type":"string","description":"Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll."},"timezone":{"type":"string","description":"Always America/New_York. asOf is Eastern Time (ET / EPT).","example":"America/New_York"},"asOf":{"type":"string","description":"Observation clock of the stored sample, ISO-8601 with offset, America/New_York (ET).","format":"date-time","example":"2026-10-09T18:00:00-04:00"},"polledAt":{"type":"string","description":"Wall time the background poller wrote this sample, ISO-8601 with offset.","format":"date-time"},"ageSeconds":{"type":"integer","description":"Seconds since polledAt. Gate marks and hedges on this and stale.","example":120},"maxAgeSeconds":{"type":"integer","description":"Stale threshold in seconds. Default 10800 (3 hours).","example":10800},"stale":{"type":"boolean","description":"true when ageSeconds > maxAgeSeconds. Payload is still returned.","example":false},"observationCount":{"type":"integer","description":"Number of observations in the stats window."},"unit":{"type":"string","description":"Always USD/MWh on this route."},"lastSpread":{"type":["number","null"],"description":"This print's zonal p95 minus p05, USD/MWh."},"lastP05":{"type":["number","null"],"description":"This print's 5th percentile of zonal LMPs, USD/MWh."},"lastP95":{"type":["number","null"],"description":"This print's 95th percentile of zonal LMPs, USD/MWh."},"zones":{"type":"object","description":"This print's zonal LMP map, USD/MWh. Keys follow the scrape.","additionalProperties":{"type":"number"}}},"description":"This-print zone LMP table (USD/MWh) plus lastSpread (p95−p05). asOf is ET. No history dump. Descriptive, not a forecast."},"example":{"asOf":"2026-10-09T18:00:00-04:00","ageSeconds":120,"stale":false,"unit":"USD/MWh","lastSpread":5.1,"lastP05":41.0,"lastP95":46.1,"zones":{"AECO":42.0,"BGE":46.0,"PEPCO":44.0}}}}},"402":{"$ref":"#/components/responses/PaymentRequired"},"503":{"$ref":"#/components/responses/DataUnavailable"},"400":{"description":"Paid request with invalid window or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"x402":[]}],"description":"Zone-level LMP table for the latest print only. Returns zones (zone name to LMP, USD/MWh), lastSpread (zonal p95 minus p05, USD/MWh), lastP05, lastP95, unit, asOf, ageSeconds, stale. No points series and no history dump. asOf is America/New_York (ET). The background poller refreshes about every 30 minutes (1800s ± 60s jitter) from the public PJM markets page. Not an official PJM data feed. Use ageSeconds versus maxAgeSeconds (default 10800). stale is true when the print is older; the payload is still returned. RTO LMP is PJM RTO real-time LMP, USD/MWh. RTO load is PJM RTO load, MW. zonalSpread.zones is this print's zonal LMP map (typically AECO, BGE, COMED, DOM, PEPCO, PSEG, JCPL — the set follows the scrape). lastSpread is zonal p95 minus p05, USD/MWh. POST {}. Why call: see which zones are wide on this print before sizing a spread. Descriptive only. Not a forecast of the next hour or day. Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll.","x-payment-info":{"scheme":"exact","asset":"USDC","price":"$0.02","facilitator":"https://facilitator.payai.network","networks":["solana","base"],"note":"x402 USDC exact on configured networks. Decode PAYMENT-REQUIRED on unpaid POST."},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"description":"Empty body. POST {}."},"example":{}}}}}},"/v1/nowcast/asof":{"post":{"tags":["nowcast"],"summary":"Descriptive snapshot pinned to a historical asOf","operationId":"asof_v1_nowcast_asof_post","responses":{"200":{"description":"Descriptive snapshot pinned to a historical asOf","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Service name. Always pjm-nowcast."},"disclaimer":{"type":"string","description":"Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll."},"timezone":{"type":"string","description":"Always America/New_York. asOf is Eastern Time (ET / EPT).","example":"America/New_York"},"asOf":{"type":"string","description":"Observation clock of the stored sample, ISO-8601 with offset, America/New_York (ET).","format":"date-time","example":"2026-10-09T18:00:00-04:00"},"polledAt":{"type":"string","description":"Wall time the background poller wrote this sample, ISO-8601 with offset.","format":"date-time"},"ageSeconds":{"type":"integer","description":"Seconds since polledAt. Gate marks and hedges on this and stale.","example":120},"maxAgeSeconds":{"type":"integer","description":"Stale threshold in seconds. Default 10800 (3 hours).","example":10800},"stale":{"type":"boolean","description":"true when ageSeconds > maxAgeSeconds. Payload is still returned.","example":false},"observationCount":{"type":"integer","description":"Number of observations in the stats window."},"pinnedAsOf":{"type":"string","description":"Echo of the requested asOf, ISO-8601.","format":"date-time"},"rtoLmp":{"type":"object","description":"Trailing descriptive stats for PJM RTO real-time LMP, USD/MWh.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"points":{"type":"array","description":"Optional native or hourly series of RTO LMP. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"value":{"type":"number","description":"Series value at t (USD/MWh or MW)."}}}}}},"zonalSpread":{"type":"object","description":"Trailing descriptive stats for zonal LMP spread, USD/MWh, plus this-print zone map.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"lastSpread":{"type":["number","null"],"description":"This print's zonal p95 minus p05, USD/MWh."},"lastP05":{"type":["number","null"],"description":"This print's 5th percentile of zonal LMPs, USD/MWh."},"lastP95":{"type":["number","null"],"description":"This print's 95th percentile of zonal LMPs, USD/MWh."},"zones":{"type":"object","description":"This print's zonal LMP map, USD/MWh. Keys are zone names from the scrape.","additionalProperties":{"type":"number"}},"points":{"type":"array","description":"Optional native or hourly spread series. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"spread":{"type":"number","description":"Zonal p95 minus p05 at t, USD/MWh."},"p05":{"type":["number","null"],"description":"5th percentile of zonal LMPs at t, USD/MWh."},"p95":{"type":["number","null"],"description":"95th percentile of zonal LMPs at t, USD/MWh."}}}}}},"rtoLoad":{"type":"object","description":"Trailing descriptive stats for PJM RTO load, MW.","properties":{"unit":{"type":"string","description":"Unit of the series. USD/MWh for LMP and spreads; MW for load."},"n":{"type":"integer","description":"Count of finite observations in the window."},"last":{"type":["number","null"],"description":"Most recent finite value in the window."},"min":{"type":["number","null"],"description":"Minimum finite value in the window."},"max":{"type":["number","null"],"description":"Maximum finite value in the window."},"mean":{"type":["number","null"],"description":"Arithmetic mean of finite values."},"std":{"type":["number","null"],"description":"Sample standard deviation of finite values. Not annualized Black vol."},"p05":{"type":["number","null"],"description":"5th percentile of finite values."},"p50":{"type":["number","null"],"description":"50th percentile (median) of finite values."},"p95":{"type":["number","null"],"description":"95th percentile of finite values."},"sourcePublishedPeakTodayMw":{"type":["number","null"],"description":"Source-published PJM peak load today, MW. Not produced by this service."},"sourcePublishedPeakTomorrowMw":{"type":["number","null"],"description":"Source-published PJM peak load tomorrow, MW. Not produced by this service."},"vsPublishedPeakTodayMw":{"type":["number","null"],"description":"sourcePublishedPeakTodayMw minus last load, MW. Null when either is missing."},"points":{"type":"array","description":"Optional native or hourly load series. History routes only.","items":{"type":"object","properties":{"t":{"type":"string","description":"Observation clock, ISO-8601 with offset (ET).","format":"date-time"},"value":{"type":"number","description":"Series value at t (USD/MWh or MW)."}}}}}}},"description":"Descriptive snapshot pinned to a historical asOf (ET). Fail closed if missing. Same families as /latest. Not a forecast."},"example":{"asOf":"2026-10-09T18:00:00-04:00","ageSeconds":120,"stale":false,"pinnedAsOf":"2026-10-09T18:00:00-04:00","rtoLmp":{"unit":"USD/MWh","last":41.0}}}}},"402":{"$ref":"#/components/responses/PaymentRequired"},"503":{"$ref":"#/components/responses/DataUnavailable"},"400":{"description":"Paid request with invalid window or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"x402":[]}],"description":"Descriptive snapshot for the last stored print at or before asOf. asOf is required, ISO-8601 with offset, interpreted on the observation clock (America/New_York / ET). No interpolation. Fail closed with 404 if asOf is missing or no row exists. Returns the same families as /latest (RTO LMP USD/MWh, zonal spread USD/MWh, RTO load MW) plus pinnedAsOf. The background poller refreshes about every 30 minutes (1800s ± 60s jitter) from the public PJM markets page. Not an official PJM data feed. Use ageSeconds versus maxAgeSeconds (default 10800). stale is true when the print is older; the payload is still returned. RTO LMP is PJM RTO real-time LMP, USD/MWh. RTO load is PJM RTO load, MW. zonalSpread.zones is this print's zonal LMP map (typically AECO, BGE, COMED, DOM, PEPCO, PSEG, JCPL — the set follows the scrape). lastSpread is zonal p95 minus p05, USD/MWh. Why call: compare the live print to a pinned hour to judge drift. Descriptive only. Not a forecast of the next hour or day. Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll.","x-payment-info":{"scheme":"exact","asset":"USDC","price":"$0.02","facilitator":"https://facilitator.payai.network","networks":["solana","base"],"note":"x402 USDC exact on configured networks. Decode PAYMENT-REQUIRED on unpaid POST."},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"asOf":{"type":"string","description":"ISO-8601 observation clock with offset. Required. No interpolation.","format":"date-time","example":"2026-10-09T18:00:00-04:00"}},"required":["asOf"]},"example":{"asOf":"2026-10-09T18:00:00-04:00"}}}}}},"/v1/nowcast/snapshots":{"post":{"tags":["nowcast"],"summary":"Append-only /latest snapshots by EPT hour","operationId":"snapshots_v1_nowcast_snapshots_post","responses":{"200":{"description":"Append-only /latest snapshots by EPT hour","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Service name. Always pjm-nowcast."},"disclaimer":{"type":"string","description":"Descriptive disclaimer plus archive caveats."},"windowDays":{"type":"integer","description":"Lookback cap in days. Default 90."},"from":{"type":"string","description":"Effective start (inclusive), ISO-8601."},"to":{"type":["string","null"],"description":"Effective end (exclusive), ISO-8601. Null if omitted."},"count":{"type":"integer","description":"Number of snapshot rows returned."},"snapshots":{"type":"array","description":"Append-only /latest rows, oldest first.","items":{"type":"object","properties":{"fetched_at_utc":{"type":"string","description":"UTC wall time the poller appended this row, ISO-8601.","format":"date-time"},"asof":{"type":"string","description":"asOf copied from /latest for that print, ISO-8601 ET.","format":"date-time"},"target_hour_ept":{"type":"string","description":"EPT hour-beginning of asOf. Unique. First write per hour wins.","format":"date-time"},"rto_nc":{"type":["number","null"],"description":"RTO LMP last from that /latest print, USD/MWh."},"zone_nc":{"type":["object","null"],"description":"Zonal LMP map from that print, USD/MWh. Null when zonals were missing.","additionalProperties":{"type":"number"}},"spr_nc":{"type":["number","null"],"description":"Zonal lastSpread from that /latest print, USD/MWh. Not spr_act."},"load_nc":{"type":["number","null"],"description":"RTO load last from that print, MW."},"price_vol":{"type":["number","null"],"description":"price_vol copied from that /latest print, USD/MWh."},"price_vol_missing":{"type":["boolean","null"],"description":"price_vol_missing copied from that print."},"mix_std_price":{"type":["number","null"],"description":"mix_std_price copied from that /latest print, USD/MWh (proprietary)."},"mix_n_obs":{"type":["integer","null"],"description":"mix_n_obs copied from that /latest print."}}}}},"description":"Append-only archive of /latest by EPT hour-beginning. 90-day cap, first write wins. Missing hours are null, not zero. Not a forecast."},"example":{"disclaimer":"Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll. Append-only snapshots of what /latest reported for that EPT hour-beginning. Not a forward forecast of a future hour. Hours without a row have no stored nowcast (null, not zero). Residuals are only defined where a snapshot exists.","windowDays":90,"from":"2026-10-09T00:00:00-04:00","to":"2026-10-10T00:00:00-04:00","count":1,"snapshots":[{"asof":"2026-10-09T18:05:00-04:00","target_hour_ept":"2026-10-09T18:00:00-04:00","rto_nc":41.0,"spr_nc":5.1,"zone_nc":{"BGE":46.0}}]}}}},"402":{"$ref":"#/components/responses/PaymentRequired"},"503":{"$ref":"#/components/responses/DataUnavailable"},"400":{"description":"Paid request with invalid window or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"x402":[]}],"description":"Append-only archive of what /latest reported for each EPT hour-beginning. The poller writes after a successful scrape; the first write per target_hour_ept wins. No backfill and no rewrite of existing rows. Query window is capped at maxHistoryDays (default 90). Hours before this store have no row (null, not zero). Residuals are only defined where a snapshot exists. from is inclusive, to is exclusive, both ISO-8601. asof on each row is ET. This archive is independent of actuals prune. Why call: monitor intraday nowcast prints or join to settled actuals. Descriptive only. Not a forecast of the next hour or day. Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll.","x-payment-info":{"scheme":"exact","asset":"USDC","price":"$0.10","facilitator":"https://facilitator.payai.network","networks":["solana","base"],"note":"x402 USDC exact on configured networks. Decode PAYMENT-REQUIRED on unpaid POST."},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","description":"ISO-8601 start with offset (inclusive). Capped at 90-day lookback.","format":"date-time","example":"2026-10-09T00:00:00-04:00"},"to":{"type":"string","description":"ISO-8601 end with offset (exclusive).","format":"date-time","example":"2026-10-10T00:00:00-04:00"}},"required":["from","to"]},"example":{"from":"2026-10-09T00:00:00-04:00","to":"2026-10-10T00:00:00-04:00"}}}}}},"/v1/nowcast/weather-summary":{"get":{"tags":["nowcast"],"summary":"Zone weather sensitivities and latest residual","operationId":"weather_summary_v1_nowcast_weather_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[],"description":"Free zone weather sensitivities from the cached pjm-weather hourly series. Returns dMW/°F (RTO load), d$/MWh/°F, latest residual, seasonBucket, and an uncertainty band (residual p10/p90). Times are hour-ending ET. stale_since is set when the last weather pull failed. Descriptive only."}},"/v1/nowcast/weather-sensitivity":{"post":{"tags":["nowcast"],"summary":"Weather sensitivity series, bands, and degree-day path","operationId":"weather_sensitivity_v1_nowcast_weather_sensitivity_post","responses":{"200":{"description":"Weather sensitivity series, bands, and degree-day path","content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string","description":"Service name. Always pjm-nowcast."},"disclaimer":{"type":"string","description":"Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll."},"timezone":{"type":"string","description":"Always America/New_York."},"asOf":{"type":["string","null"],"description":"Latest observation clock, ISO-8601."},"stale_since":{"type":["string","null"],"description":"Last successful weather pull when stale."},"seasonBucket":{"type":"string","description":"winter, shoulder, or summer from recent temperature."},"adjustWeather":{"type":"boolean","description":"True when ADJUST_WEATHER is on for /latest."},"zones":{"type":"object","description":"Per-zone summary sensitivities."},"detail":{"type":"object","description":"Per-zone series, drivenPath, and degreeDayPath."},"zone":{"type":["string","null"],"description":"Echo of requested zone when set."}},"description":"Weather sensitivities, residual uncertainty band, and degree-day path from the weather hourly series. Descriptive only. Not a forecast."},"example":{"product":"pjm-nowcast","disclaimer":"Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll.","timezone":"America/New_York","asOf":"2026-10-09T18:00:00-04:00","stale_since":null,"seasonBucket":"shoulder","adjustWeather":false,"zones":{"RTO":{"temp_f":57.2,"hdd":7.8,"cdd":0.0,"he_et":"2026-10-31T19:00:00","source":"observed","dLoadMwPerF":-120.0,"dPricePerF":0.4,"residualLoadMw":80.0,"residualPrice":1.1,"uncertaintyBand":{"loadMw":{"p10":-400.0,"p90":500.0},"price":{"p10":-6.0,"p90":8.0}}}},"detail":{"RTO":{"temp_f":57.2,"hdd":7.8,"cdd":0.0,"he_et":"2026-10-31T19:00:00","source":"observed","dLoadMwPerF":-120.0,"dPricePerF":0.4,"residualLoadMw":80.0,"residualPrice":1.1,"uncertaintyBand":{"loadMw":{"p10":-400.0,"p90":500.0},"price":{"p10":-6.0,"p90":8.0}},"series":[{"he_et":"2026-10-31T19:00:00","temp_f":57.2,"source":"observed","loadActualMw":90000.0,"loadFittedMw":89920.0,"loadResidualMw":80.0,"priceActual":41.0,"priceFitted":39.9,"priceResidual":1.1}],"drivenPath":[{"he_et":"2026-11-01T19:00:00","temp_f":54.0,"source":"forecast","loadNowcastMw":91000.0,"priceNowcast":42.0}],"degreeDayPath":[{"date_et":"2026-11-01","hdd":11.0,"cdd":0.0}]}}}}}},"402":{"$ref":"#/components/responses/PaymentRequired"},"503":{"$ref":"#/components/responses/DataUnavailable"},"400":{"description":"Paid request with invalid window or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"x402":[]}],"description":"Paid weather sensitivity: fitted vs actual series, residual uncertainty band, weather-driven load/price nowcast over the upstream horizon, and the degree-day path (NWS days 1–7 plus GFS 8–10 when present). Optional body zone (RTO, BGE, PEPCO, DOM, PSEG, JCPL); omit for all six. Times are hour-ending ET. Descriptive only. Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll.","x-payment-info":{"scheme":"exact","asset":"USDC","price":"0.10","facilitator":"https://facilitator.payai.network","networks":["solana","base"],"note":"x402 USDC exact on configured networks. Decode PAYMENT-REQUIRED on unpaid POST."},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"zone":{"type":"string","description":"Optional zone: RTO, BGE, PEPCO, DOM, PSEG, or JCPL. Omit for all six.","example":"RTO"}}},"example":{}}}}}},"/v1/spread/probability-card":{"post":{"tags":["nowcast"],"summary":"On-peak zonal spread jump probability card","operationId":"spread_probability_card_v1_spread_probability_card_post","responses":{"200":{"description":"On-peak zonal spread jump probability card","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProbabilityCard"},"example":{"sample":{"tag":"high-congestion-season","dayCount":5},"K":12.4,"hitRate":0.4,"avgPayoff":1.8}}}},"402":{"$ref":"#/components/responses/PaymentRequired"},"503":{"$ref":"#/components/responses/DataUnavailable"},"400":{"description":"Paid request with invalid window or body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}},"security":[{"x402":[]}],"description":"PJM zonal spread jump probability. empirical probability card for the evening congestion bar. Pairs stored nowcast snapshots to settled on-peak actuals (spr_act = max zone LMP minus RTO LMP for that hour). lookbackDays counts trailing on-peak EPT weekdays (skip weekends and NERC holidays; skip a weekday whose first on-peak hour has not begun). Default 5, max 30, minimum 3 paired days or HTTP 400. asOf is optional ISO-8601 sample end (ET). Returns strike K, hit rate, average payoff, daily-max p50/p95, and sample window. Why call: size a short-dated spread hedge from recent on-peak jump frequency — not month-ahead, not Black vol, not a mid. Fair value with a caller-supplied vol belongs on the derivatives pricer. Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll.","x-payment-info":{"scheme":"exact","asset":"USDC","price":"0.25","facilitator":"https://facilitator.payai.network","networks":["solana","base"],"note":"x402 USDC exact on configured networks. Decode PAYMENT-REQUIRED on unpaid POST."},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"lookbackDays":{"type":"integer","description":"Trailing on-peak EPT weekdays (skip weekends and NERC holidays). Default 5, max 30.","minimum":1,"maximum":30,"default":5,"example":5},"asOf":{"type":"string","description":"Optional ISO-8601 sample end. Default: now.","format":"date-time"}},"required":["lookbackDays"],"additionalProperties":false},"example":{"lookbackDays":5}}}}}},"/api/mcp":{"get":{"tags":["free"],"summary":"MCP Streamable HTTP (alias of /mcp)","description":"Same handler as /mcp. Server card: https://pjm-nowcast-production.up.railway.app/.well-known/mcp/server-card.json. Canonical URL: https://pjm-nowcast-production.up.railway.app/mcp.","security":[],"responses":{"200":{"description":"MCP discover document or JSON-RPC result."},"406":{"description":"Accept header is not JSON or event-stream."}}},"post":{"tags":["free"],"summary":"MCP JSON-RPC (alias of /mcp)","description":"Same Streamable HTTP JSON-RPC handler as /mcp. tools/list is free. Paid tools return paymentStatus=required without x402.","security":[],"responses":{"200":{"description":"JSON-RPC result."},"406":{"description":"Accept header is not JSON or event-stream."}}}}},"servers":[{"url":"https://pjm-nowcast-production.up.railway.app"}],"components":{"schemas":{"ErrorBody":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"disclaimer":{"type":"string"}},"required":["error","message"]},"NowcastEnvelope":{"type":"object","description":"Descriptive statistics envelope. Fields asOf, polledAt, ageSeconds, maxAgeSeconds, stale are always present.","properties":{"product":{"type":"string"},"disclaimer":{"type":"string"},"timezone":{"type":"string"},"asOf":{"type":"string","format":"date-time"},"polledAt":{"type":"string","format":"date-time"},"ageSeconds":{"type":"integer"},"maxAgeSeconds":{"type":"integer"},"stale":{"type":"boolean"},"observationCount":{"type":"integer"},"rtoLmp":{"type":"object"},"zonalSpread":{"type":"object"},"rtoLoad":{"type":"object"},"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."},"price_vol_missing":{"type":"boolean"},"mix_std_price":{"type":["number","null"],"description":"Latest only. Model-implied dispersion of RTO LMP, $/MWh (proprietary). Not price_vol and not rtoLmp.std."},"mix_n_obs":{"type":["integer","null"],"description":"Latest only. Observation count paired with mix_std_price."},"entropy":{"type":["number","null"],"description":"Regime uncertainty; lower means a more decisive regime. Not a forecast."},"posteriors":{"type":"array","items":{"type":"number"},"description":"Regime state weights (sum to 1)."},"kStar":{"type":["integer","null"],"description":"Index of the dominant regime state."},"windowHours":{"type":"integer"},"resolution":{"type":"string"},"priorPeriod":{"type":"object"}},"example":{"price_vol":2.5,"price_vol_missing":false,"mix_std_price":8.1,"mix_n_obs":40,"stale":false,"ageSeconds":120}},"LatestRequest":{"properties":{"families":{"anyOf":[{"items":{"enum":["rto_lmp","zonal_spread","rto_load"],"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Optional subset of rto_lmp, zonal_spread, rto_load. Default: all three.","title":"Families"}},"title":"LatestRequest","type":"object"},"HistoryRequest":{"properties":{"families":{"anyOf":[{"items":{"enum":["rto_lmp","zonal_spread","rto_load"],"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Optional subset of rto_lmp, zonal_spread, rto_load. Default: all three.","title":"Families"},"windowHours":{"default":24,"description":"Trailing window in hours. Default 24. L2 max 72.","maximum":72,"minimum":1,"title":"Windowhours","type":"integer"}},"title":"HistoryRequest","type":"object"},"ExtendedHistoryRequest":{"properties":{"families":{"anyOf":[{"items":{"enum":["rto_lmp","zonal_spread","rto_load"],"type":"string"},"type":"array"},{"type":"null"}],"default":null,"description":"Optional subset of rto_lmp, zonal_spread, rto_load. Default: all three.","title":"Families"},"windowHours":{"default":168,"description":"Trailing window in hours. Default 168, capped by retention.","minimum":1,"title":"Windowhours","type":"integer"},"resolution":{"default":"native","description":"native = one point per poll; hourly = mean per clock hour.","enum":["native","hourly"],"title":"Resolution","type":"string"},"compare":{"default":"none","description":"If prior_period, include the equal-length window immediately before.","enum":["none","prior_period"],"title":"Compare","type":"string"}},"title":"ExtendedHistoryRequest","type":"object"},"EmptyNowcastRequest":{"properties":{},"title":"EmptyNowcastRequest","type":"object"},"AsofRequest":{"properties":{"asOf":{"description":"ISO-8601 observation clock with offset. Required. No interpolation.","title":"Asof","type":"string"}},"required":["asOf"],"title":"AsofRequest","type":"object"},"SnapshotsRequest":{"properties":{"from":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO-8601 start with offset (inclusive). Capped at 90-day lookback.","title":"From"},"to":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ISO-8601 end with offset (exclusive).","title":"To"}},"title":"SnapshotsRequest","type":"object"},"ProbabilityCardRequest":{"properties":{"lookbackDays":{"default":5,"description":"Trailing on-peak EPT weekdays (skip weekends and NERC holidays). Default 5, max 30.","maximum":30,"minimum":1,"title":"Lookbackdays","type":"integer"},"asOf":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Optional ISO-8601 sample end. Default: now.","title":"Asof"}},"title":"ProbabilityCardRequest","type":"object"},"ProbabilityCard":{"type":"object","properties":{"product":{"type":"string","description":"Service name. Always pjm-nowcast."},"disclaimer":{"type":"string","description":"Descriptive statistics only. Not a forecast, signal, or trading recommendation. Aggregated from public market sources. Freshness depends on the last successful background poll."},"timezone":{"type":"string","description":"Always America/New_York."},"lookbackDays":{"type":"integer","description":"Echo of requested on-peak weekday lookback."},"asOf":{"type":"string","description":"Sample end used, ISO-8601."},"sample":{"type":"object","description":"Paired on-peak weekday sample window.","properties":{"tag":{"type":"string","description":"Sample tag. Always high-congestion-season.","const":"high-congestion-season"},"dayCount":{"type":"integer","description":"Number of paired on-peak EPT weekdays in the sample."},"firstEptDate":{"type":"string","description":"First EPT calendar date in the sample (YYYY-MM-DD)."},"lastEptDate":{"type":"string","description":"Last EPT calendar date in the sample (YYYY-MM-DD)."}}},"K":{"type":"number","description":"Quiet high-water mark: 95th percentile of non-max on-peak spr_act, USD/MWh."},"hitDays":{"type":"integer","description":"Count of sample days whose daily max spr_act exceeded K."},"hitRate":{"type":"number","description":"hitDays / dayCount. Empirical frequency, not a forecast."},"avgPayoff":{"type":"number","description":"Mean of max(daily max spr_act minus K, 0) over sample days, USD/MWh."},"dailyMaxP50":{"type":"number","description":"Median of daily-max spr_act, USD/MWh."},"dailyMaxP95":{"type":"number","description":"95th percentile of daily-max spr_act, USD/MWh."},"latestCompleteDay":{"type":"object","description":"Peak hour of the latest complete on-peak EPT day in the sample.","properties":{"eptDate":{"type":"string","description":"Latest complete on-peak EPT date in the sample."},"maxHourEpt":{"type":"string","description":"Hour-beginning of that day's max spr_act, ISO-8601 ET."},"spr_act":{"type":"number","description":"Settled underlier: max zone LMP minus RTO LMP for that hour, USD/MWh."},"spr_nc":{"type":["number","null"],"description":"Stored nowcast lastSpread for that hour, USD/MWh. Used for miss only."},"miss":{"type":["number","null"],"description":"spr_act minus spr_nc for that hour, USD/MWh."}}},"latestNowcast":{"type":"object","description":"Latest stored nowcast spread versus K.","properties":{"spr_nc":{"type":["number","null"],"description":"Latest stored nowcast lastSpread, USD/MWh."},"K":{"type":"number","description":"Same strike K as the card, USD/MWh."},"throughStrike":{"type":"boolean","description":"true when latest spr_nc is greater than K."}}},"buyerBeware":{"type":"string","description":"empirical hit rate on a named sample, not a forecast, not a mid, not for month-ahead or season-ahead. Nowcast is an input. Fair value with a caller-supplied vol belongs on the derivatives pricer."}},"description":"PJM zonal spread jump probability. On-peak empirical card: hit rate and avg payoff vs K over trailing EPT weekdays. Not a forecast, not a mid, not Black vol.","example":{"sample":{"tag":"high-congestion-season","dayCount":5},"K":12.4,"hitRate":0.4,"avgPayoff":1.8}}},"securitySchemes":{"x402":{"type":"apiKey","in":"header","name":"PAYMENT-SIGNATURE","description":"x402 payment proof. Omit on free routes. On paid routes, missing or invalid payment yields HTTP 402 and a PAYMENT-REQUIRED header."}},"headers":{"PaymentRequired":{"description":"Base64-encoded x402 v2 payment requirements.","schema":{"type":"string"}}},"responses":{"PaymentRequired":{"description":"Payment required. Empty or malformed bodies without payment also receive 402 (not 400). Decode the PAYMENT-REQUIRED header.","headers":{"PAYMENT-REQUIRED":{"$ref":"#/components/headers/PaymentRequired"}},"content":{"application/json":{"schema":{"type":"object","description":"Typically an empty object; terms are in the header."}}}},"DataUnavailable":{"description":"No observation is stored yet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorBody"}}}}}},"security":[{"x402":[]}]}