Documents & Productivity — entry 028 of 30

WakaTime

Verified Jul 2026

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.

time-trackingdeveloper-toolsleaderboardsfree-tier
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSDisabledBrowser calls need a server-side proxy.
PricingFreemiumA usable free tier exists, with paid plans for more volume.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score71out of 100
Authentication25/25No authentication required
Pricing17/20Freemium tier available
Docs0/20No docs or spec available
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 71 on greatapis.com
<a href="https://greatapis.com/api/wakatime/"><img src="https://greatapis.com/badge/wakatime.svg" alt="Scored 71 on greatapis.com"></a>

Auth quickstart

  1. 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/stats with no auth returned a genuine 401 {"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.
Stored keyNo key stored

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

200 application/json

{
  "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

Rate limit

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.name this run was "last_7_days" (2026-08-03 to 2026-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_page or 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/stats with zero credentials returned a clean 401 {"errors": ["Unauthorized."]}, not a scoped-down public view.