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
| 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 |
| model | optional model identifier, exact match on the provider-reported string as listed by routstr.model_leaderboard (max 60 chars; '(other)' is a valid value) |
| format | csv | 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
| name | type | description |
|---|---|---|
| model | text | provider-reported model identifier, verbatim (clipped at 60 chars); '(other)' = the providers' own residual plus any named tail folded past 100 rows |
| 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 |
| providers_30d | integer | distinct included providers that served the model in the 30d window |
| msats_alltime | integer | all reported revenue, integer millisats |
| requests_alltime | integer | all successful requests |
| tokens_alltime | integer | all 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).