Skip to main content

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.
name
string | Species
Species name (case-insensitive, spaces optional) or an existing Species object. Supports forme names like “Pikachu-Alola”.
return
Species
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).
id
ID
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.
return
readonly Species[]
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.
id
ID
Species ID.
return
Learnset
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.
id
ID
Species ID.
isNatDex
boolean
If true, includes moves from all generations. If false (default), filters by current generation availability.
return
Set<ID>
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

Basic Information

id
ID
Unique identifier (lowercase, no spaces). Full ID including forme.
name
string
Display name including forme (e.g., “Pikachu-Alola”).
num
number
National Dex number.
baseSpecies
string
Base species name without forme. Note: Do NOT assume a Pokemon can transform from baseSpecies to this forme. Use changesFrom for that.
forme
string
Forme name (e.g., “Alola”, “Mega-X”). Empty string for base forme.
baseForme
string
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

baseStats
StatsTable
Base stats object: { hp, atk, def, spa, spd, spe }.
bst
number
Base Stat Total (sum of all base stats).
types
string[]
Array of type names (1-2 types).
weightkg
number
Weight in kilograms.
heightm
number
Height in meters.
color
string
Pokedex color.
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

abilities
SpeciesAbility
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

prevo
string
Name of the pre-evolution. Empty string if this is a base forme.
evos
string[]
Array of evolution names.
evoType
string
Evolution method: 'trade', 'useItem', 'levelMove', 'levelExtra', 'levelFriendship', 'levelHold', 'other'.
evoLevel
number
Level at which evolution occurs (if applicable).
evoMove
string
Move required for evolution (if applicable).
evoItem
string
Item required for evolution (if applicable).
nfe
boolean
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

eggGroups
string[]
Array of egg group names.
canHatch
boolean
True if this species can hatch from an egg.
gender
'M' | 'F' | 'N' | ''
Gender ratio: 'M' = always male, 'F' = always female, 'N' = genderless, '' = can be either.
genderRatio
{ M: number, F: number }
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'

Formes

otherFormes
string[]
Array of other forme names. Only appears on base forme.
cosmeticFormes
string[]
Array of cosmetic forme names (visual differences only).
formeOrder
string[]
Complete list of formes in game data order (base + other + cosmetic).
isCosmeticForme
boolean
True if this is a purely cosmetic forme.
battleOnly
string | string[]
Forme(s) this can only transform from in battle (e.g., Mega Evolutions).
changesFrom
string
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

isMega
boolean
True for Mega Evolutions.
isPrimal
boolean
True for Primal Reversions.
canGigantamax
string
Name of G-Max move if species can Gigantamax.
cannotDynamax
boolean
True if species cannot Dynamax.
requiredItem
string
Item required to use this forme (e.g., Mega Stone, Griseous Orb).
requiredMove
string
Move required to use this forme in battle.
requiredAbility
string
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'

Tier Information

tier
string
Smogon Singles tier (e.g., ‘OU’, ‘UU’, ‘Uber’, ‘LC’).
doublesTier
string
Smogon Doubles tier.
natDexTier
string
National Dex tier.
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'

Tags

tags
SpeciesTag[]
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

Build docs developers (and LLMs) love