Game API
The endpoints the Krunker client reads without any authentication
These are the endpoints the game itself calls without a developer key and without a player token: the social popup, the clan window, Turf Wars, the market tab, the shop, the matchmaker and the two legacy browsers. Nothing here is documented by Krunker. Every endpoint, parameter and field below was taken from the game's client code and confirmed with a plain, unauthenticated GET in October 2026. All of it can change without notice.
In krapio these live under krunker.game.*, grouped by resource. Everything is read only: every write the game makes (follows, posts, purchases, listings, trades, clan management) needs the player's own token and is not part of this library.
Hosts and envelopes
| Host | Used by | Reply shape |
|---|---|---|
https://gapi.svc.krunker.io | everything unless noted | {"data": ..., "error": null}; an error is {"error": {"code", "message"}} on a 404 or {"error": "text"} on a 400 |
https://matchmaker.krunker.io | matchmaker.* | plain JSON, no envelope |
https://api.krunker.io | legacy.* | plain JSON, streams/top wraps in {"data"} |
krapio unwraps the envelope, you get data. A non-null error on a 2xx (never seen, but the game checks for it) throws KrunkerError.
Rate limits. gapi.svc.krunker.io sends X-RateLimit-Limit: 5, X-RateLimit-Remaining and X-RateLimit-Reset on every reply: a window of 5 requests per second per endpoint, with X-RateLimit-Reset as seconds until the window ends (not a unix timestamp like the developer API). krapio waits out an empty window instead of refusing, since it is over within a second. The matchmaker and api.krunker.io send no rate limit headers.
Names. Player and clan name lookups are case-insensitive. Names go url-encoded into the path.
Players
The social profile popup and its tabs.
Get Player
krunker.game.players.get(playerName)
The flat legacy profile the social popup renders. 404 PLAYERS_NOT_FOUND for an unknown name.
player_stats is a packed blob with short keys. The developer API's player profile has the same numbers under full names.
| Key | Meaning |
|---|---|
| s, h, hs, ls, wb | shots, hits, headshots, legshots, wallbangs |
| mk, fk, tmk | melee kills, fist kills (beatdowns), thrown weapon kills (bullseyes) |
| ast, n, ad, sad | assists, nukes, airdrops, airdrops stolen |
| sl, wm | slimes, warmachines |
| flg | country flag index |
| hds | 1 when the profile hides details |
| c0 to c15 | score per class |
raid_stats rows are {map_id, completions, attempts, best_time, ai_kills, boss_kills, deaths}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
playerName | string | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
player_id | number | |
player_name | string | |
player_clan | string | absent without a clan |
clan_id | number | |
player_twitchname | string | |
player_region | number | |
player_badge | string | comma separated badge ids |
player_titles | string | comma separated title ids |
player_datenew | string | "YYYY-MM-DD HH:MM:SS" |
player_featured | number | |
player_funds | number | kr |
player_skinvalue | number | |
player_elo | number | |
player_elo2 | number | |
player_elo4 | string | junk rating, a decimal as text |
player_premium | number | |
player_kills | number | |
player_deaths | number | |
player_wins | number | |
player_games_played | number | |
player_score | number | |
player_timeplayed | number | seconds |
player_following | number | |
player_followed | number | |
player_chal | number | |
player_infected | number | |
player_jobrating | number | |
player_jobratingpositive | number | |
player_calls | number | |
player_taggedaccounts | number | |
player_stats | object | the packed stats blob of a social profile, the developer api's profile has the same numbers under full names |
player_stats.s | number | shots |
player_stats.h | number | hits |
player_stats.hs | number | headshots |
player_stats.ls | number | legshots |
player_stats.wb | number | wallbangs |
player_stats.mk | number | melee kills |
player_stats.fk | number | fist kills (beatdowns) |
player_stats.tmk | number | thrown weapon kills (bullseyes) |
player_stats.ast | number | assists |
player_stats.n | number | nukes |
player_stats.ad | number | airdrops |
player_stats.sad | number | airdrops stolen |
player_stats.sl | number | slimes |
player_stats.wm | number | warmachines |
player_stats.flg | number | country flag index |
player_stats.hds | number | 1 when the profile hides details |
player_stats.c0 | number | score per class, c0 to c15 |
player_stats.c1 | number | score with class 1 |
player_stats.c2 | number | score with class 2 |
player_stats.c3 | number | score with class 3 |
player_stats.c4 | number | score with class 4 |
player_stats.c5 | number | score with class 5 |
player_stats.c6 | number | score with class 6 |
player_stats.c7 | number | score with class 7 |
player_stats.c8 | number | score with class 8 |
player_stats.c9 | number | score with class 9 |
player_stats.c10 | number | score with class 10 |
player_stats.c11 | number | score with class 11 |
player_stats.c12 | number | score with class 12 |
player_stats.c13 | number | score with class 13 |
player_stats.c14 | number | score with class 14 |
player_stats.c15 | number | score with class 15 |
online | number | |
maps | unknown[] | |
mods | unknown[] | |
assets | unknown[] | |
match_history | object[] | shape from the game code, only seen empty |
match_history[].date | string | |
match_history[].map | number | |
match_history[].duration | number | |
match_history[].mode | number | |
match_history[].season | number | |
match_history[].region | number | |
match_history[].is_competitive | number | |
match_history[].is_ranked | number | |
match_history[].match_history_processed | number | |
match_history[].historyEntries | object[] | |
match_history[].historyEntries[].player_name | string | |
match_history[].historyEntries[].accuracy | number | |
match_history[].historyEntries[].assists | number | |
match_history[].historyEntries[].damage_done | number | |
match_history[].historyEntries[].deaths | number | |
match_history[].historyEntries[].headshots | number | |
match_history[].historyEntries[].kills | number | |
match_history[].historyEntries[].objective_score | number | |
match_history[].historyEntries[].score | number | |
match_history[].historyEntries[].team | number | |
match_history[].historyEntries[].rank | number | |
match_history[].historyEntries[].mmr_change | number | |
match_history[].score_alpha | number | |
match_history[].score_bravo | number | |
ranked_rank | number | |
raid_stats | object[] | |
raid_stats[].map_id | number | |
raid_stats[].completions | number | |
raid_stats[].attempts | number | |
raid_stats[].best_time | number | |
raid_stats[].ai_kills | number | |
raid_stats[].boss_kills | number | |
raid_stats[].deaths | number |
Search Players
krunker.game.players.search(query, limit = 5)
Prefix match on the name, limit 1 to 20. Returns {player_id, player_name, player_score}[] (krapio unwraps the results key).
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
q | string | query | yes | |
limit | integer | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
results | object[] | |
results[].player_id | number | |
results[].player_name | string | |
results[].player_score | number |
Get Player Sales
krunker.game.players.sales(playerName, range = 3)
One row per day with market sales: {f, t, d}[] where f is kr earned, t items sold, d the day as YYYY-MM-DD. The popup sends range=3.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
playerName | string | path | yes | |
range | integer | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
f | number | |
t | number | |
d | string | YYYY-MM-DD |
Get Player Listings
krunker.game.players.listings(playerName)
Only ever answered []. The developer API's player listings endpoint has the real data.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
playerName | string | path | yes |
Get Followers and Following
krunker.game.players.followers(playerName), krunker.game.players.following(playerName)
{player_id, player_name, date, follow_state}[], 100 rows at most.
GET /players/{playerName}/followers
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
playerName | string | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
player_id | number | |
player_name | string | |
date | string | |
follow_state | number |
GET /players/{playerName}/following
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
playerName | string | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
player_id | number | |
player_name | string | |
date | string | |
follow_state | number |
Get Player Feed
krunker.game.players.feed(playerId, limit = 20)
A player's posts, limit 1 to 50. krapio returns the posts array of FeedPost (see Social for the keys).
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
player_id | integer | query | yes | |
limit | integer | query | no | |
tab | string | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
posts | object[] | |
posts[].pid | number | post id |
posts[].pln | string | poster name and id |
posts[].pli | number | poster id |
posts[].tim | number | |
posts[].lnk | string | |
posts[].txt | string | |
posts[].ftr | number | |
posts[].typ | number | |
posts[].cln | string | |
posts[].flw | number | |
posts[].clr | number | |
posts[].prm | number | |
posts[].lnk2 | string | |
posts[].vot | number | votes |
posts[].dlk | number | |
posts[].cnt | number | comment count |
posts[].exp | number | |
posts[].fds | number |
Clans
The in-game clan window and the recruitment board.
Get Clan by Name
krunker.game.clans.byName(clanName)
Case-insensitive. The roster carries no player ids.
The clan logo is at https://user-assets.krunker.io/clans/<clan_id>.png?v=<clan_logo>.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
clanName | string | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
clan_id | number | |
clan_name | string | |
clan_score | number | |
clan_funds | number | |
clan_rank | number | |
clan_link4 | string | discord invite code |
clan_logo | number or null | logo version, 0 or null without one; image at user-assets.krunker.io/clans/<clan_id>.png?v=<clan_logo> |
clan_banner_color | string | "s<n>" = paint shader n, otherwise a color |
creator_name | string | |
members | object[] | |
members[].p | string | name |
members[].s | number | score |
members[].r | number | role: 0 recruit, 1 soldier, 2 captain, 3 commander; the creator is listed with 0 |
members[].h | number | hacker flag |
members[].pr | number | |
members[].ve | number | verified |
members[].su | number | staff |
members[].s7 | number | score of the last 7 days |
Get Clan by Id
krunker.game.clans.profile(clanId)
The same reply as by name.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
clanId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
clan_id | number | |
clan_name | string | |
clan_score | number | |
clan_funds | number | |
clan_rank | number | |
clan_link4 | string | discord invite code |
clan_logo | number or null | logo version, 0 or null without one; image at user-assets.krunker.io/clans/<clan_id>.png?v=<clan_logo> |
clan_banner_color | string | "s<n>" = paint shader n, otherwise a color |
creator_name | string | |
members | object[] | |
members[].p | string | name |
members[].s | number | score |
members[].r | number | role: 0 recruit, 1 soldier, 2 captain, 3 commander; the creator is listed with 0 |
members[].h | number | hacker flag |
members[].pr | number | |
members[].ve | number | verified |
members[].su | number | staff |
members[].s7 | number | score of the last 7 days |
Get Loot Config
krunker.game.clans.lootConfig(clanId)
The clan's Turf Wars payout rule.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
clanId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
clan_id | number | |
distribution_mode | "clan_bank" | "even" | "top_weighted" | "performance" | "top_performance" | how a clan splits its turf earnings |
clan_pct | number | the treasury cut |
top_player_count | number | |
top_player_pct | number | top_player_pct + remainder_pct = 100 |
remainder_pct | number | |
min_games_required | number | |
updated_at | string | |
updated_by | number | |
updated_by_name | string |
Get Message of the Day
krunker.game.clans.motd(clanId)
{message, set_by, set_by_name, set_at}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
clanId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
message | string | |
set_by | number | |
set_by_name | string | |
set_at | string |
Get Recruitment Post
krunker.game.clans.recruitment(clanId)
The clan's own post on the recruitment board.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
clanId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
recruitment_id | number | |
clan_id | number | |
clan_name | string | |
clan_logo | number or null | |
description | string | |
looking_for | string | |
min_level | number | |
min_kd | number | |
region | string or null | |
language | string or null | |
is_active | number | |
created_at | string | |
updated_at | string | |
created_by | number | |
loot_mode | "clan_bank" | "even" | "top_weighted" | "performance" | "top_performance" or null | |
loot_clan_pct | number or null | |
loot_top_player_count | number or null | |
loot_top_player_pct | number or null | |
loot_remainder_pct | number or null | |
loot_min_games | number or null |
Get Recruitment Board
krunker.game.clans.recruitmentBoard({ page, limit, region, language })
| Name | Type | Required | Description |
|---|---|---|---|
| page | int | no | 1 based |
| limit | int | no | 1 to 50, the game sends 20 |
| region | string | no | the board's region select |
| language | string | no | the board's language select |
Returns {posts: RecruitmentPost[], total, page, limit}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
page | integer | query | no | |
limit | integer | query | no | 20 in the game |
region | string | query | no | |
language | string | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
posts | object[] | |
posts[].recruitment_id | number | |
posts[].clan_id | number | |
posts[].clan_name | string | |
posts[].clan_logo | number or null | |
posts[].description | string | |
posts[].looking_for | string | |
posts[].min_level | number | |
posts[].min_kd | number | |
posts[].region | string or null | |
posts[].language | string or null | |
posts[].is_active | number | |
posts[].created_at | string | |
posts[].updated_at | string | |
posts[].created_by | number | |
posts[].loot_mode | "clan_bank" | "even" | "top_weighted" | "performance" | "top_performance" or null | |
posts[].loot_clan_pct | number or null | |
posts[].loot_top_player_count | number or null | |
posts[].loot_top_player_pct | number or null | |
posts[].loot_remainder_pct | number or null | |
posts[].loot_min_games | number or null | |
total | number | |
page | number | |
limit | number |
Turf Wars
https://gapi.svc.krunker.io/territorial-wars/*. Days are whole UTC days since the season epoch 2026-03-17 (TURF_EPOCH_UTC, turfDay(date) in krapio). map_id is the Turf map: 0 Burg, 2 Sandstorm, 3 Subzero (TURF_MAPS). Leaderboards return 100 rows, kd is a float.
Get Status
krunker.game.turf.status()
Every Turf map with its current owner and the top 5 clans.
Response Fields:
| Field | Type | Description |
|---|---|---|
map_id | number | |
map_name | string | |
clan_id | number | the owner |
clan_name | string | |
clan_logo | number or null | |
kills | number | |
games | number | |
reward | number or null | |
leaderboard | object[] | top 5 |
leaderboard[].position | number | |
leaderboard[].clan_id | number | |
leaderboard[].clan_name | string | |
leaderboard[].clan_logo | number or null | |
leaderboard[].kills | number | |
leaderboard[].deaths | number | |
total_kills_today | number | |
guaranteed_reward | number | |
estimated_reward | number |
Get Clan
krunker.game.turf.clan(clanId)
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
clanId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
clan_id | number | |
clan_name | string | |
clan_logo | number or null | |
current_day | number | |
maps | object[] | |
maps[].map_id | number | |
maps[].map_name | string | |
maps[].day | number | |
maps[].kills | number | |
maps[].deaths | number | |
maps[].games | number | |
maps[].position | number | |
maps[].comparison_kills | number | the clan one position up |
maps[].comparison_deaths | number | |
maps[].comparison_clan_name | string | |
maps[].comparison_clan_id | number | |
maps[].comparison_clan_logo | number or null | |
maps[].comparison_position | number | |
historical_days | object[] | |
historical_days[].map_id | number | |
historical_days[].map_name | string | |
historical_days[].day | number | |
historical_days[].kills | number | |
historical_days[].deaths | number | |
historical_days[].position | number | |
historical_days[].comparison_kills | number | the clan one position up |
historical_days[].comparison_deaths | number | |
historical_days[].comparison_clan_name | string | |
historical_days[].comparison_clan_id | number | |
historical_days[].comparison_clan_logo | number or null | |
historical_days[].comparison_position | number |
Get Clan Players
krunker.game.turf.clanPlayers(clanId, { day, map_id })
Today without day. Rows are {player_id, player_name, kills, deaths, games, kd}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
clanId | integer | path | yes | |
day | integer | query | no | |
map_id | integer | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
player_id | number | |
player_name | string | |
kills | number | |
deaths | number | |
games | number | |
kd | number |
Get Clan Earnings
krunker.game.turf.clanEarnings(clanId)
{day, map_id, map_name, reward}[].
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
clanId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
day | number | |
map_id | number | |
map_name | string | |
reward | number |
Get Clan Payouts
krunker.game.turf.clanPayouts(clanId, day?)
Season totals without day. {payouts: {player_id, player_name, total_kr}[], total}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
clanId | integer | path | yes | |
day | integer | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
payouts | object[] | |
payouts[].player_id | number | |
payouts[].player_name | string | |
payouts[].total_kr | number | |
total | number |
Top Performing Clans
krunker.game.turf.topClans({ day, map_id, clan_name })
clan_name is an exact match filter. Rows: {position, clan_id, clan_name, clan_logo, kills, deaths, games, kd}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
day | integer | query | no | |
map_id | integer | query | no | |
clan_name | string | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
position | number | |
clan_id | number | |
clan_name | string | |
clan_logo | number or null | |
kills | number | |
deaths | number | |
games | number | |
kd | number |
Top Grossing Clans
krunker.game.turf.topGrossing(clanName?)
Rows: {position, clan_id, clan_name, clan_logo, total_kr, distributed, bank}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
clan_name | string | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
position | number | |
clan_id | number | |
clan_name | string | |
clan_logo | number or null | |
total_kr | number | |
distributed | number | |
bank | number |
Top Performing Players
krunker.game.turf.topPlayers({ map_id, player_name })
Slow, several seconds. Rows: {position, player_id, player_name, clan_id, clan_name, kills, deaths, games, kd, earnings}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
map_id | integer | query | no | |
player_name | string | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
position | number | |
player_id | number | |
player_name | string | |
clan_id | number | |
clan_name | string | |
kills | number | |
deaths | number | |
games | number | |
kd | number | |
earnings | number |
Get Player
krunker.game.turf.player(playerId)
Also the way to resolve a stored player id to the current name.
{player_id, player_name, current_clan, current_clan_id, current_clan_logo, total_kills, total_deaths, total_games, kd, total_kr, first_day, last_day}
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
playerId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
player_id | number | |
player_name | string | |
current_clan | string | |
current_clan_id | number | |
current_clan_logo | number or null | |
total_kills | number | |
total_deaths | number | |
total_games | number | |
kd | number | |
total_kr | number | |
first_day | number | |
last_day | number |
Get Player Contributions
krunker.game.turf.playerContributions(playerId, day?)
Every day and map of the season without day. Rows: {day, clan_id, clan_name, map_id, map_name, kills, deaths, games, kd}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
playerId | integer | path | yes | |
day | integer | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
day | number | |
clan_id | number | |
clan_name | string | |
map_id | number | |
map_name | string | |
kills | number | |
deaths | number | |
games | number | |
kd | number |
Get Player Earnings
krunker.game.turf.playerEarnings(playerId)
{day, map_id, map_name, clan_id, clan_name, amount}[].
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
playerId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
day | number | |
map_id | number | |
map_name | string | |
clan_id | number | |
clan_name | string | |
amount | number |
Leaderboards
Player Leaderboards
krunker.game.leaderboards.players(type, { sort, season })
type is one of player_score, player_kills, player_wins, player_timeplayed, player_funds, player_followed, player_nukes, player_skinvalue, player_eventcount, player_ranked_matches. 100 rows of {position, player_name, player_clan, player_featured, value}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
type | "player_score" | "player_kills" | "player_wins" | "player_timeplayed" | "player_funds" | "player_followed" | "player_nukes" | "player_skinvalue" | "player_eventcount" | "player_ranked_matches" | path | yes | |
sort | string | query | no | |
season | integer | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
position | number | |
player_name | string | |
player_clan | string | |
player_featured | number | |
value | number |
Clan Leaderboard
krunker.game.leaderboards.clans(sort = "score")
100 rows of {position, clan_name, clan_score, member_count, hack_count}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
sort | "score" | "members" | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
position | number | |
clan_name | string | |
clan_score | number | |
member_count | number | |
hack_count | number |
Raid Leaderboard
krunker.game.leaderboards.raids(mapId, sort?)
100 rows of {position, player_name, player_clan, best_time, completions}, best_time in milliseconds. Map ids with a raid board in October 2026: 18, 29, 31, 35 and 43 (RAID_MAPS). Any other id is a 400 invalid raid map ID.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
mapId | integer | path | yes | |
sort | "time" | "completions" | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
position | number | |
player_name | string | |
player_clan | string | |
best_time | number | milliseconds |
completions | number |
Monthly Raid Leaderboard
krunker.game.leaderboards.raidsMonthly(mapId, month, sort?)
month is required, as YYYY-MM (what the game sends). A bare number like 8 is also answered, with different rows of unknown meaning, so krapio only accepts YYYY-MM. A month without runs answers {"data": null}, which krapio returns as [].
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
mapId | integer | path | yes | |
month | string | query | yes | |
sort | "time" | "completions" | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
position | number | |
player_name | string | |
player_clan | string | |
best_time | number | milliseconds |
completions | number |
KrunkCup
krunker.game.leaderboards.krunkCupTeams(), .krunkCupContributors(teamId), .krunkCupPlayers(limit?)
Teams are {id, total_kills, total_score, total_games}. Contributors and players are {position, player_name, player_clan, kills, score, games}.
GET /leaderboards/krunkcup/teams
Response Fields:
| Field | Type | Description |
|---|---|---|
id | number | |
total_kills | number | |
total_score | number | |
total_games | number |
GET /leaderboards/krunkcup/teams/{teamId}/contributors
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
teamId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
position | number | |
player_name | string | |
player_clan | string | |
kills | number | |
score | number | |
games | number |
GET /leaderboards/krunkcup/players
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
limit | integer | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
position | number | |
player_name | string | |
player_clan | string | |
kills | number | |
score | number | |
games | number |
Game
Static data the page loads at start, and the community map and mod records.
Official Maps
krunker.game.game.maps()
{name, id}[]. The id is also the preview image number at https://assets.krunker.io/img/maps/map_<id>.png.
Response Fields:
| Field | Type | Description |
|---|---|---|
name | string | |
id | number |
Map Config
krunker.game.game.mapConfig(mapId)
The whole map file (120 KB for Burg). krapio names only the keys the client reads (name, modes, spawns, objects, sky, skyDome), the rest is Record<string, unknown>.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
mapId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
name | string | |
modes | unknown | |
spawns | unknown[] | |
objects | unknown[] | |
sky | unknown | |
skyDome | unknown |
Community Map by Name
krunker.game.game.mapByName(mapName)
The community map record. Note that Burg resolves to a community map of that name, not the official map.
{map_id, name, description, creator_name, votes, gameplays, playtime, category, created_at, updated_at, leaderboard_type, leaderboard_order, featured}
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
mapName | string | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
map_id | number | |
name | string | |
description | string | |
creator_name | string | |
votes | number | |
gameplays | number | |
playtime | number | |
category | number | |
created_at | string | |
updated_at | string | |
leaderboard_type | string | |
leaderboard_order | number | |
featured | boolean |
Community Map Leaderboard
krunker.game.game.mapLeaderboard(mapName, { page, type, order })
25 per page. {page, per_page, map_name, leaderboard_type, leaderboard_order, entries}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
mapName | string | path | yes | |
page | integer | query | no | |
type | "score" | "time" | query | no | |
order | 0 | 1 | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
page | number | |
per_page | number | |
map_name | string | |
leaderboard_type | string | |
leaderboard_order | number | |
entries | unknown[] |
Mod by Name
krunker.game.game.modByName(modName)
{mod_id, name, description, creator_name, votes, featured, version, created_at, updated_at}
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
modName | string | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
mod_id | number | |
name | string | |
description | string | |
creator_name | string | |
votes | number | |
featured | boolean | |
version | number | |
created_at | string | |
updated_at | string |
Titles
krunker.game.game.titles()
Every player title with its requirement: {id, name, desc, rarity, requirements: {kind, text} | null, active}[]. Kinds seen: challenge, bundle, blackmarket.
Response Fields:
| Field | Type | Description |
|---|---|---|
id | number | |
name | string | |
desc | string | |
rarity | number | |
requirements | object or null | |
requirements.kind | string | |
requirements.text | string | |
active | boolean |
Creator Events
krunker.game.game.creatorEvents()
The menu's event and survey box: {events: unknown[], polls: {id, title, description, ends_in}[]}, ends_in in seconds.
Response Fields:
| Field | Type | Description |
|---|---|---|
events | unknown[] | |
polls | object[] | |
polls[].id | number | |
polls[].title | string | |
polls[].description | string | |
polls[].ends_in | number | seconds |
Market
The reads of the market tab that answer without a token. Listings, the player's inventory and history need one, see the token API.
Market Stats
krunker.game.market.stats({ cursor, limit, sort, rarities, weapons, types, season, searchTerm })
| Name | Type | Description |
|---|---|---|
| cursor | int | next_cursor of the previous page |
| limit | int | 1 to 100 |
| sort | string | rarity is what the market tab sends; an unknown value is answered with the default order |
| rarities, weapons, types | int list | comma separated filters |
| season | int | |
| searchTerm | string |
ski is the skin index, inC the count in circulation, onS the count on sale, high and low the ask range while something is listed (seen with sort=rarity, absent under other sorts). onS of a non tradable skin is noise: Atlantean Armour reports 20 on sale with zero listings anywhere.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
cursor | integer | query | no | |
limit | integer | query | no | |
sort | string | query | no | |
rarities | integer[] | query | no | |
weapons | integer[] | query | no | |
types | integer[] | query | no | |
season | integer | query | no | |
searchTerm | string | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
stats | object[] | |
stats[].ski | number | |
stats[].inC | number | |
stats[].onS | number | |
stats[].high | number | |
stats[].low | number | |
has_more | boolean | |
next_cursor | number or null |
Item Sales Info
krunker.game.market.itemSales(skinIndex)
Despite the path, no sales: the ask range, the circulation and the player ids of the top owners.
The id list is capped at 100 and is never the whole owner base (Soul Essence, 6.7 million in circulation: 100 ids; Flame Tamer: 61 ids, and 61 owners on the item view). Measured 2026-10-17.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
skinIndex | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
ind | number | skin index |
high | number | highest ask, 0 without listings |
low | number | lowest ask, 0 without listings |
inC | number | count in circulation |
owners | number[] | player ids of the top 100 owners, the same 100 the item page lists, never the whole owner base |
Item Sales Statistics
krunker.game.market.itemSalesStatistics(skinIndex, daysBack = 30)
One row per day with a sale: {f, t, d}[] (kr, count, YYYY-MM-DD). Reaches back about 85 days whatever daysback says (measured 2026-10-17 with 3650).
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
skinIndex | integer | path | yes | |
daysback | integer | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
f | number | |
t | number | |
d | string | YYYY-MM-DD |
Items
The item page of the social market, by skin index.
Item View
krunker.game.items.view(skinIndex)
The whole order book of the skin in one reply, not a page of it: every live listing (41 of 42 for Codefall Paint, the missing one had sold between two calls; the developer api's market endpoint pages 10), the top 100 owners, about two weeks of daily sales and the stats.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
skinIndex | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
stats | object | |
stats.onS | number | |
stats.high | number | |
stats.low | number | |
stats.inC | number | |
owners | object[] | the top 100 by count owned |
owners[].nm | string | name |
owners[].ct | number | count owned |
owners[].su | number | staff |
owners[].ft | number | featured (verified) |
owners[].cr | number | |
sales | object[] | about the last two weeks, days with a sale |
sales[].f | number | |
sales[].t | number | |
sales[].d | string | YYYY-MM-DD |
listings | object[] | every live listing of the skin (41 of 42 seen, the one missing had sold between two calls) |
listings[].uid | number | |
listings[].marketid | number | |
listings[].skinid | number | the item instance |
listings[].skinindex | number | |
listings[].funds | number | ask in kr |
listings[].seller_id | number | |
listings[].seller_name | string | |
listings[].listed_time | number | unix ms |
listings[].m | string | json text {"wear": 0.9013, "serial": 32}, only on wearable skins |
stackable | boolean | |
wearable | boolean |
Item Sales
krunker.game.items.sales(skinIndex, range = 6)
Same rows as the market's sales statistics. The item page sends range=6, which reaches back about 120 days; range=24 is answered 400 "invalid sales range".
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
skinIndex | integer | path | yes | |
range | integer | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
f | number | |
t | number | |
d | string | YYYY-MM-DD |
Item Instances
krunker.game.items.instances(skinIndex, sort = "mint")
The Mints and Wear tabs of a non stackable skin (the serial numbered Season 10 items): every instance's holder name, serial and, on wearable skins, wear. Stackable skins answer []. Capped at 100 rows and not pageable: page, offset, limit and cursor are ignored, and any sort other than mint and wear falls back to mint. So a skin with up to 100 instances is complete (Roselle: 60, Bren Gun: 64), a bigger one gives the 100 lowest serials and the 100 lowest wears.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
skinIndex | integer | path | yes | |
sort | string | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
nm | string | |
serial | number | |
wear | number |
Social
Feed
krunker.game.social.feed(tab = "global", limit?)
global is the only tab seen; an unknown one is a 400 SOCIAL_INVALID_TAB. limit 1 to 50. krapio returns the posts array.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
player_id | integer | query | yes | |
limit | integer | query | no | |
tab | string | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
posts | object[] | |
posts[].pid | number | post id |
posts[].pln | string | poster name and id |
posts[].pli | number | poster id |
posts[].tim | number | |
posts[].lnk | string | |
posts[].txt | string | |
posts[].ftr | number | |
posts[].typ | number | |
posts[].cln | string | |
posts[].flw | number | |
posts[].clr | number | |
posts[].prm | number | |
posts[].lnk2 | string | |
posts[].vot | number | votes |
posts[].dlk | number | |
posts[].cnt | number | comment count |
posts[].exp | number | |
posts[].fds | number |
Post
krunker.game.social.post(postId)
{post: FeedPost, comments: unknown[]}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
postId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
post | object | one post of the social feed, short keys as the game sends them |
post.pid | number | post id |
post.pln | string | poster name and id |
post.pli | number | poster id |
post.tim | number | |
post.lnk | string | |
post.txt | string | |
post.ftr | number | |
post.typ | number | |
post.cln | string | |
post.flw | number | |
post.clr | number | |
post.prm | number | |
post.lnk2 | string | |
post.vot | number | votes |
post.dlk | number | |
post.cnt | number | comment count |
post.exp | number | |
post.fds | number | |
comments | unknown[] |
News
krunker.game.social.news()
{news: unknown[]}, only seen empty.
Response Fields:
| Field | Type | Description |
|---|---|---|
news | unknown[] |
Shop
The shop's catalogue. The wild offer and every purchase need the player's token.
Display
krunker.game.shop.display(displayId), krunker.game.shop.displayByTag(tag)
Display 1 is the front page, tag=premium is what the menu asks for. /shop/displays without a tag answers 400.
GET /shop/displays/{displayId}
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
displayId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
id | number | |
type | string | |
order | number | |
data | object | |
children | object[] | |
children[].id | number | |
children[].parent_id | number | |
children[].order | number | |
children[].type | string | |
children[].data | object | |
children[].product_id | number | |
products | object |
GET /shop/displays
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
tag | string | query | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
id | number | |
type | string | |
order | number | |
data | object | |
children | object[] | |
children[].id | number | |
children[].parent_id | number | |
children[].order | number | |
children[].type | string | |
children[].data | object | |
children[].product_id | number | |
products | object |
Spin Wheels
krunker.game.shop.spinWheels()
Every wheel with its pools and weights: {index, name, price, ticketIndex, ticketOnly, multi, poolWeights, pools: {id, name, color, weight, items}[]}[], items are skin indices.
Response Fields:
| Field | Type | Description |
|---|---|---|
index | number | |
name | string | |
price | number | |
ticketIndex | number | |
ticketOnly | boolean | |
multi | number | |
poolWeights | number[] | |
pools | object[] | |
pools[].id | string | |
pools[].name | string | |
pools[].color | string | |
pools[].weight | number | |
pools[].items | number[] | skin indices |
Lottery
krunker.game.shop.lottery(lotteryId)
Id 1 is the running one. {lottery: {id, title, frequency, theme}, player_entries, total_entries, previous_draws: {id, lottery_id, starts_at, ends_at, drawn_at, prizes}[]}. player_entries is 0 without a token.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
lotteryId | integer | path | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
lottery | object | |
lottery.id | number | |
lottery.title | string | |
lottery.frequency | number | |
lottery.theme | string | |
player_entries | number | |
total_entries | number | |
previous_draws | object[] | |
previous_draws[].id | number | |
previous_draws[].lottery_id | number | |
previous_draws[].starts_at | string | |
previous_draws[].ends_at | string | |
previous_draws[].drawn_at | string | |
previous_draws[].prizes | unknown[] |
Matchmaker
https://matchmaker.krunker.io, plain JSON without an envelope. The game polls the list every 60 seconds. krapio adds hostname=krunker.io to every call.
Game List
krunker.game.matchmaker.gameList()
Every public lobby, about 47 KB.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
hostname | "krunker.io" | query | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
games | unknown[][] | |
totalPlayerCount | number |
Ping List
krunker.game.matchmaker.pingList()
Region key (as in a game entry) to a lobby host:port to ping.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
hostname | "krunker.io" | query | yes |
Game Info
krunker.game.matchmaker.gameInfo(gameId)
One lobby as a game list entry. Ids look like FRA:4kpj2.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
game | string | query | yes |
Legacy
https://api.krunker.io, the old REST API. Only the paths the page calls without a token.
Map Browser
krunker.game.legacy.mapsList({ index, pos })
index is the category tab, pos the page, both 0 based. {index, data: {map_id, map_name, map_votes, creatorname, map_featured, map_info, map_updatecounter, map_pl, fund, category, partner, map_date}[]}, map_info is JSON text.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
index | integer | query | no | |
pos | integer | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
index | string | |
data | object[] | |
data[].map_id | number | |
data[].map_name | string | |
data[].map_votes | number | |
data[].creatorname | string | |
data[].map_featured | number | |
data[].map_info | string | json text |
data[].map_updatecounter | number | |
data[].map_pl | number | |
data[].fund | number | |
data[].category | string | |
data[].partner | string | |
data[].map_date | string |
Mod Browser
krunker.game.legacy.modsList({ index, pos })
{index, data: {mod_id, mod_name, mod_votes, creatorname, mod_featured, mod_url, mod_info, mod_updatecounter}[]}.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
index | integer | query | no | |
pos | integer | query | no |
Response Fields:
| Field | Type | Description |
|---|---|---|
index | string | |
data | object[] | |
data[].mod_id | number | |
data[].mod_name | string | |
data[].mod_votes | number | |
data[].creatorname | string | |
data[].mod_featured | number | |
data[].mod_url | string | |
data[].mod_info | string | json text |
data[].mod_updatecounter | number |
Item Prices
krunker.game.legacy.itemPrices()
The kr value per skin the inventory shows: an array indexed by skin index, null where there is no price. About 8000 entries, 38 KB.
Top Streams
krunker.game.legacy.topStreams()
The menu's stream box plus the running drop campaigns. krapio unwraps the data key.
Parameters:
| Name | Type | Location | Required | Description |
|---|---|---|---|---|
cb | 2 | query | yes |
Response Fields:
| Field | Type | Description |
|---|---|---|
data | object | GET api.krunker.io/streams/top |
data.streams | object[] | |
data.streams[].id | string | |
data.streams[].username | string | |
data.streams[].title | string | |
data.streams[].viewerCount | number | |
data.streams[].thumbnailUrl | string | |
data.streams[].startedAt | string | |
data.streams[].provider | string | |
data.streams[].featured | boolean | |
data.streams[].languageCode | string | |
data.promo | boolean | |
data.dropCampaigns | object[] | |
data.dropCampaigns[].name | string | |
data.dropCampaigns[].startDate | number | |
data.dropCampaigns[].endDate | number | |
data.dropCampaigns[].drops | object[] | |
data.dropCampaigns[].startDateISO | string | |
data.dropCampaigns[].endDateISO | string |