krapio

Developer API

The documented Krunker developer API, corrected against the live service

Base URL: https://gapi.svc.krunker.io

This is the developer API documentation as provided by Krunker (FRVR), with corrections from using it. Rows marked undocumented and notes marked observed were found by calling the endpoints in October 2026 and are not part of the original document; they may change without notice. The KPD, Events and Webhooks sections at the end were added later from a second document by Krunker; they are reproduced as documented and not verified, the key this document was checked with holds neither the kpd nor an events scope.

In krapio every endpoint below lives on the root of Krunker (krunker.player.profile(...), krunker.market.skin(...)). The endpoints the game reads without a key are in game-api.md and the ones bound to a player token in token-api.md.

Developer APIs

The Developer APIs provide read-only access to public game data for third-party integrations.

observed: player, clan and map name lookups are case-insensitive (Burg and burg return the same map, named burg).

Authentication

All developer API endpoints require the X-Developer-API-Key header.

X-Developer-API-Key: <your-api-key>

Error Response (403 Forbidden):

{
  "error": "Not allowed."
}

Rate Limiting

All endpoints are rate-limited to 240 requests per minute per API key (observed: X-RateLimit-Reset is a unix timestamp about 60 s ahead; the keyless gapi paths send their own headers, 5 per route per second with a relative reset in seconds). Some endpoints have a lower limit of their own on top (GET /api/events: 6 per minute).

Rate Limit Headers:

Every response includes headers to help you track your usage:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed per window (240, or the endpoint's own limit)
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the rate limit resets

Rate Limit Exceeded Response (429 Too Many Requests):

{
  "error": "Rate limit exceeded",
  "retry_after": 45
}
FieldTypeDescription
errorstringError message
retry_afterintSeconds until the rate limit resets

Player Endpoints

Get Player Profile

Retrieve comprehensive player statistics and profile information.

Parameters:

NameTypeLocationRequiredDescription
playernamestringpathyesThe player's in-game username

Response Fields:

FieldTypeDescription
player_idintUnique player identifier
player_namestringPlayer's username
clanstringPlayer's clan name (empty string if not in a clan)
verifiedboolWhether the player is verified
flagintPlayer's country flag index
badgesint[]Array of badge IDs the player has earned
followingintNumber of players this player is following
followersintNumber of players following this player
rankedobject[]Array of ranked profiles for the current season, one per region (only includes regions where player has completed 6+ placement matches)
ranked[].regionintRegion ID
ranked[].mmrintMatchmaking rating
ranked[].winsintRanked wins in this region
ranked[].lossesintRanked losses in this region
ranked[].killsintTotal kills in ranked matches
ranked[].deathsintTotal deaths in ranked matches
ranked[].assistsintTotal assists in ranked matches
ranked[].scoreintTotal score in ranked matches
ranked[].damage_doneintTotal damage dealt in ranked matches
ranked[].time_playedintTotal time played in ranked matches (seconds)
krintCurrency balance
levelintCalculated from score (0.03 × √score, min 1)
junkfloatELO/Junk rating
inventoryintTotal skin value
scoreintTotal score
spkfloatScore per kill
killsintTotal kills
deathsintTotal deaths
kdrfloatKill/Death ratio
kpgfloatKills per game
gamesintGames played
winsintGames won
lossesintGames lost (games - wins)
assistsintTotal assists
meleesintMelee kills
beatdownsintFist kills
bullseyesintThrown weapon kills
headshotsintHeadshot kills
legshotsintLeg shot kills
wallbangsintWallbang kills
shotsintTotal shots fired
hitsintShots that connected
missesintShots missed (shots - hits)
time_playedint64Seconds played
nukesintNukes called in
airdropsintAirdrops called in
airdrops_stolenintAirdrops stolen from enemies
slimesintSlimes called in
juggernautsintJuggernaut killstreaks earned
juggernauts_killedintEnemy juggernauts killed
warmachinesintWarmachines called in
class_statsobjectundocumented - class id (string) to score with that class, e.g. {"0": 236755, "1": 20644276}
hacker_taggedboolWhether the player has been flagged as a cheater
kpdboolWhether the player is a KPD moderator
premiumboolWhether the player has an active premium subscription
twitch_namestringundocumented - linked Twitch name, empty string if none
profile_picturestringProfile picture URL (empty string if not premium)
created_atstringAccount creation date (RFC3339 format)
mapsarrayundocumented - maps the player voted on as {id, name, votes}, only seen as [] so far
modsarrayundocumented - mods the player voted on as {id, name, votes}, only seen as [] so far

Get Player Inventory

Retrieve a player's skin inventory.

Parameters:

NameTypeLocationRequiredDescription
playernamestringpathyesThe player's in-game username

Response Fields:

FieldTypeDescription
skin_indexintIdentifier for the skin
skin_idintundocumented - id of the owned item instance (not the definition)
countintNumber owned (excludes market listings)
metadataobjectundocumented - null or kounter stats and float data, every field optional: wear, style, serial, kills, hskills, headshots, hits, shots, jumps
stackableboolundocumented

Get Player Listings

Retrieve a player's active market listings (paginated).

Parameters:

NameTypeLocationRequiredDescription
playernamestringpathyesThe player's in-game username
pageintquerynoPage number (default: 1)

Response Fields:

FieldTypeDescription
skin_indexintIdentifier for the skin being sold
priceintListing price in KR
listed_atstringWhen the listing was created

Notes:

  • Only active listings are returned
  • Page size is fixed at 10 records
  • Listings are ordered by date listed (newest first)

Get Player Match History

Retrieve a player's ranked match history (paginated).

Parameters:

NameTypeLocationRequiredDescription
playernamestringpathyesThe player's in-game username
pageintquerynoPage number (default: 1)
seasonintquerynoSeason filter (default: all seasons)

Response Fields:

FieldTypeDescription
match_idint64Unique match identifier
datestringMatch date (RFC3339 format)
mapintMap ID
durationintMatch duration in seconds
seasonintRanked season number
regionintRegion ID
killsintPlayer's kills in this match
deathsintPlayer's deaths in this match
assistsintPlayer's assists in this match
scoreintPlayer's score in this match
damage_doneintPlayer's damage dealt in this match
headshotsintPlayer's headshots in this match
accuracyintPlayer's accuracy percentage
objective_scoreintPlayer's objective score
krintKR earned from this match
victoryintMatch result (1 = win, 0 = loss, -1 = draw)
rounds_wonintRounds won by player's team
teamintPlayer's team number
play_timeintPlayer's active play time in milliseconds
mmrintPlayer's MMR at the time of this match

Notes:

  • Only ranked matches are returned
  • Page size is fixed at 10 records
  • Matches are ordered by date descending
  • observed: matches is null instead of [] when the page is past the end
  • The mmr field shows the player's rating after each match, allowing you to calculate MMR changes between matches

Get Player Posts

Retrieve a player's social media posts (paginated).

Parameters:

NameTypeLocationRequiredDescription
playernamestringpathyesThe player's in-game username
pageintquerynoPage number (default: 1)

Response Fields:

FieldTypeDescription
pagenumber
per_pagenumber
postsobject[]
posts[].datestring
posts[].textstring
posts[].votesnumber
posts[].comment_countnumber

Match Endpoints

Get Match Details

Retrieve detailed information about a specific ranked match.

Parameters:

NameTypeLocationRequiredDescription
idint64pathyesThe match ID

Notes:

  • Only ranked matches are returned
  • Participants are ordered by team, then by score descending

Response Fields:

FieldTypeDescription
match_idnumber
datestring
mapnumber
durationnumber
seasonnumber
regionnumber
participantsobject[]ordered by team, then score descending
participants[].player_namestring
participants[].killsnumberPlayer's kills in this match
participants[].deathsnumberPlayer's deaths in this match
participants[].assistsnumberPlayer's assists in this match
participants[].scorenumberPlayer's score in this match
participants[].damage_donenumberPlayer's damage dealt in this match
participants[].headshotsnumberPlayer's headshots in this match
participants[].accuracynumberPlayer's accuracy percentage
participants[].objective_scorenumberPlayer's objective score
participants[].victory1 | 0 | -11 = win, 0 = loss, -1 = draw
participants[].rounds_wonnumberRounds won by player's team
participants[].teamnumberPlayer's team number
participants[].play_timenumbermilliseconds

Clan Endpoints

Get Clan Profile

Retrieve a clan's public information.

Parameters:

NameTypeLocationRequiredDescription
clannamestringpathyesThe clan's name

Response Fields:

FieldTypeDescription
namestringClan name
owner_namestringName of the clan owner
scoreint64Clan's total score
rankintClan's leaderboard rank
member_countintNumber of members in the clan
created_atstringClan creation date
discordstringDiscord invite code (empty string if not set)

Get Clan Members

Retrieve a clan's member list (paginated).

Parameters:

NameTypeLocationRequiredDescription
clannamestringpathyesThe clan's name
pageintquerynoPage number (default: 1)

Response Fields:

FieldTypeDescription
player_namestringMember's username
roleintMember's role in the clan
verifiedboolWhether the player is verified
scoreintundocumented - the member's total score

Notes:

  • Page size is fixed at 10 records
  • Members are sorted by role (descending), then by score (descending)

Leaderboard Endpoints

Get Ranked Leaderboard

Retrieve the ranked leaderboard for a specific region.

Parameters:

NameTypeLocationRequiredDescription
regionintpathyesThe region ID (2 = Asia, 3 = Europe, 4 = North America)
pageintquerynoPage number (default: 1)
seasonintquerynoSeason number (default: current season)

Response Fields:

FieldTypeDescription
pageintCurrent page number
per_pageintNumber of entries per page (10)
seasonintCurrent ranked season
regionintRegion ID
entriesobject[]Array of leaderboard entries
entries[].positionintLeaderboard position
entries[].player_namestringPlayer's username
entries[].mmrintMatchmaking rating
entries[].winsintTotal ranked wins
entries[].lossesintTotal ranked losses
entries[].killsintTotal kills in ranked matches
entries[].deathsintTotal deaths in ranked matches
entries[].assistsintTotal assists in ranked matches
entries[].scoreintTotal score in ranked matches
entries[].damage_doneintTotal damage dealt in ranked matches

Notes:

  • Only players with 6+ completed placement matches appear on the leaderboard
  • Page size is fixed at 10 records
  • Entries are sorted by MMR descending
  • Use the season parameter to query historical seasons (omit or set to 0 for current season)

Map Endpoints

Get Map by Name

Retrieve map information by its name.

Parameters:

NameTypeLocationRequiredDescription
mapnamestringpathyesThe map's name (URL encoded)

Response Fields:

FieldTypeDescription
map_idintUnique map identifier
namestringMap name
descriptionstringMap description
creator_namestringUsername of the map creator
votesintTotal upvotes
gameplaysintNumber of times the map has been played
playtimeint64Total playtime in milliseconds
categoryintMap category ID
created_atstringWhen the map was created
updated_atstringWhen the map was last updated
leaderboard_typestringType of leaderboard (e.g., "time", "score", empty if none)
leaderboard_orderintSort order for leaderboard (0 = ascending/lower is better, 1 = descending/higher is better)
featuredboolundocumented - whether the map is currently featured

Notes:

  • Returns 404 if map not found or is restricted/deleted
  • Map name is case-sensitive (observed: it is not, burg finds Burg)
  • observed: created_at and updated_at come as YYYY-MM-DD HH:MM:SS, not RFC3339

List every map that is currently featured, newest first. Use Get Map by Name for a map's details. To be told when a map is featured or unfeatured, use Events.

Response Fields:

FieldTypeDescription
maps[].map_idintUnique map identifier
maps[].namestringMap name
maps[].creator_idintPlayer id of the map creator
maps[].creator_namestringUsername of the map creator
countintNumber of maps returned

Get Map Leaderboard

Retrieve the leaderboard for a specific map (paginated).

Parameters:

NameTypeLocationRequiredDescription
mapnamestringpathyesThe map's name (URL encoded)
pageintquerynoPage number (default: 1)
typestringquerynoBuilt-in leaderboard to rank on: score or time. Defaults to the map's configured leaderboard
orderintqueryno0 = ascending, 1 = descending. Defaults to the map's order for its configured leaderboard; otherwise ascending for time, descending for score

Response Fields:

FieldTypeDescription
pageintCurrent page number
per_pageintNumber of entries per page (25)
map_namestringThe map name queried
leaderboard_typestringType of leaderboard (e.g., "time", "score")
leaderboard_orderintSort order (0 = ascending, 1 = descending)
entriesobject[]Array of leaderboard entries
entries[].positionintLeaderboard position
entries[].player_namestringPlayer's username
entries[].valueintScore or time value
entries[].datestringWhen the entry was recorded

Notes:

  • Returns empty entries array if the map has no leaderboard configured
  • Maps can show both a score and a time leaderboard in-game; use type (and order) to fetch either. Invalid values return 400
  • Page size is fixed at 25 records
  • Entries are sorted by value according to leaderboard_order

Get Map Leaderboard Player

Look up a specific player's position on a map leaderboard.

Parameters:

NameTypeLocationRequiredDescription
mapnamestringpathyesThe map's name (URL encoded)
playernamestringpathyesThe player's username (URL encoded)
typestringquerynoBuilt-in leaderboard to rank on: score or time. Defaults to the map's configured leaderboard
orderintqueryno0 = ascending, 1 = descending. Defaults to the map's order for its configured leaderboard; otherwise ascending for time, descending for score

Response Fields:

FieldTypeDescription
map_namestringThe map name queried
leaderboard_typestringType of leaderboard (e.g., "time", "score")
leaderboard_orderintSort order (0 = ascending, 1 = descending)
player_namestringPlayer's username
positionintPlayer's position on the leaderboard
valueintPlayer's score or time value
datestringWhen the entry was recorded

Notes:

  • Returns 404 if the map has no leaderboard (and no type is given) or the player has no entry
  • Position is calculated dynamically based on current leaderboard standings

Mod Endpoints

Get Mods

Retrieve a paginated list of mods, sorted by votes (most popular first).

Parameters:

NameTypeLocationRequiredDescription
pageintquerynoPage number (default: 1)

Response Fields:

FieldTypeDescription
pageintCurrent page number
per_pageintNumber of mods per page (10)
modsobject[]Array of mod objects
mods[].mod_idintUnique mod identifier
mods[].namestringMod name
mods[].descriptionstringMod description
mods[].creator_namestringUsername of the mod creator
mods[].votesintNumber of upvotes
mods[].featuredboolWhether the mod is featured
mods[].versionintMod version number
mods[].created_atstringWhen the mod was first published (observed: YYYY-MM-DD HH:MM:SS, not RFC3339)
mods[].updated_atstringWhen the mod was last updated (same format)

Notes:

  • Mods are sorted by votes (most popular first)
  • Only active mods are returned (deleted mods are excluded)
  • Mods from banned users are excluded

Get Mod by Name

Retrieve detailed information about a specific mod.

Parameters:

NameTypeLocationRequiredDescription
modnamestringpathyesThe mod's name (URL encoded)

Response Fields:

FieldTypeDescription
mod_idintUnique mod identifier
namestringMod name
descriptionstringMod description
creator_namestringUsername of the mod creator
votesintNumber of upvotes
featuredboolWhether the mod is featured
versionintMod version number
created_atstringWhen the mod was first published
updated_atstringWhen the mod was last updated

Market Endpoints

Get Market Listings by Skin Index

Retrieve market information and active listings for a specific skin.

Parameters:

NameTypeLocationRequiredDescription
skinindexintpathyesThe skin index (item type ID)
pageintquerynoPage number for listings (default: 1)
daysintquerynoNumber of days for price history (default: 30, max: 120)

Response Fields:

FieldTypeDescription
skin_indexintThe skin index queried
total_listingsintTotal number of active listings
lowest_priceintLowest listed price (0 if no listings)
average_pricefloatAverage sale price from last 7 days
total_circulatingintTotal quantity of this skin in circulation
listingsobject[]Paginated list of active listings (sorted by price ascending)
listings[].priceintListing price in KR
listings[].seller_namestringSeller's username
listings[].listed_atstringWhen the listing was created
ownersobject[]First 100 owners sorted by quantity owned (descending)
owners[].player_namestringOwner's username
owners[].countintNumber of this skin the player owns
price_historyobject[]Daily average sale prices for the specified time period
price_history[].datestringDate (YYYY-MM-DD format)
price_history[].average_pricefloatAverage sale price on that day
price_history[].salesintNumber of sales on that day

Notes:

  • Listings are sorted by price (lowest first)
  • Page size is fixed at 10 records for listings
  • average_price is calculated from sales in the last 7 days
  • Owners list shows up to 100 players, sorted by quantity owned (highest first)
  • Banned users are excluded from the owners list
  • price_history contains daily averages for days with sales within the specified days parameter (default 30, max 120 days / 4 months)
  • observed: this is the slow endpoint, over 10 s cold and about 3 s warm; every other endpoint answers in under a second

Skin Definitions

Get Skin Definitions

List all skin definitions with optional filtering.

Parameters:

NameTypeLocationRequiredDescription
pageintquerynoPage number (default: 1)
per_pageintquerynoItems per page (default: 100, max: 10000)
seasonintquerynoSeason filter (returns only skins for the specified season)

Response Fields:

FieldTypeDescription
pageintCurrent page number
per_pageintItems per page
totalintTotal number of matching skins
skinsarrayArray of skin objects
skins[].indexintSkin index (ID)
skins[].namestringSkin name
skins[].typeintSkin type
skins[].rarityintSkin rarity
skins[].weaponintWeapon index (omitted if null)
skins[].seasintundocumented - the skin's season; this is the field name the season filter refers to, there is no season field in the reply
skins[].thumbnailstringundocumented - preview image URL
skins[].tradableboolundocumented
skins[].idintundocumented - equals index on GET /api/skins/:skinid, absent in the list

Notes:

  • Each skin object may contain additional properties from its configuration, merged into the root level (observed: creator, glow, frames, frameT, mid, midT, pulsT, ...)
  • Use the season parameter to retrieve skins for a specific ranked season
  • Skins without a season field are treated as season 1

Example:

Get skins from season 12:


Get Skin Definition

Get a single skin definition by its index.

Parameters:

NameTypeLocationRequiredDescription
skinidintpathyesThe skin index (0-based)

Error Responses:

  • 400 if skinid is not a valid integer
  • 404 if skin does not exist

Response Fields:

FieldTypeDescription
indexnumberSkin index (ID)
namestringSkin name
typenumberSkin type
raritynumberSkin rarity
weaponnumberomitted when the skin has no weapon
seasnumberthe season; the docs call this field season
idnumberundocumented, equals index on the single skin endpoint
thumbnailstringundocumented
tradablebooleanundocumented

KPD Endpoints

Get Latest KPD Calls

List the 50 most recent KPD (player hacker-report) calls, newest first, across all statuses so officer verdicts are visible. Requires the kpd scope.

Parameters:

None.

Response Fields:

FieldTypeDescription
idintReport id
datestringCall time (RFC 3339, UTC)
caller_idintReporter player id
caller_namestringReporter name
caller_scoreintReporter score
caller_job_ratingintReporter's total KPD job rating
caller_job_rating_positiveintReporter's correct (positive) call count
called_idintReported player id
called_namestringReported player name (guest if unregistered)
called_scoreintReported player score
kdf_typeintCall context: 0=public, 1=ranked, 2=comp, 3=custom
kdf_type_labelstringReadable kdf_type
statusint1=not responded, 2=responded, 3=reviewed
status_labelstringReadable status
ratingintOfficer verdict: 0=pending, 1=banned, 2=rejected
rating_labelstringReadable rating
officer_idintOfficer who handled the call (0 if none)
officer_namestringOfficer name
status_datestringLast status change (RFC 3339, UTC)
game_codestringGame instance code
hoststringGame server host
portstringGame server port
tokenstringInternal call token

Notes:

  • Player IP addresses are not exposed.
  • A fixed window of the 50 most recent calls; there is no pagination.

Events

Events tell you when something happens on Krunker, such as a map being featured. You can poll for them, or have them pushed to a webhook (below). Both use the same events.

Each event type belongs to one events scope. A key only sees the types whose scope it holds; ask for a scope from the partner portal.

TypeScopeSent when
map.featuredevents.mapsA map was featured
map.unfeaturedevents.mapsA map is no longer featured

Every key with the scope gets the event. Events are kept for 30 days.

List Events

Returns events newer than after, oldest first. Store next and pass it as after on your next call. Start with after=0. Keep the same filters between calls; next also moves past events your filters skipped, so changing filters later does not bring those back.

Rate limit: 6 requests per minute per key, on top of the general limit. The X-RateLimit-* headers on this endpoint describe this 6-per-minute limit. Poll every 20 to 60 seconds; if has_more is true, fetch the next page right away.

Parameters:

NameTypeLocationRequiredDescription
afterintquerynoEvent id cursor (default 0)
typesstringquerynoComma-separated event types to return (default: all your scopes allow)
target_typestringquerynoOnly events about this kind of target, e.g. map
target_idstringquerynoComma-separated target ids, up to 100 (needs target_type), e.g. target_type=map&target_id=8497,8500
limitintqueryno1 to 100 (default 100)

Events appear a few seconds after they happen. Ids only increase; gaps are normal.

Event data:

Typedata fields
map.featured, map.unfeaturedmap_id, map_name, creator

Response Fields:

FieldTypeDescription
eventsobject[]oldest first
events[].idnumberonly ever increases, gaps are normal
events[].typestringthe types documented so far; a key only sees the types of the event scopes it holds
events[].created_atstringrfc3339 utc
events[].targetobjectwhat an event is about, e.g. type "map" and the map id
events[].target.typestring
events[].target.idnumber or string
events[].dataobject or object
events[].data.map_idnumber
events[].data.map_namestring
events[].data.creatorstring
nextnumberpass as `after` on the next call, it also moves past events the filters skipped
has_moreboolean

Webhooks

Instead of polling, Krunker can POST each event to your HTTPS endpoint. The Krunker team enables webhooks for your key; you then add endpoints, pick their event types and see deliveries under Developer > Webhooks in the partner portal.

Request: POST with a JSON body shaped like one item of events above, and these headers:

HeaderDescription
Krunker-Event-IdThe event id. The same event can arrive more than once; use this header, not the body's id, to ignore repeats (test and signature-check requests have "id": 0 and an id like test-... / verify-... here)
Krunker-Event-TypeThe event type, e.g. map.featured (webhook.test for test sends, webhook.verify for the signature check)
Krunker-Delivery-IdThis delivery
Krunker-Delivery-Attempt1 for the first try, then 2, 3, ... It can also go up without a failed request on your side (e.g. an attempt cut off by a restart on ours), and starts again at 1 when you redeliver from the portal
Krunker-Signaturet=<unix seconds>,v1=<signature>

Respond with any 2xx within 10 seconds. Anything else, a timeout or a redirect counts as a failure and is retried after 30s, 2m, 10m, 30m, 1h, 2h, 4h, 8h and 8h (about a day). If an endpoint keeps failing for that whole time it is turned off and you get a Krunker Mail; fix it and turn it back on in the portal. Events that happen while a webhook is off are not sent to it; catch up with GET /api/events, or redeliver single events from the portal. Delivery order is not guaranteed.

Verify the signature. Compute HMAC-SHA256 of <t>.<raw request body> with your endpoint's signing secret (whsec_..., shown once when you create or rotate it), hex-encode it and compare it with v1 in constant time. Reject requests whose t is more than 5 minutes old. Answer 401 when either check fails.

import { createHmac, timingSafeEqual } from 'node:crypto';

function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
  if (Math.abs(Date.now() / 1000 - Number(parts.t)) > 300) return false;
  const expected = createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex');
  return parts.v1?.length === expected.length && timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
}

Signature check. A webhook receives nothing until its endpoint passes a check. Click Verify on the webhook page after you install the secret. Krunker then sends 10 webhook.verify requests in random order:

  • Some are signed with your secret; answer them with a 2xx.
  • The others carry a wrong signature; reject them with 401 Unauthorized. Any other status fails the check.

The first wrong answer, error or timeout fails the check, and the page says which request failed. After you rotate the secret, verify again. If you change the URL, the check runs again by itself. It also runs again when you turn a webhook back on after it was turned off for failing.

{
  "id": 0,
  "type": "webhook.verify",
  "created_at": "2026-10-11T09:12:44Z",
  "target": { "type": "webhook", "id": 12 },
  "data": { "nonce": "4f9c0e6a1b2d3c4e5f60718293a4b5c6" }
}

Endpoints must use https and resolve to a public address.

In krapio, verifyWebhook(rawBody, request.headers.get("Krunker-Signature"), secret) does the whole check above on WebCrypto, and signWebhook produces the header for your own tests.


Error Responses

All endpoints return standard error responses:

Status CodeDescription
400Bad request (missing or invalid parameters)
403Forbidden (invalid API key)
404Resource not found
429Rate limit exceeded
500Internal server error

observed: 404 replies carry the plain text body Not Found, not the json below.

Error Response Format:

{
  "error": "Error message description"
}

On this page