CrossFit leaderboard API
CrossFit leaderboard API
Leaderboards that stay fast at any depth, with filters that mean the same thing in every season.
Plans from $15 a month.
Pagination is the whole problem
A leaderboard endpoint is easy to write and hard to write well. The upstream serves at most a hundred rows per request and pages by number, so reading deep into a large division means thousands of round trips, and offset pagination slows down the deeper you go.
This API paginates by cursor, keyed on rank plus a tiebreaker id. Page two thousand costs what page one costs. The tiebreaker matters more than it sounds: athletes tie on rank constantly, and a partial ordering skips or repeats rows at a page boundary.
Filters are canonical, so `division=men-45-49` returns the right people in 2014 and in 2026 even though the underlying ids differ.
Endpoints
| Method | Path | What it returns |
|---|---|---|
| GET | /v1/competitions/{id}/leaderboard | Any competition, one shape |
| GET | /v1/open/{year}/leaderboard | Convenience view for the Open |
| GET | /v1/workouts/{id}/leaderboard | Ranked on one workout alone |
Example
Request
curl "https://api.crossfitapi.com/v1/open/2026/leaderboard?division=men&limit=50&cursor=eyJrIjo1MCwi..." \
-H "Authorization: Bearer cfapi_live_..."Response
{
"data": [ { "rank": 51, "athlete": { "name": "..." } } ],
"pagination": {
"next_cursor": "eyJrIjoxMDAsImkiOiIwMWEw...",
"has_more": true
}
}What is covered
- Overall leaderboards for every imported competition.
- Per-workout leaderboards, ranked on that workout alone.
- Filters: division, scaled, country, gym.
- Cursor pagination up to 200 rows a page.
- An invalid cursor returns invalid_cursor, with the page you asked for left unserved.
Coverage grows as each season finishes importing . A season appears there once it is imported and reconciled.
What people build with it
Live boards
Render a division in a gym display without hammering anyone.
Gym dashboards
Filter a whole leaderboard down to one affiliate.
Country views
National standings from a single query parameter.
Have a look at the data first
The docs and the live explorer are open, so you can see what comes back before you pay for anything.