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. 109 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 or explicit .json both return 200. No auth / no rate limit.

Fields

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

Example response

{
  "list": [
    {
      "id": 16000110,
      "avatarId": 28001338,
      "name": "Vince",
      "hash": "Vince",
      "path": "Vince",
      "fankit": "Vince",
      "released": true,
      "version": 1,
      "link": "https://brawlify.com/brawlers/16000110",
      "imageUrl": "https://cdn.brawlify.com/brawlers/borders/16000110.png",
      "imageUrl2": "https://cdn.brawlify.com/brawlers/borderless/16000110.png",
      "imageUrl3": "https://cdn.brawlify.com/brawlers/emoji/16000110.png",
      "class": {
        "id": 1,
        "name": "Damage Dealer"
      },
      "rarity": {
        "id": 5,
        "name": "Mythic",
        "color": "#fe5e72"
      },
      "unlock": null,
      "description": "Vince tends to both the espresso machine and his many-legged friends, much to his customers' dismay. He walks slowly around his Creepy Café, careful not to step on any of his beloved bugs. His companions, Mocha and Doppio, follow him everywhere.",
      "descriptionHtml": "Vince tends to both the espresso machine and his many-legged friends, much to his customers' dismay.<br><br>He walks slowly around his Creepy Café, careful not to step on any of his beloved bugs. His companions, Mocha and Doppio, follow him everywhere.",
      "starPowers": [
        {
          "id": 23001450,
          "name": "Come To Papa",
          "path": "Come-To-Papa",
          "version": 1,
          "description": "Nearby caterpillars crawl towards Vince.",
          "descriptionHtml": "Nearby caterpillars crawl towards Vince.",
          "imageUrl": "https://cdn.brawlify.com/star-powers/borderless/23001450.png",
          "released": true
        },
        {
          "id": 23001451,
          "name": "Bug Bandage",
          "path": "Bug-Bandage",
          "version": 1,
          "description": "Turning a caterpillar into a moth heals Vince for x.",
          "descriptionHtml": "Turning a caterpillar into a moth heals Vince for <span style=\"color:#00cc00;\">x</span>.",
          "imageUrl": "https://cdn.brawlify.com/star-powers/borderless/23001451.png",
          "released": true
        }
      ],
      "gadgets": [
        {
          "id": 23001452,
          "name": "Hot Coffee",
          "path": "Hot-Coffee",
          "version": 1,
          "description": "Vince throws an explosive cappuccino, dealing area damage.",
          "descriptionHtml": "Vince throws an explosive cappuccino, dealing area damage.",
          "imageUrl": "https://cdn.brawlify.com/gadgets/borderless/23001452.png",
          "released": true
        },
        {
          "id": 23001453,
          "name": "Metamothosis",
          "path": "Metamothosis",
          "version": 1,
          "description": "Vince turns all nearby caterpillars into moths, gaining an additional moth for each collected.",
          "descriptionHtml": "Vince turns all nearby caterpillars into moths, gaining an additional moth for each collected.",
          "imageUrl": "https://cdn.brawlify.com/gadgets/borderless/23001453.png",
          "released": true
        }
      ],
      "videos": []
    },
    /* … 108 more */
  ]
}

GET/v1/brawlers/{id}

Returns a single Brawler object by numeric id (e.g. 16000000). 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: 1 Damage Dealer, 2 Tank, 3 Marksman, 4 Artillery, 5 Controller, 6 Assassin, 7 Support (0 "Unknown" only if the game names none).
rarityobject {id, name, color}Rarity with hex color, e.g. {id:5, name:"Mythic", color:"#fe5e72"}.
unlocknullUnlock info; currently always null.
descriptionstringPlain-text description, no markup.
descriptionHtmlstringHTML variant of description: game colors as inline <span style> runs, line breaks as <br>.
starPowersobject[]Star powers; each {id, name, path, version, description, descriptionHtml, imageUrl, released}. imageUrl on cdn.brawlify.com/star-powers/borderless/{id}.png. A value the game computes per level or per match reads "x" in the description.
gadgetsobject[]Gadgets; same object shape as starPowers. imageUrl on cdn.brawlify.com/gadgets/borderless/{id}.png.
videosarrayRelated videos; typically empty.

Example response

{
  "id": 16000000,
  "avatarId": 28000003,
  "name": "Shelly",
  "hash": "Shelly",
  "path": "Shelly",
  "fankit": "Shelly",
  "released": true,
  "version": 1,
  "link": "https://brawlify.com/brawlers/16000000",
  "imageUrl": "https://cdn.brawlify.com/brawlers/borders/16000000.png",
  "imageUrl2": "https://cdn.brawlify.com/brawlers/borderless/16000000.png",
  "imageUrl3": "https://cdn.brawlify.com/brawlers/emoji/16000000.png",
  "class": {
    "id": 1,
    "name": "Damage Dealer"
  },
  "rarity": {
    "id": 1,
    "name": "Common",
    "color": "#b9eaff"
  },
  "unlock": null,
  "description": "Shelly's the perfect ranger: reliable, tough, and terrific with her shotgun. She never understood why Colt got to steal the limelight...",
  "descriptionHtml": "Shelly's the perfect ranger: reliable, tough, and terrific with her shotgun. She never understood why Colt got to steal the limelight...",
  "starPowers": [
    {
      "id": 23000076,
      "name": "Shell Shock",
      "path": "Shell-Shock",
      "version": 1,
      "description": "Shelly's Super shells slow down enemies for 2 sec!",
      "descriptionHtml": "Shelly's Super shells slow down enemies for <span style=\"color:#00cc00;\">2</span> sec!",
      "imageUrl": "https://cdn.brawlify.com/star-powers/borderless/23000076.png",
      "released": true
    },
    {
      "id": 23000135,
      "name": "Band-Aid",
      "path": "Band-Aid",
      "version": 1,
      "description": "When Shelly falls below x% health, she instantly heals for x health. Band-Aid recharges in x sec.",
      "descriptionHtml": "When Shelly falls below <span style=\"color:#00cc00;\">x%</span> health, she instantly heals for <span style=\"color:#00cc00;\">x</span> health. Band-Aid recharges in <span style=\"color:#00cc00;\">x</span> sec.",
      "imageUrl": "https://cdn.brawlify.com/star-powers/borderless/23000135.png",
      "released": true
    }
  ],
  "gadgets": [
    {
      "id": 23000255,
      "name": "Fast Forward",
      "path": "Fast-Forward",
      "version": 1,
      "description": "Shelly dashes to an aimed direction or forwards, fully reloading her ammo!",
      "descriptionHtml": "Shelly dashes to an aimed direction or forwards, fully reloading her ammo!",
      "imageUrl": "https://cdn.brawlify.com/gadgets/borderless/23000255.png",
      "released": true
    },
    {
      "id": 23000288,
      "name": "Clay Pigeons",
      "path": "Clay-Pigeons",
      "version": 1,
      "description": "Shelly focuses her fire to a smaller area with an increased range. Can be used x times per activation.",
      "descriptionHtml": "Shelly focuses her fire to a smaller area with an increased range. Can be used x times per activation.",
      "imageUrl": "https://cdn.brawlify.com/gadgets/borderless/23000288.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.
  • unlock is always null and videos is always an empty array.
  • Star power / gadget descriptions show "x" where the game fills in a number at runtime (values that scale with the brawler's level, or whose unit only the game client knows). Values the game data states outright (durations, counts, percentages of a status effect) are filled in.

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 1,300 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; /v1/maps.json also works.

Fields

FieldTypeDescription
listMap[]Array of 1,300 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}; link is the brawlify.com mode page, e.g. https://brawlify.com/gamemodes/48000000.
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/48000003",
        "imageUrl": "https://cdn.brawlify.com/game-modes/regular/48000003.png"
      },
      "lastActive": 0,
      "dataUpdated": 0
    },
    /* … 1299 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/48000003",
    "imageUrl": "https://cdn.brawlify.com/game-modes/regular/48000003.png"
  },
  "lastActive": 0,
  "dataUpdated": 0,
  "stats": [],
  "teamStats": []
}
Notes & caveats
  • v1/maps.json has 1,300 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.
  • environment.imageUrl points at cdn-misc.brawlify.com, which is not serving images at the moment.

Game Modes

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

GET/v1/gamemodes

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

Response { list: GameMode[] }

Extensionless URL; 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 70 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/48000000",
      "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"
    },
    /* … 69 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..70 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..70.

Response GameMode (bare object, no wrapper)

140 detail files total = 70 numeric-id files + 70 sequential-index files. Extensionless URL; the .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/48000000.
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 (that host is not serving images at the moment; imageUrl is).
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/48000000",
  "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: /v1/gamemodes/1 (index) and /v1/gamemodes/48000000 (id) are byte-identical (140 detail files = 70 ids + 70 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 70 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, the .json suffix also works directly.

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

player currently has 1,352 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. 1,352 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
    },
    /* … 1351 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 of the current game version. Returns a flat JSON object mapping each CSV path -> metadata { id, file, path }. 173 entries (csv_client: 26, csv_logic: 123, localization: 24). `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"
  },
  /* … 170 more fields */
}

GET/game/{path}

The named CSV converted to JSON: a bare object keyed by each row's first-column name (e.g. character/entry name), or an array when the first column is numeric or empty. Each row 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",
    "InstanceID": 0,
    "LockedForChronos": false,
    "Disabled": false,
    "ItemName": "shelly",
    "WeaponSkill": "ShotgunGirlWeapon",
    "UltimateSkill": "ShotgunGirlUlti",
    "OverchargedUltimateSkill": null,
    "Pet": null,
    /* … 175 more fields */
  },
  /* … 455 more rows */
}
Notes & caveats
  • Converted CSV responses are objects KEYED BY ROW NAME (the first CSV column) unless that column is numeric or empty, which gives an array. 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).
  • 173 index entries (csv_client: 26, csv_logic: 123, localization: 24), exactly the files of the current game version. localization/texts has 16,715 rows.
  • boolean columns are true only where the game writes TRUE; FALSE and empty cells are false.
  • 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 describing its columns and types. `data` has the same shape as /game/{path} (an object keyed by row Name, or an array when the first column is numeric or empty); rows carry the synthetic `id` only when metadata.hasId is true.

GET/v2/raw/{path}

Raw 1:1 mirror of a Brawl Stars game CSV, converted to JSON and wrapped in a metadata envelope. The `data` field is an OBJECT keyed by each row's first-column Name, or an ordered ARRAY when that column is numeric or empty. metadata.hasId says whether rows carry the synthetic `id` (fileId*1,000,000 + index); files without a known file id have none. 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: {...} | [...] }

Empty CSVs return data:[] (rowCount 0). Some string values are hex ARGB strings, e.g. "0xFF9EF0FF". generatedAt is when this game-data version was generated (ISO-8601 UTC; stable across rebuilds of the same version). Extensionless URL; 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.generatedAtstringWhen this game-data version was generated (ISO-8601 UTC), e.g. "2026-09-25T18:40:03.870Z".
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.hasIdbooleantrue = every row carries the synthetic `id`; false = rows have no `id` (the file has no known file id).
dataobject | arrayThe mirrored rows: object keyed by row Name, or array when the first column is numeric or empty. Each row is a column->typed-value map. Empty when rowCount=0.

Example response

{
  "metadata": {
    "file": "csv_logic/gear_rarities.csv",
    "generatedAt": "2026-10-03T16:59:28.000Z",
    "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 is about the `id` field, not the shape: csv_logic/characters is hasId=true with an object keyed by Name; csv_logic/gear_rarities is hasId=false with an object keyed by Name.
  • 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, stringarray. int/boolean columns are coerced (boolean is true only for TRUE); string and stringarray 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.