跳到主要内容

Leaderboard

Returns the epoch cumulative points leaderboard: the top 100 users of the current active epoch by total points, computed live from points.balances on every request (there is no cache).

GET /v1/points/leaderboard

No authentication required.

Query Parameters​

None. The epoch is always the current active epoch, the ranking is always total (sum of all five point types), and the result is capped at 100 entries. epoch, type_ and limit parameters are not implemented and are ignored.

Response​

{
"epoch_number": 3,
"rank_type": "total",
"entries": [
{
"rank": 1,
"user_address": null,
"username": null,
"points": "125680.50",
"tier": "T3"
},
{
"rank": 2,
"user_address": null,
"username": null,
"points": "98450.20",
"tier": "T2"
}
],
"total": 1842,
"updated_at": "2026-04-15T12:00:00Z"
}

Response Fields​

FieldTypeDescription
epoch_numberintCurrent active epoch (falls back to 1 if none is active)
rank_typestringAlways "total"
entriesarrayRanked entries (at most 100)
totalintNumber of users with a balance row in the epoch (not capped at 100)
updated_atstringTime the response was generated (ISO 8601) — the board is computed live

entries[]​

FieldTypeDescription
rankintRank position (1-based, by total points descending)
user_addressstring | nullAddress stored on the balance row; the accrual pipeline does not populate it yet, so currently null
usernamenullReserved; currently always null
pointsDecimalTotal points (all five types summed, 2 decimals)
tierstringUser's tier (T1 / T2 / T3), derived from the epoch trading_volume

Code Examples​

Python​

import requests

BASE_URL = "https://api.rocky.exchange"

resp = requests.get(f"{BASE_URL}/v1/points/leaderboard")
data = resp.json()

print(f"Top {len(data['entries'])} of {data['total']} users (Epoch {data['epoch_number']})")
for e in data["entries"]:
name = e["username"] or e["user_address"] or "-"
print(f" #{e['rank']} {name}: {e['points']} pts [{e['tier']}]")