API Guide

Pokemon Champions Battle Data + API

Use one index endpoint to discover Pokemon and available season folders, then fetch parsed JSON or direct CSV assets for your app.

/api /api/pokemon/:name /api/battle/:format/:name
Start Here

Quick start

Load the index, pick a season, then fetch one Pokemon and its battle rows.

const season = "Season M-3";

const index = await fetch("/api")
  .then((response) => response.json());

const params = new URLSearchParams({
  format: "Doubles",
  season
});

const garchomp = await fetch(
  `/api/pokemon/garchomp?${params}`
).then((response) => response.json());

const battleRows = await fetch(
  `/api/battle/Doubles/garchomp?season=${encodeURIComponent(season)}`
).then((response) => response.json());
Static Assets

Folder structure

The season dropdown uses the folder names inside battle_data. These paths are also directly requestable.

Battle data files, sprites, and metadata rows all use the form-specific name (saved_name). A single metadata file, named after the base Pokémon (base_name), contains rows for every form.

pokemon_champions_assets/
  battle_data/
    Season M-3/
      Doubles/
        Tauros.csv                        ← base form
        Paldean Tauros Aqua Breed.csv     ← form-specific
        Paldean Tauros Blaze Breed.csv
        Paldean Tauros Combat Breed.csv
      Singles/
        …
  metadata/
    Tauros.csv   ← one file, all four forms as separate rows
  pokemon/
    Tauros.png
    Paldean Tauros Aqua Breed.png         ← form-specific sprite
  types/
    Dragon.png
Endpoint 01

Index

Use the index first. It lists Pokemon, seasons, formats, file paths, sprites, typing, stats, and summaries.

GET/api
GET/api/index
GET/data/pokemon-index.json
battleDataFolders
Folder names under battle_data.
seasons
Season folders available in the Explorer.
defaultSeason
The default folder, currently Season M-3.
pokemon
All indexed Pokemon records.
Endpoint 02

Pokemon record

Returns one indexed Pokemon. Add format and season to include the matching summary and CSV path.

GET/api/pokemon/garchomp?format=Doubles&season=Season%20M-3
{
  "name": "Garchomp",
  "requestedFormat": "Doubles",
  "requestedSeason": "Season M-3",
  "battleDataCsv": {
    "path": "pokemon_champions_assets/battle_data/Season M-3/Doubles/Garchomp.csv"
  }
}
Endpoint 03

Battle rows

Returns parsed rows from one battle-data CSV. Use this for moves, items, teammates, natures, spreads, and abilities.

GET/api/battle/Doubles/garchomp?season=Season%20M-3
{
  "pokemon": "Garchomp",
  "format": "Doubles",
  "season": "Season M-3",
  "source": "pokemon_champions_assets/battle_data/Season M-3/Doubles/Garchomp.csv",
  "rows": [
    {
      "position": 1,
      "category": "move",
      "rank": 1,
      "name": "Earthquake",
      "percentage": "90.3%"
    }
  ]
}
Endpoint 04

Metadata rows

Returns all forms for a Pokémon from a single metadata file. Request by base name (e.g. tauros) — the response contains one row per form, each identified by its form-specific saved_name.

Use saved_name to build paths to sprites and battle data. Use base_name to group forms together.

GET/api/metadata/tauros
{
  "pokemon": "Tauros",
  "source": "pokemon_champions_assets/metadata/Tauros.csv",
  "rows": [
    {
      "title": "Tauros [Paldean Form (Aqua Breed)]",
      "base_name": "Tauros",
      "saved_name": "Paldean Tauros Aqua Breed",
      "types": "Fighting/Water",
      "abilities": "Intimidate|Anger Point|Cud Chew",
      "image_path": "pokemon_champions_assets/pokemon/Paldean Tauros Aqua Breed.png",
      "form": "Paldean Aqua Breed",
      "hp": 150, "atk": 130, "def": 125,
      "spa": 50, "spd": 90, "spe": 120, "total": 610
    },
    {
      "title": "Tauros [Paldean Form (Blaze Breed)]",
      "base_name": "Tauros",
      "saved_name": "Paldean Tauros Blaze Breed",
      "types": "Fighting/Fire",
      "abilities": "Intimidate|Anger Point|Cud Chew",
      "image_path": "pokemon_champions_assets/pokemon/Paldean Tauros Blaze Breed.png",
      "form": "Paldean Blaze Breed",
      "hp": 150, "atk": 130, "def": 125,
      "spa": 50, "spd": 90, "spe": 120, "total": 610
    },
    {
      "title": "Tauros",
      "base_name": "Tauros",
      "saved_name": "Tauros",
      "types": "Normal",
      "abilities": "Intimidate|Anger Point|Sheer Force",
      "image_path": "pokemon_champions_assets/pokemon/Tauros.png",
      "form": "",
      "hp": 150, "atk": 120, "def": 115,
      "spa": 60, "spd": 90, "spe": 130, "total": 610
    }
  ]
}
base_name
The shared Pokémon name. Matches the metadata filename and the /api/metadata/:name route parameter.
saved_name
The form-specific name used for battle data CSVs, sprites, and the /api/battle/:format/:name route.
form
Human-readable form label. Empty string for the base form.
abilities
Pipe-separated list of all abilities for this form.
Direct Files

Raw CSV and images

Use static paths for downloads, spreadsheet imports, notebooks, sprites, and type icons. Battle data and sprites use the form-specific saved_name. Metadata uses the base_name.


GET /pokemon_champions_assets/battle_data/Season%20M-3/Doubles/Tauros.csv
GET /pokemon_champions_assets/battle_data/Season%20M-3/Doubles/Paldean%20Tauros%20Aqua%20Breed.csv


GET /pokemon_champions_assets/metadata/Tauros.csv


GET /pokemon_champions_assets/pokemon/Tauros.png
GET /pokemon_champions_assets/pokemon/Paldean%20Tauros%20Aqua%20Breed.png


GET /pokemon_champions_assets/types/Dragon.png
Client Example

Filtering with the index

For client-side tools, load the index once and filter summary data before requesting full rows.

const index = await fetch("/api")
  .then((response) => response.json());

const fastGroundTypes = index.pokemon.filter((entry) => {
  const stats = entry.summary?.baseStats ?? {};
  const types = entry.summary?.types ?? [];

  return types.includes("Ground")
    && Number(stats.speed ?? 0) >= 100;
});
Behavior

Response behavior

  • API endpoints return JSON.
  • CSV files and images remain available as static assets.
  • Pokemon names are matched case-insensitively.
  • The season query must match a battle-data folder.
  • CORS is enabled for browser apps on other domains.