Google Search Flights Scraper

A route search,
as rows.

Google Flights compares one origin and one destination across airlines and shows you the itineraries. This service turns that comparison into a table - one row per itinerary, carrying the airline, the departure and arrival times, the journey length, the number of stops and the fare shown.

one-time 500 free rows$0.002 per row aftereleven columns per itineraryCSV · JSON · Excel
Read this first

A fare is a moment,
not a fact.

Flight pricing moves faster than almost anything else you can scrape, and Google is explicit about how much of it is conditional.

Google's own help material says that fares, taxes, fees and even which flights are available to buy can vary by city because of airline business rules, and that the currency shown to you may not be the currency you are eventually charged in. It also notes that the location you search from affects the results, including which booking partners appear. So a price in this export is what Google displayed, for that route, on that date, to a viewer in a particular place - not a universal price for the seat.

The same is true across time rather than space. Prices change with the day of the week you are searching for and with the day you happen to search on. An export captured this morning and one captured tonight are both correct and are not the same measurement. Anything you build on this data should record the moment of capture as carefully as it records the fare.

None of that makes the data less useful - it makes it a time series rather than a lookup. A single pull tells you what a route costs right now. The same pull repeated on a schedule tells you how a route behaves, which is the question most people are actually asking.

livescraper.app · what shapes a run
Origin and destination as airport codes
Departure date, and a return date for round trips
Fares and availability vary by city
Displayed currency may differ from the charged one
Record when you ran it - a fare is a timestamp!
One pull is a price. Repeated pulls are a trend.
How it works

Two airport codes in,
itineraries out.

There is no URL to copy. You give it a route and a date.

  1. STEP 1Pick your route: the origin and destination airport codes.
  2. STEP 2Sign in to Livescraper and open the Google Search Flights Scraper.
  3. STEP 3Submit the pair as a query, with your departure_date.
  4. STEP 4Add a return_date for a round trip, or leave it out for one-way.
  5. STEP 5Pick your format and click Get Data.

Both dates are UNIX timestamps in the published reference. Departure defaults to the current date if you omit it.

What you get back

Eleven columns,
one itinerary each.

These are the columns this scraper's export declares, in the order the header lists them. Each description explains what the column is for and what Google Flights shows in that position on a results page.

origin
The departure airport for the itinerary, as the code you searched on.
destination
The arrival airport. Together with origin this is the route the row belongs to, which matters once a file holds more than one search.
airline
The carrier shown against the itinerary. On a connecting journey Google may name more than one, and a flight sold by one airline is frequently operated by another - so read this as the marketing carrier rather than as who owns the aircraft.
departure_time
The local time the flight leaves. Local to the origin airport, which is the trap on any route that crosses time zones.
arrival_time
The local time it lands - local to the destination. Subtracting one of these from the other does not give you the journey length, which is why the next column exists.
duration
How long the journey takes door to door, as Google states it. Use this rather than deriving it from the two times: it already accounts for the time-zone difference and for time spent connecting.
stops
How many times the itinerary touches down between origin and destination. Zero is a direct flight; the number is what separates a fast expensive option from a slow cheap one, and it is the column that makes a price comparison fair.
price
The fare Google displayed for that itinerary. Read the note above about what a fare is: it varies by search location and by when you searched, and the currency shown is not guaranteed to be the currency charged.
departure_date
The outbound date the search was for, echoed back so a file covering several dates stays separable.
return_date
The inbound date, when the search was a round trip. Empty for a one-way search, which is what you get by omitting it from the request.
query
The route pair you submitted, repeated on every row of that search. Note it comes last in this export rather than first, unlike most of our services - worth knowing if you are writing a generic column-order importer.

Two columns are about the search, not the flight. departure_date, return_date and query echo what you asked for, which is what lets one file hold many routes and dates at once - keep them, and key on them when you compare runs. And do not compute journey length from the two clock times: departure_time is local to the origin and arrival_time is local to the destination, so the arithmetic is wrong on every route that crosses a time zone. duration is the column that already knows this.

Before you build

Four things about
flight data to plan for.

None of these are quirks of the scraper. They are properties of how air fares work, and they decide what the export can honestly support.

The timestamp is part of the price

A fare is only true at the instant it was shown. Google's own guidance is that prices move with the travel date and with airline rules, and that availability itself changes. Store the capture time beside every row and treat the pair as the observation. A price table without run times is a table of numbers you can no longer interpret.

Where you search from changes what you see

Google states that fares, taxes, fees and the flights available for sale can differ by city, that the location you pick affects which booking partners appear, and that the displayed currency may not be the one you are charged in. For a price comparison to mean anything, hold the search locale constant across the runs you intend to compare - and write down which locale that was, because no column records it.

Use duration, never the clock arithmetic

departure_time is local to the origin and arrival_time is local to the destination. Subtract one from the other on a transatlantic route and you will get an answer that is wrong by hours - sometimes negative. duration is the column that already accounts for the offset and for connection time, and stops is what explains why two itineraries on the same route differ by half a day.

This route is defended, and runs can come back empty

Flight search is one of the most aggressively protected surfaces on the web, and this service is recorded internally as needing a residential proxy - a request that trips the defences gets a page with no flights on it rather than an error. Treat an empty result as a retry condition rather than as "no flights on this route", and schedule accordingly. This is not hypothetical for us: see the closing note about our own runs.

Common workflows

Three jobs people
run this for.

Where a route comparison is more useful as a table than as a results page.

Fare monitoring

Watch a route instead of refreshing it

The question is rarely "what does this flight cost" and almost always "is this a good time to buy". Run the same route and date on a schedule, keep every row with its capture time, and you have the price history that a single search can never give you - including how far ahead the fare starts climbing.

Travel · Consumer
Travel management

Check what your policy actually costs

Corporate travel rules are written in the abstract - cheapest fare, no more than one stop, arrive before nine. Pull the routes your people actually fly and you can test those rules against real itineraries: how often the direct flight is worth the premium, and how much a preferred-carrier policy costs you per trip.

Finance · Travel ops
Market research

Map who flies a route, and how

Across a set of routes, airline, stops and duration describe the competitive shape of a market - who offers the only direct service, where a connection is the norm, which carriers price against each other. That is route-level intelligence you would otherwise buy from an aviation data vendor.

Aviation · Strategy
Pricing

Pay for the rows
you actually pull.

No subscription, no minimum, no per-seat licence. Your first 500 rows are on us - after that it is pay-as-you-go.

Free tier

500 free rows - $0

For every new account, one time. No credit card. All scrapers unlocked. A single route on a single date is a modest number of itineraries, so the free tier covers a genuine first experiment rather than a token one.

$0 forever
Pay-as-you-go

$0.002 per row, after the free tier

Roughly $2 per 1,000 itineraries. Because the value here comes from repetition rather than breadth, the sensible way to spend is a narrow set of routes sampled often - the same route every day for a month costs very little and answers a question a one-off search cannot.

Most popular
Enterprise

Custom · scheduled monitoring

Volume pricing, SLAs, dedicated workers and tailored onboarding for teams tracking many routes and departure dates on a repeating schedule. Tell us your numbers and we will quote.

Talk to us
10% off your first paid run.Use code LIVESCRAPER10 at checkout.
Sign up
Pairs well with

A flight is one leg
of the trip.

The rest of a journey is a place to stay and a reason to go. These two cover the ground either side of the airport.

The legal bit

Is it legal to collect
flight prices?

Short answer: yes. A published fare is an advertisement, shown to every traveller who searches the route.

Google Flights results are public. Anyone can search a route without an account, and collecting publicly visible pricing for research and comparison is long-settled practice. As long as the data is publicly available and the process does not disrupt the service, there are no federal laws against it.

The subject matter is uncontroversial. Every one of these eleven columns describes an itinerary - a route, a carrier, a time, a duration, a fare. There is no personal data anywhere in the export: no passenger, no booking, no traveller. Nothing in the file identifies a person, and no booking is made on your behalf.

Google's terms restrict automated access, so this remains a question of terms. We touch nothing behind a login, book nothing, run no third-party trackers on the data layer, and your exports self-delete after 30 days.

livescraper.app · principles
Public search results only
Itineraries, never travellers
No bookings made, nobody contacted
GDPR-aligned by default
Exports self-delete (30 days)
A published fare is an advertisement.
Frequently asked

What people ask
before signing up.

The questions we hear most. Something else? Talk to us - humans write the answers, not bots.

What columns will the export contain?+
Eleven, in this order: origin, destination, airline, departure_time, arrival_time, duration, stops, price, departure_date, return_date and query. One row per itinerary. Note that query comes last here rather than first, which is unusual across our services.
What do I submit?+
A route. The published reference takes each query as a pair - the first item is the origin airport code and the second is the destination. Dates are separate parameters: departure_date and return_date, both as UNIX timestamps. Departure defaults to the current date if you leave it out.
How do I search a one-way flight?+
Omit return_date. The reference is explicit that if it is not supplied, only departure_date is used. The column still appears in the export; it is simply empty on those rows.
Why is the price different from what I see?+
Because a fare depends on where and when you look. Google states that fares, taxes, fees and even which flights are available for sale can vary by city under airline business rules, that the location you search from affects which booking partners appear, and that the currency displayed may not be the currency you are charged in. Hold the locale constant across runs you intend to compare.
Can I work out the flight length from the two times?+
No - and this is the most common mistake with flight data. departure_time is local to the origin airport and arrival_time is local to the destination, so subtracting them is wrong on any route that crosses a time zone, sometimes spectacularly. Use duration, which already accounts for the offset and for connection time.
Does it cover connecting flights?+
Yes - stops is how many times the itinerary touches down between origin and destination, with zero meaning direct. On a connecting journey the airline field may name more than one carrier, and the marketing airline is often not the one operating the aircraft.
Why might a run come back with nothing?+
Flight search is heavily defended against automation, and this service is recorded internally as needing a residential proxy. A blocked request typically returns a page with no flights on it rather than a clean error, so an empty result should be retried rather than read as "this route has no flights". Our own local runs all came back empty for exactly this reason - see the note at the foot of this page.
What does it cost?+
The first 500 rows on a new account are free and one-time; after that it is $0.002 per row - about $2 per 1,000 itineraries - pay-as-you-go with no subscription. Credits do not expire and there is no monthly reset.

Turn a route search
into a spreadsheet.

Give it two airport codes and a date, and take the itineraries away as rows - airline, times, duration, stops and the fare shown. Your first 500 rows are free.

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.