# Flight Finder Source Viability This note records bounded live checks for the first implementation pass. It is intentionally operational, not aspirational: if a source is blocked here, the skill must treat it as blocked unless later evidence replaces this note. ## Required sources - KAYAK - Skyscanner - Expedia - airline direct-booking cross-check ## Status Checked on `2026-03-30` from Stefano's MacBook Air, with no VPN active, using the existing local `web-automation` / CloakBrowser probe scripts. Route used for bounded checks: - `DFW -> BLQ` - outbound date: `2026-05-30` - travelers: `3 adults` ### KAYAK - Status: `viable` - Probe: `node flight_kayak_sweep.mjs DFW BLQ 3 /tmp/flight-finder-kayak-dates.json ...` - Evidence: - title returned as `DFW to BLQ, 5/30` - results included multiple one-stop itineraries with parsed USD fares such as `$877`, `$949`, `$955` - direct-booking hints were visible for British Airways on at least some results - Implementation note: - KAYAK can be a primary source in this first implementation pass - parsed text is workable, but still brittle enough that bounded retries and status fallback remain necessary ### Skyscanner - Status: `viable` - Probe: `node tmp_skyscanner_probe.mjs 'https://www.skyscanner.com/transport/flights/dfw/blq/260530/?adultsv2=3&cabinclass=economy&rtn=0'` - Evidence: - title returned as `Cheap flights from Dallas to Bologna on Skyscanner` - results page exposed concrete prices, total trip prices, stops, and itinerary text - one-stop and multi-stop options were visible in the captured text - Implementation note: - Skyscanner is viable for bounded result capture in this first pass - itinerary extraction should still be treated as text-scrape, not a stable API ### Expedia - Status: `viable` - Probe: `node tmp_expedia_probe.mjs 'https://www.expedia.com/Flights-Search?...'` - Evidence: - title returned as `DFW to BLQ flights` - results page exposed current lowest price, airline/stops filters, and concrete per-traveler options such as `$877`, `$949`, `$961` - Expedia text already surfaced some itinerary summaries in a report-friendly format - Implementation note: - Expedia is viable for bounded result capture in this first pass - as with the other aggregators, source-specific timeouts and fallback rules are still required ### Airline direct-booking cross-check - Status: `degraded` - Probe: `node tmp_skyscanner_probe.mjs 'https://www.united.com/en/us/fsr/choose-flights?...'` - Evidence: - United's booking shell loaded and recognized the route / date context - the search then returned `united.com was unable to complete your request. Please try again later.` - Implementation note: - direct-airline cross-checking remains in scope, but it should be treated as best-effort in the first pass - when a direct site fails or refuses completion, the skill should record the failure explicitly instead of hanging or pretending a clean cross-check happened ## Scope decision for implementation pass 1 - Primary bounded search sources: `KAYAK`, `Skyscanner`, `Expedia` - Direct-airline cross-check: `best-effort / degraded` - The skill should continue if the direct-airline step fails, but the report must say that the direct cross-check was not fully completed