{"service":"power-flags","endpoints":{"dart":{"price_usd":0.01,"endpoint":"GET /toll/power/flags/dart","query":{"hub":"required, one of HB_NORTH | HB_HOUSTON | HB_SOUTH | HB_WEST | HB_PAN | HB_BUSAVG | HB_HUBAVG","threshold":"optional USD/MWh 5..500, default 25","window_hours":"optional integer 1..168, default 48"},"response":{"verdict":"answer first","firing_count":"hours in window with |RT hourly mean - DA| >= threshold","max_abs_divergence":"USD/MWh","latest_firing":"{hour_start, hour_ct, da, rt_hourly_mean, divergence} or null","firings":"ranked by |divergence| desc, max 25","staleness":"snapshot as-of + age + stale flags","attribution":"Source: ERCOT public market data","envelope":"fleet metadata envelope"}},"negative":{"price_usd":0.01,"endpoint":"GET /toll/power/flags/negative","query":{"hub":"optional; omit for all hubs"},"response":{"verdict":"answer first","per_hub":"[{hub, da_negative_hours_24h, da_negative_hours_7d, rt_negative_intervals_24h, rt_negative_intervals_7d, min_da_7d, min_rt_7d, active_window, recent_negative_points}]","staleness":"snapshot block","attribution":"Source: ERCOT public market data","envelope":"fleet metadata envelope"}},"congestion":{"price_usd":0.01,"endpoint":"GET /toll/power/flags/congestion","query":{"threshold":"optional USD/MWh 5..500, default 25","window_hours":"optional integer 1..168, default 48"},"response":{"verdict":"answer first","spike_count":"hours with max-min RT hourly spread >= threshold","max_spread":"USD/MWh","top_pair":"e.g. HB_NORTH vs HB_WEST","spikes":"ranked desc, max 25","envelope":"fleet metadata envelope"}},"battery":{"price_usd":0.01,"endpoint":"GET /toll/power/flags/battery","query":{"hub":"optional; omit for all hubs"},"response":{"verdict":"answer first","per_hub":"[{hub, days: [{operating_day_ct, partial, hours_observed, rt_hourly_min, rt_hourly_max, spread, charge_hour_ct, discharge_hour_ct, spread_ge_50}]}] — trailing 7 days + current partial day","envelope":"fleet metadata envelope"}},"scan":{"price_usd":0.05,"endpoint":"GET /toll/power/scan","query":{},"response":{"verdict":"answer first","highlights":"ranked across all four families, max 10","per_hub_summary":"one row per hub","envelope":"fleet metadata envelope"}}},"staleness_thresholds":{"rt_snapshot_max_age_seconds":7200,"dam_snapshot_max_age_seconds":129600,"behaviour":"stale snapshots are still served but flagged STALE in the staleness block and the verdict; a MISSING snapshot returns 503 — freshness is never fabricated"},"limitations":["Computed flags only: this service never serves raw ERCOT price series (licence hygiene + product shape).","The worker serves from collector-written KV snapshots only; it never fetches ERCOT on the paid path. Every paid response carries snapshot as-of + age and an explicit stale flag when a threshold is exceeded (RT > 2h, DAM > 36h).","DART compares the DA hourly SPP with the RT hourly MEAN of the four 15-min SPPs for the same delivery hour.","Congestion uses RT hourly means (max-min across hubs per hour); the top hub pair is named per spike.","Battery windows are gross RT hourly max-min spreads with charge (min) / discharge (max) hour picks — before fees, efficiency and degradation.","ERCOT operating day and hour labels are America/Chicago."],"envelope":{"v":1,"service":"power-flags","as_of":"2026-11-14T14:49:32.671Z","source":"power-flags service configuration","grade":"derived","max_age_seconds":300,"changes":{"supported":false}}}