The reading
GET /organism- Default context. The compact public reading: 17 required fields plus the additive 1.1 fields (observed_at, data_quality_reason, height_last_advanced_at, height_static_seconds, active_public_conditions, agreement_detail, last_24h.critical_public_incidents_in_window, last_24h.chain_movement.blocks_advanced) and the additive 1.2 fields (witnesses: what the reading rests on, as counts; height_standstill_after_seconds: after this long without a new height a reading that would be stable is degraded). No fleet data. ETag / 304 between observations.
GET /organism/schema- The JSON Schema contract: stability policy, enums, changelog.
GET /health- The same labels and reasons without the summary sentence, and their parts: publicNodes (each seed, with height_source), witnesses, signals, validator_growth (seed counts and peer-listed identities; online and synced are listed in mixed_fields; first_counted has the identities first counted in the last 24 h, 7 days and 30 days, null for a window the count does not cover or that a gap in the count crosses), attestation (DAHR attempted on the cross-check RPCs, not on the seeds whose answers enter status: available, last_count, last_ok_at), on_chain_publication (currently "disabled"), on_chain_validators (the on-chain validators table as the public seeds list it: counts by status and minValidatorStake, each only when at least two seeds return the same answer, and how many ACTIVE keys DNO first counted in the last 24 h, 7 days and 30 days) and validator_watch (what DNO saw when it dialed the address each ACTIVE validator published on chain: counts only, never an address). While two seeds give their own height neither of the last two enters status; when fewer do, validators that answered as listed stand in, and witnesses says so. Neither object is in /organism.
GET /incidents- Public records. ?status=active|resolved, ?limit=1–500. Condition records carry kind=condition and are counted in active_public_conditions; /organism active_incidents does not count them. A record may carry note, a dated note DNO added later; the stored record is never edited.
Peer-listed identities
GET /catalog- Identities listed on the public seeds' peerlists, kept after two public peerlists have listed them (one peerlist brings at most 50 new identities into that count per crawl): first recorded (first_seen), last listed, and what the peerlists reported in the latest crawl. ?q= filters by the end of a display name or a truncated key; ?listed=now|not by whether the latest crawl listed the row. ETag / 304 between observations. Never dialed.
GET /catalog/lookup?key=0x…- Exact check of one full key against the catalog and the configured seeds. Returns the sanitized row only, never a key. on_chain says where that key stands on the agreed validators list (ACTIVE, UNSTAKING, other or not_listed), only while two seeds return the same list, read in the last 300 s.
GET /peers- The latest crawl only: truncated identities with the peer-reported height, online flag, sync status and how many public peerlists listed them. Connections are never exposed.
Pages
GET /- The homepage: the reading, the seeds, the on-chain validators and the peer-listed identities. HTML; the reading is also written into the page for readers without JavaScript.
GET /methodology- How each value is derived, and where the observation stops.
GET /about-demos- Validators, shards, node health and DAHR, as the Demos docs describe them, and what DNO sees of each.
GET /sources- What DNO reads, and which of it enters status.
GET /agent- How software agents consume the API: fields, polling, examples.
GET /reference- The fixnet probe and the peer-listed identities, in two tables.
GET /timeline- Public incidents, condition records and release events.
GET /criteria- The definitions of DNO's observation criteria, published as definitions only: applied to no named participant.
GET /commerce- Whether the public endpoints of the attestation authorities named by the Demos agent commerce protocol answered DNO's probe.
GET /commerce/methodology- How those endpoints are probed, and what the result says and does not say.
Integration
GET /criteria.json- The criteria definitions of /criteria, as JSON.
GET /commerce/observations- The observations of /commerce, as JSON.
GET /federate- Prometheus text, not JSON: the oracle version, plus cross-check RPC reachability and probe latency observed from this vantage, under neutral names.
GET /metrics- The same text as /federate.
GET /badge- An SVG image, not JSON, of the current status word.
GET /version- Running agent version and the version most seeds report.
GET /sentinel- Whether DNO's own alert process completed a check in the last 15 minutes: status ok or unknown, and last_check. No counts.
GET /consensus- An experiment that would collect other observers' reports. It is switched off on this server and answers {"error":"Consensus not initialized"}. Not part of the reading.
Public observation interval: 20 s.
Internal only
Fleet views, /dashboard, /history and /history/export, are served on DNO's internal listener only (INTERNAL_PORT). The public site answers 404 for them.
