Skip to main content

Overview

RaidHub provides multiple types of leaderboards to rank players and teams across various categories. These leaderboards allow you to find top performers, search for specific players, and track competitive rankings.

Leaderboard Types

Individual Global

Rankings across all raids (clears, fresh clears, sherpas, time played, speed)

Individual Raid

Rankings for specific raids (clears, fresh clears, sherpas)

Individual Pantheon

Rankings for specific Pantheon versions (clears, fresh clears, score)

Team Contest

World first race rankings for contest mode completions

Team First

First clear leaderboards for specific activity versions

Clan

Clan rankings based on various metrics

Individual Global Leaderboards

Global leaderboards rank players across all raid activities.

Available Categories

  • clears - Total raid completions
  • freshClears - Total fresh raid completions
  • sherpas - Total sherpa runs (carrying first-timers)
  • timeInRaids - Total time spent in raids
  • speed - Sum of best times across all raids
  • contest - World first race score

Querying Global Leaderboards

# Get top 50 players by total clears
curl "https://api.raid.report/v2/leaderboard/individual/global/clears?page=1&count=50"

# Search for a specific player on the leaderboard
curl "https://api.raid.report/v2/leaderboard/individual/global/clears?search=4611686018484930134&count=25"

Global Leaderboard Parameters

category
string
required
Leaderboard category: clears, freshClears, sherpas, timeInRaids, speed, or contest
page
integer
default:"1"
Page number (1-indexed)
count
integer
default:"50"
Number of entries per page (10-100)
Membership ID to search for. Returns entries centered around the player’s rank.

Example Response

{
  "type": "individual",
  "format": "numerical",
  "page": 1,
  "count": 50,
  "entries": [
    {
      "rank": 1,
      "value": 15234,
      "playerInfo": {
        "membershipId": "4611686018484930134",
        "membershipType": 3,
        "displayName": "TopPlayer",
        "bungieGlobalDisplayName": "TopPlayer",
        "bungieGlobalDisplayNameCode": 1234
      }
    }
  ]
}

Individual Raid Leaderboards

Raid-specific leaderboards rank players within a single raid activity.

Available Categories

  • clears - Total completions of the raid
  • freshClears - Fresh completions only
  • sherpas - Sherpa runs

Querying Raid Leaderboards

# Get top players for Last Wish by clears
curl "https://api.raid.report/v2/leaderboard/individual/raid/last-wish/clears?page=1&count=50"

# Get top players for Root of Nightmares by fresh clears
curl "https://api.raid.report/v2/leaderboard/individual/raid/root-of-nightmares/freshClears?page=1&count=50"

Common Raid Slugs

  • last-wish
  • garden-of-salvation
  • deep-stone-crypt
  • vault-of-glass
  • vow-of-the-disciple
  • kings-fall
  • root-of-nightmares
  • crotas-end
  • salvations-edge
Raid slugs are lowercase with hyphens. If unsure of the slug, check the RaidHub website or API documentation.

Individual Pantheon Leaderboards

Pantheon leaderboards rank players for specific Pantheon versions.

Available Categories

  • clears - Total completions
  • freshClears - Fresh completions
  • score - Highest score achieved

Querying Pantheon Leaderboards

curl "https://api.raid.report/v2/leaderboard/individual/pantheon/atraks-sovereign/score?page=1&count=50"

Team Contest Leaderboards

Team contest leaderboards rank teams that completed the raid during the official contest period (typically 24-48 hours after raid launch).

Querying Team Contest Leaderboards

curl "https://api.raid.report/v2/leaderboard/team/contest/salvations-edge?page=1&count=50"

Team Leaderboard Response

{
  "type": "team",
  "format": "duration",
  "page": 1,
  "count": 50,
  "entries": [
    {
      "rank": 1,
      "value": 15234,
      "instanceId": "12345678901234567",
      "players": [
        {
          "membershipId": "4611686018484930134",
          "membershipType": 3,
          "displayName": "Player1"
        }
      ]
    }
  ]
}
The value field for team leaderboards represents completion time in seconds. The format field indicates this is a duration-based leaderboard.

Team First Leaderboards

These leaderboards show the first teams to complete a specific activity version, regardless of whether it was during contest mode.

Querying Team First Leaderboards

curl "https://api.raid.report/v2/leaderboard/team/first/100/1?page=1&count=50"

Clan Leaderboards

Clan leaderboards rank Destiny 2 clans based on various metrics.

Available Columns

  • weighted_contest_score (default) - Contest performance score
  • Other clan-specific metrics

Querying Clan Leaderboards

curl "https://api.raid.report/v2/leaderboard/clan?page=1&count=50&column=weighted_contest_score"

Clan Leaderboard Parameters

page
integer
default:"1"
Page number (1-indexed)
count
integer
default:"50"
Number of entries per page (10-100)
column
string
default:"weighted_contest_score"
Sort column for clan rankings

Pagination

All leaderboards use page-based pagination.

How Pagination Works

1

Request a page

Specify page (1-indexed) and count (entries per page)
2

Calculate offset

The API calculates offset as (page - 1) * count
3

Receive entries

Get up to count entries starting from the calculated offset
4

Navigate pages

Increment page to get the next set of results

Pagination Example

// Get first 3 pages of a leaderboard
async function getMultiplePages(category, totalPages = 3) {
  const allEntries = [];
  
  for (let page = 1; page <= totalPages; page++) {
    const response = await fetch(
      `https://api.raid.report/v2/leaderboard/individual/global/${category}?page=${page}&count=50`
    );
    const data = await response.json();
    allEntries.push(...data.entries);
  }
  
  return allEntries;
}

const topPlayers = await getMultiplePages('clears', 5);
console.log(`Got ${topPlayers.length} total entries`);

Searching for Players

When using the search parameter with a membership ID, the API returns entries centered around the player’s rank.

Search Behavior

// Search returns entries around the player's position
const response = await fetch(
  `https://api.raid.report/v2/leaderboard/individual/global/clears?search=${membershipId}&count=25`
);
const data = await response.json();

// The response includes:
// - ~12 players ranked above the searched player
// - The searched player
// - ~12 players ranked below the searched player
// This gives context about where the player ranks

const searchedPlayer = data.entries.find(
  entry => entry.playerInfo.membershipId === membershipId
);

console.log(`Player rank: ${searchedPlayer.rank}`);
console.log(`Player value: ${searchedPlayer.value}`);
console.log(`Page: ${data.page}`);
If the player is not on the leaderboard, you’ll receive a 404 PlayerNotOnLeaderboardError.

Understanding Response Formats

Leaderboards return different formats based on the type of data:
Used for count-based leaderboards (clears, sherpas, etc.)
{
  "type": "individual",
  "format": "numerical",
  "entries": [
    {
      "rank": 1,
      "value": 15234  // Number of clears, sherpas, etc.
    }
  ]
}

Common Use Cases

Finding Top Players in a Raid

const raidSlug = 'salvations-edge';
const response = await fetch(
  `https://api.raid.report/v2/leaderboard/individual/raid/${raidSlug}/clears?page=1&count=10`
);
const leaderboard = await response.json();

leaderboard.entries.forEach((entry, index) => {
  console.log(`${index + 1}. ${entry.playerInfo.displayName} - ${entry.value} clears`);
});

Checking a Player’s Global Rank

const membershipId = '4611686018484930134';
const response = await fetch(
  `https://api.raid.report/v2/leaderboard/individual/global/clears?search=${membershipId}&count=25`
);
const data = await response.json();

const player = data.entries.find(
  entry => entry.playerInfo.membershipId === membershipId
);

if (player) {
  console.log(`Global Rank: #${player.rank}`);
  console.log(`Total Clears: ${player.value}`);
}

Viewing World First Teams

const raidSlug = 'salvations-edge';
const response = await fetch(
  `https://api.raid.report/v2/leaderboard/team/contest/${raidSlug}?page=1&count=5`
);
const leaderboard = await response.json();

leaderboard.entries.forEach(entry => {
  const hours = Math.floor(entry.value / 3600);
  const minutes = Math.floor((entry.value % 3600) / 60);
  console.log(`Rank ${entry.rank}: ${hours}h ${minutes}m`);
  console.log('Team:', entry.players.map(p => p.displayName).join(', '));
});

Error Handling

404 - PlayerNotOnLeaderboardError
error
The searched player does not appear on this leaderboard
404 - RaidNotFoundError
error
The specified raid slug is invalid
404 - PantheonVersionNotFoundError
error
The specified Pantheon version is invalid

Best Practices

Cache Leaderboards

Leaderboards are cached for 15 seconds server-side. Cache on your end too.

Use Appropriate Count

Request only the number of entries you need to reduce response size

Handle 404s

Not all players appear on all leaderboards - handle NotOnLeaderboardError

Check Format Field

Use the format field to properly display values (duration vs numerical)

Player Data

Get detailed player profiles and statistics

Instance Data

View details of specific raid completions

Build docs developers (and LLMs) love