Live wait times, crowd levels, opening hours and forecasts for theme parks worldwide. The data service behind park.fan.
All routes live under /v1. Parks are addressed by their geographic path,
/v1/parks/{continent}/{country}/{city}/{park}, e.g.
/v1/parks/europe/germany/rust/europa-park. Every parameter and response shape is in the
Swagger UI.
| Area | Routes | What you get |
|---|---|---|
| π‘ Parks | GET /parks Β· /parks/{continent}[/{country}[/{city}]] Β· /parks/popular |
Park lists by region, most-requested parks |
| π° One park | GET /parks/β¦/{park} |
Status, opening hours, live crowd level, weather, every attraction, show and restaurant |
| β±οΈ Live | β¦/{park}/wait-times |
Current queues per attraction |
| π Calendar | β¦/{park}/calendar Β· /best-days Β· /schedule Β· /seasons Β· /predictions/yearly |
Opening hours, day status, crowd forecast per day, holidays, named seasons |
| ποΈ Trip planning | β¦/{park}/plan/day |
One day, ride by ride: hourly waits with source and expected error |
| π Statistics | β¦/{park}/stats Β· /stats/hourly Β· /stats/day |
Historical park stats, the park's hourly profile, one ride's day curve |
| π’ Attractions | β¦/{park}/attractions[/{attraction}] |
Catalog list; detail with live state, forecast, typical/busy waits, ride profile |
| π€οΈ Weather | β¦/{park}/weather Β· /weather/forecast Β· /weather/nowcast |
Observed weather, 16-day forecast, short-term nowcast, severe-weather warnings |
| π Discovery | GET /discovery/geo Β· /discovery/continents[β¦] Β· /discovery/nearby |
Geo hierarchy for navigation, parks or rides near a position |
| π Search | GET /search?q=β¦ |
Parks and attractions by name or place |
| π Analytics | GET /analytics/realtime Β· /geo-live Β· /ticker Β· /best-times |
Platform-wide live figures and best times to visit |
| π Glossary | GET /glossary/terms/counts Β· /glossary/terms/{termId}/attractions |
Rides that feature a glossary term |
| β Personal | /favorites Β· /trips Β· /push Β· /push/ride-alerts Β· /push/show-follows Β· /page-views |
Favorites, stored day plans, web push, page-view counts |
| π©Ί Health | GET /health Β· /health/ready Β· /health/ping Β· /ml/health |
Liveness, readiness, ML service state |
timezone on every park), never the caller's.UNKNOWN; a crowd level without a baseline reads unknown. Neither means "closed" or "quiet".?debug=true to see them.Cache-Control headers for Cloudflare; live endpoints refresh within minutes.Requires Node.js 26+, pnpm 11 (corepack enable) and Docker.
git clone https://github.com/PArns/v4.api.park.fan.git
cd v4.api.park.fan
pnpm install
cp .env.example .env
docker compose up -d postgres redis bull-board # add ml-service nf-service pcn-service for forecasts
pnpm dev # http://localhost:3000
| URL | |
|---|---|
| http://localhost:3000/ | This page |
| http://localhost:3000/v1 | The API |
| http://localhost:3000/api | Swagger UI |
| http://localhost:3001/ | Bull Board (job queues) |
pnpm docker:up starts the whole stack including the API container on port 3000 β use it
instead of pnpm dev, not alongside it.
βββββββββββββββββ NestJS API (src/) βββββββββββββββββ
park.fan ββΆβ REST /v1 Β· Redis cache Β· Bull queues Β· TypeORM β
βββββ¬ββββββββββββββββ¬βββββββββββββββββββ¬βββββββββββββ
β β β
PostgreSQL 18 Redis 8 Python services
+ TimescaleDB cache + queues ml-service (CatBoost)
nf-service (TFT, Chronos)
pcn-service (intraday PCN)
| Path | Contents |
|---|---|
src/ |
NestJS modules: parks, attractions, queue-data, analytics, ml, holidays, discovery, search, trips, push, admin, β¦ |
ml-service/ |
CatBoost training and serving (FastAPI) |
nf-service/ |
NeuralForecast TFT and Chronos daily forecasts |
pcn-service/ |
Intraday forecast model |
ml-bench/ |
Offline forecasting benchmark (not deployed) |
scripts/ |
Operational and one-off scripts |
test/ |
E2E suite (Testcontainers) and fixtures |
docs/ |
Developer documentation β start at docs/README.md |
pnpm test # unit tests
pnpm test:e2e # end-to-end tests against a TimescaleDB container
pnpm lint # ESLint (fixes in place)
pnpm format # Prettier
pnpm build # type check + build
Configuration lives in .env.example
(development) and .env.production.example. Deployment runs on
Coolify with docker-compose.production.yml β see
docs/deployment.
park.fan combines these sources. Thank you for making theme park data accessible.
| Source | Used for |
|---|---|
| Queue-Times.com | Live wait times β Powered by Queue-Times.com |
| ThemeParks.wiki | Parks, attractions, live data, opening hours |
| Wartezeiten.app | Wait times, crowd levels and opening hours |
| Open-Meteo.com | Weather forecasts, current conditions and history (CC BY 4.0; built on data from DWD, ECMWF, NOAA, MΓ©tΓ©o-France and other national weather services) |
| Bright Sky | Severe-weather warnings for Germany from the Deutscher Wetterdienst (DWD) |
| MeteoGate | Severe-weather warnings for Europe (EUMETNET / MeteoAlarm) |
| Nager.Date Β· OpenHolidays API | Public and school holidays |
| NEIS Β· KASI | School and public holidays in South Korea |
| Wikidata | Park and ride facts |
| Google Geocoding | Park locations |
| MaxMind GeoLite2 | Approximate visitor location for "nearby" β includes GeoLite2 data created by MaxMind |
UNLICENSED β private project by Patrick Arns. For questions or collaboration, contact the maintainer.
Made with β€οΈ for theme park fans Β· api.park.fan/api Β· park.fan