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.