BrawlAPI

A free, static JSON API for Brawl Stars data — brawlers, maps, game modes, icons, events, and the raw game CSV files. Served straight from Cloudflare Pages, so it is fast, cached, and needs no key.

Base URL https://api.brawlapi.com (the underlying Pages project is also reachable at https://brawlapi-v1.pages.dev).

Brawlers

Every Brawler in the game, list + detail. List elements carry the full field set (nothing is trimmed), so the list and the per-id detail are byte-identical objects.

GET/v1/brawlers

Returns all Brawlers wrapped in a { list: [] } envelope. 107 entries, ordered newest-first (highest id first). Each element is a full Brawler object identical to the detail endpoint (no fields are omitted in the list).

Response { list: Brawler[] }

Static file. CORS: Access-Control-Allow-Origin: *; Cache-Control: public, max-age=3600. Extensionless URL (Pages rewrite) or explicit .json both return 200. No auth / no rate limit.

Fields

FieldTypeDescription
listBrawler[]Array of 107 Brawler objects, newest first. See the detail endpoint for the per-object field set.

Example response

{
  "list": [
    {
      "id": 16000108,
      "avatarId": 28001287,
      "name": "Wendy",
      "hash": "Wendy",
      "path": "Wendy",
      "fankit": "Wendy",
      "released": true,
      "version": 1,
      "link": "https://brawlify.com/brawlers/16000108",
      "imageUrl": "https://cdn.brawlify.com/brawlers/borders/16000108.png",
      "imageUrl2": "https://cdn.brawlify.com/brawlers/borderless/16000108.png",
      "imageUrl3": "https://cdn.brawlify.com/brawlers/emoji/16000108.png",
      "class": {
        "id": 0,
        "name": "Unknown"
      },
      "rarity": {
        "id": 5,
        "name": "Mythic",
        "color": "#fe5e72"
      },
      "unlock": null,
      "description": "A smart scientist, with a nostalgic soul. After years working in shady corporate laboratories, she left to build Windstock and help the planet, not harm it!",
      "descriptionHtml": "A smart scientist, with a nostalgic soul. After years working in shady corporate laboratories, she left to build Windstock and help the planet, not harm it!",
      "starPowers": [
        {
          "id": 23001318,
          "name": "Slowing Shield",
          "path": "Slowing-Shield",
          "version": 1,
          "description": "Enemies in Wendy’s shield generator are slowed.",
          "descriptionHtml": "Enemies in Wendy’s shield generator are slowed.",
          "imageUrl": "https://cdn.brawlify.com/star-powers/borderless/23001318.png",
          "released": true
        },
        {
          "id": 23001319,
          "name": "Solar Shield",
          "path": "Solar-Shield",
          "version": 1,
          "description": "Wendy’s shield generator gains an additional  <!card.value.scaleToLevel> health.",
          "descriptionHtml": "Wendy’s shield generator gains an additional <span style=\"color:#00cc00;\"> <!card.value.scaleToLevel></span> health.",
          "imageUrl": "https://cdn.brawlify.com/star-powers/borderless/23001319.png",
          "released": true
        }
      ],
      "gadgets": [
        {
          "id": 23001320,
          "name": "Wind-Powered",
          "path": "Wind-Powered",
          "version": 1,
          "description": "Wendy's platform gives her a boost and she jumps a short distance.",
          "descriptionHtml": "Wendy's platform gives her a boost and she jumps a short distance.",
          "imageUrl": "https://cdn.brawlify.com/gadgets/borderless/23001320.png",
          "released": true
        },
        {
          "id": 23001321,
          "name": "Green Grenade",
          "path": "Green-Grenade",
          "version": 1,
          "description": "Wendy launches a wind grenade that slows all enemies hit and stops them healing momentarily.",
          "descriptionHtml": "Wendy launches a wind grenade that slows all enemies hit and stops them healing momentarily.",
          "imageUrl": "https://cdn.brawlify.com/gadgets/borderless/23001321.png",
          "released": true
        }
      ],
      "videos": []
    },
    /* … 106 more */
  ]
}

GET/v1/brawlers/{id}

Returns a single Brawler object by numeric id (e.g. 16000108). The object is byte-identical to the corresponding element in /v1/brawlers — the list is not a trimmed projection.

Path params id — numeric brawler id, e.g. 16000108 (range 16000000+).

Response Brawler (bare object, no envelope)

Same headers/caching as the list. Unknown id returns 404 (no matching static file).

Fields

FieldTypeDescription
idnumberBrawler id, e.g. 16000108.
avatarIdnumberIn-game avatar/profile-icon id for this brawler.
namestringDisplay name, e.g. "Wendy".
hashstringURL-safe name hash used in brawlify.com paths.
pathstringSlug path segment (usually same as hash).
fankitstringFankit asset name for this brawler.
releasedbooleanWhether the brawler is live in-game.
versionnumberAsset/data version counter.
linkstringCanonical brawlify.com page, e.g. https://brawlify.com/brawlers/16000108.
imageUrlstringBordered portrait PNG on cdn.brawlify.com.
imageUrl2stringBorderless portrait PNG.
imageUrl3stringEmoji-style PNG.
classobject {id, name}Brawler class/role, e.g. {id:0, name:"Unknown"}.
rarityobject {id, name, color}Rarity with hex color, e.g. {id:5, name:"Mythic", color:"#fe5e72"}.
unlocknullUnlock info; currently always null.
descriptionstringPlain-text lore/description (may contain <!card.value...> tokens).
descriptionHtmlstringHTML-formatted variant of description with inline color spans.
starPowersobject[]Star powers; each {id, name, path, version, description, descriptionHtml, imageUrl, released}. imageUrl on cdn.brawlify.com/star-powers/borderless/{id}.png.
gadgetsobject[]Gadgets; same object shape as starPowers. imageUrl on cdn.brawlify.com/gadgets/borderless/{id}.png.
videosarrayRelated videos; typically empty.

Example response

{
  "id": 16000108,
  "avatarId": 28001287,
  "name": "Wendy",
  "hash": "Wendy",
  "path": "Wendy",
  "fankit": "Wendy",
  "released": true,
  "version": 1,
  "link": "https://brawlify.com/brawlers/16000108",
  "imageUrl": "https://cdn.brawlify.com/brawlers/borders/16000108.png",
  "imageUrl2": "https://cdn.brawlify.com/brawlers/borderless/16000108.png",
  "imageUrl3": "https://cdn.brawlify.com/brawlers/emoji/16000108.png",
  "class": {
    "id": 0,
    "name": "Unknown"
  },
  "rarity": {
    "id": 5,
    "name": "Mythic",
    "color": "#fe5e72"
  },
  "unlock": null,
  "description": "A smart scientist, with a nostalgic soul. After years working in shady corporate laboratories, she left to build Windstock and help the planet, not harm it!",
  "descriptionHtml": "A smart scientist, with a nostalgic soul. After years working in shady corporate laboratories, she left to build Windstock and help the planet, not harm it!",
  "starPowers": [
    {
      "id": 23001318,
      "name": "Slowing Shield",
      "path": "Slowing-Shield",
      "version": 1,
      "description": "Enemies in Wendy’s shield generator are slowed.",
      "descriptionHtml": "Enemies in Wendy’s shield generator are slowed.",
      "imageUrl": "https://cdn.brawlify.com/star-powers/borderless/23001318.png",
      "released": true
    },
    {
      "id": 23001319,
      "name": "Solar Shield",
      "path": "Solar-Shield",
      "version": 1,
      "description": "Wendy’s shield generator gains an additional  <!card.value.scaleToLevel> health.",
      "descriptionHtml": "Wendy’s shield generator gains an additional <span style=\"color:#00cc00;\"> <!card.value.scaleToLevel></span> health.",
      "imageUrl": "https://cdn.brawlify.com/star-powers/borderless/23001319.png",
      "released": true
    }
  ],
  "gadgets": [
    {
      "id": 23001320,
      "name": "Wind-Powered",
      "path": "Wind-Powered",
      "version": 1,
      "description": "Wendy's platform gives her a boost and she jumps a short distance.",
      "descriptionHtml": "Wendy's platform gives her a boost and she jumps a short distance.",
      "imageUrl": "https://cdn.brawlify.com/gadgets/borderless/23001320.png",
      "released": true
    },
    {
      "id": 23001321,
      "name": "Green Grenade",
      "path": "Green-Grenade",
      "version": 1,
      "description": "Wendy launches a wind grenade that slows all enemies hit and stops them healing momentarily.",
      "descriptionHtml": "Wendy launches a wind grenade that slows all enemies hit and stops them healing momentarily.",
      "imageUrl": "https://cdn.brawlify.com/gadgets/borderless/23001321.png",
      "released": true
    }
  ],
  "videos": []
}
Notes & caveats
  • The list object is NOT trimmed — each element carries the full field set including nested starPowers[] and gadgets[], identical to the detail file.
  • class.name can be "Unknown" (id 0) for brawlers whose class isn't set. unlock is null and videos is an empty array across sampled brawlers.
  • descriptionHtml/description may contain raw in-game tokens like <!card.value.scaleToLevel>.

Maps

All Brawl Stars maps. The list omits the stats/teamStats arrays; the per-id detail adds them (currently always empty in this static dataset).

GET/v1/maps

Full list of all 1239 Brawl Stars maps. Each Map is returned in LIST form, which omits the stats and teamStats arrays present on the detail endpoint. Order is by id ascending.

Response { list: Map[] }

Static JSON on Cloudflare Pages. Headers: Access-Control-Allow-Origin: *, Cache-Control: public, max-age=3600. No auth / no rate limits. Extensionless URL (Pages _redirects rewrite to .json, HTTP 200); /v1/maps.json also works.

Fields

FieldTypeDescription
listMap[]Array of 1239 Map objects in LIST form (no stats/teamStats).
list[].idnumberMap id, e.g. 15000000.
list[].newbooleanWhether the map is newly added.
list[].disabledbooleanWhether the map is currently disabled/out of rotation.
list[].namestringDisplay name, e.g. "Temple Ruins".
list[].hashstringURL-safe slug, e.g. "Temple-Ruins".
list[].versionnumberAsset/data version counter.
list[].linkstringCanonical brawlify.com page, e.g. https://brawlify.com/maps/15000000.
list[].imageUrlstringRendered map PNG on cdn.brawlify.com.
list[].creditstring | nullMap maker credit; null when none.
list[].environmentobjectNested environment/theme object {id, scId, name, hash, path, version, imageUrl}.
list[].gameModeobjectNested game mode object {id, scId, name, hash, version, color, bgColor, link, imageUrl}.
list[].lastActivenumberUnix timestamp of last rotation activity; 0 if never/unknown.
list[].dataUpdatednumberUnix timestamp of last data update; 0 if unknown.

Example response

{
  "list": [
    {
      "id": 15000000,
      "new": false,
      "disabled": true,
      "name": "Temple Ruins",
      "hash": "Temple-Ruins",
      "version": 1,
      "link": "https://brawlify.com/maps/15000000",
      "imageUrl": "https://cdn.brawlify.com/maps/regular/15000000.png",
      "credit": null,
      "environment": {
        "id": 1,
        "scId": 47000016,
        "name": "Default",
        "hash": "event_canyon_banner",
        "path": "Default",
        "version": 1,
        "imageUrl": "https://cdn-misc.brawlify.com/gamemode/header/Bounty.png"
      },
      "gameMode": {
        "id": 48000003,
        "scId": 48000003,
        "name": "Bounty",
        "hash": "Bounty",
        "version": 1,
        "color": "#24d6ff",
        "bgColor": "#00cfff",
        "link": "https://brawlify.com/gamemodes/Bounty",
        "imageUrl": "https://cdn.brawlify.com/game-modes/regular/48000003.png"
      },
      "lastActive": 0,
      "dataUpdated": 0
    },
    /* … 1238 more */
  ]
}

GET/v1/maps/{id}

Single map by numeric id (e.g. /v1/maps/15000000). Returns the same Map object as in the list, plus two extra arrays: stats[] and teamStats[]. In the current static dataset both arrays are always present but empty ([]).

Path params id — numeric map id, e.g. 15000000.

Response Map (bare object, not wrapped in list)

Same headers/caching/no-auth as the list. Extensionless; /v1/maps/{id}.json also works. Fields id..dataUpdated identical to the LIST shape (see /v1/maps).

Fields

FieldTypeDescription
(all list fields)id, new, disabled, name, hash, version, link, imageUrl, credit, environment{}, gameMode{}, lastActive, dataUpdated — identical to /v1/maps list entries.
statsarrayBrawler-level stats for this map; DETAIL-only. Empty [] in current static data.
teamStatsarrayTeam-composition stats for this map; DETAIL-only. Empty [] in current static data.

Example response

{
  "id": 15000000,
  "new": false,
  "disabled": true,
  "name": "Temple Ruins",
  "hash": "Temple-Ruins",
  "version": 1,
  "link": "https://brawlify.com/maps/15000000",
  "imageUrl": "https://cdn.brawlify.com/maps/regular/15000000.png",
  "credit": null,
  "environment": {
    "id": 1,
    "scId": 47000016,
    "name": "Default",
    "hash": "event_canyon_banner",
    "path": "Default",
    "version": 1,
    "imageUrl": "https://cdn-misc.brawlify.com/gamemode/header/Bounty.png"
  },
  "gameMode": {
    "id": 48000003,
    "scId": 48000003,
    "name": "Bounty",
    "hash": "Bounty",
    "version": 1,
    "color": "#24d6ff",
    "bgColor": "#00cfff",
    "link": "https://brawlify.com/gamemodes/Bounty",
    "imageUrl": "https://cdn.brawlify.com/game-modes/regular/48000003.png"
  },
  "lastActive": 0,
  "dataUpdated": 0,
  "stats": [],
  "teamStats": []
}
Notes & caveats
  • v1/maps.json has exactly 1239 entries; detail files add exactly two keys (stats, teamStats). Across the static dataset every stats[]/teamStats[] is empty.
  • lastActive and dataUpdated are 0 in the static export defaults.

Game Modes

All game modes. Detail is addressable by BOTH the numeric id and a sequential 1..68 index — both files exist on disk and are byte-identical for the same mode.

GET/v1/gamemodes

List of all game modes (68 modes). Returns an object with a single `list` array of GameMode objects.

Response { list: GameMode[] }

Extensionless URL (Pages _redirects rewrites to .json, HTTP 200); the .json suffix also works directly. Headers: Access-Control-Allow-Origin: *, Cache-Control: public, max-age=3600. No auth/keys/rate limits.

Fields

FieldTypeDescription
listGameMode[]Array of 68 GameMode objects (see the detail endpoint for the element shape).

Example response

{
  "list": [
    {
      "id": 48000000,
      "scId": 48000000,
      "name": "Gem Grab",
      "hash": "Gem-Grab",
      "scHash": "gemGrab",
      "disabled": false,
      "color": "#d852ff",
      "bgColor": "#9a3df3",
      "version": 1,
      "title": "3 vs 3",
      "tutorial": "Collect Gems that pop out of the Gem Mine in the middle of the map. Or, just take them from fallen opponents! Hold ten Gems for the duration of a countdown to win the game!",
      "description": "Collect Gems that pop out of the Gem Mine in the middle of the map. Or, just take them from fallen opponents! Hold ten Gems for the duration of a countdown to win the game!",
      "shortDescription": "Grab 10 gems to win",
      "sort1": 1,
      "sort2": 1,
      "link": "https://brawlify.com/gamemodes/Gem-Grab",
      "imageUrl": "https://cdn.brawlify.com/game-modes/regular/48000000.png",
      "imageUrl2": "https://cdn-misc.brawlify.com/gamemode/header/Gem-Grab.png",
      "lastActive": null,
      "TID": "TID_GAME_MODE_0"
    },
    /* … 67 more */
  ]
}

GET/v1/gamemodes/{id}

A single GameMode object. Dual addressing: {id} resolves by BOTH the numeric game-mode id (e.g. 48000000) AND a sequential 1..68 index (e.g. 1). Both files exist on disk and are byte-identical for the same mode. Same object as the corresponding element in /v1/gamemodes.

Path params id — either the numeric scId/id (e.g. 48000000) or a 1-based sequential index 1..68.

Response GameMode (bare object, no wrapper)

136 detail files total = 68 numeric-id files + 68 sequential-index files. Extensionless URL rewrites to .json (HTTP 200); .json suffix also works. Headers: Access-Control-Allow-Origin: *, Cache-Control: public, max-age=3600.

Fields

FieldTypeDescription
idnumberGame mode id (equals scId; e.g. 48000000).
scIdnumberSupercell game id (same value as id).
namestringDisplay name, e.g. "Gem Grab".
hashstringURL slug used in link, e.g. "Gem-Grab".
scHashstringSupercell internal camelCase key, e.g. "gemGrab".
disabledbooleanWhether the mode is currently disabled/retired.
colorstringPrimary hex color, e.g. "#d852ff".
bgColorstringBackground hex color, e.g. "#9a3df3".
versionnumberAsset/content version.
titlestringShort subtitle, e.g. "3 vs 3".
tutorialstringFull tutorial/how-to-play text (often same as description).
descriptionstringFull description text.
shortDescriptionstringOne-line summary, e.g. "Grab 10 gems to win".
sort1numberPrimary sort weight.
sort2numberSecondary sort weight.
linkstringBrawlify detail page URL, e.g. https://brawlify.com/gamemodes/Gem-Grab.
imageUrlstringRegular icon on cdn.brawlify.com, e.g. /game-modes/regular/48000000.png.
imageUrl2stringHeader image on cdn-misc.brawlify.com, e.g. /gamemode/header/Gem-Grab.png.
lastActivenumber | nullUnix timestamp last active, or null.
TIDstringLocalization text id, e.g. "TID_GAME_MODE_0".

Example response

{
  "id": 48000000,
  "scId": 48000000,
  "name": "Gem Grab",
  "hash": "Gem-Grab",
  "scHash": "gemGrab",
  "disabled": false,
  "color": "#d852ff",
  "bgColor": "#9a3df3",
  "version": 1,
  "title": "3 vs 3",
  "tutorial": "Collect Gems that pop out of the Gem Mine in the middle of the map. Or, just take them from fallen opponents! Hold ten Gems for the duration of a countdown to win the game!",
  "description": "Collect Gems that pop out of the Gem Mine in the middle of the map. Or, just take them from fallen opponents! Hold ten Gems for the duration of a countdown to win the game!",
  "shortDescription": "Grab 10 gems to win",
  "sort1": 1,
  "sort2": 1,
  "link": "https://brawlify.com/gamemodes/Gem-Grab",
  "imageUrl": "https://cdn.brawlify.com/game-modes/regular/48000000.png",
  "imageUrl2": "https://cdn-misc.brawlify.com/gamemode/header/Gem-Grab.png",
  "lastActive": null,
  "TID": "TID_GAME_MODE_0"
}
Notes & caveats
  • GameMode detail is a BARE object (no wrapper), identical to the matching list element.
  • Dual addressing confirmed: /v1/gamemodes/1.json (index) and /v1/gamemodes/48000000.json (id) are byte-identical (136 detail files = 68 ids + 68 indices).
  • tutorial and description may be identical strings for a mode but are distinct fields; lastActive is typed number|null but is currently null for all 68 modes in the static dataset.

Icons

All profile (player) icons and club badges — returned as two OBJECTS keyed by id, not arrays. Iterate with Object.values()/Object.entries().

GET/v1/icons

All profile (player) icons and club badges. Returns two OBJECTS keyed by icon id (not arrays): `player` and `club`. Static file; extensionless URL rewrites to .json (HTTP 200), the .json suffix also works directly.

Response { player: {<id>: PlayerIcon}, club: {<id>: ClubIcon} }

player currently has 1325 entries, club has 60 entries. Keys are the numeric icon id as a string; each value repeats that id in its `id` field. Images on cdn.brawlify.com. Headers: Access-Control-Allow-Origin: *, Cache-Control: public, max-age=3600. No auth/keys/rate limits.

Fields

FieldTypeDescription
playerobject<string, PlayerIcon>Map of player-icon id -> PlayerIcon. ~1325 entries.
clubobject<string, ClubIcon>Map of club-badge id -> ClubIcon. ~60 entries.
player.<id>.idnumberIcon id (matches the key).
player.<id>.namestringInternal icon name, e.g. "base1".
player.<id>.name2stringSecondary/asset name, e.g. "player_icon_00".
player.<id>.imageUrlstringcdn.brawlify.com PNG URL.
player.<id>.imageUrl2stringSecond image URL (often identical to imageUrl).
player.<id>.brawlernumber | nullAssociated brawler id, or null if not brawler-specific.
player.<id>.requiredExpLevelnumberExperience level required to unlock.
player.<id>.requiredTotalTrophiesnumberTotal trophies required to unlock.
player.<id>.sortOrdernumberDisplay sort order.
player.<id>.isRewardbooleanWhether the icon is a reward unlock.
player.<id>.isAvailableForOffersbooleanWhether obtainable via in-game offers.
club.<id>.idnumberClub badge id (matches the key).
club.<id>.imageUrlstringcdn.brawlify.com club-badge PNG URL. Club icons carry ONLY id + imageUrl.

Example response

{
  "player": {
    "28000000": {
      "id": 28000000,
      "name": "base1",
      "name2": "player_icon_00",
      "imageUrl": "https://cdn.brawlify.com/profile-icons/regular/28000000.png",
      "imageUrl2": "https://cdn.brawlify.com/profile-icons/regular/28000000.png",
      "brawler": null,
      "requiredExpLevel": 1,
      "requiredTotalTrophies": 0,
      "sortOrder": 0,
      "isReward": false,
      "isAvailableForOffers": false
    },
    /* … 1324 more fields */
  },
  "club": {
    "8000000": {
      "id": 8000000,
      "imageUrl": "https://cdn.brawlify.com/club-badges/regular/8000000.png"
    },
    /* … 59 more fields */
  }
}
Notes & caveats
  • player and club are OBJECTS keyed by string id, NOT arrays.
  • ClubIcon carries only id + imageUrl — no name/level/trophy fields like PlayerIcon.

Events

A static placeholder. Both arrays are ALWAYS empty — this API does not serve live event rotation. Use the live Brawl Stars / Brawlify API for real events.

GET/v1/events

Event rotation envelope. In THIS static API both arrays are ALWAYS empty — the file does not serve live event rotation. Use the live Brawl Stars / Brawlify API for real current + upcoming events.

Response { active: [], upcoming: [] }

Verified on disk: {"active":[],"upcoming":[]} with zero entries in both arrays. Static Cloudflare Pages file; intentionally empty and not updated with live rotation. Headers: Access-Control-Allow-Origin: *, Cache-Control: public, max-age=3600.

Fields

FieldTypeDescription
activearrayCurrently-active events. ALWAYS empty in this static API.
upcomingarrayUpcoming events. ALWAYS empty in this static API.

Example response

{
  "active": [],
  "upcoming": []
}

Game CSV

The raw game data files. /game is an index of every CSV; /game/{path} returns that CSV converted to JSON, keyed by row name, with a synthetic id = fileId*1,000,000 + index.

GET/game

Index of all game CSV files. Returns a flat JSON object mapping each CSV path -> metadata { id, file, path }. 168 entries across three dirs (csv_logic: 119, csv_client: 26, localization: 23). `id` is the numeric file id used in the row-id formula (null when the file has no assigned id).

Response Bare object keyed by CSV path (not an array, no wrapper)

3 dirs: csv_logic, csv_client, localization. Use the keys directly as {path} for /game/{path}.

Fields

FieldTypeDescription
<path>objectKey is the extensionless CSV path (e.g. "csv_logic/characters"); value is the metadata object below.
<path>.idnumber | nullFile id; multiplied by 1,000,000 to form row ids. null for files without an id (treated as 0).
<path>.filestringOriginal CSV filename, e.g. "characters.csv".
<path>.pathstringSame extensionless path as the key, e.g. "csv_logic/characters".

Example response

{
  "csv_client/animations": {
    "id": 24,
    "file": "animations.csv",
    "path": "csv_client/animations"
  },
  "csv_client/availability_window": {
    "id": null,
    "file": "availability_window.csv",
    "path": "csv_client/availability_window"
  },
  "csv_client/billing_packages": {
    "id": 2,
    "file": "billing_packages.csv",
    "path": "csv_client/billing_packages"
  },
  /* … 165 more fields */
}

GET/game/{path}

The named CSV converted to JSON. Returns a bare object keyed by each row's first-column name (e.g. character/entry name). Each row value is the CSV row as an object with typed values (bool/number/string/null, arrays for repeated columns) plus a synthetic `id` = fileId*1,000,000 + rowIndex (fileId from the /game index; null fileId -> 0). Column set varies per file; column names come from the CSV header.

Path params path — one of the index keys, e.g. csv_logic/characters, csv_client/animations, localization/texts.

Response Bare object keyed by row name; each value is a row object whose first field is `id`

Real converted example from csv_logic/characters (trimmed). Array-valued cells exist (e.g. csv_client/availability_window "Skins": ["BarkeepDrunken", ...]). localization/texts rows look like { id, TID, EN }.

Fields

FieldTypeDescription
<rowName>objectKey is the row's first-column value (e.g. "ShotgunGirl"); value is the converted row.
<rowName>.idnumberSynthetic row id = fileId*1,000,000 + index (e.g. characters fileId=16 -> 16000000, 16000001, ...).
<rowName>.<column>string | number | bool | null | arrayOne field per CSV column, name = CSV header, value typed from the cell; repeated columns collapse to arrays.

Example response

{
  "ShotgunGirl": {
    "id": 16000000,
    "Name": "ShotgunGirl",
    "LockedForChronos": false,
    "Disabled": false,
    "ItemName": "shelly",
    "WeaponSkill": "ShotgunGirlWeapon",
    "UltimateSkill": "ShotgunGirlUlti",
    "OverchargedUltimateSkill": null,
    "Pet": null,
    "AltPet": null,
    /* … 174 more fields */
  },
  /* … 434 more rows */
}
Notes & caveats
  • Converted CSV responses are objects KEYED BY ROW NAME (the first CSV column), not arrays. Row order is object insertion order.
  • Row `id` is always present even when the /game index shows id:null (null fileId is treated as 0, so ids are index-only).
  • 168 index entries total: csv_logic 119, csv_client 26, localization 23. localization/texts has 15,480 rows.
  • For a raw/typed mirror with an explicit metadata envelope (columns, types, hasId, rowCount), use /v2/raw/{path} instead.

v2 Raw CSV

A raw 1:1 mirror of a game CSV wrapped in a metadata envelope. Unlike /game/{path}, it preserves the CSV's native shape: `data` is an object keyed by row Name (hasId=false) or an ordered array (hasId=true).

GET/v2/raw/{path}

Raw 1:1 mirror of a Brawl Stars game CSV, converted to JSON and wrapped in a metadata envelope. Unlike /game/{path} (which coerces every row into a numbered list keyed by the fileId*1,000,000+index formula), /v2/raw preserves the CSV's native shape: the `data` field is an OBJECT keyed by each row's first-column Name when the CSV has identifier rows (hasId=false), or an ordered ARRAY when it does not (hasId=true). Values are typed per the row-2 type declarations (int/boolean coerced from strings; everything else stays string).

Path params path — the CSV's logical path without extension, e.g. csv_logic/gear_rarities, csv_client/animations, localization/texts. The three top-level dirs are csv_logic, csv_client, localization.

Response { metadata: {...}, data: {...} | [...] }

`data` is an object (row-keyed) when metadata.hasId=false and an array when metadata.hasId=true; empty CSVs return data:[] (rowCount 0). Some string values are hex ARGB strings, e.g. "0xFF9EF0FF". generatedAt is a fresh ISO-8601 UTC timestamp stamped at build time. Extensionless URL rewrites to .json (Pages _redirects, HTTP 200); the .json suffix also works directly. Static Pages asset — no auth, no rate limits, Cache-Control public max-age=3600, Access-Control-Allow-Origin *.

Fields

FieldTypeDescription
metadataobjectEnvelope describing the mirrored CSV.
metadata.filestringSource CSV path incl. extension, e.g. "csv_logic/gear_rarities.csv".
metadata.generatedAtstringISO-8601 UTC build timestamp, e.g. "2026-07-01T09:18:58.972Z".
metadata.rowCountintNumber of data rows (0 for empty files).
metadata.columnsstring[]Ordered column names from the CSV header (row 1).
metadata.typesobjectMap of column name -> declared CSV type (row 2): string | int | boolean | ...
metadata.hasIdbooleanfalse = `data` is an object keyed by row Name (id-bearing rows); true = `data` is an ordered array.
dataobject | arrayThe mirrored rows. Object keyed by row Name when hasId=false; array when hasId=true. Each row is a column->typed-value map. Empty when rowCount=0.

Example response

{
  "metadata": {
    "file": "csv_logic/gear_rarities.csv",
    "generatedAt": "2026-07-01T09:48:31.996Z",
    "rowCount": 3,
    "columns": [
      "Name",
      "CoinPrice",
      "TID",
      "AvailableToAllBrawlers",
      "IconFrameIndex",
      "NotOwnedIconBgFrameIndex",
      "TextColor",
      "GearTitleWithRarityTID"
    ],
    "types": {
      "Name": "string",
      "CoinPrice": "int",
      "TID": "string",
      "AvailableToAllBrawlers": "boolean",
      "IconFrameIndex": "int",
      "NotOwnedIconBgFrameIndex": "int",
      "TextColor": "string",
      "GearTitleWithRarityTID": "string"
    },
    "hasId": false
  },
  "data": {
    "RareGear": {
      "Name": "RareGear",
      "CoinPrice": 1000,
      "TID": "TID_GEAR_RARITY_RARE",
      "AvailableToAllBrawlers": true,
      "IconFrameIndex": 1,
      "NotOwnedIconBgFrameIndex": 11,
      "TextColor": "0xFF9EF0FF",
      "GearTitleWithRarityTID": "TID_GEAR_RARITY_TITLE_RARE_GEAR"
    },
    /* … 2 more rows */
  }
}
Notes & caveats
  • hasId semantics verified on disk: hasId=false -> data is an object keyed by each row's Name; hasId=true -> data is an array. This is the opposite of what the name might suggest — documented from the actual files.
  • A verified hasId=true / empty example is csv_logic/campaign: {"metadata":{...,"rowCount":0,"hasId":true},"data":[]} — note data is an ARRAY here.
  • types values seen: string, int, boolean. int/boolean columns are coerced; string columns kept verbatim (including hex color strings like "0xFF9EF0FF").
  • Column/field names are CSV-native PascalCase and vary per file — NOT a fixed schema. Only the envelope shape is stable across all /v2/raw endpoints.