Skip to main content

Overview

The Moves API provides comprehensive data about Pokémon moves including damage, accuracy, type, priority, effects, and generation-specific changes.

Basic Usage

Get a Move

Retrieve move information using Dex.moves.get():
const {Dex} = require('pokemon-showdown');

const tackle = Dex.moves.get('Tackle');
console.log(tackle.name); // 'Tackle'
console.log(tackle.basePower); // 40
console.log(tackle.type); // 'Normal'
console.log(tackle.accuracy); // 100
Move names are case-insensitive and whitespace is ignored.
// All of these work
Dex.moves.get('tackle');
Dex.moves.get('Tackle');
Dex.moves.get('TACKLE');
Dex.moves.get('T a c k l e');

Move Properties

const thunderbolt = Dex.moves.get('Thunderbolt');

console.log(thunderbolt.num); // Move dex number
console.log(thunderbolt.name); // 'Thunderbolt'
console.log(thunderbolt.type); // 'Electric'
console.log(thunderbolt.category); // 'Special'
console.log(thunderbolt.basePower); // 90
console.log(thunderbolt.accuracy); // 100
console.log(thunderbolt.pp); // 15

Move Categories

Damaging Moves

const flamethrower = Dex.moves.get('Flamethrower');

console.log(flamethrower.category); // 'Special'
console.log(flamethrower.basePower); // 90
console.log(flamethrower.type); // 'Fire'

const closeCombat = Dex.moves.get('Close Combat');
console.log(closeCombat.category); // 'Physical'
console.log(closeCombat.basePower); // 120

Status Moves

const thunderWave = Dex.moves.get('Thunder Wave');

console.log(thunderWave.category); // 'Status'
console.log(thunderWave.basePower); // 0
console.log(thunderWave.status); // 'par'

const swordsDance = Dex.moves.get('Swords Dance');
console.log(swordsDance.boosts); // { atk: 2 }

Multi-Hit Moves

const doubleSlap = Dex.moves.get('Double Slap');
console.log(doubleSlap.multihit); // [2, 5]
// Hits 2-5 times

const doubleKick = Dex.moves.get('Double Kick');
console.log(doubleKick.multihit); // 2
// Always hits exactly 2 times

const beatUp = Dex.moves.get('Beat Up');
console.log(beatUp.multihit); // undefined
// Calculated dynamically based on party

Recoil & Drain Moves

const bravebird = Dex.moves.get('Brave Bird');

console.log(bravebird.recoil); // [33, 100]
// User takes 33/100 (33%) of damage dealt

const doubleEdge = Dex.moves.get('Double-Edge');
console.log(doubleEdge.recoil); // [33, 100]

Critical Hit Ratios

const aeroblast = Dex.moves.get('Aeroblast');
console.log(aeroblast.critRatio); // 2
// High critical hit ratio (1/8 chance)

const slash = Dex.moves.get('Slash');
console.log(slash.critRatio); // 2

const tackle = Dex.moves.get('Tackle');
console.log(tackle.critRatio); // undefined
// Normal critical hit ratio (1/24 chance)

Special Move Properties

Accuracy

const aurasphere = Dex.moves.get('Aura Sphere');
console.log(aurasphere.accuracy); // true
// Never misses (ignores accuracy/evasion)

const blizzard = Dex.moves.get('Blizzard');
console.log(blizzard.accuracy); // 70
// 70% accuracy (100% in hail)

OHKO Moves

const fissure = Dex.moves.get('Fissure');
console.log(fissure.ohko); // true
console.log(fissure.accuracy); // 30
// Base 30% accuracy, fails if target is higher level

Two-Turn Moves

const fly = Dex.moves.get('Fly');
console.log(fly.flags.charge); // 1
// Charges on turn 1, attacks on turn 2

const bounce = Dex.moves.get('Bounce');
console.log(bounce.flags.charge); // 1
console.log(bounce.accuracy); // 85

Move Effects

Stat Changes

const closeCombat = Dex.moves.get('Close Combat');

console.log(closeCombat.self);
// { boosts: { def: -1, spd: -1 } }
// User's Defense and Sp. Def decrease by 1

const ancientPower = Dex.moves.get('Ancient Power');
console.log(ancientPower.secondary);
// { chance: 10, self: { boosts: 
//   { atk: 1, def: 1, spa: 1, spd: 1, spe: 1 } } }

Status Conditions

const thunderbolt = Dex.moves.get('Thunderbolt');
console.log(thunderbolt.secondary);
// { chance: 10, status: 'par' }

const blazeKick = Dex.moves.get('Blaze Kick');
console.log(blazeKick.secondary);
// { chance: 10, status: 'brn' }

const airSlash = Dex.moves.get('Air Slash');
console.log(airSlash.secondary);
// { chance: 30, volatileStatus: 'flinch' }

Z-Moves and Max Moves

const thunderbolt = Dex.moves.get('Thunderbolt');

// Check if move can be a Z-Move
console.log(thunderbolt.isZ); // undefined (can become Z-Move)

// Get Z-Move power
const breakdown = Dex.moves.get('Breakneck Blitz');
console.log(breakdown.isZ); // 'normaliumz'
console.log(breakdown.basePower); // 1 (calculated dynamically)

// Max Move power
const maxFlare = Dex.moves.get('Max Flare');
console.log(maxFlare.isMax); // 'Fire'

List All Moves

Retrieve all move data:
const allMoves = Dex.moves.all();

console.log(allMoves.length); // 900+ moves
console.log(allMoves[0].name); // First move in database

// Filter to damaging moves
const attackMoves = allMoves.filter(m => 
  m.basePower > 0 && m.exists && !m.isNonstandard
);

// Find all Fire-type moves
const fireMoves = allMoves.filter(m => 
  m.type === 'Fire' && m.exists && !m.isNonstandard
);
The .all() method includes nonstandard data from past generations, Z-Moves, Max Moves, and custom moves. Always check exists and isNonstandard properties.

Generation-Specific Data

Moves change between generations:
// Current generation
const tackle = Dex.moves.get('Tackle');
console.log(tackle.basePower); // 40

// Gen 1 data
const gen1Tackle = Dex.mod('gen1').moves.get('Tackle');
console.log(gen1Tackle.basePower); // 35

// Gen 4 - when special/physical split happened
const gen3Bite = Dex.mod('gen3').moves.get('Bite');
console.log(gen3Bite.category); // 'Physical'

const gen4Bite = Dex.mod('gen4').moves.get('Bite');
console.log(gen4Bite.category); // 'Physical'
console.log(gen4Bite.type); // 'Dark'

Checking Move Existence

const frobnicate = Dex.moves.get('frobnicate');
console.log(frobnicate.exists); // false
console.log(frobnicate.isNonstandard); // 'Custom'

const tackle = Dex.moves.get('Tackle');
console.log(tackle.exists); // true
console.log(tackle.isNonstandard); // null (standard)

const acidDownpour = Dex.moves.get('Acid Downpour');
console.log(acidDownpour.exists); // true
console.log(acidDownpour.isNonstandard); // 'Past'
console.log(acidDownpour.isZ); // 'poisoniumz'

Practical Examples

Find Highest Base Power Moves

const standardMoves = Dex.moves.all()
  .filter(m => m.exists && !m.isNonstandard && !m.isMax && !m.isZ);

const strongest = standardMoves.reduce((max, m) => 
  m.basePower > max.basePower ? m : max
);

console.log(strongest.name);
console.log(strongest.basePower);

Get All Priority Moves

const priorityMoves = Dex.moves.all()
  .filter(m => m.exists && !m.isNonstandard)
  .filter(m => m.priority > 0)
  .sort((a, b) => b.priority - a.priority);

priorityMoves.forEach(m => {
  console.log(`${m.name}: +${m.priority} priority`);
});

Find STAB Moves for a Type

const type = 'Electric';
const stab = Dex.moves.all()
  .filter(m => m.type === type && m.basePower > 0)
  .filter(m => m.exists && !m.isNonstandard)
  .sort((a, b) => b.basePower - a.basePower);

console.log(`Top ${type} moves:`);
stab.slice(0, 10).forEach(m => {
  console.log(`${m.name}: ${m.basePower} BP`);
});

Calculate Average Damage

const doubleSlap = Dex.moves.get('Double Slap');

if (Array.isArray(doubleSlap.multihit)) {
  const [min, max] = doubleSlap.multihit;
  const avgHits = (min + max) / 2;
  const avgDamage = doubleSlap.basePower * avgHits;
  console.log(`Average damage: ${avgDamage}`);
}

Move Callbacks

Some move effects are implemented via callback functions. These are not directly usable but show move behavior.
const acrobatics = Dex.moves.get('Acrobatics');

console.log(acrobatics.basePowerCallback);
// function(pokemon, target, move) {
//   if (!pokemon.item) {
//     return move.basePower * 2;
//   }
//   return move.basePower;
// }
// Base power doubles if user has no item

Species API

Query Pokémon species data

Abilities API

Get ability information

Items API

Access held items data

Formats Data

Check format-specific restrictions

Build docs developers (and LLMs) love