Public API
API reference
Every number on this site comes from this API. Versioned, rate-limited (60 req/min/IP), and shipped under CC0 for the data.
Conventions
- Base URL
- https://whoearns.live
- Auth
- None — public, read-only.
- Rate limit
- 60 requests / min / IP. Exceeding returns
429 Too Many Requests. - Errors
- JSON:
{ error: { code, message, requestId, details? } }.
Endpoints
- GET
/healthzLiveness + readiness probeReports DB connectivity + RPC heartbeat freshness. Returns 200 with body `{status: "ok" | "degraded"}`. Used by k8s probes.
https://whoearns.live/healthz - GET
/v1/epoch/currentCurrent Solana epoch snapshotFirst/last/current slot, `slotsElapsed`, and `isClosed` for the running epoch. Updated every `EPOCH_WATCH_INTERVAL_MS` tick.
https://whoearns.live/v1/epoch/current - GET
/v1/leaderboardTop-N validators by live, final, or Decade windowRanked list for a selected window. Default `window=live_trend&sort=income_per_slot`, combining current elapsed leader slots with the latest final epoch. Other windows: `current_only`, `stable_trend`, `final_epoch`, and `decade_epoch`.
Query parameters (5)
- limit (integer)
- How many rows to return. Clamped server-side to 500. Default 100.
- epoch (integer)
- Override target closed epoch. Only valid with `window=final_epoch`.
- window (enum)
- `live_trend` | `current_only` | `stable_trend` | `final_epoch` | `decade_epoch`.
- minWindowSlots (integer)
- Minimum denominator slots required for a row. Default 4.
- sort (enum)
- `income_per_slot` | `total_income` | `mev_tips` | `fees` | `skip_rate`. Default `income_per_slot`.
https://whoearns.live/v1/leaderboard?window=live_trend&limit=25&sort=income_per_slot - GET
/v1/validators/searchSearch known validatorsDB-only search over validator name, vote pubkey prefix, identity pubkey prefix, and keybase username. Opted-out validators are excluded and the request never calls Solana RPC.
Query parameters (2)
- q (string, required)
- Search text, minimum 2 characters.
- limit (integer)
- Result count clamped to 1-25. Default 10.
https://whoearns.live/v1/validators/search?q=0base&limit=10 - GET
/v1/validators/{idOrVote}/current-epochA validator's running-epoch statsSame row as the history endpoint filtered to the current epoch. `idOrVote` accepts either a vote pubkey or an identity pubkey; the resolver picks whichever matches our `validators` table.
https://whoearns.live/v1/validators/5BAi9YGCipHq4ZcXuen5vagRQqRTVTRszXNqBZC6uBPZ/current-epoch - GET
/v1/validators/{idOrVote}/epochs/{epoch}A validator's stats for one epochSame record shape as `current-epoch`, but pinned to the requested epoch. `idOrVote` accepts either a vote pubkey or an identity pubkey.
https://whoearns.live/v1/validators/5BAi9YGCipHq4ZcXuen5vagRQqRTVTRszXNqBZC6uBPZ/epochs/963 - GET
/v1/validators/{idOrVote}/epochs/{epoch}/leader-slotsLeader-slot facts for one validator epochAggregates stored facts from watched validator leader slots only. The API call does not trigger Solana RPC; it returns slot quality fields plus block fee, tip, tx, CU, cost-unit, ComputeBudget, and income-per-1M-CU summaries.
https://whoearns.live/v1/validators/9f7dqiYNBZbgPesAnLeWnKCtxYHSfMg5x1EMZCJwVwG7/epochs/966/leader-slots - GET
/v1/validators/{idOrVote}/historyPer-epoch history for a validatorRows returned newest-first. Each row carries `isFinal`, `hasSlots`, `hasIncome`, and `peerBenchmark` for indexed-validator average income per leader slot.
Query parameters (1)
- limit (integer)
- Row count. Clamped server-side to 200. Default 50.
https://whoearns.live/v1/validators/5BAi9YGCipHq4ZcXuen5vagRQqRTVTRszXNqBZC6uBPZ/history?limit=20
Need more detail?
Full response shapes, field-level docs, and enum values live in the OpenAPI 3.1 spec at /openapi.yaml. Paste that URL into Hoppscotch, Scalar, or your own OpenAPI viewer for a full interactive reference.