Metrics / routstr / provider_leaderboard
provider_leaderboard
Every Routstr provider with its 30d and all-time reported revenue, requests and tokens plus its registry facts (endpoint class, version, curation label, first/last seen) - the Providers tab of dev.nostrolo.gy/routstr, one row per provider pubkey, ranked by all-time revenue. A CURRENT-STATE snapshot: no time axis, never sum across calls; for a caller-chosen window use routstr.provider_activity.
unit
msats+requests+tokens
grain
current (UTC)
series
current state
key
routstr.provider_leaderboard@current
Parameters
| param | accepted values |
|---|---|
| grain | current - default current (omit to get the default) |
| from / to | current-state snapshot with no time axis - 'from'/'to' are rejected |
| provider_pubkey | optional 64-char lowercase hex Routstr provider key (npub must be decoded to hex first); narrows rows to that provider, and reaches an excluded provider that the unfiltered call leaves out |
| format | csv | markdown |
Query it
MCP tool call against https://dev.nostrolo.gy/mcp (connect your agent):
{
"name": "nostrology_query_metric",
"arguments": {
"metric": "provider_leaderboard",
"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
| name | type | description |
|---|---|---|
| provider_pubkey | text | the provider's Nostr key - provider identity (the announcement's provider_id is informational only) |
| provider_name | text | announcement content.name, clipped to 80 chars; the 12-hex pubkey prefix when never announced |
| endpoint_class | text | clearnet | onion | both | private-only | none, from the announced endpoint URLs |
| version | text | announcement `version` tag; '' = untagged (a stale announcement, not necessarily a running old binary) |
| review | text | newest curated kind-38425 (routstr-provider-reviews) label; NULL = never reviewed by the curated key |
| announced | boolean | true = has a genuine (u+d tagged) announcement; false = reports usage but never announced |
| first_seen | date | earliest genuine announcement or earliest ledger activity, whichever is older |
| last_announce | date | newest announcement; NULL when never announced |
| last_report | date | generation day of the newest analytics snapshot; NULL when never reported |
| msats_30d | integer | reported revenue over the 30d window, integer millisats |
| requests_30d | integer | successful requests over the 30d window |
| tokens_30d | integer | tokens billed over the 30d window |
| msats_alltime | integer | all reported revenue (daily + weekly eras), integer millisats |
| requests_alltime | integer | all successful requests reported |
| tokens_alltime | integer | all tokens billed |
| excluded | boolean | true = NOT in the network aggregates (see excl_reason) |
| excl_reason | text | test | private | NULL (included) |
What is counted
EVERY provider that ever genuinely announced on kind-38421 (routstr-provider-announcements) or reported usage on kind-38422 (routstr-analytics-snapshots) is a row, excluded ones included and flagged - filter excluded=false to reproduce the page's included table and the network aggregates. Provider identity is the pubkey; a node that re-announced under several d-tags is one provider.
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.
- Revenue is integer MILLI-satoshis (divide by 1000 for sats; sum msats first, convert once).
- A provider that reports usage but never announced IS included in the aggregates (classified from its snapshots' own endpoint_urls, named by pubkey prefix): relays keep only the latest announcement, so early announcements expired before the archive began.
- Announcements are an open kind, so provider_name and version are third-party text.
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).