Skip to content

Data Sources

Hails edited this page Jun 11, 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, localized names 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 (client-side) On demand
Open-Meteo Geocoding plus current weather for the weather boost feature; no API key needed Server Cached until the next half-hour boundary
Pokemon Showdown Classic trainer class sprites for avatars Server (proxied) Fetched once, cached in memory
Dreamstone Mysteries GBA-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_names. 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).

pokemon_names feeds the localized Pokemon names (French, German, Spanish) used by the frontend; the parser tolerates the several response shapes this endpoint has had over time.

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 is used entirely 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. Nothing from PokeAPI transits or loads the hailsDotGO server.

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 classic trainer class sprites used for avatars are 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.
  • 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.

Caching and offline resilience

The store 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, Pokemon Showdown, and Pokemon Dreamstone Mysteries. 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