krapio

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

HostUsed byReply shape
https://gapi.svc.krunker.ioeverything unless noted{"data": ..., "error": null}; an error is {"error": {"code", "message"}} on a 404 or {"error": "text"} on a 400
https://matchmaker.krunker.iomatchmaker.*plain JSON, no envelope
https://api.krunker.iolegacy.*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.

KeyMeaning
s, h, hs, ls, wbshots, hits, headshots, legshots, wallbangs
mk, fk, tmkmelee kills, fist kills (beatdowns), thrown weapon kills (bullseyes)
ast, n, ad, sadassists, nukes, airdrops, airdrops stolen
sl, wmslimes, warmachines
flgcountry flag index
hds1 when the profile hides details
c0 to c15score per class

raid_stats rows are {map_id, completions, attempts, best_time, ai_kills, boss_kills, deaths}.

Parameters:

NameTypeLocationRequiredDescription
playerNamestringpathyes

Response Fields:

FieldTypeDescription
player_idnumber
player_namestring
player_clanstringabsent without a clan
clan_idnumber
player_twitchnamestring
player_regionnumber
player_badgestringcomma separated badge ids
player_titlesstringcomma separated title ids
player_datenewstring"YYYY-MM-DD HH:MM:SS"
player_featurednumber
player_fundsnumberkr
player_skinvaluenumber
player_elonumber
player_elo2number
player_elo4stringjunk rating, a decimal as text
player_premiumnumber
player_killsnumber
player_deathsnumber
player_winsnumber
player_games_playednumber
player_scorenumber
player_timeplayednumberseconds
player_followingnumber
player_followednumber
player_chalnumber
player_infectednumber
player_jobratingnumber
player_jobratingpositivenumber
player_callsnumber
player_taggedaccountsnumber
player_statsobjectthe packed stats blob of a social profile, the developer api's profile has the same numbers under full names
player_stats.snumbershots
player_stats.hnumberhits
player_stats.hsnumberheadshots
player_stats.lsnumberlegshots
player_stats.wbnumberwallbangs
player_stats.mknumbermelee kills
player_stats.fknumberfist kills (beatdowns)
player_stats.tmknumberthrown weapon kills (bullseyes)
player_stats.astnumberassists
player_stats.nnumbernukes
player_stats.adnumberairdrops
player_stats.sadnumberairdrops stolen
player_stats.slnumberslimes
player_stats.wmnumberwarmachines
player_stats.flgnumbercountry flag index
player_stats.hdsnumber1 when the profile hides details
player_stats.c0numberscore per class, c0 to c15
player_stats.c1numberscore with class 1
player_stats.c2numberscore with class 2
player_stats.c3numberscore with class 3
player_stats.c4numberscore with class 4
player_stats.c5numberscore with class 5
player_stats.c6numberscore with class 6
player_stats.c7numberscore with class 7
player_stats.c8numberscore with class 8
player_stats.c9numberscore with class 9
player_stats.c10numberscore with class 10
player_stats.c11numberscore with class 11
player_stats.c12numberscore with class 12
player_stats.c13numberscore with class 13
player_stats.c14numberscore with class 14
player_stats.c15numberscore with class 15
onlinenumber
mapsunknown[]
modsunknown[]
assetsunknown[]
match_historyobject[]shape from the game code, only seen empty
match_history[].datestring
match_history[].mapnumber
match_history[].durationnumber
match_history[].modenumber
match_history[].seasonnumber
match_history[].regionnumber
match_history[].is_competitivenumber
match_history[].is_rankednumber
match_history[].match_history_processednumber
match_history[].historyEntriesobject[]
match_history[].historyEntries[].player_namestring
match_history[].historyEntries[].accuracynumber
match_history[].historyEntries[].assistsnumber
match_history[].historyEntries[].damage_donenumber
match_history[].historyEntries[].deathsnumber
match_history[].historyEntries[].headshotsnumber
match_history[].historyEntries[].killsnumber
match_history[].historyEntries[].objective_scorenumber
match_history[].historyEntries[].scorenumber
match_history[].historyEntries[].teamnumber
match_history[].historyEntries[].ranknumber
match_history[].historyEntries[].mmr_changenumber
match_history[].score_alphanumber
match_history[].score_bravonumber
ranked_ranknumber
raid_statsobject[]
raid_stats[].map_idnumber
raid_stats[].completionsnumber
raid_stats[].attemptsnumber
raid_stats[].best_timenumber
raid_stats[].ai_killsnumber
raid_stats[].boss_killsnumber
raid_stats[].deathsnumber

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:

NameTypeLocationRequiredDescription
qstringqueryyes
limitintegerqueryno

Response Fields:

FieldTypeDescription
resultsobject[]
results[].player_idnumber
results[].player_namestring
results[].player_scorenumber

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:

NameTypeLocationRequiredDescription
playerNamestringpathyes
rangeintegerqueryno

Response Fields:

FieldTypeDescription
fnumber
tnumber
dstringYYYY-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:

NameTypeLocationRequiredDescription
playerNamestringpathyes

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:

NameTypeLocationRequiredDescription
playerNamestringpathyes

Response Fields:

FieldTypeDescription
player_idnumber
player_namestring
datestring
follow_statenumber

GET /players/{playerName}/following

Parameters:

NameTypeLocationRequiredDescription
playerNamestringpathyes

Response Fields:

FieldTypeDescription
player_idnumber
player_namestring
datestring
follow_statenumber

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:

NameTypeLocationRequiredDescription
player_idintegerqueryyes
limitintegerqueryno
tabstringqueryno

Response Fields:

FieldTypeDescription
postsobject[]
posts[].pidnumberpost id
posts[].plnstringposter name and id
posts[].plinumberposter id
posts[].timnumber
posts[].lnkstring
posts[].txtstring
posts[].ftrnumber
posts[].typnumber
posts[].clnstring
posts[].flwnumber
posts[].clrnumber
posts[].prmnumber
posts[].lnk2string
posts[].votnumbervotes
posts[].dlknumber
posts[].cntnumbercomment count
posts[].expnumber
posts[].fdsnumber

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:

NameTypeLocationRequiredDescription
clanNamestringpathyes

Response Fields:

FieldTypeDescription
clan_idnumber
clan_namestring
clan_scorenumber
clan_fundsnumber
clan_ranknumber
clan_link4stringdiscord invite code
clan_logonumber or nulllogo version, 0 or null without one; image at user-assets.krunker.io/clans/<clan_id>.png?v=<clan_logo>
clan_banner_colorstring"s<n>" = paint shader n, otherwise a color
creator_namestring
membersobject[]
members[].pstringname
members[].snumberscore
members[].rnumberrole: 0 recruit, 1 soldier, 2 captain, 3 commander; the creator is listed with 0
members[].hnumberhacker flag
members[].prnumber
members[].venumberverified
members[].sunumberstaff
members[].s7numberscore of the last 7 days

Get Clan by Id

krunker.game.clans.profile(clanId)

The same reply as by name.

Parameters:

NameTypeLocationRequiredDescription
clanIdintegerpathyes

Response Fields:

FieldTypeDescription
clan_idnumber
clan_namestring
clan_scorenumber
clan_fundsnumber
clan_ranknumber
clan_link4stringdiscord invite code
clan_logonumber or nulllogo version, 0 or null without one; image at user-assets.krunker.io/clans/<clan_id>.png?v=<clan_logo>
clan_banner_colorstring"s<n>" = paint shader n, otherwise a color
creator_namestring
membersobject[]
members[].pstringname
members[].snumberscore
members[].rnumberrole: 0 recruit, 1 soldier, 2 captain, 3 commander; the creator is listed with 0
members[].hnumberhacker flag
members[].prnumber
members[].venumberverified
members[].sunumberstaff
members[].s7numberscore of the last 7 days

Get Loot Config

krunker.game.clans.lootConfig(clanId)

The clan's Turf Wars payout rule.

Parameters:

NameTypeLocationRequiredDescription
clanIdintegerpathyes

Response Fields:

FieldTypeDescription
clan_idnumber
distribution_mode"clan_bank" | "even" | "top_weighted" | "performance" | "top_performance"how a clan splits its turf earnings
clan_pctnumberthe treasury cut
top_player_countnumber
top_player_pctnumbertop_player_pct + remainder_pct = 100
remainder_pctnumber
min_games_requirednumber
updated_atstring
updated_bynumber
updated_by_namestring

Get Message of the Day

krunker.game.clans.motd(clanId)

{message, set_by, set_by_name, set_at}.

Parameters:

NameTypeLocationRequiredDescription
clanIdintegerpathyes

Response Fields:

FieldTypeDescription
messagestring
set_bynumber
set_by_namestring
set_atstring

Get Recruitment Post

krunker.game.clans.recruitment(clanId)

The clan's own post on the recruitment board.

Parameters:

NameTypeLocationRequiredDescription
clanIdintegerpathyes

Response Fields:

FieldTypeDescription
recruitment_idnumber
clan_idnumber
clan_namestring
clan_logonumber or null
descriptionstring
looking_forstring
min_levelnumber
min_kdnumber
regionstring or null
languagestring or null
is_activenumber
created_atstring
updated_atstring
created_bynumber
loot_mode"clan_bank" | "even" | "top_weighted" | "performance" | "top_performance" or null
loot_clan_pctnumber or null
loot_top_player_countnumber or null
loot_top_player_pctnumber or null
loot_remainder_pctnumber or null
loot_min_gamesnumber or null

Get Recruitment Board

krunker.game.clans.recruitmentBoard({ page, limit, region, language })

NameTypeRequiredDescription
pageintno1 based
limitintno1 to 50, the game sends 20
regionstringnothe board's region select
languagestringnothe board's language select

Returns {posts: RecruitmentPost[], total, page, limit}.

Parameters:

NameTypeLocationRequiredDescription
pageintegerqueryno
limitintegerqueryno20 in the game
regionstringqueryno
languagestringqueryno

Response Fields:

FieldTypeDescription
postsobject[]
posts[].recruitment_idnumber
posts[].clan_idnumber
posts[].clan_namestring
posts[].clan_logonumber or null
posts[].descriptionstring
posts[].looking_forstring
posts[].min_levelnumber
posts[].min_kdnumber
posts[].regionstring or null
posts[].languagestring or null
posts[].is_activenumber
posts[].created_atstring
posts[].updated_atstring
posts[].created_bynumber
posts[].loot_mode"clan_bank" | "even" | "top_weighted" | "performance" | "top_performance" or null
posts[].loot_clan_pctnumber or null
posts[].loot_top_player_countnumber or null
posts[].loot_top_player_pctnumber or null
posts[].loot_remainder_pctnumber or null
posts[].loot_min_gamesnumber or null
totalnumber
pagenumber
limitnumber

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:

FieldTypeDescription
map_idnumber
map_namestring
clan_idnumberthe owner
clan_namestring
clan_logonumber or null
killsnumber
gamesnumber
rewardnumber or null
leaderboardobject[]top 5
leaderboard[].positionnumber
leaderboard[].clan_idnumber
leaderboard[].clan_namestring
leaderboard[].clan_logonumber or null
leaderboard[].killsnumber
leaderboard[].deathsnumber
total_kills_todaynumber
guaranteed_rewardnumber
estimated_rewardnumber

Get Clan

krunker.game.turf.clan(clanId)

Parameters:

NameTypeLocationRequiredDescription
clanIdintegerpathyes

Response Fields:

FieldTypeDescription
clan_idnumber
clan_namestring
clan_logonumber or null
current_daynumber
mapsobject[]
maps[].map_idnumber
maps[].map_namestring
maps[].daynumber
maps[].killsnumber
maps[].deathsnumber
maps[].gamesnumber
maps[].positionnumber
maps[].comparison_killsnumberthe clan one position up
maps[].comparison_deathsnumber
maps[].comparison_clan_namestring
maps[].comparison_clan_idnumber
maps[].comparison_clan_logonumber or null
maps[].comparison_positionnumber
historical_daysobject[]
historical_days[].map_idnumber
historical_days[].map_namestring
historical_days[].daynumber
historical_days[].killsnumber
historical_days[].deathsnumber
historical_days[].positionnumber
historical_days[].comparison_killsnumberthe clan one position up
historical_days[].comparison_deathsnumber
historical_days[].comparison_clan_namestring
historical_days[].comparison_clan_idnumber
historical_days[].comparison_clan_logonumber or null
historical_days[].comparison_positionnumber

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:

NameTypeLocationRequiredDescription
clanIdintegerpathyes
dayintegerqueryno
map_idintegerqueryno

Response Fields:

FieldTypeDescription
player_idnumber
player_namestring
killsnumber
deathsnumber
gamesnumber
kdnumber

Get Clan Earnings

krunker.game.turf.clanEarnings(clanId)

{day, map_id, map_name, reward}[].

Parameters:

NameTypeLocationRequiredDescription
clanIdintegerpathyes

Response Fields:

FieldTypeDescription
daynumber
map_idnumber
map_namestring
rewardnumber

Get Clan Payouts

krunker.game.turf.clanPayouts(clanId, day?)

Season totals without day. {payouts: {player_id, player_name, total_kr}[], total}.

Parameters:

NameTypeLocationRequiredDescription
clanIdintegerpathyes
dayintegerqueryno

Response Fields:

FieldTypeDescription
payoutsobject[]
payouts[].player_idnumber
payouts[].player_namestring
payouts[].total_krnumber
totalnumber

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:

NameTypeLocationRequiredDescription
dayintegerqueryno
map_idintegerqueryno
clan_namestringqueryno

Response Fields:

FieldTypeDescription
positionnumber
clan_idnumber
clan_namestring
clan_logonumber or null
killsnumber
deathsnumber
gamesnumber
kdnumber

Top Grossing Clans

krunker.game.turf.topGrossing(clanName?)

Rows: {position, clan_id, clan_name, clan_logo, total_kr, distributed, bank}.

Parameters:

NameTypeLocationRequiredDescription
clan_namestringqueryno

Response Fields:

FieldTypeDescription
positionnumber
clan_idnumber
clan_namestring
clan_logonumber or null
total_krnumber
distributednumber
banknumber

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:

NameTypeLocationRequiredDescription
map_idintegerqueryno
player_namestringqueryno

Response Fields:

FieldTypeDescription
positionnumber
player_idnumber
player_namestring
clan_idnumber
clan_namestring
killsnumber
deathsnumber
gamesnumber
kdnumber
earningsnumber

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:

NameTypeLocationRequiredDescription
playerIdintegerpathyes

Response Fields:

FieldTypeDescription
player_idnumber
player_namestring
current_clanstring
current_clan_idnumber
current_clan_logonumber or null
total_killsnumber
total_deathsnumber
total_gamesnumber
kdnumber
total_krnumber
first_daynumber
last_daynumber

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:

NameTypeLocationRequiredDescription
playerIdintegerpathyes
dayintegerqueryno

Response Fields:

FieldTypeDescription
daynumber
clan_idnumber
clan_namestring
map_idnumber
map_namestring
killsnumber
deathsnumber
gamesnumber
kdnumber

Get Player Earnings

krunker.game.turf.playerEarnings(playerId)

{day, map_id, map_name, clan_id, clan_name, amount}[].

Parameters:

NameTypeLocationRequiredDescription
playerIdintegerpathyes

Response Fields:

FieldTypeDescription
daynumber
map_idnumber
map_namestring
clan_idnumber
clan_namestring
amountnumber

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:

NameTypeLocationRequiredDescription
type"player_score" | "player_kills" | "player_wins" | "player_timeplayed" | "player_funds" | "player_followed" | "player_nukes" | "player_skinvalue" | "player_eventcount" | "player_ranked_matches"pathyes
sortstringqueryno
seasonintegerqueryno

Response Fields:

FieldTypeDescription
positionnumber
player_namestring
player_clanstring
player_featurednumber
valuenumber

Clan Leaderboard

krunker.game.leaderboards.clans(sort = "score")

100 rows of {position, clan_name, clan_score, member_count, hack_count}.

Parameters:

NameTypeLocationRequiredDescription
sort"score" | "members"queryno

Response Fields:

FieldTypeDescription
positionnumber
clan_namestring
clan_scorenumber
member_countnumber
hack_countnumber

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:

NameTypeLocationRequiredDescription
mapIdintegerpathyes
sort"time" | "completions"queryno

Response Fields:

FieldTypeDescription
positionnumber
player_namestring
player_clanstring
best_timenumbermilliseconds
completionsnumber

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:

NameTypeLocationRequiredDescription
mapIdintegerpathyes
monthstringqueryyes
sort"time" | "completions"queryno

Response Fields:

FieldTypeDescription
positionnumber
player_namestring
player_clanstring
best_timenumbermilliseconds
completionsnumber

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:

FieldTypeDescription
idnumber
total_killsnumber
total_scorenumber
total_gamesnumber

GET /leaderboards/krunkcup/teams/{teamId}/contributors

Parameters:

NameTypeLocationRequiredDescription
teamIdintegerpathyes

Response Fields:

FieldTypeDescription
positionnumber
player_namestring
player_clanstring
killsnumber
scorenumber
gamesnumber

GET /leaderboards/krunkcup/players

Parameters:

NameTypeLocationRequiredDescription
limitintegerqueryno

Response Fields:

FieldTypeDescription
positionnumber
player_namestring
player_clanstring
killsnumber
scorenumber
gamesnumber

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:

FieldTypeDescription
namestring
idnumber

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:

NameTypeLocationRequiredDescription
mapIdintegerpathyes

Response Fields:

FieldTypeDescription
namestring
modesunknown
spawnsunknown[]
objectsunknown[]
skyunknown
skyDomeunknown

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:

NameTypeLocationRequiredDescription
mapNamestringpathyes

Response Fields:

FieldTypeDescription
map_idnumber
namestring
descriptionstring
creator_namestring
votesnumber
gameplaysnumber
playtimenumber
categorynumber
created_atstring
updated_atstring
leaderboard_typestring
leaderboard_ordernumber
featuredboolean

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:

NameTypeLocationRequiredDescription
mapNamestringpathyes
pageintegerqueryno
type"score" | "time"queryno
order0 | 1queryno

Response Fields:

FieldTypeDescription
pagenumber
per_pagenumber
map_namestring
leaderboard_typestring
leaderboard_ordernumber
entriesunknown[]

Mod by Name

krunker.game.game.modByName(modName)

{mod_id, name, description, creator_name, votes, featured, version, created_at, updated_at}

Parameters:

NameTypeLocationRequiredDescription
modNamestringpathyes

Response Fields:

FieldTypeDescription
mod_idnumber
namestring
descriptionstring
creator_namestring
votesnumber
featuredboolean
versionnumber
created_atstring
updated_atstring

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:

FieldTypeDescription
idnumber
namestring
descstring
raritynumber
requirementsobject or null
requirements.kindstring
requirements.textstring
activeboolean

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:

FieldTypeDescription
eventsunknown[]
pollsobject[]
polls[].idnumber
polls[].titlestring
polls[].descriptionstring
polls[].ends_innumberseconds

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 })

NameTypeDescription
cursorintnext_cursor of the previous page
limitint1 to 100
sortstringrarity is what the market tab sends; an unknown value is answered with the default order
rarities, weapons, typesint listcomma separated filters
seasonint
searchTermstring

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:

NameTypeLocationRequiredDescription
cursorintegerqueryno
limitintegerqueryno
sortstringqueryno
raritiesinteger[]queryno
weaponsinteger[]queryno
typesinteger[]queryno
seasonintegerqueryno
searchTermstringqueryno

Response Fields:

FieldTypeDescription
statsobject[]
stats[].skinumber
stats[].inCnumber
stats[].onSnumber
stats[].highnumber
stats[].lownumber
has_moreboolean
next_cursornumber 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:

NameTypeLocationRequiredDescription
skinIndexintegerpathyes

Response Fields:

FieldTypeDescription
indnumberskin index
highnumberhighest ask, 0 without listings
lownumberlowest ask, 0 without listings
inCnumbercount in circulation
ownersnumber[]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:

NameTypeLocationRequiredDescription
skinIndexintegerpathyes
daysbackintegerqueryno

Response Fields:

FieldTypeDescription
fnumber
tnumber
dstringYYYY-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:

NameTypeLocationRequiredDescription
skinIndexintegerpathyes

Response Fields:

FieldTypeDescription
statsobject
stats.onSnumber
stats.highnumber
stats.lownumber
stats.inCnumber
ownersobject[]the top 100 by count owned
owners[].nmstringname
owners[].ctnumbercount owned
owners[].sunumberstaff
owners[].ftnumberfeatured (verified)
owners[].crnumber
salesobject[]about the last two weeks, days with a sale
sales[].fnumber
sales[].tnumber
sales[].dstringYYYY-MM-DD
listingsobject[]every live listing of the skin (41 of 42 seen, the one missing had sold between two calls)
listings[].uidnumber
listings[].marketidnumber
listings[].skinidnumberthe item instance
listings[].skinindexnumber
listings[].fundsnumberask in kr
listings[].seller_idnumber
listings[].seller_namestring
listings[].listed_timenumberunix ms
listings[].mstringjson text {"wear": 0.9013, "serial": 32}, only on wearable skins
stackableboolean
wearableboolean

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:

NameTypeLocationRequiredDescription
skinIndexintegerpathyes
rangeintegerqueryno

Response Fields:

FieldTypeDescription
fnumber
tnumber
dstringYYYY-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:

NameTypeLocationRequiredDescription
skinIndexintegerpathyes
sortstringqueryno

Response Fields:

FieldTypeDescription
nmstring
serialnumber
wearnumber

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:

NameTypeLocationRequiredDescription
player_idintegerqueryyes
limitintegerqueryno
tabstringqueryno

Response Fields:

FieldTypeDescription
postsobject[]
posts[].pidnumberpost id
posts[].plnstringposter name and id
posts[].plinumberposter id
posts[].timnumber
posts[].lnkstring
posts[].txtstring
posts[].ftrnumber
posts[].typnumber
posts[].clnstring
posts[].flwnumber
posts[].clrnumber
posts[].prmnumber
posts[].lnk2string
posts[].votnumbervotes
posts[].dlknumber
posts[].cntnumbercomment count
posts[].expnumber
posts[].fdsnumber

Post

krunker.game.social.post(postId)

{post: FeedPost, comments: unknown[]}.

Parameters:

NameTypeLocationRequiredDescription
postIdintegerpathyes

Response Fields:

FieldTypeDescription
postobjectone post of the social feed, short keys as the game sends them
post.pidnumberpost id
post.plnstringposter name and id
post.plinumberposter id
post.timnumber
post.lnkstring
post.txtstring
post.ftrnumber
post.typnumber
post.clnstring
post.flwnumber
post.clrnumber
post.prmnumber
post.lnk2string
post.votnumbervotes
post.dlknumber
post.cntnumbercomment count
post.expnumber
post.fdsnumber
commentsunknown[]

News

krunker.game.social.news()

{news: unknown[]}, only seen empty.

Response Fields:

FieldTypeDescription
newsunknown[]

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:

NameTypeLocationRequiredDescription
displayIdintegerpathyes

Response Fields:

FieldTypeDescription
idnumber
typestring
ordernumber
dataobject
childrenobject[]
children[].idnumber
children[].parent_idnumber
children[].ordernumber
children[].typestring
children[].dataobject
children[].product_idnumber
productsobject

GET /shop/displays

Parameters:

NameTypeLocationRequiredDescription
tagstringqueryyes

Response Fields:

FieldTypeDescription
idnumber
typestring
ordernumber
dataobject
childrenobject[]
children[].idnumber
children[].parent_idnumber
children[].ordernumber
children[].typestring
children[].dataobject
children[].product_idnumber
productsobject

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:

FieldTypeDescription
indexnumber
namestring
pricenumber
ticketIndexnumber
ticketOnlyboolean
multinumber
poolWeightsnumber[]
poolsobject[]
pools[].idstring
pools[].namestring
pools[].colorstring
pools[].weightnumber
pools[].itemsnumber[]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:

NameTypeLocationRequiredDescription
lotteryIdintegerpathyes

Response Fields:

FieldTypeDescription
lotteryobject
lottery.idnumber
lottery.titlestring
lottery.frequencynumber
lottery.themestring
player_entriesnumber
total_entriesnumber
previous_drawsobject[]
previous_draws[].idnumber
previous_draws[].lottery_idnumber
previous_draws[].starts_atstring
previous_draws[].ends_atstring
previous_draws[].drawn_atstring
previous_draws[].prizesunknown[]

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:

NameTypeLocationRequiredDescription
hostname"krunker.io"queryyes

Response Fields:

FieldTypeDescription
gamesunknown[][]
totalPlayerCountnumber

Ping List

krunker.game.matchmaker.pingList()

Region key (as in a game entry) to a lobby host:port to ping.

Parameters:

NameTypeLocationRequiredDescription
hostname"krunker.io"queryyes

Game Info

krunker.game.matchmaker.gameInfo(gameId)

One lobby as a game list entry. Ids look like FRA:4kpj2.

Parameters:

NameTypeLocationRequiredDescription
gamestringqueryyes

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:

NameTypeLocationRequiredDescription
indexintegerqueryno
posintegerqueryno

Response Fields:

FieldTypeDescription
indexstring
dataobject[]
data[].map_idnumber
data[].map_namestring
data[].map_votesnumber
data[].creatornamestring
data[].map_featurednumber
data[].map_infostringjson text
data[].map_updatecounternumber
data[].map_plnumber
data[].fundnumber
data[].categorystring
data[].partnerstring
data[].map_datestring

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:

NameTypeLocationRequiredDescription
indexintegerqueryno
posintegerqueryno

Response Fields:

FieldTypeDescription
indexstring
dataobject[]
data[].mod_idnumber
data[].mod_namestring
data[].mod_votesnumber
data[].creatornamestring
data[].mod_featurednumber
data[].mod_urlstring
data[].mod_infostringjson text
data[].mod_updatecounternumber

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:

NameTypeLocationRequiredDescription
cb2queryyes

Response Fields:

FieldTypeDescription
dataobjectGET api.krunker.io/streams/top
data.streamsobject[]
data.streams[].idstring
data.streams[].usernamestring
data.streams[].titlestring
data.streams[].viewerCountnumber
data.streams[].thumbnailUrlstring
data.streams[].startedAtstring
data.streams[].providerstring
data.streams[].featuredboolean
data.streams[].languageCodestring
data.promoboolean
data.dropCampaignsobject[]
data.dropCampaigns[].namestring
data.dropCampaigns[].startDatenumber
data.dropCampaigns[].endDatenumber
data.dropCampaigns[].dropsobject[]
data.dropCampaigns[].startDateISOstring
data.dropCampaigns[].endDateISOstring

On this page