Skip to main content

Overview

Format-specific data contains tier placements, banned moves, and other restrictions for different competitive formats. This data is separate from base species/move/ability data.

What is Formats Data?

Formats data stores information about how Pokémon, moves, abilities, and items are treated in specific competitive formats like OU, Ubers, VGC, etc.
Formats data is stored separately from the main Dex data in formats-data.ts files.

Accessing Format Data

Format-specific data is accessed through the species object:
const {Dex} = require('pokemon-showdown');

// Get a Pokemon's tier
const pikachu = Dex.species.get('Pikachu');
console.log(pikachu.tier); // Tier assigned in formats-data

// Check if a move is available in a format
const formatDex = Dex.forFormat('gen8ou');
const move = formatDex.moves.get('Dynamax Cannon');

Tier System

Pokémon are assigned to tiers based on usage statistics:
const landorus = Dex.species.get('Landorus-Therian');
console.log(landorus.tier); // 'OU'
// OU = Overused (highest usage)

const azumarill = Dex.species.get('Azumarill');
console.log(azumarill.tier); // 'UU'
// UU = Underused

const toxicroak = Dex.species.get('Toxicroak');
console.log(toxicroak.tier); // 'RU'
// RU = Rarely Used

const articuno = Dex.species.get('Articuno');
console.log(articuno.tier); // 'NU'
// NU = Never Used

Format Restrictions

Species Restrictions

Some Pokémon have format-specific restrictions:
// Check if a species is allowed in a format
const formatDex = Dex.forFormat('gen9ou');
const miraidon = formatDex.species.get('Miraidon');

// Uber Pokémon are banned in OU
console.log(miraidon.tier); // 'Uber'
// Would not be usable in OU format

const garchomp = formatDex.species.get('Garchomp');
console.log(garchomp.tier); // 'OU'
// Allowed in OU format

Move Restrictions

Certain moves may be banned in specific formats:
// Some moves are banned in certain formats
// Example: Dynamax moves in Gen 9
const gen9Dex = Dex.forFormat('gen9ou');
const maxAirstream = gen9Dex.moves.get('Max Airstream');
console.log(maxAirstream.isMax); // 'Flying'
console.log(maxAirstream.isNonstandard); // 'Past'
// Max Moves not available in Gen 9

const gen8Dex = Dex.forFormat('gen8ou');
const dynamaxed = gen8Dex.moves.get('Max Airstream');
// Available in Gen 8 formats

Ability Restrictions

// Some abilities are banned or restricted
const shadowTag = Dex.abilities.get('Shadow Tag');
console.log(shadowTag.rating); // 5
// Often banned in competitive formats

const moody = Dex.abilities.get('Moody');
// Commonly banned due to RNG-based boosts

Usage-Based Tiers

Tiers are determined by usage statistics:

Tier Thresholds

1

Uber

Pokémon banned from OU for being too powerful
  • Typically legendary/mythical Pokémon
  • Mega Rayquaza, Primal Groudon, etc.
2

OU (Overused)

Pokémon with ≥4.52% usage in OU
  • Most commonly used in standard play
  • Landorus-T, Garchomp, Toxapex, etc.
3

UU (Underused)

Pokémon with <4.52% OU usage but ≥4.52% UU usage
  • Viable but less common than OU
  • Azumarill, Scizor, Hydreigon, etc.
4

RU (Rarely Used)

Pokémon with <4.52% UU usage but ≥4.52% RU usage
  • Less common in higher tiers
  • Toxicroak, Salazzle, Flygon, etc.
5

NU (Never Used)

Pokémon with <4.52% RU usage but ≥4.52% NU usage
  • Rarely seen in higher tiers
  • Articuno, Silvally, Druddigon, etc.
6

PU/ZU

Pokémon with minimal usage
  • PU = Previously Untiered
  • ZU = Zero Used

Format-Specific Mods

Access data for specific formats using forFormat():
// Gen 8 OU format
const gen8ou = Dex.forFormat('gen8ou');
const cinderace = gen8ou.species.get('Cinderace');

// Gen 9 VGC format  
const gen9vgc = Dex.forFormat('gen9vgc2024regf');
const flutter = gen9vgc.species.get('Flutter Mane');

// National Dex format
const natdex = Dex.forFormat('gen9nationaldex');
const blaziken = natdex.species.get('Blaziken');

Checking Format Legality

Validate if a Pokémon/move/ability is legal in a format:
function isLegalInFormat(speciesName, formatId) {
  const formatDex = Dex.forFormat(formatId);
  const species = formatDex.species.get(speciesName);
  
  // Check if species exists and isn't nonstandard
  if (!species.exists) return false;
  if (species.isNonstandard) return false;
  
  // Check tier restrictions
  // This is a simplified example
  const format = formatDex.formats.get(formatId);
  return true; // Actual implementation is complex
}

console.log(isLegalInFormat('Pikachu', 'gen9ou'));

Doubles vs Singles

Some Pokémon have different viability in different formats:
// Incineroar is much stronger in VGC (Doubles)
const incineroar = Dex.species.get('Incineroar');
console.log(incineroar.tier); // Lower in Singles

// But extremely popular in VGC due to Intimidate + Fake Out
const vgcDex = Dex.forFormat('gen9vgc2024regf');
const vgcIncineroar = vgcDex.species.get('Incineroar');
// Widely used in VGC

// Opposite example: Landorus-T
const landorus = Dex.species.get('Landorus-Therian');
console.log(landorus.tier); // 'OU' in Singles
// Less common in Doubles/VGC

Format Names

Common format identifiers:

Singles Formats

  • gen9ou - Generation 9 OverUsed
  • gen9uu - Generation 9 UnderUsed
  • gen9ru - Generation 9 Rarely Used
  • gen9nu - Generation 9 Never Used
  • gen9ubers - Generation 9 Ubers
  • gen9nationaldex - National Dex

Doubles Formats

  • gen9vgc2024regf - VGC 2024 Regulation F
  • gen9doublesubers - Doubles Ubers
  • gen9doublesou - Doubles OverUsed
  • gen9bdsp - BDSP Doubles

Past Generations

  • gen8ou - Generation 8 OU
  • gen7ou - Generation 7 OU
  • gen6ou - Generation 6 OU
  • gen5ou - Generation 5 OU
  • gen4ou - Generation 4 OU

Special Formats

  • gen9balancedhackmons - Balanced Hackmons
  • gen9anythinggoes - Anything Goes
  • gen9monotype - Monotype
  • gen9lc - Little Cup

Practical Examples

Get All OU Pokémon

const ouPokemon = Dex.species.all()
  .filter(s => s.exists && !s.isNonstandard)
  .filter(s => s.tier === 'OU')
  .map(s => s.name);

console.log(`OU Pokémon (${ouPokemon.length}):`);
ouPokemon.forEach(name => console.log(name));

Find Pokémon by Tier

function getPokemonByTier(tier) {
  return Dex.species.all()
    .filter(s => s.exists && !s.isNonstandard)
    .filter(s => s.tier === tier)
    .map(s => s.name);
}

const uumons = getPokemonByTier('UU');
const ubers = getPokemonByTier('Uber');

console.log(`UU: ${uumons.length} Pokemon`);
console.log(`Ubers: ${ubers.length} Pokemon`);

Compare Tiers Across Generations

function compareTiers(speciesName) {
  const gens = [9, 8, 7, 6, 5, 4, 3];
  const tiers = {};
  
  for (const gen of gens) {
    const dex = Dex.mod(`gen${gen}`);
    const species = dex.species.get(speciesName);
    if (species.exists) {
      tiers[`Gen ${gen}`] = species.tier || 'N/A';
    }
  }
  
  return tiers;
}

const greninjaTiers = compareTiers('Greninja');
console.log('Greninja tier history:', greninjaTiers);

Get Format-Restricted Content

function getRestrictedContent(formatId) {
  const dex = Dex.forFormat(formatId);
  const format = dex.formats.get(formatId);
  
  // This is a simplified example
  // Actual implementation requires accessing format rules
  console.log(`Format: ${format.name}`);
  console.log(`Mod: ${format.mod}`);
}

getRestrictedContent('gen9ou');

Species API

Learn about base species data

Moves API

Understand move restrictions

Abilities API

Check ability bans and restrictions

Items API

See item restrictions by format

Build docs developers (and LLMs) love