Metrics / routstr / model_leaderboard

model_leaderboard

Every model served on Routstr with its 30d and all-time reported revenue, requests, tokens and 30d provider count - the Models tab table of dev.nostrolo.gy/routstr, one row per model identifier, ranked by 30d revenue with '(other)' last. A CURRENT-STATE snapshot: no time axis, never sum across calls; for a caller-chosen window use routstr.model_activity.

unit

msats+requests+tokens

grain

current (UTC)

series

current state

key

routstr.model_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
modeloptional model identifier, exact match on the provider-reported string as listed by routstr.model_leaderboard (max 60 chars; '(other)' is a valid value)
formatcsv | markdown

Query it

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

{
  "name": "nostrology_query_metric",
  "arguments": {
    "metric": "model_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
modeltextprovider-reported model identifier, verbatim (clipped at 60 chars); '(other)' = the providers' own residual plus any named tail folded past 100 rows
msats_30dintegerreported revenue over the 30d window, integer millisats
requests_30dintegersuccessful requests over the 30d window
tokens_30dintegertokens billed over the 30d window
providers_30dintegerdistinct included providers that served the model in the 30d window
msats_alltimeintegerall reported revenue, integer millisats
requests_alltimeintegerall successful requests
tokens_alltimeintegerall tokens billed

What is counted

Included providers only. Up to 100 named models are listed; any longer tail is folded into the '(other)' row together with the providers' own residuals, so the rows always sum to the network totals. 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.
  • Model identifiers are the providers' own strings, verbatim (clipped at 60 chars): the same model appears both as 'openai/gpt-...' and 'gpt-...' and no normalization is applied; '(other)' is the providers' own residual for models they truncated off the wire and is part of the data.
  • 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).
  • The `model` filter is an exact match on the identifier as listed here.

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).