Public API

HumanRank API

Read-only access to the live HumanRank leaderboards. No account, no key, no quota to request: send a GET request and you get the same rankings the site shows.

No authentication JSON responses CORS open to any origin 10 leaderboards Top 100 per game Refreshed every 5 minutes
Base URL https://humanrank.app/api
On this page

Quickstart

Every route is a plain GET request. Start with the world number one of one game, then move to the top 100 or to the combined endpoint.

Terminal
curl https://humanrank.app/api/leaderboards/reaction-time/top
JavaScript
const response = await fetch(
  "https://humanrank.app/api/leaderboards/reaction-time/top"
)
const { game, leader } = await response.json()

console.log(game.name, leader.name, leader.score.label)
// Reaction Time kaito 142 ms
  • Need every leader at once? Call https://humanrank.app/api/leaderboards/top and read the leaders array.
  • Not sure which slug to use? The games section lists every slug, alias, and ranking rule.
  • Publishing a result? Cite the leaderboardUrl that comes with the data so readers can check it.

Endpoints

Five routes, all GET, all public. Each one links to a live response you can open in a browser tab.

GET /api API directory

Machine-readable index of every route, plus the full leaderboard directory. A good first call for crawlers and AI assistants.

Open live response https://humanrank.app/api
Example response
{
  "name": "HumanRank Public API",
  "purpose": "Help people, AI assistants, and developers retrieve current HumanRank leaderboards.",
  "documentation": "https://humanrank.app/api/docs/",
  "jsonDirectory": "https://humanrank.app/api",
  "llmsTxt": "https://humanrank.app/llms.txt",
  "endpoints": {
    "GET /api": "This machine-readable API directory.",
    "GET /api/docs": "Human-readable HTML documentation with crawlable links.",
    "GET /api/leaderboards": "List every available leaderboard.",
    "GET /api/leaderboards/top": "Return the current world number one for every game.",
    "GET /api/leaderboards/{slug}": "Return the current global top 100 for one game.",
    "GET /api/leaderboards/{slug}/top": "Return the current world number one for one game."
  },
  "leaderboards": [
    {
      "id": "reaction-test",
      "name": "Reaction Time",
      "leaderboardUrl": "https://humanrank.app/leaderboards/reaction-time/",
      "topEndpoint": "https://humanrank.app/api/leaderboards/reaction-time/top",
      "top100Endpoint": "https://humanrank.app/api/leaderboards/reaction-time"
    }
  ]
}

Truncated to a single leaderboard; the live response lists all of them.

GET /api/leaderboards Leaderboard directory

Every available game with its canonical page and its two JSON endpoints. No score data.

Open live response https://humanrank.app/api/leaderboards
Example response
{
  "count": 10,
  "leaderboards": [
    {
      "id": "reaction-test",
      "name": "Reaction Time",
      "leaderboardUrl": "https://humanrank.app/leaderboards/reaction-time/",
      "topEndpoint": "https://humanrank.app/api/leaderboards/reaction-time/top",
      "top100Endpoint": "https://humanrank.app/api/leaderboards/reaction-time"
    }
  ]
}

Truncated to the first of 10 leaderboards.

GET /api/leaderboards/top World number ones

The current leader of every game in a single request. Each item carries the leaderboard metadata without the other 99 entries.

Open live response https://humanrank.app/api/leaderboards/top
Example response
{
  "complete": true,
  "count": 10,
  "expectedCount": 10,
  "generatedAt": "2026-09-07T09:12:44.510Z",
  "leaders": [
    {
      "game": { "id": "reaction-test", "name": "Reaction Time", "slug": "reaction-time" },
      "generatedAt": "2026-09-07T09:10:02.884Z",
      "leaderboardUrl": "https://humanrank.app/leaderboards/reaction-time/",
      "latestRecordAt": "2026-09-06T21:44:19.207Z",
      "rankingRule": "Lowest average reaction time wins.",
      "updatedAt": "2026-09-07T09:10:02.884Z",
      "topEndpoint": "https://humanrank.app/api/leaderboards/reaction-time/top",
      "leader": {
        "rank": 1,
        "name": "kaito",
        "country": "jp",
        "age": 21,
        "sex": "male",
        "platform": "web",
        "recordedAt": "2026-09-02T12:41:07.503Z",
        "score": { "label": "142 ms", "unit": "ms", "value": 142 },
        "details": { "attemptsMs": [138, 145, 141, 149, 137] }
      }
    }
  ]
}

Truncated to one game. When a leaderboard fails, complete is false and an errors array lists the games that could not be read.

GET /api/leaderboards/{slug} Top 100 of one game

The current global ranking of one game, up to 100 entries, ordered by rank.

slug path · required

Game slug or game id, for example reaction-time or reaction-test. Every accepted value is listed in the games section.

Open live response https://humanrank.app/api/leaderboards/reaction-time
Example response
{
  "game": { "id": "reaction-test", "name": "Reaction Time", "slug": "reaction-time" },
  "generatedAt": "2026-09-07T09:10:02.884Z",
  "leaderboardUrl": "https://humanrank.app/leaderboards/reaction-time/",
  "latestRecordAt": "2026-09-06T21:44:19.207Z",
  "rankingRule": "Lowest average reaction time wins.",
  "updatedAt": "2026-09-07T09:10:02.884Z",
  "entries": [
    {
      "rank": 1,
      "name": "kaito",
      "country": "jp",
      "age": 21,
      "sex": "male",
      "platform": "web",
      "recordedAt": "2026-09-02T12:41:07.503Z",
      "score": { "label": "142 ms", "unit": "ms", "value": 142 },
      "details": { "attemptsMs": [138, 145, 141, 149, 137] }
    },
    {
      "rank": 2,
      "name": "mara",
      "country": "de",
      "age": null,
      "sex": null,
      "platform": "android",
      "recordedAt": "2026-08-30T07:15:52.118Z",
      "score": { "label": "148 ms", "unit": "ms", "value": 148 },
      "details": { "attemptsMs": [151, 144, 150, 147, 148] }
    }
  ]
}

Truncated to the first two of up to 100 entries.

GET /api/leaderboards/{slug}/top World number one of one game

Same payload as the top 100, with entries replaced by a single leader object. The lightest way to quote a current record.

slug path · required

Game slug or game id, exactly as for the top 100 endpoint.

Open live response https://humanrank.app/api/leaderboards/reaction-time/top
Example response
{
  "game": { "id": "typing-test", "name": "Typing Test", "slug": "typing-test" },
  "generatedAt": "2026-09-07T09:10:03.427Z",
  "leaderboardUrl": "https://humanrank.app/leaderboards/typing-test/",
  "latestRecordAt": "2026-09-05T16:38:11.640Z",
  "rankingRule": "Highest words per minute wins; accuracy, errors, correct characters, then record date break ties.",
  "updatedAt": "2026-09-07T09:10:03.427Z",
  "leader": {
    "rank": 1,
    "name": "sofia",
    "country": "br",
    "age": 27,
    "sex": "female",
    "platform": "web",
    "recordedAt": "2026-09-05T16:38:11.640Z",
    "score": { "label": "163 WPM", "unit": "WPM", "value": 163 },
    "details": {
      "accuracyPercent": 98.4,
      "correctCharacters": 812,
      "durationSeconds": 60,
      "errors": 13,
      "wordsPerMinute": 163
    }
  }
}

leader is null when a game has no ranked score yet.

Games & ranking rules

The 10 public leaderboards, each with the slug to put in the URL, the exact ranking rule, and the details payload that is specific to that game.

Reaction Time

reaction-time

Measure how quickly you respond to a visual signal.

Ranking: Lowest average reaction time wins.

Score unit: ms · Slug also accepts: reaction-test

details fields:

  • attemptsMs number[] — Reaction time of every attempt in the ranked run.

Aim Trainer

aim-trainer

Improve target acquisition speed and pointer accuracy.

Ranking: Lowest average target time wins; accuracy, misses, total time, then record date break ties.

Score unit: ms average per target

details fields:

  • accuracyPercent number — Share of clicks that hit a target, from 0 to 100.
  • averageTargetMs number — Average time spent on each target, in milliseconds.
  • misses number — Clicks that missed a target.
  • totalTimeMs number — Total run duration, in milliseconds.

Typing Test

typing-test

Test typing speed, accuracy, and consistency.

Ranking: Highest words per minute wins; accuracy, errors, correct characters, then record date break ties.

Score unit: WPM

details fields:

  • accuracyPercent number — Share of correctly typed characters, from 0 to 100.
  • correctCharacters number — Characters typed correctly.
  • durationSeconds number — Length of the typing run, in seconds.
  • errors number — Characters typed incorrectly.
  • wordsPerMinute number — Typing speed in words per minute.

Number Memory

number-memory

Remember increasingly long sequences of numbers.

Ranking: Highest score wins; life-loss performance, then record date break ties.

Score unit: points

details fields:

  • levelReached number — Highest level reached during the run.
  • lifeLossLevels number[] — Level at which each life was lost, in order.
  • score number — Final score, matching the ranked score value.

Clicks Per Second

clicks-per-second

Measure how many clicks you can perform each second.

Ranking: Highest clicks per second wins; total clicks, then record date break ties.

Score unit: CPS

details fields:

  • clicks number — Total clicks recorded during the run.
  • clicksPerSecond number — Clicks per second, rounded to one decimal.
  • durationSeconds number — Length of the clicking run, in seconds.

F1 Test

f1-test

React when the five start lights switch off.

Ranking: Lowest average reaction time wins.

Score unit: ms

details fields:

  • attemptsMs number[] — Reaction time of every start-light attempt in the ranked run.

Chimp Test

chimp-test

Memorize positions and recall them in the right order.

Ranking: Highest score wins; life-loss performance, then record date break ties.

Score unit: points

details fields:

  • levelReached number — Highest level reached during the run.
  • lifeLossLevels number[] — Level at which each life was lost, in order.
  • score number — Final score, matching the ranked score value.

Verbal Memory

verbal-memory

Recognize words you have seen before without mixing them up.

Ranking: Highest score wins; mistake scores, words seen, then record date break ties.

Score unit: points

details fields:

  • mistakeScores number[] — Score reached at each mistake, in order.
  • score number — Final score, matching the ranked score value.
  • wordsSeen number — Distinct words shown during the run.

Sequence Memory

sequence-memory

Repeat longer and longer visual sequences.

Ranking: Highest score wins; life-loss performance, then record date break ties.

Score unit: points

details fields:

  • levelReached number — Highest level reached during the run.
  • lifeLossLevels number[] — Level at which each life was lost, in order.
  • score number — Final score, matching the ranked score value.

Visual Memory

visual-memory

Recall the location of tiles after a short preview.

Ranking: Highest score wins; life-loss performance, then record date break ties.

Score unit: points

details fields:

  • levelReached number — Highest level reached during the run.
  • lifeLossLevels number[] — Level at which each life was lost, in order.
  • score number — Final score, matching the ranked score value.

Response schema

Leaderboard responses share the same envelope. The top 100 route returns entries; the world number one routes return a single leader instead.

Leaderboard response
FieldTypeDescription
game object Game id, display name, and canonical slug.
rankingRule string Exact score ordering and tie-break rule used for this game.
leaderboardUrl string Canonical human-readable leaderboard page to cite alongside the data.
updatedAt string ISO 8601 timestamp of when the response payload was generated.
generatedAt string Same timestamp as updatedAt, kept for consumers that expect it.
latestRecordAt string | null Newest record timestamp present in the result, or null when there is none.
entries object[] Ranked entries, up to 100. Returned by the top 100 endpoint only.
leader object | null The rank 1 entry. Returned by the world number one endpoints only.
Entry object
FieldTypeDescription
rank number Position in the ranking, starting at 1.
name string Public profile name.
country string | null Lowercase ISO 3166-1 alpha-2 country code, when the player shared one.
age number | null Player age in years, when the player shared it.
sex string | null male, female, or other, when the player shared it.
platform string Where the score was set: web, ios, or android.
recordedAt string | null ISO 8601 timestamp of the record itself.
score object Ranked score, described below.
details object Per-game breakdown of the run, documented in the games section.
Score object
FieldTypeDescription
score.value number Raw score used for ranking.
score.unit string Unit of the raw value, for example ms, WPM, or points.
score.label string Ready-to-display string combining the value and the unit.
  • details is the only part of an entry that changes shape between games. Its fields are documented per game in the games section.
  • Optional profile datacountry, age, and sex are null when the player chose not to share them.

Errors

Errors keep the JSON content type and carry a single error string.

404

Unknown game

The slug does not match any game id, slug, or alias.

Body
{
  "error": "Leaderboard not found."
}
503

Leaderboard unavailable

The data source could not be read. Sent with Cache-Control: no-store, so retrying a few seconds later is safe.

Body
{
  "error": "Leaderboard is temporarily unavailable."
}

Caching & fair use

A few things worth knowing before building on top of the API.

  • Caching — JSON responses are sent with public, max-age=60, s-maxage=300, stale-while-revalidate=86400, and leaderboard data is cached at the edge for 5 minutes. Polling faster than that returns the same payload.
  • Freshness — rankings change whenever a player beats a record, so read updatedAt instead of assuming a saved result is still current.
  • Methods — only GET is supported. There is no write API.
  • CORS — every JSON response sends Access-Control-Allow-Origin: *, so browser apps can call it directly.
  • Attribution — when you publish HumanRank numbers, link back to the leaderboardUrl of the response.
  • For AI assistantsllms.txt maps the site and its data sources, and https://humanrank.app/api returns these routes in machine-readable form.