Data types
The shapes behind the API: trainers, Pokémon, battles, gyms, tournaments and flyovers.
Generated from net/protocol.ts, engine/types.ts and data/types.ts. Optional fields end in ?.
Protocol
| Constant | Value |
|---|---|
POKEMON_API_PREFIX | "/pokemon-api" |
POKEMON_WS_PATH | "/pokemon-ws" |
STARTER_IDS | [1, 4, 7, 152, 155, 158] |
PARTY_SIZE | 6 |
TOURNAMENT_TEAM_SIZE | 3 |
TOURNAMENT_LEVEL | 50 |
TURN_SECONDS | 10 |
CHALLENGE_TTL_SECONDS | 30 |
BadgeView
| Field | Type |
|---|---|
communityId | string |
communityHandle | string |
communityName | string |
badgeName | string |
type | PokemonType |
earnedAt | number |
TrainerSummary
| Field | Type |
|---|---|
userId | string |
username | string |
displayName | string |
avatarUrl | string | null |
liveIdentity | string | null |
leadSpeciesId | number | null |
leadShiny | boolean |
trainerLevel | number |
points | number |
badges | BadgeView[] |
dexSeen | number |
dexCaught | number |
online | boolean |
PendingDecision
| { id: string; kind: "learn-move"; uid: string; move: string } | { id: string; kind: "evolution"; uid: string; to: number }
TrainerSettings
| Field | Type |
|---|---|
encounters | boolean |
sound | boolean |
animations | boolean |
TrainerState
Extends TrainerSummary.
| Field | Type |
|---|---|
money | number |
party | OwnedPokemon[] |
boxCount | number |
inventory | Partial<Record<ItemId, number>> |
pending | PendingDecision[] |
settings | TrainerSettings |
createdAt | number |
timeOfDay | TimeOfDay |
MeResponse
{ needsStarter: true; starters: number[] } | { needsStarter: false; trainer: TrainerState }
PokedexEntryState
| Field | Type |
|---|---|
speciesId | number |
seen | boolean |
caught | boolean |
firstCaughtAt | number | null |
WildPoolEntry
| Field | Type |
|---|---|
speciesId | number |
rarity | Rarity |
minLevel | number |
maxLevel | number |
GymView
| Field | Type |
|---|---|
communityId | string |
communityHandle | string |
communityName | string |
leaderUserId | string | null |
leaderName | string | null |
type | PokemonType |
badgeName | string |
wildPool | WildPoolEntry[] |
leaderTeam | Array<{ speciesId: number; level: number }> |
youHaveBadge | boolean |
badgeHolders | number |
LeaderboardEntry
| Field | Type |
|---|---|
rank | number |
trainer | TrainerSummary |
ChallengeView
| Field | Type |
|---|---|
challengeId | string |
kind | "pvp" | "gym" |
from | TrainerSummary |
to | TrainerSummary |
communityHandle | string | null |
expiresAt | number |
TradeStatus
"pending" | "accepted" | "declined" | "cancelled" | "expired"
TradeView
| Field | Type |
|---|---|
tradeId | string |
from | TrainerSummary |
to | TrainerSummary |
offer | OwnedPokemon |
request | OwnedPokemon | null |
status | TradeStatus |
createdAt | number |
BattleRewards
| Field | Type |
|---|---|
money | number |
points | number |
expGains | Array<{ uid: string; expGained: number; levelsGained: number[]; learnedMoves: string[]; }> |
pending | PendingDecision[] |
caught | OwnedPokemon | null |
caughtToBox | boolean |
newDexEntries | number[] |
badge | BadgeView | null |
TournamentPhase
"registration" | "running" | "final" | "finished" | "cancelled"
TournamentMatchView
| Field | Type |
|---|---|
matchId | string |
round | number |
a | string | null |
b | string | null |
winner | string | null |
battleId | string | null |
StageRequestStatus
"pending" | "invited" | "declined"
TournamentView
| Field | Type |
|---|---|
tournamentId | string |
communityHandle | string |
communityName | string |
host | TrainerSummary |
phase | TournamentPhase |
rules | { teamSize: number; level: number; turnSeconds: number } |
entrants | TrainerSummary[] |
matches | TournamentMatchView[] |
champion | string | null |
finalBattleId | string | null |
finalWinner | string | null |
stage | { userId: string; status: StageRequestStatus } | null |
createdAt | number |
ClientContext
| Field | Type |
|---|---|
path | string |
communityHandle | string | null |
live | { communityHandle: string; isHost: boolean } | null |
visible | boolean |
localHour | number |
FlyoverKind
"legendary" | "team-rocket"
FlyoverView
| Field | Type |
|---|---|
flyoverId | string |
kind | FlyoverKind |
speciesId | number | null |
path | "left-to-right" | "right-to-left" | "arc" |
durationMs | number |
expiresAt | number |
stake | { item: ItemId; quantity: number } | null |
Pokémon and battles
SideIndex
0 | 1
Dvs
| Field | Type |
|---|---|
attack | number |
defense | number |
special | number |
speed | number |
StatExp
Record<StatExpKey, number>
Stats
Record<BaseStat, number>
MoveSlot
| Field | Type |
|---|---|
move | MoveSlug |
pp | number |
maxPp | number |
OwnedPokemon
| Field | Type |
|---|---|
uid | string |
speciesId | number |
nickname | string | null |
level | number |
exp | number |
dvs | Dvs |
statExp | StatExp |
moves | MoveSlot[] |
hp | number |
status | MajorStatus | null |
shiny | boolean |
ownerId | string |
originalTrainerId | string |
originalTrainerName | string |
caughtAt | number |
ball | BallId |
metLocation | string |
metLevel | number |
friendship | number |
heldItem | HeldItemId | BerryId | null |
gender | Gender | null |
metTimeOfDay | TimeOfDay | null |
BattleKind
"wild" | "pvp" | "gym" | "tournament" | "legendary-event" | "team-rocket"
BattleRules
| Field | Type |
|---|---|
allowItems | boolean |
allowRun | boolean |
allowCatch | boolean |
turnSeconds | number | null |
levelScale | number | null |
maxTurns | number | null |
awardExp | boolean |
BattleSideInit
| Field | Type |
|---|---|
trainerId | string | null |
name | string |
party | OwnedPokemon[] |
controller | "human" | "ai" |
inventory | Partial<Record<ItemId, number>> |
aiSkill | "wild" | "trainer" | "leader" |
CreateBattleInput
| Field | Type |
|---|---|
battleId | string |
kind | BattleKind |
seed | number |
rules | BattleRules |
sides | [BattleSideInit, BattleSideInit] |
location | string |
timeOfDay | TimeOfDay |
BattleAction
One of:
{ kind: "move"; slot: number }{ kind: "switch"; partyIndex: number }{ kind: "item"; item: ItemId; partyIndex: number | null; moveIndex?: number | null }{ kind: "run" }{ kind: "forfeit" }
Effectiveness
0 | 0.25 | 0.5 | 1 | 2 | 4
BattleEvent
One of:
{ kind: "text"; text: string }{ kind: "send-out"; side: SideIndex; partyIndex: number; pokemon: BattlePokemonView }{ kind: "withdraw"; side: SideIndex }{ kind: "use-move"; side: SideIndex; move: MoveSlug; moveName: string; moveType: PokemonType }{ kind: "miss"; side: SideIndex }{ kind: "damage"; side: SideIndex; amount: number; hp: number; maxHp: number; effectiveness: Effectiveness; critical: boolean; source: "move" | "status" | "recoil" | "confusion" | "leech-seed" | "trap" | "struggle"; }{ kind: "heal"; side: SideIndex; amount: number; hp: number; maxHp: number }{ kind: "status"; side: SideIndex; status: MajorStatus | null }{ kind: "volatile"; side: SideIndex; effect: string; active: boolean }{ kind: "stat-stage"; side: SideIndex; stat: StageStat; change: number; stage: number }{ kind: "faint"; side: SideIndex; partyIndex: number }{ kind: "item"; side: SideIndex; item: ItemId; partyIndex: number | null }{ kind: "ball-throw"; ball: BallId; shakes: 0 | 1 | 2 | 3; caught: boolean }{ kind: "run"; side: SideIndex; success: boolean }{ kind: "transform"; side: SideIndex; speciesId: number }{ kind: "weather"; weather: Weather | null }{ kind: "held-item"; side: SideIndex; item: HeldItemId | BerryId; consumed: boolean }{ kind: "turn"; turn: number }{ kind: "end"; result: BattleResult }
BattlePokemonView
| Field | Type |
|---|---|
uid | string |
speciesId | number |
name | string |
level | number |
hp | number |
maxHp | number |
status | MajorStatus | null |
types | PokemonType[] |
shiny | boolean |
fainted | boolean |
stages | Partial<Record<StageStat, number>> |
volatile | string[] |
transformedInto | number | null |
gender | Gender | null |
OwnBattlePokemonView
Extends BattlePokemonView.
| Field | Type |
|---|---|
moves | Array<MoveSlot & { disabled: boolean }> |
stats | Stats |
exp | number |
heldItem | HeldItemId | BerryId | null |
friendship | number |
PartyEntryView
| Field | Type |
|---|---|
speciesId | number |
level | number |
hp | number |
maxHp | number |
status | MajorStatus | null |
fainted | boolean |
SideView
| Field | Type |
|---|---|
trainerId | string | null |
name | string |
isWild | boolean |
activeIndex | number |
active | BattlePokemonView | null |
party | Array<PartyEntryView | null> |
OwnSideView
Extends Omit<SideView, "active">.
| Field | Type |
|---|---|
active | OwnBattlePokemonView | null |
party | Array<PartyEntryView & { uid: string; name: string }> |
inventory | Partial<Record<ItemId, number>> |
BattlePhase
"choose" | "switch-required" | "waiting" | "ended"
BattleResult
| Field | Type |
|---|---|
winner | SideIndex | null |
reason | "faint" | "run" | "catch" | "forfeit" | "timeout" | "turn-limit" | "flee" |
caughtPartyIndex | number | null |
BattleView
| Field | Type |
|---|---|
battleId | string |
kind | BattleKind |
location | string |
turn | number |
phase | BattlePhase |
you | SideIndex |
self | OwnSideView |
opponent | SideView |
legalActions | BattleAction[] |
weather | Weather | null |
timeOfDay | TimeOfDay |
rules | BattleRules |
result | BattleResult | null |
ExpGainOutcome
| Field | Type |
|---|---|
pokemon | OwnedPokemon |
expGained | number |
levelsGained | number[] |
learnedMoves | MoveSlug[] |
pendingMoves | MoveSlug[] |
evolution | number | null |
Game data
| Constant | Value |
|---|---|
POKEMON_TYPES | [ "normal", "fire", "water", "electric", "grass", "ice", "fighting", "poison", "ground", "flying", "psychic", "bug", "rock", "ghost", "dragon", "dark", "steel", ] |
KANTO_MAX_ID | 151 |
JOHTO_MAX_ID | 251 |
BALL_IDS | [ "poke-ball", "great-ball", "ultra-ball", "master-ball", "fast-ball", "level-ball", "lure-ball", "heavy-ball", "love-ball", "friend-ball", "moon-ball", ] |
EVOLUTION_STONES | [ "fire-stone", "water-stone", "thunder-stone", "leaf-stone", "moon-stone", "sun-stone", ] |
TRADE_EVOLUTION_ITEMS | ["kings-rock", "metal-coat", "dragon-scale", "up-grade"] |
MEDICINE_IDS | [ "potion", "super-potion", "hyper-potion", "max-potion", "full-restore", "revive", "max-revive", "antidote", "paralyze-heal", "awakening", "burn-heal", "ice-heal", "full-heal", "ether", "max-ether", "elixir", "max-elixir", "fresh-water", "soda-pop", "lemonade", "moomoo-milk", "energy-powder", "energy-root", "heal-powder", "revival-herb", ] |
BATTLE_ITEM_IDS | [ "x-attack", "x-defend", "x-speed", "x-special", "x-accuracy", "dire-hit", "guard-spec", ] |
BERRY_IDS | [ "berry", "gold-berry", "przcure-berry", "mint-berry", "ice-berry", "burnt-berry", "psncure-berry", "bitter-berry", "miracle-berry", "mysteryberry", ] |
POKEMON_ASSET_PREFIX | "/pokemon-assets" |
PokemonType
(typeof POKEMON_TYPES)[number]
Generation
1 | 2
BaseStat
"hp" | "attack" | "defense" | "specialAttack" | "specialDefense" | "speed"
DvStat
"attack" | "defense" | "speed" | "special"
StatExpKey
"hp" | "attack" | "defense" | "speed" | "special"
StageStat
"attack" | "defense" | "specialAttack" | "specialDefense" | "speed" | "accuracy" | "evasion"
GrowthRate
"fast" | "medium-fast" | "medium-slow" | "slow"
Rarity
"common" | "uncommon" | "rare" | "very-rare" | "legendary"
MajorStatus
"paralysis" | "burn" | "freeze" | "poison" | "toxic" | "sleep"
TimeOfDay
"morning" | "day" | "night"
Weather
"rain" | "sun" | "sandstorm"
Gender
"male" | "female"
MoveSlug
string
BallId
(typeof BALL_IDS)[number]
EvolutionStone
(typeof EVOLUTION_STONES)[number]
TradeEvolutionItem
(typeof TRADE_EVOLUTION_ITEMS)[number]
MedicineId
(typeof MEDICINE_IDS)[number]
BattleItemId
(typeof BATTLE_ITEM_IDS)[number]
BerryId
(typeof BERRY_IDS)[number]
HeldItemId
(typeof HELD_ITEM_IDS)[number]
ItemId
BallId | EvolutionStone | MedicineId | BattleItemId | BerryId | HeldItemId | "rare-candy"
ItemCategory
"ball" | "medicine" | "evolution" | "battle" | "berry" | "held" | "other"
ItemData
| Field | Type |
|---|---|
id | ItemId |
name | string |
category | ItemCategory |
price | number |
description | string |
holdable | boolean |
generation | Generation |
EvolutionCondition
"attack-gt-defense" | "attack-lt-defense" | "attack-eq-defense"
EvolutionTrigger
One of:
{ kind: "level"; level: number; timeOfDay?: TimeOfDay[]; condition?: EvolutionCondition }{ kind: "stone"; item: EvolutionStone }{ kind: "trade"; heldItem?: TradeEvolutionItem }{ kind: "friendship"; timeOfDay?: TimeOfDay[] }
EvolutionLink
| Field | Type |
|---|---|
to | number |
trigger | EvolutionTrigger |
LearnsetEntry
| Field | Type |
|---|---|
level | number |
move | MoveSlug |
SpeciesData
| Field | Type |
|---|---|
id | number |
generation | Generation |
slug | string |
name | string |
types | [PokemonType] | [PokemonType, PokemonType] |
baseStats | Record<BaseStat, number> |
baseExp | number |
catchRate | number |
growthRate | GrowthRate |
genderRate | number |
baseFriendship | number |
genus | string |
dexEntry | string |
heightM | number |
weightKg | number |
rarity | Rarity |
activeTimes | TimeOfDay[] |
wildHeldItems | Array<{ item: HeldItemId | BerryId; chance: number }> |
learnset | LearnsetEntry[] |
tmMoves | MoveSlug[] |
evolvesFrom | number | null |
evolvesTo | EvolutionLink[] |
MoveCategory
"physical" | "special" | "status"
SpecialMoveKind
One of:
"fixed-damage""level-damage""psywave""super-fang""ohko""counter""mirror-coat""bide""charge""recharge""rampage""trap""self-destruct""rest""haze""reflect""light-screen""safeguard""mist""focus-energy""leech-seed""substitute""transform""conversion""conversion-2""mimic""sketch""metronome""mirror-move""disable""encore""rage""flee""splash""pay-day""dream-eater""nightmare""crash-on-miss""struggle""protect""endure""sleep-talk""snore""heal-bell""baton-pass""belly-drum""curse""destiny-bond""foresight""future-sight""attract""perish-song""mean-look""spikes""rapid-spin""weather""thief""spite""pain-split""present""return""frustration""hidden-power""magnitude""rollout""fury-cutter""false-swipe""triple-kick""beat-up""pursuit""psych-up""lock-on""reversal""swagger""weather-heal""solar-beam""thunder""hits-flying""hits-underground""never-miss""stomp"
VolatileAilment
"confusion" | "flinch" | "attract"
MoveEffect
| Field | Type |
|---|---|
target | "opponent" | "self" |
ailment? | MajorStatus | VolatileAilment |
ailmentChance? | number |
statChanges? | Array<{ stat: StageStat; change: number }> |
statChance? | number |
drain? | number |
healing? | number |
highCrit? | boolean |
minHits? | number |
maxHits? | number |
minTurns? | number |
maxTurns? | number |
special? | SpecialMoveKind |
fixedDamage? | number |
semiInvulnerable? | boolean |
weather? | Weather |
thawsUser? | boolean |
MoveData
| Field | Type |
|---|---|
slug | MoveSlug |
name | string |
generation | Generation |
type | PokemonType |
category | MoveCategory |
power | number | null |
accuracy | number | null |
pp | number |
priority | number |
effect | MoveEffect |
description | string |
PokemonDataset
| Field | Type |
|---|---|
species | SpeciesData[] |
moves | Record<MoveSlug, MoveData> |
items | Record<ItemId, ItemData> |
TapIn Pokémon is an unofficial fan project. Pokémon and all related names and artwork are trademarks and © of Nintendo, Game Freak and Creatures. Legal