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
Returns a manifest of all available Pokémon with their dex number, name, and ID.
Returns full data for a specific Pokémon by Pokédex number, including stats, moves, computed DPS values, and TDO-ranked movesets.
Rankings Endpoints
Returns a manifest of all available ranking types.
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.
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.
// 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
| Field | Type | Description |
|---|---|---|
| id | string | Internal Pokémon GO identifier |
| formId | string | Form-specific identifier |
| dexNr | number | National Pokédex number |
| generation | number | Generation number |
| name | string | English display name |
| stats | object|null | { stamina, attack, defense } |
| primaryType | object | { type, name } |
| secondaryType | object|null | { type, name } or null |
| quickMoves | Move[] | Fast attacks |
| cinematicMoves | Move[] | Charged attacks |
| eliteQuickMoves | Move[] | Elite TM fast attacks |
| eliteCinematicMoves | Move[] | Elite TM charged attacks |
| assets | object|null | { image, shinyImage } URLs |
| evolutions | array | Evolution paths with candy costs |
| computed.pokemon | object | Pokémon-level computed stats (see below) |
| computed.movesets | object | TDO-ranked moveset combinations (see below) |
computed.pokemon Object
| Field | Type | Description |
|---|---|---|
| atkReal | number | Real attack stat: (base_attack + 15) × 0.84029999 |
| defReal | number | Real defense stat: (base_defense + 15) × 0.84029999 |
| hpReal | number | Real 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.
| Field | Type | Description |
|---|---|---|
| quickMove | string | Name of the fast move in this combination |
| cinematicMove | string | Name of the charged move in this combination |
| comboDps | number | Combo DPS for the full energy cycle |
| comboDpsAtk | number | Combo DPS × real attack stat |
| tdo | number | Total Damage Output: comboDpsAtk × hpReal × defReal |
Move Object
| Field | Type | Description |
|---|---|---|
| id | string | Move identifier |
| name | string | English display name |
| power | number | Base damage |
| energy | number | Energy cost/gain |
| durationMs | number | Animation duration in milliseconds |
| type | object | { type, name } — move element type |
| combat | object|null | PvP stats: { energy, power, turns, buffs } |
| computed.dps | number | Damage Per Second: power / (durationMs / 1000) |
| computed.stabDps | number | STAB DPS: dps × 1.2 if move type matches Pokémon type |
Computed Fields
Every move includes a computed object calculated at build time:
| Field | Formula | Description |
|---|---|---|
| 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:
Real stats are derived from base stats:
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.
Per-Move DPS
Each individual move has a simple DPS calculation, kept for quick reference when comparing moves in isolation:
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
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
We round up because you can't use a fractional fast move.
Step 3: Cycle Time
The total time for one complete energy cycle: all the fast moves plus one charged move.
Step 4: Combo DPS
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:
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
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 Field | Formula |
|---|---|
| computed.pokemon.atkReal | (base_attack + 15) × 0.84029999 |
| computed.pokemon.defReal | (base_defense + 15) × 0.84029999 |
| computed.pokemon.hpReal | floor((base_stamina + 15) × 0.84029999) |
| movesets[].comboDps | (n_fast × fast_power × fast_stab + charge_power × charge_stab) / cycle_time |
| movesets[].comboDpsAtk | comboDps × atkReal |
| movesets[].tdo | comboDpsAtk × hpReal × defReal |
| moves[].computed.dps | power / (durationMs / 1000) |
| moves[].computed.stabDps | dps × 1.2 (if STAB) |