Google Search Flights Scraper - turning a route search into structured rows
Google Flights is where a very large share of air travel research begins. It compares one origin against one destination across carriers and dates, and presents the result as a list of itineraries: who flies it, when, how long it takes, how many times it stops and what it costs. That interface is built for choosing a flight. It is not built for any question about a route over time - whether a fare is climbing, how much the direct service commands over the one-stop, which carriers actually compete on a city pair. This service answers those by turning a route search into a table: one row per itinerary, eleven columns, exported as CSV, JSON or Excel.
Driving it is deliberately simple. The published reference takes each query as a pair of airport codes - origin first, destination second - with the outbound and inbound dates supplied separately as UNIX timestamps. Leave the return date out and the search is one-way; the reference states plainly that only the departure date is used in that case, and departure itself defaults to the current date. Language and region parameters are available on top, and setting them matters more here than on most services, because of what they do to the prices.
The central thing to understand about this data is that a fare is a moment rather than a fact. Google's own material is unusually direct about this: fares, taxes, fees and even which flights are available for sale can vary by city under airline business rules; the location you search from affects the results including which booking partners are shown; and the currency displayed is not guaranteed to be the currency you are eventually charged in. Prices also move with the travel date and with the date you happen to search on. None of that makes the export unreliable - it makes it a time series. Record the capture time alongside every row, hold the search locale constant across runs you intend to compare, and a single ambiguous price becomes a trend you can act on. One further trap worth naming: departure_time is local to the origin airport and arrival_time is local to the destination, so subtracting one from the other gives a wrong answer on any route crossing a time zone. The duration column already accounts for the offset and for connection time; use it.
One honest note about the evidence behind this page. Everything above is either the export's declared schema - the eleven column names, identical in the header of all six of our local runs - or a documented property of the request, or a published statement by Google about its own product. There are no scrape results here, because we have none: every one of those six runs returned an empty array. The reason is recorded internally and is worth repeating, because it is also the most likely thing to happen to you: the service needs a residential proxy, and a request that trips Google's defences comes back as a page with no flights on it rather than as an error. So this page quotes no fare, no airline, no duration and no itinerary count, and none will be added unless a real export backs them. What it does describe - what each column is for, and how Google Flights behaves - is accurate. Start free: your first 500 rows cost nothing and need no credit card.