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 usingDex.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
Related APIs
Species API
Query Pokémon species data
Abilities API
Get ability information
Items API
Access held items data
Formats Data
Check format-specific restrictions
