| Status | Count |
|---|---|
| Scheduled | 209 |
| Delayed | 5 |
| Underway | 3 |
| Completed | 3 |
| Operator | Today | Future | Total | Date Range |
|---|---|---|---|---|
| AIDA Cruises | 0 | 17 | 17 | 2026-06-02 to 2026-12-28 |
| Brittany Ferries | 11 | 2721 | 2732 | 2026-05-30 to 2027-02-24 |
| Celebrity Cruises | 0 | 14 | 14 | 2026-06-06 to 2026-10-18 |
| Crystal Cruises | 0 | 1 | 1 | 2026-07-07 to 2026-07-07 |
| Cunard | 0 | 43 | 43 | 2026-06-05 to 2026-12-28 |
| DFDS Seaways | 2 | 614 | 616 | 2026-05-30 to 2027-04-02 |
| Disney Cruise Line | 0 | 11 | 11 | 2026-07-27 to 2026-09-14 |
| Explora Journeys | 0 | 2 | 2 | 2026-08-17 to 2026-09-09 |
| Fred. Olsen Cruise Lines | 0 | 143 | 143 | 2026-06-04 to 2027-09-27 |
| Isle of Man Steam Packet Company | 10 | 1712 | 1722 | 2026-05-30 to 2027-04-02 |
| MSC Cruises | 1 | 30 | 31 | 2026-05-30 to 2026-12-24 |
| Norwegian Cruise Line | 0 | 18 | 18 | 2026-05-31 to 2026-11-20 |
| Oceania Cruises | 0 | 12 | 12 | 2026-05-31 to 2026-10-31 |
| P&O Cruises | 2 | 106 | 108 | 2026-05-30 to 2026-12-29 |
| Princess Cruises | 1 | 23 | 24 | 2026-05-30 to 2026-11-05 |
| Red Funnel | 94 | 13256 | 13350 | 2026-05-30 to 2026-11-06 |
| Regent Seven Seas Cruises | 0 | 6 | 6 | 2026-06-16 to 2026-09-01 |
| Royal Caribbean International | 0 | 21 | 21 | 2026-05-31 to 2026-10-16 |
| Silversea Cruises | 0 | 4 | 4 | 2026-07-12 to 2026-10-13 |
| Stena Line | 4 | 960 | 964 | 2026-05-30 to 2027-01-31 |
| TUI Cruises | 0 | 8 | 8 | 2026-06-15 to 2026-11-03 |
| Wightlink | 95 | 18197 | 18292 | 2026-05-30 to 2026-12-20 |
| Airport | Status | Today | Future | Total | Date Range | Last Scrape | Last Result | Duration | Errors (24h) |
|---|---|---|---|---|---|---|---|---|---|
| ABZ | OK | 24 | 197 | 221 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:28 | 18 found, 0 new, 18 updated | 0.3s | 0/136 |
| ALC | OK | 287 | 8024 | 8311 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:24 | 494 found, 0 new, 263 updated | 1.8s | 0/136 |
| BFS | Issue | 0 | 1 | 1 | 2026-06-05 to 2026-06-05 | Never | — | — | 0/0 |
| BHX | Issue | 116 | 3462 | 3578 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:33 | 0 found, 0 new, 0 updated | 15.8s | 36/130 |
| BRS | OK | 172 | 2250 | 2422 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:29 | 129 found, 0 new, 129 updated | 17.5s | 0/136 |
| CWL | OK | 14 | 339 | 353 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:24 | 95 found, 0 new, 13 updated | 0.4s | 0/137 |
| DLM | Issue | 0 | 2 | 2 | 2026-05-31 to 2026-06-11 | Never | — | — | 0/0 |
| EDI | OK | 172 | 4803 | 4975 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:33 | 184 found, 0 new, 184 updated | 0.7s | 0/138 |
| EMA | OK | 53 | 2939 | 2992 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:31 | 4693 found, 0 new, 104 updated | 7.2s | 0/138 |
| FAO | Issue | 0 | 1 | 1 | 2026-06-07 to 2026-06-07 | Never | — | — | 0/0 |
| GLA | Issue | 95 | 737 | 832 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:31 | 76 found, 0 new, 76 updated | 15.0s | 8/137 |
| IBZ | Issue | 0 | 1 | 1 | 2026-08-02 to 2026-08-02 | Never | — | — | 0/0 |
| IST | Issue | 1 | 0 | 1 | 2026-05-30 to 2026-05-30 | Never | — | — | 0/0 |
| LBA | OK | 58 | 1764 | 1822 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:29 | 195 found, 15 new, 103 updated | 12.6s | 0/137 |
| LCY | Issue | 14 | 51 | 65 | 2026-05-30 to 2026-06-03 | 2026-05-30 16:29 | 0 found, 0 new, 0 updated | 0.8s | 31/108 |
| LGW | OK | 247 | 1074 | 1321 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:34 | 42 found, 5 new, 37 updated | 0.6s | 0/137 |
| LHR | OK | 652 | 4076 | 4728 | 2026-05-30 to 2026-06-05 | 2026-05-30 16:31 | 4692 found, 0 new, 1035 updated | 8.2s | 0/137 |
| LPL | OK | 60 | 2317 | 2377 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:23 | 54 found, 0 new, 54 updated | 0.4s | 0/136 |
| LTN | OK | 154 | 2287 | 2441 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:23 | 103 found, 0 new, 103 updated | 1.7s | 0/137 |
| MAN | OK | 299 | 14639 | 14938 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:24 | 11551 found, 0 new, 611 updated | 25.1s | 0/136 |
| NCE | Issue | 0 | 1 | 1 | 2026-06-16 to 2026-06-16 | Never | — | — | 0/0 |
| NCL | OK | 91 | 1213 | 1304 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:29 | 60 found, 0 new, 60 updated | 9.5s | 0/137 |
| SOU | Issue | 25 | 8 | 33 | 2026-05-30 to 2026-06-03 | 2026-05-30 16:31 | 17 found, 0 new, 17 updated | 0.2s | 1/136 |
| SPU | Issue | 1 | 0 | 1 | 2026-05-30 to 2026-05-30 | Never | — | — | 0/0 |
| STN | OK | 298 | 22555 | 22853 | 2026-05-30 to 2026-08-31 | 2026-05-30 16:24 | 10000 found, 0 new, 582 updated | 16.8s | 0/137 |
| Airline Code | Total Recorded | Future | Primary Source |
|---|---|---|---|
| RYR | 58097 | 53888 | Airport scraper + AeroDataBox |
| BA | 6141 | 2707 | British Airways API |
| EZY | 5912 | 2390 | easyJet schedule scraper |
| RUK | 5130 | 4759 | Airport scraper + AeroDataBox |
| EXS | 4938 | 3107 | Jet2 schedule scraper |
| TOM | 2291 | 1420 | Airport scraper + AeroDataBox |
| EIN | 1172 | 594 | Airport scraper + AeroDataBox |
| LOG | 868 | 421 | Airport scraper + AeroDataBox |
| EJU | 850 | 360 | Airport scraper + AeroDataBox |
| KLM | 816 | 433 | Airport scraper + AeroDataBox |
| VIR | 610 | 345 | Airport scraper + AeroDataBox |
| VY | 588 | 188 | Airport scraper + AeroDataBox |
| XQ | 450 | 292 | Airport scraper + AeroDataBox |
| SAS | 432 | 240 | Airport scraper + AeroDataBox |
| AA | 400 | 167 | Airport scraper + AeroDataBox |
| DLH | 365 | 176 | Airport scraper + AeroDataBox |
| EW | 365 | 181 | Airport scraper + AeroDataBox |
| THY | 354 | 228 | Airport scraper + AeroDataBox |
| AFR | 353 | 204 | Airport scraper + AeroDataBox |
| PGT | 350 | 269 | Airport scraper + AeroDataBox |
| LX | 344 | 183 | Airport scraper + AeroDataBox |
| W9 | 326 | 48 | Airport scraper + AeroDataBox |
| UA | 312 | 147 | Airport scraper + AeroDataBox |
| UAE | 308 | 186 | Airport scraper + AeroDataBox |
| QTR | 297 | 152 | Airport scraper + AeroDataBox |
| IBE | 253 | 91 | Airport scraper + AeroDataBox |
| WZZ | 210 | 33 | Airport scraper + AeroDataBox |
| W4 | 200 | 31 | Airport scraper + AeroDataBox |
| D8 | 199 | 45 | Airport scraper + AeroDataBox |
| GR | 183 | 67 | Airport scraper + AeroDataBox |
| System | Airports | Method | Max horizon | Why that limit |
|---|---|---|---|---|
| MAG GraphQL API | MAN (36d), STN (37d), EMA (90d) | GraphQL (allArrivals) | 36–90 days | Manchester Airport Group exposes a private GraphQL API that returns the full published schedule — up to 90 days for EMA, 36–37 days for MAN/STN. This is the richest airport data source in the system. Direct httpx (no browser needed) |
| Cardiff / Heathrow REST API | CWL (7d), LHR (7d) | REST API (JSON) | 7 days | Both airports expose a structured JSON REST API. Cardiff returns ~7 days; Heathrow returns 7 days via parallel date-range requests. The APIs are publicly accessible but undocumented. Direct httpx (no browser needed) |
| Leeds Bradford (Next.js) | LBA (3d) | Next.js RSC payload scrape | 3 days | LBA's site is a Next.js app that embeds flight data in server-side rendered page payloads. Scraping the RSC JSON gives ~3 days of data — more than the Hangar ADM airports but less than REST APIs. Direct httpx (no browser needed) |
| Edinburgh REST API | EDI (2d) | REST API (JSON) | 2 days | Edinburgh Airport exposes a direct JSON API for flight data, limited to approximately 48 hours of flights. The API is publicly accessible without authentication. Direct httpx (no browser needed) |
| Hangar ADM (direct httpx) | LPL (2d), SOU (2d), ABZ (2d) | Hangar ADM live flights API | 2 days | These airports use the Hangar ADM flight information system, which architecturally stores only ~48 hours of data. All date/range parameters are silently ignored by the backend — the 2-day limit is a hard system constraint, not a UI filter. Direct httpx (no browser needed — no Cloudflare) |
| Hangar ADM (Playwright — Cloudflare) | GLA (2d) | Hangar ADM via Playwright browser | 2 days | Same Hangar ADM system as LPL/SOU/ABZ with the same 48-hour data limit, but Glasgow Airport sits behind Cloudflare WAF which blocks direct httpx requests. A full headless Chromium session via Playwright is required to intercept the XHR response. Playwright (Cloudflare bypass required) |
| Luton HTML scrape | LTN (2d) | HTML page scrape | 2 days | London Luton's arrivals page renders flight data directly in HTML. The page only shows ~48 hours of flights and there is no accessible JSON API endpoint. Direct httpx (no browser needed) |
| Umbraco / Playwright (Cloudflare) | NCL (2d) | Umbraco CMS API via Playwright browser | 2 days | Newcastle uses an Umbraco CMS-backed flight API with a ~48-hour data window. Like Glasgow, it is protected by Cloudflare and requires Playwright to access. Playwright (Cloudflare bypass required) |
| Playwright HTML (Cloudflare) | BRS (2d), BHX (1d) | HTML scrape via Playwright browser | 1–2 days | Bristol and Birmingham render flight data dynamically in JavaScript-heavy pages protected by Cloudflare. Playwright loads the full page in a headless browser to extract the data. Both expose only 1–2 days. Playwright (Cloudflare bypass required) |
| Gatwick (Demandware API) | LGW (2d) | Demandware/Salesforce Commerce REST API | 2 days | Gatwick uses a Demandware (Salesforce Commerce Cloud) backend for its flight display. The API only returns same-day and next-day flights — a 1-day effective horizon. Direct httpx (no browser needed) |
| Source | Type | Airlines Covered | Schedule | Horizon | Cost |
|---|---|---|---|---|---|
| Ryanair schedule API | Airline timetable | FR, RK (Ryanair only) | Daily at 04:00 UTC | 3 months ahead | Free |
| AeroDataBox FlightByNumber RapidAPI — on-demand |
On-demand flight lookup 1 credit per search miss |
All airlines EZY, LS, TOM, BA, KL, EI, LM, etc. |
Triggered automatically when a flight search finds no DB record for a current or future date | Any future date | 1 credit/lookup 600/month free tier — 1h cooldown on misses |
| Wizz Air timetable API | Route discovery No auth required |
W6 (Wizz Air only) Route map + flight dates |
Daily at 04:30 UTC | Route coverage only | Free |
| Loganair VARS scraper | Schedule scrape Videcom VARS system |
LM (Loganair only) | Disabled | — | VARS schedule report decommissioned by Loganair |
| KLM / Air France Open Data | Official airline API developer.airfranceklm.com |
KL, AF + codeshares DL, KQ, etc. |
Daily at 05:30 UTC | 5 days ahead | Free |
|
British Airways API
No API key |
Official airline API developer.iairgroup.com |
BA, BAW + codeshares AA, IB, etc. |
Daily at 06:00 UTC | 5 days ahead | Free |
| AirLabs aggregator | Schedule aggregator airlabs.co |
All airlines EZY, LS, TOM, etc. |
Every 8h (3x daily) | ~10h lookahead | 1,000 req/month Free tier |
| FlightRadar24 | ADS-B position tracking | All (booked flights only) | Every 30 seconds Area 300km + global fallback |
Live positions + enrichment | Free |
| adsb.lol | ADS-B fallback tracking | All (booked flights only) | Every 30 seconds Area query fallback |
Live positions | Free |
| OpenSky Network | ADS-B legacy tracking | All (booked flights only) | Every 2-5 min (adaptive) Backup only |
Live positions + arrival | Free |
| Steam Packet timetable + live status | Maritime schedule + status | Douglas ↔ Heysham/Liverpool/Belfast | Incremental every 4h Full sync daily + PDF horizon sync |
Season timetable horizon | Free |
| Brittany Ferries | Maritime schedule API | Portsmouth ↔ Ouistreham | Every 4h + daily full sync | Configured maritime horizon | Free |
| Wightlink | Maritime schedule API/scrape | Portsmouth/Fishbourne, Portsmouth/Ryde, Lymington/Yarmouth | Every 4h + daily full sync | Configured maritime horizon | Free |
| Red Funnel Dolli API | Maritime schedule API | Southampton ↔ East Cowes/West Cowes | Every 4h + daily full sync | Configured maritime horizon | Free |
| Southampton Cruise Schedule | Cruise call schedule scrape | Southampton cruise terminals | Every 4h + daily full sync | Configured maritime horizon | Free |
| MyShipTracking / AISHub | Maritime live vessel positions | Booked sailings | Every 2 min status refresh + position updates | Live positions | Free tiers / no-signup fallback |
| Feature | Behaviour |
|---|---|
| Deduplication key | airport + flight_number + date — all sources share one record per flight |
| Status merge | Terminal states (landed, cancelled, diverted) protected from regression by schedule sources |
| Codeshare dedup | Cross-references codeshare numbers to prevent duplicate records for same physical flight |
| Origin preference | Keeps the richer (longer) origin name across sources |
| Time updates | Scheduled arrival always updated; estimated/actual only updated when non-null |
| Position Tracking (Booked Flights) | |
| Pipeline |
3-layer fallback: 1. FR24 area query (300km) with enrichment (aircraft type, registration, gate, terminal) 2. adsb.lol area fallback (300km) — unmatched flights 3. FR24 per-flight global lookup — catches long-distance arrivals |
| Polling interval | Every 30 seconds for active booked flights |
| Enrichment fields | Aircraft type, registration (tail number), departure gate, arrival terminal — from FlightRadar24. Applied on first match, persisted in DB. |
| Booking tracking | Bookings support JM3 reference-level storage for idempotent POST/DELETE calls. Active booking references are exposed via /api/flights/lookup and /api/flights/active-bookings. |
| Live map | /map shows all booked flights for a date with ring-only status colors, multi-booking count badges, booking-reference tooltips, and optional landed-flight filtering via hide_landed=1. |
| Tracking window | Active from -1h before scheduled arrival through +6h after (adjustable). Filtered by departure heuristic (estimated flight duration + 30 min) |
| Airport | Time | Error |
|---|---|---|
| BHX | 2026-05-30 16:33 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 16:23 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 16:11 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 15:48 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 15:27 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 15:15 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 14:52 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 14:40 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 14:29 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 13:55 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 13:34 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 13:22 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 13:11 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 13:01 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 12:50 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 12:06 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| BHX | 2026-05-30 11:55 | CaptchaEncounteredError: Cloudflare challenge detected on BHX arrivals page |
| LCY | 2026-05-30 11:54 | HTTPError: HTTP Error 403: |
| LCY | 2026-05-30 11:44 | HTTPError: HTTP Error 403: |
| LCY | 2026-05-30 11:34 | HTTPError: HTTP Error 403: |