Metrics / routstr / network_summary

network_summary

The Routstr headline figures in ONE row - the four cards at the top of dev.nostrolo.gy/routstr plus the coverage dates and the exclusion ledger counts. A snapshot of the newest refresh, not a time series: no day axis, and nothing here is additive across calls.

unit

mixed

grain

current (UTC)

series

current state

key

routstr.network_summary@current

Parameters

paramaccepted values
graincurrent - default current (omit to get the default)
from / tocurrent-state snapshot with no time axis - 'from'/'to' are rejected
formatcsv | markdown

Query it

MCP tool call against https://dev.nostrolo.gy/mcp (connect your agent):

{
  "name": "nostrology_query_metric",
  "arguments": {
    "metric": "network_summary",
    "domain": "routstr",
    "grain": "current"
  }
}

Response: a plain-text envelope (window, freshness, column contract, this page's caveats) followed by the data table (csv, or format: "markdown") at current grain.

Response columns

nametypedescription
refresh_generated_attimestampgeneration instant of the refresh these figures come from
providers_announcedintegerdistinct pubkeys with a genuine kind-38421 (routstr-provider-announcements) announcement, INCLUDING excluded ones
providers_reportingintegerincluded providers with at least one ledger row ever
providers_active_30dintegerincluded providers with nonzero daily activity in the 30d window
revenue_30d_satsintegerreported revenue over the 30d window, in SATS (rounded once from msats)
requests_30dintegersuccessful requests over the 30d window
tokens_30dintegertokens billed over the 30d window
revenue_alltime_satsintegerall reported revenue (daily + weekly eras), in SATS
requests_alltimeintegerall successful requests reported
tokens_alltimeintegerall tokens billed
first_activitydateearliest ledger day (weekly era included)
last_activitydatenewest ledger day (never today)
daily_ledger_fromdatefirst day with daily-grain coverage; NULL = none
weekly_ledger_fromdatefirst weekly-era bucket start; NULL = none
models_30dintegerdistinct named models with any activity in the 30d window ('(other)' excluded)
catalog_modelsintegersize of the current curated kind-38423 (routstr-model-catalog) list; NULL = no catalog archived
mintsintegerdistinct Cashu mint URLs across all announced providers
success_rate_30dnumber1 - failed/total over fresh included providers' own trailing-30d summaries; NULL = no fresh reporter
excluded_test_nodesintegerproviders excluded as test/staging nodes
excluded_private_nodesintegerproviders excluded as private-endpoint-only
kind_squattersintegerpubkeys publishing non-Routstr events on kind-38421 (routstr-provider-announcements)

What is counted

Network aggregates cover INCLUDED providers only: test/staging-marked nodes and private-endpoint-only nodes are excluded (still listed, with the reason, by routstr.provider_leaderboard and the routstr.provider_profile record), and kind-38421 (routstr-provider-announcements) squatters are never providers.

Caveats

  • Every usage number is SELF-REPORTED by each provider's own node in kind-38422 (routstr-analytics-snapshots) events and is unverifiable by construction (RIP-01 payments travel as Cashu tokens in HTTP headers, invisible on Nostr): a node can overstate, understate or stay silent, so read these as what the network says about itself.
  • Every *_30d figure covers the last 30 COMPLETE UTC days before the refresh's generation instant (day-aligned: the refresh's day minus 30 through that day minus 1 - anchored to the REFRESH, not to the caller's date), daily buckets only.
  • The two revenue columns are in SATS (the page's pre-converted headline values); every other Routstr metric serves millisats.
  • The success_rate_30d column is self-reported twice over (each provider computes its own trailing window; we only aggregate) over included providers whose newest snapshot is at most 7 days old, and its request total includes failed and non-chat requests - read it as what the still-reporting network says about itself.
  • Daily figures come from a ledger reconstructed by merging the UTC-grid buckets of EVERY archived snapshot's trailing windows (full-coverage-only, newest-wins); observed history is a FLOOR - a day a node later omits is kept, a gap longer than the windows' reach stays a gap - and today is never a ledger day.

Freshness in every response is data-derived: the newest routstr refresh's generation instant (nightly 02:45 UTC; the newest ledger day is the previous UTC day).