Pogo DB API v1.1

A static JSON API for Pokémon GO data with pre-computed DPS, STAB stats, and TDO rankings. Built and deployed automatically on every push.

Pokémon Endpoints

GET /api/pokemon/index.json

Returns a manifest of all available Pokémon with their dex number, name, and ID.

GET /api/pokemon/{dexNr}.json

Returns full data for a specific Pokémon by Pokédex number, including stats, moves, computed DPS values, and TDO-ranked movesets.

Rankings Endpoints

GET /api/rankings/index.json

Returns a manifest of all available ranking types.

GET /api/rankings/{type}.json

Returns Pokémon ranked by TDO for a specific type (e.g., fire.json). Each entry includes the Pokémon's best moveset for that damage type.

GET /api/raids/current.json

Returns current raid bosses scraped from Leek Duck. Includes tier, types, CP ranges, weather boosts, and cross-referenced dexNr. Updated daily.

Try It

Enter a Pokédex number to fetch a Pokémon. These calls hit the API directly from your browser.

GET /api/pokemon/25.json
// Click "Send Request" to see the response

Quick Start

Fetch a single Pokémon (JavaScript)

const response = await fetch("api/pokemon/25.json");
const pikachu = await response.json();

console.log(pikachu.name);           // "Pikachu"
console.log(pikachu.stats.attack);    // 112
console.log(pikachu.quickMoves[0].computed.dps); // DPS value

Get the best TDO moveset for a Pokémon

const response = await fetch("api/pokemon/150.json");
const mewtwo = await response.json();

// Get best regular moveset by TDO
const best = mewtwo.computed.movesets.regular
  .sort((a, b) => b.tdo - a.tdo)[0];

console.log(`Best moveset: ${best.quickMove} + ${best.cinematicMove}`);
console.log(`TDO: ${best.tdo}, Combo DPS: ${best.comboDps}`);

Get the full index

const response = await fetch("api/pokemon/index.json");
const allPokemon = await response.json();

// allPokemon = [{ dexNr: 1, name: "Bulbasaur", id: "BULBASAUR" }, ...]
console.log(`Total: ${allPokemon.length} Pokémon`);

Find the best DPS quick move for a Pokémon

const response = await fetch("api/pokemon/150.json");
const mewtwo = await response.json();

const bestMove = mewtwo.quickMoves
  .sort((a, b) => b.computed.stabDps - a.computed.stabDps)[0];

console.log(`Best quick move: ${bestMove.name} (${bestMove.computed.stabDps} STAB DPS)`);

Using with cURL

# Get Pikachu
curl http://localhost:3000/api/pokemon/25.json

# Get the full index
curl http://localhost:3000/api/pokemon/index.json

# Get Fire-type rankings
curl http://localhost:3000/api/rankings/fire.json

# Get current raid bosses
curl http://localhost:3000/api/raids/current.json

# Pretty-print with jq
curl -s http://localhost:3000/api/pokemon/6.json | jq '.computed.movesets.regular[0]'

Response Schema

Pokémon Object

FieldTypeDescription
idstringInternal Pokémon GO identifier
formIdstringForm-specific identifier
dexNrnumberNational Pokédex number
generationnumberGeneration number
namestringEnglish display name
statsobject|null{ stamina, attack, defense }
primaryTypeobject{ type, name }
secondaryTypeobject|null{ type, name } or null
quickMovesMove[]Fast attacks
cinematicMovesMove[]Charged attacks
eliteQuickMovesMove[]Elite TM fast attacks
eliteCinematicMovesMove[]Elite TM charged attacks
assetsobject|null{ image, shinyImage } URLs
evolutionsarrayEvolution paths with candy costs
computed.pokemonobjectPokémon-level computed stats (see below)
computed.movesetsobjectTDO-ranked moveset combinations (see below)

computed.pokemon Object

FieldTypeDescription
atkRealnumberReal attack stat: (base_attack + 15) × 0.84029999
defRealnumberReal defense stat: (base_defense + 15) × 0.84029999
hpRealnumberReal HP stat: floor((base_stamina + 15) × 0.84029999)

computed.movesets Object

Contains regular[] and elite[] arrays. Regular movesets use only standard moves; elite movesets include at least one Elite TM move.

FieldTypeDescription
quickMovestringName of the fast move in this combination
cinematicMovestringName of the charged move in this combination
comboDpsnumberCombo DPS for the full energy cycle
comboDpsAtknumberCombo DPS × real attack stat
tdonumberTotal Damage Output: comboDpsAtk × hpReal × defReal

Move Object

FieldTypeDescription
idstringMove identifier
namestringEnglish display name
powernumberBase damage
energynumberEnergy cost/gain
durationMsnumberAnimation duration in milliseconds
typeobject{ type, name } — move element type
combatobject|nullPvP stats: { energy, power, turns, buffs }
computed.dpsnumberDamage Per Second: power / (durationMs / 1000)
computed.stabDpsnumberSTAB DPS: dps × 1.2 if move type matches Pokémon type

Computed Fields

Every move includes a computed object calculated at build time:

FieldFormulaDescription
dps power / (durationMs / 1000) Raw damage per second for PvE (gym/raid) battles
stabDps dps × 1.2 (if type matches) Same Type Attack Bonus — applied when move type matches the Pokémon's primary or secondary type

Methodology

How TDO rankings and computed stats are calculated in the Pogo DB API build pipeline.

Credit: The TDO ranking methodology is based on the work of Dr. Gogochi as documented on Doctor Pokegogo. We implement their formulas to produce boss-agnostic Total Damage Output rankings for every Pokémon and moveset combination.

Overview

The API computes two levels of stats at build time:

  • Per-move DPS — simple power/duration for individual move reference
  • TDO Rankings — full energy-cycle simulation for every moveset combination

Real Stats (Level 50, Perfect IVs)

All calculations assume a Level 50 Pokémon with 15/15/15 IVs. The CP Multiplier for Level 50 is:

CPM_50 = 0.84029999

Real stats are derived from base stats:

ATK_real = (base_attack + 15) × CPM_50 DEF_real = (base_defense + 15) × CPM_50 HP_real = floor((base_stamina + 15) × CPM_50)

These are output in the API as computed.pokemon.atkReal, computed.pokemon.defReal, and computed.pokemon.hpReal.

STAB (Same Type Attack Bonus)

When a move's element type matches the Pokémon's primary or secondary type, the move receives a 1.2× damage multiplier. This is applied in both the per-move DPS and the TDO combo calculations.

stab = 1.2 if move.type ∈ {primaryType, secondaryType} else 1.0

Per-Move DPS

Each individual move has a simple DPS calculation, kept for quick reference when comparing moves in isolation:

dps = power / (durationMs / 1000) stabDps = dps × 1.2 // only if STAB applies

This does not account for energy cycles or charged moves — it's purely the raw damage rate of a single move animation.

Energy Cycle Calculation

To compare full movesets (fast + charged move combos), we calculate how many fast moves are needed to accumulate enough energy for one charged move, then compute the overall DPS of that complete cycle.

Step 1: Energy Per Second

eps = fast_energy / fast_duration

Where fast_energy is the energy gained per fast move use, and fast_duration is in seconds.

Step 2: Number of Fast Moves per Cycle

energy_cost = abs(charge_energy) n_fast = ceil(energy_cost / (eps × fast_duration))

We round up because you can't use a fractional fast move.

Step 3: Cycle Time

cycle_time = n_fast × fast_duration + charge_duration

The total time for one complete energy cycle: all the fast moves plus one charged move.

Step 4: Combo DPS

combo_dps = (n_fast × fast_power × fast_stab + charge_power × charge_stab) / cycle_time

This gives the effective damage rate across a full energy cycle, incorporating STAB bonuses for both moves.

TDO (Total Damage Output)

TDO combines offensive output (combo DPS × attack) with the Pokémon's bulk (HP × defense) to produce a single ranking metric:

combo_dps_atk = combo_dps × ATK_real TDO = combo_dps_atk × HP_real × DEF_real

Higher TDO means the Pokémon deals more total damage before fainting. This is the primary ranking metric used in the /api/rankings/ endpoints.

Regular vs Elite Movesets

Every moveset combination is classified into two categories:

  • Regular — both the fast move and charged move are available through normal gameplay (TMs, leveling, etc.)
  • Elite — at least one of the moves requires an Elite TM (Community Day moves, legacy moves, etc.)

This separation allows users to see the best achievable moveset with and without Elite TMs. Both arrays are sorted by TDO descending in the API output.

Boss-Agnostic Rankings

Note: These rankings do not apply type effectiveness multipliers. No specific raid boss or defender is assumed. The TDO metric represents raw offensive + bulk potential without any type advantage or disadvantage applied. This makes the rankings useful as a general-purpose "how good is this Pokémon's moveset?" reference.

If you need type-matchup-aware rankings (e.g., "best counters for Mewtwo"), you would apply the relevant type effectiveness multipliers on top of the comboDps values from the API.

Summary of Output Fields

API FieldFormula
computed.pokemon.atkReal(base_attack + 15) × 0.84029999
computed.pokemon.defReal(base_defense + 15) × 0.84029999
computed.pokemon.hpRealfloor((base_stamina + 15) × 0.84029999)
movesets[].comboDps(n_fast × fast_power × fast_stab + charge_power × charge_stab) / cycle_time
movesets[].comboDpsAtkcomboDps × atkReal
movesets[].tdocomboDpsAtk × hpReal × defReal
moves[].computed.dpspower / (durationMs / 1000)
moves[].computed.stabDpsdps × 1.2 (if STAB)