Build your own leaderboard
Using /rankings as a base, and what to do when you want different weights.
/v1/{game}/rankings is our board. If it's what you want, it's one request.
curl -H "Authorization: Bearer $ESPORTSODDS_API_KEY" \
"https://api.esportsodds.gg/v1/cs2/rankings?type=team&limit=50"Each row carries rank, value, metric, plus form (last 5 results) and rank_delta (movement
vs ~7 days ago) for teams. That's a complete standings widget from a single call.
Understand what you're getting
Teams rank on glicko2_conservative — the Glicko-2 rating minus twice its deviation. A team the
model is unsure about sorts below an equally-rated team it's confident about, and an inactive team
drifts down as its uncertainty grows. Players rank on rating.
Entities below the sample floor (5 rated matches for teams, 30 rated maps for players) are omitted entirely, so absence means "not enough evidence", not "ranked last".
Filtering and reordering
# Regional board
…/rankings?type=team®ion=Europe
# By role
…/rankings?type=player&role=AWP
# The bottom of the board, with real ranks preserved
…/rankings?type=team&sort=-rank&limit=10Re-sorting changes the order rows come back in, never the rank each entity holds — so -rank
gives you the bottom ten with their true ranks rather than renumbering them 1–10.
/rankings is not cursor-paginated; limit truncates the computed board.
Rolling your own
If you want different weights — a different window, or map-specific strength — build from the primitives rather than trying to re-derive ours:
# Rating trajectory rather than a point-in-time rating
history = get(f"/v1/cs2/teams/{team_id}/ratings?limit=200")["data"] # oldest-first
# Recent results
form = get(f"/v1/cs2/teams/{team_id}/form?limit=50")["data"]
# Per-map strength
maps = get(f"/v1/cs2/teams/{team_id}/maps")["data"]Budget carefully: three calls per team across 200 teams is 600 requests — 3% of a month per full refresh. Cache and refresh weekly; ratings don't move fast enough to justify daily rebuilds.
Weight by confidence
Whatever you build, apply the lesson glicko2_conservative encodes: discount by uncertainty. A
90% win rate over 5 matches is weaker evidence than 65% over 60. Use rd from the ratings series,
or played from the per-map record, as the confidence term. Sorting on a raw rate puts small
samples at the top and makes the board look wrong to anyone who knows the scene.
Comparing with an external ranking
Team rows carry external_rank, a separately-sourced world ranking where one exists. It is reported
alongside for comparison and is not used for ordering — the gap between it and our rank is
often the interesting part.