Species API
The DexSpecies API provides comprehensive data about Pokemon species including base stats, types, abilities, evolution chains, formes, and learnsets. Access it through Dex.species.
Getting Species Data
import { Dex } from './sim/dex' ;
// Get a species by name
const pikachu = Dex . species . get ( 'Pikachu' );
console . log ( pikachu . types ); // ['Electric']
console . log ( pikachu . baseStats ); // { hp: 35, atk: 55, def: 40, spa: 50, spd: 50, spe: 90 }
// Get all species
const allSpecies = Dex . species . all ();
console . log ( allSpecies . length ); // 1025+ (in Gen 9)
Methods
get()
Dex . species . get ( name ?: string | Species ): Species
Retrieves species data by name or returns the species if already a Species object.
Species name (case-insensitive, spaces optional) or an existing Species object. Supports forme names like “Pikachu-Alola”.
A readonly Species object with all species properties. Returns an empty species with exists: false if not found.
Example:
const charizard = Dex . species . get ( 'Charizard' );
console . log ( charizard . name ); // 'Charizard'
console . log ( charizard . types ); // ['Fire', 'Flying']
// Get a forme
const charizardX = Dex . species . get ( 'Charizard-Mega-X' );
console . log ( charizardX . types ); // ['Fire', 'Dragon']
console . log ( charizardX . baseSpecies ); // 'Charizard'
getByID()
Dex . species . getByID ( id : ID ): Species
Retrieves species data by ID (lowercase, no spaces).
Species ID in lowercase alphanumeric format.
Example:
const species = Dex . species . getByID ( 'charizardmegax' as ID );
console . log ( species . forme ); // 'Mega-X'
all()
Dex . species . all (): readonly Species []
Returns an array of all species in the current generation/mod.
Array of all Species objects, including formes and nonstandard species.
Example:
const allSpecies = Dex . species . all ();
const legendaries = allSpecies . filter ( s =>
s . tags . includes ( 'Restricted Legendary' )
);
console . log ( ` ${ legendaries . length } restricted legendaries` );
getLearnsetData()
Dex . species . getLearnsetData ( id : ID ): Learnset
Gets the raw learnset data for a species.
Learnset object containing move sources and event data.
Example:
const learnset = Dex . species . getLearnsetData ( 'pikachu' as ID );
if ( learnset . learnset ) {
console . log ( 'Thunderbolt sources:' , learnset . learnset [ 'thunderbolt' ]);
// Output: ['9M', '8M', '7M', '6M', ...]
}
getMovePool()
Dex . species . getMovePool ( id : ID , isNatDex ?: boolean ): Set < ID >
Returns the complete set of move IDs a species can learn.
If true, includes moves from all generations. If false (default), filters by current generation availability.
Set of move IDs the species can learn.
Example:
const movePool = Dex . species . getMovePool ( 'charizard' as ID );
console . log ( movePool . has ( 'flamethrower' as ID )); // true
console . log ( movePool . has ( 'surf' as ID )); // false
console . log ( movePool . size ); // Total number of moves
// National Dex movepool (includes past gen moves)
const natDexPool = Dex . species . getMovePool ( 'charizard' as ID , true );
console . log ( natDexPool . size > movePool . size ); // true
Species Properties
Unique identifier (lowercase, no spaces). Full ID including forme.
Display name including forme (e.g., “Pikachu-Alola”).
Base species name without forme. Note: Do NOT assume a Pokemon can transform from baseSpecies to this forme. Use changesFrom for that.
Forme name (e.g., “Alola”, “Mega-X”). Empty string for base forme.
Base forme name for species with multiple base formes (e.g., “Altered” for Giratina).
Example:
const raichuAlola = Dex . species . get ( 'Raichu-Alola' );
console . log ( raichuAlola . id ); // 'raichualola'
console . log ( raichuAlola . name ); // 'Raichu-Alola'
console . log ( raichuAlola . num ); // 26
console . log ( raichuAlola . baseSpecies ); // 'Raichu'
console . log ( raichuAlola . forme ); // 'Alola'
Stats & Types
Base stats object: { hp, atk, def, spa, spd, spe }.
Base Stat Total (sum of all base stats).
Array of type names (1-2 types).
Example:
const garchomp = Dex . species . get ( 'Garchomp' );
console . log ( garchomp . baseStats );
// { hp: 108, atk: 130, def: 95, spa: 80, spd: 85, spe: 102 }
console . log ( garchomp . bst ); // 600
console . log ( garchomp . types ); // ['Dragon', 'Ground']
console . log ( garchomp . weightkg ); // 95
console . log ( garchomp . heightm ); // 1.9
Abilities
Object containing ability slots: { 0: string, 1?: string, H?: string, S?: string }.
0: Primary ability
1: Secondary ability (if any)
H: Hidden ability
S: Special/event ability
Example:
const blastoise = Dex . species . get ( 'Blastoise' );
console . log ( blastoise . abilities );
// { 0: 'Torrent', H: 'Rain Dish' }
const pidgey = Dex . species . get ( 'Pidgey' );
console . log ( pidgey . abilities );
// { 0: 'Keen Eye', 1: 'Tangled Feet', H: 'Big Pecks' }
Evolution
Name of the pre-evolution. Empty string if this is a base forme.
Array of evolution names.
Evolution method: 'trade', 'useItem', 'levelMove', 'levelExtra', 'levelFriendship', 'levelHold', 'other'.
Level at which evolution occurs (if applicable).
Move required for evolution (if applicable).
Item required for evolution (if applicable).
True if Not Fully Evolved (can still evolve, excluding Mega Evolution).
Example:
const charmeleon = Dex . species . get ( 'Charmeleon' );
console . log ( charmeleon . prevo ); // 'Charmander'
console . log ( charmeleon . evos ); // ['Charizard']
console . log ( charmeleon . evoLevel ); // 16
console . log ( charmeleon . nfe ); // true
const charizard = Dex . species . get ( 'Charizard' );
console . log ( charizard . prevo ); // 'Charmeleon'
console . log ( charizard . evos ); // []
console . log ( charizard . nfe ); // false
Breeding
Array of egg group names.
True if this species can hatch from an egg.
Gender ratio: 'M' = always male, 'F' = always female, 'N' = genderless, '' = can be either.
Precise gender ratio (adds up to 1 for gendered Pokemon).
Example:
const ditto = Dex . species . get ( 'Ditto' );
console . log ( ditto . eggGroups ); // ['Ditto']
console . log ( ditto . gender ); // 'N'
const pikachu = Dex . species . get ( 'Pikachu' );
console . log ( pikachu . eggGroups ); // ['Field', 'Fairy']
console . log ( pikachu . genderRatio ); // { M: 0.5, F: 0.5 }
const nidoranf = Dex . species . get ( 'Nidoran-F' );
console . log ( nidoranf . gender ); // 'F'
Array of other forme names. Only appears on base forme.
Array of cosmetic forme names (visual differences only).
Complete list of formes in game data order (base + other + cosmetic).
True if this is a purely cosmetic forme.
Forme(s) this can only transform from in battle (e.g., Mega Evolutions).
The forme this transforms from (for both in-battle and out-of-battle transformations).
Example:
const charizard = Dex . species . get ( 'Charizard' );
console . log ( charizard . otherFormes );
// ['Charizard-Mega-X', 'Charizard-Mega-Y', 'Charizard-Gmax']
const charizardX = Dex . species . get ( 'Charizard-Mega-X' );
console . log ( charizardX . battleOnly ); // 'Charizard'
console . log ( charizardX . isMega ); // true
console . log ( charizardX . requiredItem ); // 'Charizardite X'
const rotomHeat = Dex . species . get ( 'Rotom-Heat' );
console . log ( rotomHeat . changesFrom ); // 'Rotom'
Special Mechanics
True for Mega Evolutions.
True for Primal Reversions.
Name of G-Max move if species can Gigantamax.
True if species cannot Dynamax.
Item required to use this forme (e.g., Mega Stone, Griseous Orb).
Move required to use this forme in battle.
Ability required to use this forme in battle.
Example:
const rayquazaMega = Dex . species . get ( 'Rayquaza-Mega' );
console . log ( rayquazaMega . isMega ); // true
console . log ( rayquazaMega . requiredMove ); // 'Dragon Ascent'
const kyogrePrimal = Dex . species . get ( 'Kyogre-Primal' );
console . log ( kyogrePrimal . isPrimal ); // true
console . log ( kyogrePrimal . requiredItem ); // 'Blue Orb'
const rillaboomGmax = Dex . species . get ( 'Rillaboom-Gmax' );
console . log ( rillaboomGmax . canGigantamax ); // 'G-Max Drum Solo'
Smogon Singles tier (e.g., ‘OU’, ‘UU’, ‘Uber’, ‘LC’).
Example:
const landorusTherian = Dex . species . get ( 'Landorus-Therian' );
console . log ( landorusTherian . tier ); // 'OU'
console . log ( landorusTherian . doublesTier ); // 'DOU'
const groudon = Dex . species . get ( 'Groudon' );
console . log ( groudon . tier ); // 'Uber'
Array of tags: 'Mythical', 'Restricted Legendary', 'Sub-Legendary', 'Ultra Beast', 'Paradox'.
Example:
const mew = Dex . species . get ( 'Mew' );
console . log ( mew . tags ); // ['Mythical']
const rayquaza = Dex . species . get ( 'Rayquaza' );
console . log ( rayquaza . tags ); // ['Restricted Legendary']
const ironValiant = Dex . species . get ( 'Iron Valiant' );
console . log ( ironValiant . tags ); // ['Paradox']
Working with Learnsets
// Check if a Pokemon can learn a move
function canLearn ( speciesName : string , moveName : string ) : boolean {
const species = Dex . species . get ( speciesName );
const move = Dex . moves . get ( moveName );
const movePool = Dex . species . getMovePool ( species . id as ID );
return movePool . has ( move . id );
}
console . log ( canLearn ( 'Charizard' , 'Flamethrower' )); // true
console . log ( canLearn ( 'Charizard' , 'Surf' )); // false
// Get all moves of a specific type a Pokemon can learn
function getMovesOfType ( speciesName : string , type : string ) : string [] {
const species = Dex . species . get ( speciesName );
const movePool = Dex . species . getMovePool ( species . id as ID );
const moves : string [] = [];
for ( const moveId of movePool ) {
const move = Dex . moves . get ( moveId );
if ( move . type === type ) {
moves . push ( move . name );
}
}
return moves ;
}
const fireMove = getMovesOfType ( 'Charizard' , 'Fire' );
console . log ( fireMoves . slice ( 0 , 5 ));
// ['Blast Burn', 'Fire Blast', 'Fire Fang', 'Fire Pledge', 'Fire Punch']
Filtering Species
// Get all Dragon-type Pokemon
const dragons = Dex . species . all (). filter ( species =>
species . types . includes ( 'Dragon' ) && ! species . isNonstandard
);
// Get all Mega Evolutions
const megas = Dex . species . all (). filter ( species =>
species . isMega
);
// Get all Pokemon with base stat total >= 600
const pseudoLegendaries = Dex . species . all (). filter ( species =>
species . bst >= 600 &&
! species . tags . length &&
! species . isMega &&
! species . isPrimal
);
// Get all fully evolved Pokemon
const fullyEvolved = Dex . species . all (). filter ( species =>
! species . nfe &&
! species . isNonstandard
);
// Get all Pokemon in OU tier
const ouPokemon = Dex . species . all (). filter ( species =>
species . tier === 'OU'
);
Generation Differences
// Gen 1 Alakazam had different SpD
const gen1Alakazam = Dex . mod ( 'gen1' ). species . get ( 'Alakazam' );
console . log ( gen1Alakazam . baseStats );
// In Gen 1, Special was combined
// Modern Alakazam
const alakazam = Dex . species . get ( 'Alakazam' );
console . log ( alakazam . baseStats );
// { hp: 55, atk: 50, def: 45, spa: 135, spd: 95, spe: 120 }
// Regional formes by generation
const gen7Raichu = Dex . mod ( 'gen7' ). species . get ( 'Raichu-Alola' );
console . log ( gen7Raichu . types ); // ['Electric', 'Psychic']
const gen8Ponyta = Dex . mod ( 'gen8' ). species . get ( 'Ponyta-Galar' );
console . log ( gen8Ponyta . types ); // ['Psychic']
Complete Example
import { Dex } from './sim/dex' ;
function analyzeSpecies ( speciesName : string ) {
const species = Dex . species . get ( speciesName );
if ( ! species . exists ) {
console . log ( `Species " ${ speciesName } " not found` );
return ;
}
console . log ( `=== ${ species . name } ===");
console.log(` # $ {species. num } - $ {species.types.join( '/' )} `);
console.log(` Base Stats (BST: $ {species. bst }): `);
console.log(` HP : $ {species.baseStats. hp } `);
console.log(` Atk : $ {species.baseStats. atk } `);
console.log(` Def : $ {species.baseStats. def } `);
console.log(` SpA : $ {species.baseStats. spa } `);
console.log(` SpD : $ {species.baseStats. spd } `);
console.log(` Spe : $ {species.baseStats. spe } `);
console.log(` \ nAbilities : `);
if (species.abilities[0]) console.log(` - $ {species.abilities [ 0 ]}`);
if (species.abilities[ 1 ]) console.log(` - ${species.abilities[ 1 ]}`);
if (species.abilities.H) console.log(` - ${species.abilities.H} (Hidden)`);
if (species.prevo) {
console.log(`\nEvolves from: $ {species. prevo } `);
}
if (species.evos.length) {
console.log(` Evolves into : $ {species.evos.join( ', ' )} `);
}
console.log(` \nTier: $ {species. tier } `);
if (species.tags.length) {
console.log(` Tags : $ {species.tags.join( ', ' )} `);
}
// Get movepool size
const movePool = Dex.species.getMovePool(species.id as ID);
console.log(` \nCan learn ${movePool.size} moves `);
}
analyzeSpecies('Garchomp');
analyzeSpecies('Charizard-Mega-X');
analyzeSpecies('Landorus-Therian');
Type Definitions
interface Species {
readonly id : ID ;
readonly name : string ;
readonly num : number ;
readonly baseSpecies : string ;
readonly forme : string ;
readonly types : string [];
readonly baseStats : StatsTable ;
readonly bst : number ;
readonly abilities : SpeciesAbility ;
readonly weightkg : number ;
readonly heightm : number ;
readonly prevo : string ;
readonly evos : string [];
readonly evoLevel ?: number ;
readonly nfe : boolean ;
readonly eggGroups : string [];
readonly gender : 'M' | 'F' | 'N' | '' ;
readonly tier : string ;
readonly doublesTier : string ;
readonly tags : SpeciesTag [];
readonly exists : boolean ;
readonly isNonstandard : string | null ;
// ... many more properties
}
interface SpeciesAbility {
0 : string ;
1 ?: string ;
H ?: string ;
S ?: string ;
}
type StatsTable = {
hp : number ;
atk : number ;
def : number ;
spa : number ;
spd : number ;
spe : number ;
};
Dex API Main Dex interface and utility methods
Moves API Move data and damage calculations
Abilities API Ability effects and interactions
Items API Item data and held item effects