MENU navbar-image

Introduction

This documentation aims to provide all the information you need to work with our API.

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_API_TOKEN}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

You can retrieve your token by visiting API Tokens in your dashboard.

Metadata

Fetch Platforms

Fetches all enabled platforms and their metadata.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/platforms" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/platforms';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/platforms"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/platforms'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
content-type: application/json
content-encoding: gzip
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 499
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "data": [
        {
            "slug": "steam",
            "name": "Steam",
            "start_date": "2014-07-30",
            "end_date": null
        }
    ]
}
 

Request      

GET api/platforms

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Fetch Tag Combos for Platform

Fetches all tag combos for the specified platform.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/platforms/steam/tag-combos?limit=2" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/platforms/steam/tag-combos';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/platforms/steam/tag-combos"
);

const params = {
    "limit": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/platforms/steam/tag-combos'
params = {
  'limit': '2',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 498
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 2
    },
    "data": [
        {
            "slug": "all-time~all-chars~amplified~deathless",
            "metric": "wins",
            "includes_wildcard": true,
            "includes_meme": true
        },
        {
            "slug": "all-time~all-chars~amplified~deathless~co-op",
            "metric": "wins",
            "includes_wildcard": true,
            "includes_meme": true
        }
    ]
}
 

Request      

GET api/platforms/{platform}/tag-combos

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

platform   string   

The slug of the platform. Example: steam

Query Parameters

includes_wildcard   boolean  optional  

Only fetches wildcard tag combos when true, and only fetches non wildcard tag combos when false.

includes_meme   boolean  optional  

Only fetches meme tag combos when true, and only fetches non meme tag combos when false.

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The slug of the tag combo to search for.

next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

Fetch Metrics for Platform

Fetches all enabled metrics and their metadata for the specified platform.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/platforms/steam/metrics?limit=2" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/platforms/steam/metrics';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/platforms/steam/metrics"
);

const params = {
    "limit": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/platforms/steam/metrics'
params = {
  'limit': '2',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 497
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 2
    },
    "data": [
        {
            "slug": "score",
            "name": "Score"
        },
        {
            "slug": "time",
            "name": "Time"
        }
    ]
}
 

Request      

GET api/platforms/{platform}/metrics

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

platform   string   

The slug of the platform. Example: steam

Query Parameters

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The slug of the metric to search for.

next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

Fetch Ranking Timeframes

Fetches all enabled ranking timeframes and their metadata.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/ranking-timeframes" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/ranking-timeframes';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/ranking-timeframes"
);

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/ranking-timeframes'
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):

Show headers
content-type: application/json
content-encoding: gzip
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 496
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "data": [
        {
            "slug": "all",
            "name": "All",
            "start_date": null,
            "end_date": null
        },
        {
            "slug": "past-6-months",
            "name": "Past 6 Months",
            "start_date": "2023-07-07",
            "end_date": "2024-01-07"
        },
        {
            "slug": "past-month",
            "name": "Past Month",
            "start_date": "2023-12-07",
            "end_date": "2024-01-07"
        },
        {
            "slug": "past-week",
            "name": "Past Week",
            "start_date": "2023-12-31",
            "end_date": "2024-01-07"
        },
        {
            "slug": "past-year",
            "name": "Past Year",
            "start_date": "2023-01-07",
            "end_date": "2024-01-07"
        }
    ]
}
 

Request      

GET api/ranking-timeframes

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

Leaderboards

Fetch Leaderboard Entries for Date

Fetch the entries for a leaderboard that is tied to a date.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/leaderboards/steam/daily~any-percent~cadence~amplified~normal~score~seeded~single-player~ost/2022-06-30/entries?limit=2" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/leaderboards/steam/daily~any-percent~cadence~amplified~normal~score~seeded~single-player~ost/2022-06-30/entries';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/leaderboards/steam/daily~any-percent~cadence~amplified~normal~score~seeded~single-player~ost/2022-06-30/entries"
);

const params = {
    "limit": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/leaderboards/steam/daily~any-percent~cadence~amplified~normal~score~seeded~single-player~ost/2022-06-30/entries'
params = {
  'limit': '2',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 493
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 2
    },
    "data": [
        {
            "user": [],
            "player_external_id": "76561198207378484",
            "username": "Ocre",
            "rank": 1,
            "metric": "29203",
            "metric_type": "score",
            "date": "2022-06-30",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "6",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "5",
                    "display_name": "End Zone"
                }
            ],
            "seed": "44832",
            "replay_id": 3900146047,
            "replay_metadata": [
                {
                    "name": "last_damage_source",
                    "value": "",
                    "display_name": "Last Damage Source"
                },
                {
                    "name": "replay_version",
                    "value": "94",
                    "display_name": "Replay Version"
                }
            ]
        },
        {
            "user": [],
            "player_external_id": "76561197997560639",
            "username": "Hellminthiasis",
            "rank": 2,
            "metric": "27867",
            "metric_type": "score",
            "date": "2022-06-30",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "6",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "5",
                    "display_name": "End Zone"
                }
            ],
            "seed": "44832",
            "replay_id": 3902609047,
            "replay_metadata": [
                {
                    "name": "last_damage_source",
                    "value": "",
                    "display_name": "Last Damage Source"
                },
                {
                    "name": "replay_version",
                    "value": "94",
                    "display_name": "Replay Version"
                }
            ]
        }
    ]
}
 

Request      

GET api/leaderboards/{platform}/{slug}/{date}/entries

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

platform   string   

The slug of the platform. Example: steam

slug   string   

The tag combo slug. Example: daily~any-percent~cadence~amplified~normal~score~seeded~single-player~ost

date   string   

The date of the leaderboard in a format of YYYY-MM-DD. Example: 2022-06-30

Query Parameters

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The player or user to search for.

next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

Fetch Leaderboard Entries for All Time

Fetch the entries for a leaderboard that is not tied to a date.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/leaderboards/steam/all-time~any-percent~cadence~amplified~normal~score~unseeded~single-player~ost/entries?limit=2" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/leaderboards/steam/all-time~any-percent~cadence~amplified~normal~score~unseeded~single-player~ost/entries';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/leaderboards/steam/all-time~any-percent~cadence~amplified~normal~score~unseeded~single-player~ost/entries"
);

const params = {
    "limit": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/leaderboards/steam/all-time~any-percent~cadence~amplified~normal~score~unseeded~single-player~ost/entries'
params = {
  'limit': '2',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 492
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 2
    },
    "data": [
        {
            "user": [],
            "player_external_id": "76561197995201379",
            "username": "dannyboy5600",
            "rank": 1,
            "metric": "99440",
            "metric_type": "score",
            "date": "2022-08-25",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "2",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "1",
                    "display_name": "End Zone"
                },
                {
                    "name": "gold_duplication",
                    "value": "no",
                    "display_name": "Gold Duplication"
                },
                {
                    "name": "killer_id",
                    "value": "Red Dragon",
                    "display_name": "Killer"
                },
                {
                    "name": "low_percent",
                    "value": "no",
                    "display_name": "Low Percent"
                },
                {
                    "name": "number_of_players",
                    "value": "1",
                    "display_name": "Number of Players"
                },
                {
                    "name": "raw_version",
                    "value": "17173394",
                    "display_name": "Raw Version"
                },
                {
                    "name": "version",
                    "value": "3.1.6-b2962",
                    "display_name": "Version"
                },
                {
                    "name": "victory",
                    "value": "no",
                    "display_name": "Victory"
                }
            ],
            "seed": null,
            "replay_id": null,
            "replay_metadata": []
        },
        {
            "user": [],
            "player_external_id": "76561198072415677",
            "username": "Aipexos",
            "rank": 2,
            "metric": "98715",
            "metric_type": "score",
            "date": "2024-01-04",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "1",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "1",
                    "display_name": "End Zone"
                },
                {
                    "name": "gold_duplication",
                    "value": "no",
                    "display_name": "Gold Duplication"
                },
                {
                    "name": "killer_id",
                    "value": "Light Minotaur",
                    "display_name": "Killer"
                },
                {
                    "name": "low_percent",
                    "value": "no",
                    "display_name": "Low Percent"
                },
                {
                    "name": "number_of_players",
                    "value": "1",
                    "display_name": "Number of Players"
                },
                {
                    "name": "raw_version",
                    "value": "118100769",
                    "display_name": "Raw Version"
                },
                {
                    "name": "version",
                    "value": "3.7.10-b4897",
                    "display_name": "Version"
                },
                {
                    "name": "victory",
                    "value": "no",
                    "display_name": "Victory"
                }
            ],
            "seed": null,
            "replay_id": null,
            "replay_metadata": []
        }
    ]
}
 

Request      

GET api/leaderboards/{platform}/{slug}/entries

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

platform   string   

The slug of the platform. Example: steam

slug   string   

The tag combo slug. Example: all-time~any-percent~cadence~amplified~normal~score~unseeded~single-player~ost

Query Parameters

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The player or user to search for.

next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

Rankings

Fetch Ranking Entries

Fetches ranking entries for the specified platform, slug, and timeframe.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/rankings/steam/all-time~any-percent/all/entries?limit=2" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/rankings/steam/all-time~any-percent/all/entries';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/rankings/steam/all-time~any-percent/all/entries"
);

const params = {
    "limit": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/rankings/steam/all-time~any-percent/all/entries'
params = {
  'limit': '2',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 495
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 2
    },
    "data": [
        {
            "user": [],
            "username": "TruthOrMare",
            "rank": 1,
            "points": "575915.3673626177",
            "leaderboard_entries_count": 7342,
            "sum_of_ranks": 252545,
            "first_place_ranks": 4770,
            "top_5_ranks": 5806,
            "top_10_ranks": 6206,
            "top_25_ranks": 6643,
            "top_50_ranks": 6901,
            "top_100_ranks": 7065,
            "lowest_rank": 27042,
            "metrics": [
                {
                    "metric": 403680.4320000001,
                    "points": 25032.407491516937,
                    "lowest_rank": 1963,
                    "metric_type": "time",
                    "top_5_ranks": 244,
                    "sum_of_ranks": 11291,
                    "top_10_ranks": 300,
                    "top_25_ranks": 388,
                    "top_50_ranks": 454,
                    "top_100_ranks": 487,
                    "first_place_ranks": 106,
                    "leaderboard_entries_count": 502
                },
                {
                    "metric": 3067310,
                    "points": 499172.42214048654,
                    "lowest_rank": 27042,
                    "metric_type": "score",
                    "top_5_ranks": 5035,
                    "sum_of_ranks": 229991,
                    "top_10_ranks": 5342,
                    "top_25_ranks": 5651,
                    "top_50_ranks": 5822,
                    "top_100_ranks": 5933,
                    "first_place_ranks": 4242,
                    "leaderboard_entries_count": 6176
                },
                {
                    "metric": 119,
                    "points": 51710.53773060954,
                    "lowest_rank": 1570,
                    "metric_type": "wins",
                    "top_5_ranks": 527,
                    "sum_of_ranks": 11263,
                    "top_10_ranks": 564,
                    "top_25_ranks": 604,
                    "top_50_ranks": 625,
                    "top_100_ranks": 645,
                    "first_place_ranks": 422,
                    "leaderboard_entries_count": 664
                }
            ]
        },
        {
            "user": [],
            "username": "philburt",
            "rank": 2,
            "points": "29594.30562995018",
            "leaderboard_entries_count": 758,
            "sum_of_ranks": 162405,
            "first_place_ranks": 19,
            "top_5_ranks": 307,
            "top_10_ranks": 426,
            "top_25_ranks": 549,
            "top_50_ranks": 604,
            "top_100_ranks": 654,
            "lowest_rank": 18486,
            "metrics": [
                {
                    "metric": 136,
                    "points": 1203.8339465698675,
                    "lowest_rank": 904,
                    "metric_type": "wins",
                    "top_5_ranks": 14,
                    "sum_of_ranks": 2653,
                    "top_10_ranks": 19,
                    "top_25_ranks": 21,
                    "top_50_ranks": 22,
                    "top_100_ranks": 25,
                    "first_place_ranks": 0,
                    "leaderboard_entries_count": 30
                },
                {
                    "metric": 293258.97900000005,
                    "points": 11683.893469344632,
                    "lowest_rank": 4930,
                    "metric_type": "time",
                    "top_5_ranks": 121,
                    "sum_of_ranks": 30921,
                    "top_10_ranks": 171,
                    "top_25_ranks": 223,
                    "top_50_ranks": 238,
                    "top_100_ranks": 257,
                    "first_place_ranks": 5,
                    "leaderboard_entries_count": 277
                },
                {
                    "metric": 2296209,
                    "points": 16706.578214035595,
                    "lowest_rank": 18486,
                    "metric_type": "score",
                    "top_5_ranks": 172,
                    "sum_of_ranks": 128831,
                    "top_10_ranks": 236,
                    "top_25_ranks": 305,
                    "top_50_ranks": 344,
                    "top_100_ranks": 372,
                    "first_place_ranks": 14,
                    "leaderboard_entries_count": 451
                }
            ]
        }
    ]
}
 

Request      

GET api/rankings/{platform}/{slug}/{timeframe}/entries

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

platform   string   

The slug of the platform. Example: steam

slug   string   

The tag combo slug. Example: all-time~any-percent

timeframe   string   

The slug of the timeframe. Example: all

Query Parameters

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The player or user to search for.

next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

rank   integer  optional  

The rank of a single entry to only return that record.

Fetch Leaderboard Entries for Ranking Entry

Fetches all leaderboard entries used in the calculation of the specified ranking entry.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/rankings/steam/all-time~any-percent/all/entries/1/leaderboards/1?rank=1&metric=score&limit=2&search=any-percent%2Ccadence" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/rankings/steam/all-time~any-percent/all/entries/1/leaderboards/1';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'rank' => '1',
            'metric' => 'score',
            'limit' => '2',
            'search' => 'any-percent,cadence',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/rankings/steam/all-time~any-percent/all/entries/1/leaderboards/1"
);

const params = {
    "rank": "1",
    "metric": "score",
    "limit": "2",
    "search": "any-percent,cadence",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/rankings/steam/all-time~any-percent/all/entries/1/leaderboards/1'
params = {
  'rank': '1',
  'metric': 'score',
  'limit': '2',
  'search': 'any-percent,cadence',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 494
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": [],
    "data": []
}
 

Request      

GET api/rankings/{platform}/{slug}/{timeframe}/entries/{rank}/leaderboards/{metric}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

platform   string   

The slug of the platform. Example: steam

slug   string   

The tag combo slug. Example: all-time~any-percent

timeframe   string   

The slug of the timeframe. Example: all

Query Parameters

rank   integer   

The rank of the ranking entry to fetch leaderboards for. Example: 1

metric   string   

The slug of metric. Example: score

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The tags to search for separated by a comma.

Example: `any-percent,cadence`
next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

end_rank   integer  optional  

The highest rank of leaderboard entries to fetch. Must be greater than 0.

Users

Fetch PBs for the specified User

Fetch all PBs for a registered user.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/pbs/steam?limit=2&search=any-percent%2Ccadence" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/pbs/steam';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
            'search' => 'any-percent,cadence',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/pbs/steam"
);

const params = {
    "limit": "2",
    "search": "any-percent,cadence",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/pbs/steam'
params = {
  'limit': '2',
  'search': 'any-percent,cadence',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 491
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 6008968335
    },
    "data": [
        {
            "slug": "all-time~any-percent~cadence~synchrony-amplified~normal~score~unseeded~single-player~ost",
            "rank": 764,
            "leaderboard_entry_rank": 765,
            "metric": "7573",
            "metric_type": "score",
            "date": "2024-01-02",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "5",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "5",
                    "display_name": "End Zone"
                },
                {
                    "name": "gold_duplication",
                    "value": "no",
                    "display_name": "Gold Duplication"
                },
                {
                    "name": "killer_id",
                    "value": "Nothing!",
                    "display_name": "Killer"
                },
                {
                    "name": "low_percent",
                    "value": "no",
                    "display_name": "Low Percent"
                },
                {
                    "name": "number_of_players",
                    "value": "1",
                    "display_name": "Number of Players"
                },
                {
                    "name": "raw_version",
                    "value": "118100769",
                    "display_name": "Raw Version"
                },
                {
                    "name": "version",
                    "value": "3.7.10-b4897",
                    "display_name": "Version"
                },
                {
                    "name": "victory",
                    "value": "yes",
                    "display_name": "Victory"
                }
            ],
            "seed": null,
            "replay_id": null,
            "replay_metadata": []
        },
        {
            "slug": "all-time~any-percent~cadence~synchrony-amplified~normal~speed~seeded~single-player~ost",
            "rank": 3,
            "leaderboard_entry_rank": 4,
            "metric": "331.416",
            "metric_type": "time",
            "date": "2022-12-16",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "5",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "5",
                    "display_name": "End Zone"
                },
                {
                    "name": "gold_duplication",
                    "value": "no",
                    "display_name": "Gold Duplication"
                },
                {
                    "name": "killer_id",
                    "value": "Nothing!",
                    "display_name": "Killer"
                },
                {
                    "name": "low_percent",
                    "value": "no",
                    "display_name": "Low Percent"
                },
                {
                    "name": "number_of_players",
                    "value": "1",
                    "display_name": "Number of Players"
                },
                {
                    "name": "raw_version",
                    "value": "50597347",
                    "display_name": "Raw Version"
                },
                {
                    "name": "version",
                    "value": "3.3.4-b3555",
                    "display_name": "Version"
                },
                {
                    "name": "victory",
                    "value": "yes",
                    "display_name": "Victory"
                }
            ],
            "seed": null,
            "replay_id": null,
            "replay_metadata": []
        }
    ]
}
 

Request      

GET api/users/{id}/pbs/{platform}

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   uuid   

The ID of the user. Example: 52735c47-b6c6-46fe-9962-b438496f5647

platform   string   

The slug of the platform. Example: steam

Query Parameters

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The tags to search for separated by a comma.

Example: `any-percent,cadence`
next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

Fetch leaderboard entries for the specified User

Fetch all leaderboard entries for a registered user.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/leaderboards/steam/entries?limit=2&search=any-percent%2Ccadence" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/leaderboards/steam/entries';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
            'search' => 'any-percent,cadence',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/leaderboards/steam/entries"
);

const params = {
    "limit": "2",
    "search": "any-percent,cadence",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/leaderboards/steam/entries'
params = {
  'limit': '2',
  'search': 'any-percent,cadence',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 490
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 2
    },
    "data": [
        {
            "slug": "all-time~any-percent~cadence~synchrony-amplified~normal~speed~seeded~single-player~ost",
            "rank": 4,
            "metric": "331.416",
            "metric_type": "time",
            "date": "2022-12-16",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "5",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "5",
                    "display_name": "End Zone"
                },
                {
                    "name": "gold_duplication",
                    "value": "no",
                    "display_name": "Gold Duplication"
                },
                {
                    "name": "killer_id",
                    "value": "Nothing!",
                    "display_name": "Killer"
                },
                {
                    "name": "low_percent",
                    "value": "no",
                    "display_name": "Low Percent"
                },
                {
                    "name": "number_of_players",
                    "value": "1",
                    "display_name": "Number of Players"
                },
                {
                    "name": "raw_version",
                    "value": "50597347",
                    "display_name": "Raw Version"
                },
                {
                    "name": "version",
                    "value": "3.3.4-b3555",
                    "display_name": "Version"
                },
                {
                    "name": "victory",
                    "value": "yes",
                    "display_name": "Victory"
                }
            ],
            "seed": null,
            "replay_id": null,
            "replay_metadata": []
        },
        {
            "slug": "all-time~any-percent~cadence~amplified~mystery~speed~unseeded~single-player~ost",
            "rank": 5,
            "metric": "517.1",
            "metric_type": "time",
            "date": "2019-10-16",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "6",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "5",
                    "display_name": "End Zone"
                }
            ],
            "seed": "6336765",
            "replay_id": 1000289418,
            "replay_metadata": [
                {
                    "name": "last_damage_source",
                    "value": "BLACK SKELETON KNIGHT",
                    "display_name": "Last Damage Source"
                },
                {
                    "name": "replay_version",
                    "value": "94",
                    "display_name": "Replay Version"
                }
            ]
        }
    ]
}
 

Request      

GET api/users/{id}/leaderboards/{platform}/entries

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   uuid   

The ID of the user. Example: 52735c47-b6c6-46fe-9962-b438496f5647

platform   string   

The slug of the platform. Example: steam

Query Parameters

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The tags to search for separated by a comma.

Example: `any-percent,cadence`
next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

Fetch Unsubmitted Leaderboards for User

Fetch all leaderboards that the specified user has not submitted an entry for.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/leaderboards/steam/unsubmitted?limit=2&search=any-percent%2Ccadence&next=0" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/leaderboards/steam/unsubmitted';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
            'search' => 'any-percent,cadence',
            'next' => '0',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/leaderboards/steam/unsubmitted"
);

const params = {
    "limit": "2",
    "search": "any-percent,cadence",
    "next": "0",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/leaderboards/steam/unsubmitted'
params = {
  'limit': '2',
  'search': 'any-percent,cadence',
  'next': '0',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 489
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 2
    },
    "data": [
        {
            "slug": "all-time~any-percent~cadence~amplified~hard~score~seeded~co-op~custom",
            "end_rank": 5,
            "metric_type": "score",
            "metric_total": "3341"
        },
        {
            "slug": "all-time~any-percent~cadence~amplified~hard~score~seeded~co-op~ost",
            "end_rank": 79,
            "metric_type": "score",
            "metric_total": "173954"
        }
    ]
}
 

Request      

GET api/users/{id}/leaderboards/{platform}/unsubmitted

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   uuid   

The ID of the user. Example: 52735c47-b6c6-46fe-9962-b438496f5647

platform   string   

The slug of the platform. Example: steam

Query Parameters

limit   integer   

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string   

The tags to search for separated by a comma.

Example: `any-percent,cadence`
next   integer   

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0. Example: 0

Fetch Ranking Entries for the Specified User

Fetch all ranking entries for a registered user and a specified timeframe.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/rankings/steam/all/entries?limit=2&search=any-percent%2Ccadence" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/rankings/steam/all/entries';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
            'search' => 'any-percent,cadence',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/rankings/steam/all/entries"
);

const params = {
    "limit": "2",
    "search": "any-percent,cadence",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/users/52735c47-b6c6-46fe-9962-b438496f5647/rankings/steam/all/entries'
params = {
  'limit': '2',
  'search': 'any-percent,cadence',
}
headers = {
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 488
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 2
    },
    "data": [
        {
            "slug": "all-time~any-percent~cadence~normal~speed~seeded~single-player~ost",
            "rank": 4,
            "points": "105.438680146868",
            "leaderboard_entries_count": 3,
            "sum_of_ranks": 45,
            "first_place_ranks": 0,
            "top_5_ranks": 1,
            "top_10_ranks": 2,
            "top_25_ranks": 2,
            "top_50_ranks": 3,
            "top_100_ranks": 3,
            "lowest_rank": 32,
            "metrics": [
                {
                    "metric": 910.409,
                    "points": 105.438680146868,
                    "lowest_rank": 32,
                    "metric_type": "time",
                    "top_5_ranks": 1,
                    "sum_of_ranks": 45,
                    "top_10_ranks": 2,
                    "top_25_ranks": 2,
                    "top_50_ranks": 3,
                    "top_100_ranks": 3,
                    "first_place_ranks": 0,
                    "leaderboard_entries_count": 3
                }
            ]
        },
        {
            "slug": "all-time~any-percent~cadence~amplified~speed~unseeded~single-player~ost",
            "rank": 6,
            "points": "170.075504259145",
            "leaderboard_entries_count": 6,
            "sum_of_ranks": 91,
            "first_place_ranks": 0,
            "top_5_ranks": 1,
            "top_10_ranks": 2,
            "top_25_ranks": 5,
            "top_50_ranks": 6,
            "top_100_ranks": 6,
            "lowest_rank": 29,
            "metrics": [
                {
                    "metric": 2749.2569999999996,
                    "points": 170.075504259145,
                    "lowest_rank": 29,
                    "metric_type": "time",
                    "top_5_ranks": 1,
                    "sum_of_ranks": 91,
                    "top_10_ranks": 2,
                    "top_25_ranks": 5,
                    "top_50_ranks": 6,
                    "top_100_ranks": 6,
                    "first_place_ranks": 0,
                    "leaderboard_entries_count": 6
                }
            ]
        }
    ]
}
 

Request      

GET api/users/{id}/rankings/{platform}/{timeframe}/entries

Headers

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

id   uuid   

The ID of the user. Example: 52735c47-b6c6-46fe-9962-b438496f5647

platform   string   

The slug of the platform. Example: steam

timeframe   string   

The slug of the timeframe. Example: all

Query Parameters

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The tags to search for separated by a comma.

Example: `any-percent,cadence`
next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

Me

Fetch PBs for Me

requires authentication

Fetch all PBs for the currently authenticated User.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/me/pbs/steam?limit=2&search=any-percent%2Ccadence" \
    --header "Authorization: Bearer {YOUR_API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/me/pbs/steam';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
            'search' => 'any-percent,cadence',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/me/pbs/steam"
);

const params = {
    "limit": "2",
    "search": "any-percent,cadence",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/me/pbs/steam'
params = {
  'limit': '2',
  'search': 'any-percent,cadence',
}
headers = {
  'Authorization': 'Bearer {YOUR_API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 499
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 6008968335
    },
    "data": [
        {
            "slug": "all-time~any-percent~cadence~synchrony-amplified~normal~score~unseeded~single-player~ost",
            "rank": 764,
            "leaderboard_entry_rank": 765,
            "metric": "7573",
            "metric_type": "score",
            "date": "2024-01-02",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "5",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "5",
                    "display_name": "End Zone"
                },
                {
                    "name": "gold_duplication",
                    "value": "no",
                    "display_name": "Gold Duplication"
                },
                {
                    "name": "killer_id",
                    "value": "Nothing!",
                    "display_name": "Killer"
                },
                {
                    "name": "low_percent",
                    "value": "no",
                    "display_name": "Low Percent"
                },
                {
                    "name": "number_of_players",
                    "value": "1",
                    "display_name": "Number of Players"
                },
                {
                    "name": "raw_version",
                    "value": "118100769",
                    "display_name": "Raw Version"
                },
                {
                    "name": "version",
                    "value": "3.7.10-b4897",
                    "display_name": "Version"
                },
                {
                    "name": "victory",
                    "value": "yes",
                    "display_name": "Victory"
                }
            ],
            "seed": null,
            "replay_id": null,
            "replay_metadata": []
        },
        {
            "slug": "all-time~any-percent~cadence~synchrony-amplified~normal~speed~seeded~single-player~ost",
            "rank": 3,
            "leaderboard_entry_rank": 4,
            "metric": "331.416",
            "metric_type": "time",
            "date": "2022-12-16",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "5",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "5",
                    "display_name": "End Zone"
                },
                {
                    "name": "gold_duplication",
                    "value": "no",
                    "display_name": "Gold Duplication"
                },
                {
                    "name": "killer_id",
                    "value": "Nothing!",
                    "display_name": "Killer"
                },
                {
                    "name": "low_percent",
                    "value": "no",
                    "display_name": "Low Percent"
                },
                {
                    "name": "number_of_players",
                    "value": "1",
                    "display_name": "Number of Players"
                },
                {
                    "name": "raw_version",
                    "value": "50597347",
                    "display_name": "Raw Version"
                },
                {
                    "name": "version",
                    "value": "3.3.4-b3555",
                    "display_name": "Version"
                },
                {
                    "name": "victory",
                    "value": "yes",
                    "display_name": "Victory"
                }
            ],
            "seed": null,
            "replay_id": null,
            "replay_metadata": []
        }
    ]
}
 

Request      

GET api/me/pbs/{platform}

Headers

Authorization      

Example: Bearer {YOUR_API_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

platform   string   

The slug of the platform. Example: steam

Query Parameters

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The tags to search for separated by a comma.

Example: `any-percent,cadence`
next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

Fetch Leaderboard Entries for Me

requires authentication

Fetch all leaderboard entries for the currently authenticated User.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/me/leaderboards/steam/entries?limit=2&search=any-percent%2Ccadence" \
    --header "Authorization: Bearer {YOUR_API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/me/leaderboards/steam/entries';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
            'search' => 'any-percent,cadence',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/me/leaderboards/steam/entries"
);

const params = {
    "limit": "2",
    "search": "any-percent,cadence",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/me/leaderboards/steam/entries'
params = {
  'limit': '2',
  'search': 'any-percent,cadence',
}
headers = {
  'Authorization': 'Bearer {YOUR_API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 498
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 2
    },
    "data": [
        {
            "slug": "all-time~any-percent~cadence~synchrony-amplified~normal~speed~seeded~single-player~ost",
            "rank": 4,
            "metric": "331.416",
            "metric_type": "time",
            "date": "2022-12-16",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "5",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "5",
                    "display_name": "End Zone"
                },
                {
                    "name": "gold_duplication",
                    "value": "no",
                    "display_name": "Gold Duplication"
                },
                {
                    "name": "killer_id",
                    "value": "Nothing!",
                    "display_name": "Killer"
                },
                {
                    "name": "low_percent",
                    "value": "no",
                    "display_name": "Low Percent"
                },
                {
                    "name": "number_of_players",
                    "value": "1",
                    "display_name": "Number of Players"
                },
                {
                    "name": "raw_version",
                    "value": "50597347",
                    "display_name": "Raw Version"
                },
                {
                    "name": "version",
                    "value": "3.3.4-b3555",
                    "display_name": "Version"
                },
                {
                    "name": "victory",
                    "value": "yes",
                    "display_name": "Victory"
                }
            ],
            "seed": null,
            "replay_id": null,
            "replay_metadata": []
        },
        {
            "slug": "all-time~any-percent~cadence~amplified~mystery~speed~unseeded~single-player~ost",
            "rank": 5,
            "metric": "517.1",
            "metric_type": "time",
            "date": "2019-10-16",
            "pb_metadata": [
                {
                    "name": "end_level",
                    "value": "6",
                    "display_name": "End Level"
                },
                {
                    "name": "end_zone",
                    "value": "5",
                    "display_name": "End Zone"
                }
            ],
            "seed": "6336765",
            "replay_id": 1000289418,
            "replay_metadata": [
                {
                    "name": "last_damage_source",
                    "value": "BLACK SKELETON KNIGHT",
                    "display_name": "Last Damage Source"
                },
                {
                    "name": "replay_version",
                    "value": "94",
                    "display_name": "Replay Version"
                }
            ]
        }
    ]
}
 

Request      

GET api/me/leaderboards/{platform}/entries

Headers

Authorization      

Example: Bearer {YOUR_API_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

platform   string   

The slug of the platform. Example: steam

Query Parameters

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The tags to search for separated by a comma.

Example: `any-percent,cadence`
next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

Fetch Unsubmitted Leaderboards for Me

requires authentication

Fetch all leaderboards that the currently authenticated user has not submitted an entry for.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/me/leaderboards/steam/unsubmitted?limit=2&search=any-percent%2Ccadence" \
    --header "Authorization: Bearer {YOUR_API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/me/leaderboards/steam/unsubmitted';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
            'search' => 'any-percent,cadence',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/me/leaderboards/steam/unsubmitted"
);

const params = {
    "limit": "2",
    "search": "any-percent,cadence",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/me/leaderboards/steam/unsubmitted'
params = {
  'limit': '2',
  'search': 'any-percent,cadence',
}
headers = {
  'Authorization': 'Bearer {YOUR_API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 497
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 2
    },
    "data": [
        {
            "slug": "all-time~any-percent~cadence~amplified~hard~score~seeded~co-op~custom",
            "end_rank": 5,
            "metric_type": "score",
            "metric_total": "3341"
        },
        {
            "slug": "all-time~any-percent~cadence~amplified~hard~score~seeded~co-op~ost",
            "end_rank": 79,
            "metric_type": "score",
            "metric_total": "173954"
        }
    ]
}
 

Request      

GET api/me/leaderboards/{platform}/unsubmitted

Headers

Authorization      

Example: Bearer {YOUR_API_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

platform   string   

The slug of the platform. Example: steam

Query Parameters

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The tags to search for separated by a comma.

Example: `any-percent,cadence`
next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.

Fetch Ranking Entries for Me

requires authentication

Fetch all ranking entries for the currently authenticated User.

Example request:
curl --request GET \
    --get "https://www.necrolab.com/api/me/rankings/steam/all/entries?limit=2&search=any-percent%2Ccadence" \
    --header "Authorization: Bearer {YOUR_API_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
$client = new \GuzzleHttp\Client();
$url = 'https://www.necrolab.com/api/me/rankings/steam/all/entries';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_API_TOKEN}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'limit' => '2',
            'search' => 'any-percent,cadence',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
const url = new URL(
    "https://www.necrolab.com/api/me/rankings/steam/all/entries"
);

const params = {
    "limit": "2",
    "search": "any-percent,cadence",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_API_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
import requests
import json

url = 'https://www.necrolab.com/api/me/rankings/steam/all/entries'
params = {
  'limit': '2',
  'search': 'any-percent,cadence',
}
headers = {
  'Authorization': 'Bearer {YOUR_API_TOKEN}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):

Show headers
content-type: application/json
cache-control: no-cache, private
x-ratelimit-limit: 500
x-ratelimit-remaining: 496
access-control-allow-origin: *
access-control-expose-headers: x-inertia
 

{
    "cursors": {
        "next": 2
    },
    "data": [
        {
            "slug": "all-time~any-percent~cadence~normal~speed~seeded~single-player~ost",
            "rank": 4,
            "points": "105.438680146868",
            "leaderboard_entries_count": 3,
            "sum_of_ranks": 45,
            "first_place_ranks": 0,
            "top_5_ranks": 1,
            "top_10_ranks": 2,
            "top_25_ranks": 2,
            "top_50_ranks": 3,
            "top_100_ranks": 3,
            "lowest_rank": 32,
            "metrics": [
                {
                    "metric": 910.409,
                    "points": 105.438680146868,
                    "lowest_rank": 32,
                    "metric_type": "time",
                    "top_5_ranks": 1,
                    "sum_of_ranks": 45,
                    "top_10_ranks": 2,
                    "top_25_ranks": 2,
                    "top_50_ranks": 3,
                    "top_100_ranks": 3,
                    "first_place_ranks": 0,
                    "leaderboard_entries_count": 3
                }
            ]
        },
        {
            "slug": "all-time~any-percent~cadence~amplified~speed~unseeded~single-player~ost",
            "rank": 6,
            "points": "170.075504259145",
            "leaderboard_entries_count": 6,
            "sum_of_ranks": 91,
            "first_place_ranks": 0,
            "top_5_ranks": 1,
            "top_10_ranks": 2,
            "top_25_ranks": 5,
            "top_50_ranks": 6,
            "top_100_ranks": 6,
            "lowest_rank": 29,
            "metrics": [
                {
                    "metric": 2749.2569999999996,
                    "points": 170.075504259145,
                    "lowest_rank": 29,
                    "metric_type": "time",
                    "top_5_ranks": 1,
                    "sum_of_ranks": 91,
                    "top_10_ranks": 2,
                    "top_25_ranks": 5,
                    "top_50_ranks": 6,
                    "top_100_ranks": 6,
                    "first_place_ranks": 0,
                    "leaderboard_entries_count": 6
                }
            ]
        }
    ]
}
 

Request      

GET api/me/rankings/{platform}/{timeframe}/entries

Headers

Authorization      

Example: Bearer {YOUR_API_TOKEN}

Content-Type      

Example: application/json

Accept      

Example: application/json

URL Parameters

platform   string   

The slug of the platform. Example: steam

timeframe   string   

The slug of the timeframe. Example: all

Query Parameters

limit   integer  optional  

How many records to return per page. Must be between 1 and 10000. Defaults to 25. Example: 2

search   string  optional  

The tags to search for separated by a comma.

Example: `any-percent,cadence`
next   integer  optional  

The cursor value to fetch the next page. Can be found in the cursors index of a response. Must be at least 0.