Documents & Productivity — entry 028 of 30
WakaTime
WakaTime tracks coding activity through editor plugins and exposes it via a REST API covering durations, leaderboards, and per-project stats. The free plan keeps the last 14 days of history, and a Premium subscription unlocks unlimited history and deeper reports.
WakaTime's public leaderboard endpoint ranks everyone who opts in to visible stats, straight from editor-plugin telemetry. A live GET this run against /leaders?page=1 returned a real ~400 KB, 100-entry page at HTTP 200 — no key, no Authorization header, and no session cookie sent.
GreatAPIs Score
Auth quickstart
- The leaderboard, and any public user's own profile stats, need no key at all — the live GET above returned real ranked data with zero credentials. A key only unlocks your own private data: a live GET this run against
/users/current/statswith no auth returned a genuine401 {"errors": ["Unauthorized."]}. Getting a key means signing in and copying the secret key from the WakaTime account settings page, then sending it as HTTP Basic auth (the key as the username, blank password) on/users/current/*routes.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Fetch the public coding-activity leaderboard
GEThttps://wakatime.com/api/v1/leaders?page=1
{
"data": [
{
"user": {
"id": "2f596461-89b0-406e-9eaa-7443d5e83d25",
"display_name": "Alessio Rocchi",
"username": "blackms",
"is_hireable": true
},
"running_total": {
"total_seconds": 507889.860208,
"human_readable_total": "141 hrs 4 mins",
"daily_average": 72556
},
"rank": 1
},
{
"user": {
"id": "d30b8d73-cad4-4d80-9bf3-552266044d20",
"display_name": "Bryan Djafer",
"username": "Yukky",
"is_hireable": false
},
"running_total": {
"total_seconds": 503165.659,
"human_readable_total": "139 hrs 46 mins",
"daily_average": 71881
},
"rank": 2
}
],
"total_pages": 100,
"page": 1,
"range": {
"start_date": "2026-08-03",
"start_text": "Mon Aug 3rd 2026",
"end_date": "2026-08-09",
"end_text": "Sun Aug 9th 2026",
"text": "from Mon Aug 3rd 2026 until Sun Aug 9th 2026",
"name": "last_7_days"
}
}Cut down hard — the real response this run was 401,980 B for 100 ranked users on this one page alone, across 100 total pages. Each real data[] entry also carries a full city object on user and per-language languages[]/ai_model_costs/ai_model_line_changes breakdowns inside running_total, all dropped here for length.
Developer reference
10 requests/second on average over any 5-minute period (429 on excess); new OAuth tokens are additionally capped at 10 per user per hour.
Gotchas & limits
- The leaderboard ranks a trailing 7-day window, not lifetime totals — the live response's own
range.namethis run was"last_7_days"(2026-08-03to2026-08-09), not an all-time or daily figure. There's no query parameter in the docs to change that window on the public endpoint. - One page is ~400 KB and there's no way to ask for a smaller slice — the live response this run had no
per_pageor field-selection parameter; a client that only needs rank and username still has to download every language/cost breakdown for all 100 users on the page. /users/current/*genuinely requires the key, with no partial or public fallback — a live GET this run against/users/current/statswith zero credentials returned a clean401 {"errors": ["Unauthorized."]}, not a scoped-down public view.