Free JSON API
No key needed. CORS is open (Access-Control-Allow-Origin: *). Responses are cached for 30 to 60 seconds; the data changes every 2 minutes. Limit: 6 requests per minute per client (per IPv4 address, per /64 for IPv6; HTTP 429 with Retry-After above that). Times are unix seconds (UTC). Big integers (multipliers, answers, round ids) are strings.
Heavy users: cache. Poll /api/status at most once a minute, keep your own copy, and use /api/alerts?since=<last id> for changes. For push, use the RSS or Atom feed. One poll every 2 minutes sees every change.
Endpoints
GET /api/statusHeadline (ok | attention | degraded | unknown), dataAgeSec (seconds since the last successful check; the level is unknown once it passes 600), open issues, market session, chain health (head age, block rate, L1 posting lag, monitorNote), counts.
GET /api/tokensEvery Stock Token: address, paused, multiplier, pending corporate action, unpaused share 24 h / 7 d / all; and every feed: status (fresh | closed | paused | stale | invalid | error), age, round, price, freshness share. Optional ?token=SGOV.
GET /api/incidentsIncident timeline, newest first. Params: limit (1-100, default 50), before (unix seconds), token (symbol or chain), kind (paused, stale, invalid, blocks, l1lag, rpc, gap), open=1. rpc and gap are monitor-side (subject monitor), not chain problems.
GET /api/history?token=SGOV&range=24hPer-check points for 24 h ([t, status, ageSec] for feeds, [t, paused] for tokens without a feed) or hourly rollups for 7d / 30d. token=chain gives [t, headAgeSec, l1LagSec].
GET /api/alertsLatest alerts (state changes), newest first. Params: limit (1-100, default 50), since (alert id; returns newer ones). Also /api/alerts.rss and /api/alerts.atom.
Alert kinds
paused_on/paused_off, stale_on/stale_off, invalid_on/invalid_off, blocks_on/blocks_off (no new block for over 60 s), l1lag_on/l1lag_off (L1 posting lag over 5 min), ca_scheduled, ca_24h, ca_applied, notice_new, notice_changed, notice_unreadable, rpc_on/rpc_off (the monitor cannot reach the public RPC), gap (the monitor itself was not running for over 5 minutes; written when checks resume). While no check has succeeded for 10 minutes, the RSS/Atom feeds start with a monitor_unknown item.
Example
curl -s https://stocktokenwatch.swiftbotlabs.workers.dev/api/status