Skip to content

Data Sources

Hails edited this page Jul 15, 2026 · 7 revisions

Data Sources

hailsDotGO does not invent any game data: everything on the site is aggregated from community-maintained sources, cached aggressively, and served from memory. This page lists every external source, what it provides, how often it is fetched, and how the app stays up even when all of them are unreachable.

Source overview

Source Provides Fetched by Cadence
PoGoAPI Base stats, current movesets, fast/charged moves, CP multipliers, shiny availability, shadow list, type effectiveness, Pokemon types Server Every 6 hours
pokemon-go-api (GitHub Pages) Current raid bosses (raidboss.json) and Max Battles (maxbattles.json) Server Six scheduled refreshes per day
ScrapedDuck LeekDuck events feed (events.min.json) Server Every 30 minutes
LeekDuck event pages Per-event detail HTML (scraped and sanitized) Server Re-fetched when older than 12 hours
PokeAPI Pokemon sprites, species flavor text, genus, cries, form sprites (browser); official localized Pokemon names (server) Browser and server On demand; names every 6 hours
Open-Meteo Geocoding plus current weather for the weather boost feature; no API key needed Server Cached until the next half-hour boundary
PokeMiners / pogo_assets Mined Pokemon GO assets: which costume codes and shiny art exist, and the sprite images themselves Build tool (catalog) and server (sprite proxy) Catalog regenerated on demand; sprites fetched once, cached
WatWowMap Game Master Costume pretty names and the isCostume flag, cross-checked against the mined assets Build tool (cmd/synccostumes) On demand, when regenerating the catalog
Pokemon Showdown Full trainer sprite library for avatars (all generation groups) Server (proxied) Fetched once, cached in memory
Dreamstone Mysteries GBA-style trainer sprites Bundled in the repo Never fetched
pokeemerald-expansion (RHH) FRLG-style trainer sprites Bundled in the repo Never fetched

PoGoAPI

The core game data set comes from ten PoGoAPI endpoints: pokemon_stats, current_pokemon_moves, fast_moves, charged_moves, shiny_pokemon, shadow_pokemon, type_effectiveness, cp_multiplier, pokemon_types, and pokemon_evolutions. They are fetched sequentially with a 400 ms delay between requests to stay polite, every 6 hours, plus once at startup. Each successful response is written to the disk cache. A superadmin can force an immediate refresh from the admin panel, and private API consumers can trigger one via POST /api/refresh (see API Reference).

Localized Pokemon names used to come from PoGoAPI's pokemon_names endpoint, but that endpoint stopped including language data; they now come from PokeAPI (see below). The legacy parser is kept so an old cached pokemon_names.json in any of the historical response shapes still loads.

pokemon_evolutions.json

pogoapi.net/api/v1/pokemon_evolutions.json is a full evolution-family and candy-cost dataset (roughly 1,098 entries) fetched on the same server-side schedule as the rest of PoGoAPI, with an embedded snapshot compiled into the binary as a fallback. It powers the candy-line species identification used by the IV Calculator screenshot OCR: when a Pokemon is nicknamed, the visible candy name plus the evolution family narrows down which species the screenshot shows.

Shiny supplement (locally curated)

internal/pogodata/fallback/shinies_supplement.json is a small hand-maintained list that fills gaps where PoGoAPI stopped tracking some newer shiny releases (about 21 Pokemon, for example the Scorbunny and Sobble lines, the Honedge line, Mr. Rime, and Ursaluna). It is merged over the upstream shiny data in memory, always wins on conflict, and survives every refresh, so a shiny the upstream feed is missing still shows as available. It is bundled in the repository, never fetched over the network.

pokemon-go-api (raid bosses and Max Battles)

Current raid bosses come from https://pokemon-go-api.github.io/pokemon-go-api/api/raidboss.json and Max Battles from .../api/maxbattles.json. The app regroups them under its own tier keys: raids use 1, 3, 5, and 6 (Mega), with the shadow tiers folded into their numeric tier and a Shadow prefix added to the name; Max Battles use tiers 1 to 3. Each boss carries its image, types, shiny availability, and normal plus weather-boosted CP ranges.

Both endpoints refresh on a fixed schedule in Mountain Time (DST-aware): 12:01 AM, 4:00 AM, 8:00 AM, 12:01 PM, 4:00 PM, and 8:00 PM, matching when raid rotations actually change. They are also fetched once at startup. These bosses power the Raids and Counters page and define which bosses can be queued in the Raid Finder.

ScrapedDuck and LeekDuck event details

The Events page is driven by ScrapedDuck's events.min.json, a machine-readable export of LeekDuck's event calendar, fetched every 30 minutes (ScrapedDuck asks for at least 5 minutes between fetches, so this is comfortably polite).

For the event detail modal, the server scrapes each active event's LeekDuck page directly:

  • Only https links on the leekduck.com host are ever fetched.
  • Requests are spaced 1500 ms apart and a fetch pass skips events that already ended.
  • The page's main content block is extracted, navigation, ads, scripts, and the author box are stripped, links are absolutized and forced to target="_blank" rel="noopener nofollow", and the result is sanitized with bluemonday (UGC policy plus class attributes, https-only URLs) before storage.
  • A scraped page is kept for up to 12 hours before re-fetching; failures keep the previous copy, and details for events that leave the feed are evicted.
  • The whole detail cache persists to disk (event_details.json in the cache directory).

PokeAPI

PokeAPI serves two roles. Client-side, Pokemon sprites (including shiny and special forms), species flavor text, genus lines, and cries are fetched by the browser on demand for the DPS Calculator, Shiny Tracking, and profile features; the server also builds favorite-Pokemon sprite URLs from the PokeAPI sprites repository on GitHub for the Trainer Directory.

Server-side, the official localized Pokemon names come from PokeAPI's pokemon_species_names.csv (the official species names from the main-series games). The server fetches it at startup and every 6 hours, keeps the French, German, Spanish, and Japanese rows, converts them to JSON keyed by dex number, and caches the result as pokemon_names.json in the cache directory. These names flow into the game data payload and localize Pokemon names across the frontend via the shared pokeName() helper.

Open-Meteo (weather boost)

The weather boost feature resolves a user's saved city to coordinates with Open-Meteo's geocoding API (results cached indefinitely, since cities do not move), then reads the current WMO weather code and wind speed from the forecast API. The code is mapped to an in-game weather condition, with wind of 36 km/h or more overriding clear-sky conditions as Windy. Results are cached per city until the next half-hour boundary, matching when in-game weather changes. No API key is required. See Accounts and Roles for the user-facing behavior.

Trainer sprites

  • Pokemon Showdown: the full trainer sprite library used for avatars (roughly 1,450 sprites across every generation group, Let's Go, Masters EX, and Pokemon GO, including Team GO Rocket and team leaders) is proxied through GET /api/trainer-sprite/{slug} so browsers never hit Showdown directly. Each sprite is fetched once, capped at 64 KB, cached in an in-process sync.Map, and served with Cache-Control: public, max-age=2592000, immutable. The avatar picker supports keyword search by type, role, gender, generation, region, and Pokemon GO faction.
  • Dreamstone Mysteries: GBA-style trainer sprites from the open-source pokeemerald ROM hack Pokemon Dreamstone Mysteries are bundled in the repository under static/sprites/dreamstone/ and served as ordinary static files.
  • pokeemerald-expansion (Rom Hacking Hideout): FRLG-style trainer sprites from the open-source pokeemerald-expansion ROM hack are bundled in the repository under static/sprites/pex/ and served as ordinary static files.

Costume assets (mined data)

Costume sprites and the list of which Pokemon can wear which costume come from mined Pokemon GO assets, not from PokeAPI. The build-time tool cmd/synccostumes (make costumes) reads the PokeMiners/pogo_assets tree, where the filename grammar itself is the data: the presence of a pm{dex}.{code}.s.icon.png file proves both that a species can wear a costume and that its shiny art exists. The WatWowMap Game Master supplies the pretty names and an isCostume flag, cross-checked against the mined assets to catch codes whose internal name is misleading. The tool writes internal/costumes/catalog.json, which is compiled into the binary; see Building and Development for the regeneration workflow and Shiny Tracking for how the catalog drives the picker.

At runtime the sprite images are not hotlinked. Each is pulled from the mined-asset CDN exactly once by the proxy at GET /api/costume-sprite/{file}, cached, and re-served immutably (the origin URL is pinned to an asset commit), so browsing the shiny dex never sends a per-costume request to a third party.

Caching and offline resilience

The app survives every source being down:

  1. Embedded fallback: baseline JSON for the core PoGoAPI data sets is compiled into the binary from internal/pogodata/fallback/, so a fresh install boots with working data and no network at all.
  2. Disk cache: every successful fetch is written to the cache directory (CACHE_DIR, default ./cache); at startup anything on disk overlays the embedded fallback.
  3. Network: background refreshers then overlay live data as it arrives. A failed refresh keeps the last good payload.

Public consumers read the same in-memory store through the endpoints in the API Reference, which add a 5-minute browser cache on top.

Attribution

hailsDotGO exists because of the people maintaining these projects: PoGoAPI, pokemon-go-api, ScrapedDuck, LeekDuck, PokeAPI, Open-Meteo, PokeMiners, WatWowMap, Pokemon Showdown, Pokemon Dreamstone Mysteries, and pokeemerald-expansion (Rom Hacking Hideout). The in-app credits page (https://pogo.hails.live/credits) carries the canonical attribution list, split by how each source is used. If you operate one of these sources and have concerns about how your data is used, please open an issue on the repository.

Clone this wiki locally