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

paramaccepted values
graincurrent - default current (omit to get the default)
from / tocurrent-state snapshot with no time axis - 'from'/'to' are rejected
provider_pubkeyoptional 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
formatcsv | 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

nametypedescription
provider_pubkeytextthe provider's Nostr key - provider identity (the announcement's provider_id is informational only)
provider_nametextannouncement content.name, clipped to 80 chars; the 12-hex pubkey prefix when never announced
endpoint_classtextclearnet | onion | both | private-only | none, from the announced endpoint URLs
versiontextannouncement `version` tag; '' = untagged (a stale announcement, not necessarily a running old binary)
reviewtextnewest curated kind-38425 (routstr-provider-reviews) label; NULL = never reviewed by the curated key
announcedbooleantrue = has a genuine (u+d tagged) announcement; false = reports usage but never announced
first_seendateearliest genuine announcement or earliest ledger activity, whichever is older
last_announcedatenewest announcement; NULL when never announced
last_reportdategeneration day of the newest analytics snapshot; NULL when never reported
msats_30dintegerreported revenue over the 30d window, integer millisats
requests_30dintegersuccessful requests over the 30d window
tokens_30dintegertokens billed over the 30d window
msats_alltimeintegerall reported revenue (daily + weekly eras), integer millisats
requests_alltimeintegerall successful requests reported
tokens_alltimeintegerall tokens billed
excludedbooleantrue = NOT in the network aggregates (see excl_reason)
excl_reasontexttest | 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).