Google Flights Scraper: Failed Runs Cost Nothing avatar

Google Flights Scraper: Failed Runs Cost Nothing

Pricing

from $0.70 / 1,000 itinerary delivereds

Go to Apify Store
Google Flights Scraper: Failed Runs Cost Nothing

Google Flights Scraper: Failed Runs Cost Nothing

Scrape live Google Flights fares for any route and date: price, airline, times, stops and layovers. A run that fails or finds nothing costs nothing. A free dry run shows the price first, and the run stops at a spend cap you set.

Pricing

from $0.70 / 1,000 itinerary delivereds

Rating

0.0

(0)

Developer

Monty Burrows

Monty Burrows

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Google Flights Scraper

Scrape live Google Flights fares as clean JSON, CSV or Excel. Each row has the price, airline, departure and arrival times, stop count, total duration and every layover.

Give it a list of origins, destinations and dates. Every combination is searched, so one run can build a whole fare calendar, such as LHR to JFK every day in September in business class.

One way, round trip and multi-city. Adults, children and infants. Alliance and stop filters. Over a hundred currencies.

Quick start

Press Start. The form is already filled in with a real search, LHR to JFK thirty days out, so the first run works without you typing anything. It returns roughly 25 to 30 itineraries in about ten seconds and costs around $0.03.

Then change three fields to your own search:

FieldExample
FromLHR, or several codes to compare departure points
ToJFK, or several
Departure dates+30, or 2026-11-10

To see the cost before you spend anything, tick Dry run. It reports how many results you would get and what they would cost, and it never charges you.

A finished dry run in the Apify Console: its status line reads "Dry run: about 33 results for roughly $0.0330. Nothing was charged."

The status line is the estimate. A dry run writes no rows, so the results table stays empty, and the small figure beside the status is Apify's platform usage, which the developer pays under pay-per-event pricing, not you.

Dates that do not go stale

Every date field takes a calendar date such as 2026-11-10, or a number of days from today such as +30.

Use the relative form on a schedule. A daily run pinned to a calendar date returns fares until that date arrives and then returns nothing, with no error to tell you why. +30 still means thirty days out a year later, so a scheduled run needs no maintenance.

// A rolling fare tracker: the next five departure days, re-checked every day.
{ "origins": ["LHR"], "destinations": ["JFK"], "departureDates": ["+1", "+2", "+3", "+4", "+5"] }

What you get

One row per itinerary.

A finished run's results in the Apify Console, in table view, with the Overview, Schedule, What was searched, Connections and All fields views

FieldDescription
priceLowest total fare for the whole party, in your chosen currency
currencyISO code, such as USD, GBP or EUR
tripTypeone-way, round-trip or multi-city
priceBasisHow to read price: one-way, whole-trip or per-leg
legIndex / legCountWhich leg this row prices, out of how many
airline / airlinesMarketing airline, and every airline on the itinerary
operatedByThe carrier actually flying it, when it differs from the one selling
stops0 for nonstop
departureAirport / departureTimeAirport name and local 24-hour time
departureDate / arrivalDateFull ISO dates, so an overnight arrival is unambiguous
arrivalAirport / arrivalTimeAirport name and local 24-hour time
durationMinutesTotal journey time
overnighttrue when it lands on a later day than it left
layovers[]Each connection's airport, city and wait in minutes
tripLegs[]Every leg that was priced, so a round-trip row explains itself
returnDateThe return that was searched, or null on a one-way
searchUrlThe exact Google Flights search. Paste it into a browser and check
origin / destination / searchDateWhat was searched, so rows from a multi-route run stay self-describing
adults / children / infantsInSeat / infantsOnLapThe party this fare was quoted for

Example output

These are real rows, not a mock-up. LHR to JFK and LHR to BOS, round trip, economy, out on 10 November and back on 17 November 2026, scraped on 22 September 2026. The run returned 36 itineraries across 9 airlines, 28 of them nonstop, priced from $479 to $673, in 13 seconds.

The cheapest itinerary for each airline and route from that run, with price, stops, times, duration and connection

PriceRouteAirlineStopsDepartsArrivesDuration
$479LHR to BOSIcelandair1 stop12:1517:5034h 35m
$494LHR to JFKSWISS1 stop06:0013:1512h 15m
$498LHR to JFKAustrian1 stop06:0014:1513h 15m
$537LHR to JFKJetBlueNonstop07:2510:328h 07m
$537LHR to JFKBritish AirwaysNonstop08:2011:208h 00m
$537LHR to JFKVirgin AtlanticNonstop09:0512:258h 20m

One row in full, exactly as it is written to your dataset, with nothing trimmed:

{
"searchUrl": "https://www.google.com/travel/flights/search?tfs=CBwQAhoeEgoyMDI2LTExLTEwagcIARIDTEhScgcIARIDSkZLGh4SCjIwMjYtMTEtMTdqBwgBEgNKRktyBwgBEgNMSFJAAUgBcAGCAQsI____________AZgBAQ&hl=en&gl=US&curr=USD",
"tripType": "round-trip",
"origin": "LHR",
"destination": "JFK",
"searchDate": "2026-11-10",
"returnDate": "2026-11-17",
"tripLegs": [
{ "origin": "LHR", "destination": "JFK", "date": "2026-11-10" },
{ "origin": "JFK", "destination": "LHR", "date": "2026-11-17" }
],
"legIndex": 1,
"legCount": 1,
"priceBasis": "whole-trip",
"cabinClass": "economy",
"adults": 1,
"children": 0,
"infantsInSeat": 0,
"infantsOnLap": 0,
"price": 494,
"currency": "USD",
"airline": "SWISS",
"airlines": ["SWISS"],
"operatedBy": null,
"stops": 1,
"departureAirport": "Heathrow Airport",
"departureTime": "06:00",
"departureDate": "2026-11-10",
"arrivalAirport": "John F. Kennedy International Airport",
"arrivalTime": "13:15",
"arrivalDate": "2026-11-10",
"durationMinutes": 735,
"overnight": false,
"layovers": [{ "airport": "Zurich Airport", "city": "Zürich", "durationMinutes": 75 }],
"id": "round-trip|1|LHR|JFK|2026-11-10|2026-11-17|economy|1|0|0|0|2026-11-10|06:00|2026-11-10|13:15|1|SWISS",
"actorName": "google-flights",
"scrapedAt": "2026-09-22T15:20:45.248Z"
}

Paste a row's searchUrl into a browser and you land on the search it came from. That is how you check any fare here against the source.

Input

SettingWhat it does
Trip typeOne way, round trip or multi-city.
From / ToPick from 1,149 major airports and 22 whole cities, or type any IATA code.
Departure datesYYYY-MM-DD, or +30 for days from today. Add a range to find the cheapest day.
Return datesRound trip only, same formats. Every departure is paired with every return.
Trip length in nightsEasier than listing returns: enter 7 and 14 to price both from every departure.
Multi-city legsMulti-city only. One row per leg, each with a from, a to and a date.
PassengersAdults, children aged 2 to 11, infants in seat, infants on lap. Up to 9 seated.
CabinEconomy, premium economy, business or first.
Maximum stopsAny, nonstop only, 1 stop or fewer, 2 stops or fewer. Applied by Google itself.
CurrencyOver a hundred, each verified end to end against the live page.
Dry runEstimates the result count and cost, then stops. Costs nothing.
Maximum resultsHard cap on rows. The run stops the moment it is reached.
Maximum spend (USD)Hard cap on cost. The run stops before exceeding it.

A city in From or To, such as London, New York, Paris, Tokyo and eighteen more, searches every airport in it at once. LON to NYC returns Heathrow, Gatwick and Stansted to JFK, Newark and LaGuardia in one run, which is usually the search you actually want. Any code not in the list can still be typed.

There is no limit on how many origins, destinations or dates you provide. Cost is bounded by Maximum results and Maximum spend, and Dry run tells you the real number for free before you commit.

A single route on a single date returns roughly 25 to 30 itineraries, which is a useful number to size Maximum results against.

How prices are quoted

Every row carries a priceBasis field, so you never have to work out what a price covers by checking which trip type produced it.

Trip typepriceBasisWhat price means
One wayone-wayThat flight
Round tripwhole-tripThe entire return journey, all passengers
Multi-cityper-legThat leg alone, priced as a one-way

On a round trip, Google prices each outbound option at the whole-trip total, because you pick an outbound before it will show you returns. A round-trip row therefore describes the outbound flight and prices the whole journey.

On multi-city, each leg is searched and priced separately, so you get every option for every leg. That is more than Google's own multi-city view gives you, which lists first-leg choices only. A three-city trip returned 44 bookable itineraries in testing where Google's multi-city page showed 26 first-leg options.

The caveat, and the reason priceBasis exists: the sum of the legs is not a single multi-city ticket, and a combined fare is often cheaper. If you need one ticket, use these prices to find the right flights and then price that itinerary directly. Adding three one-ways together and calling it a multi-city fare would be the wrong number.

Accuracy

Fares are read from the itinerary descriptions Google writes into the page for screen-reader users. Those are sentences with named fields rather than an internal feed of unlabelled positional arrays.

That is the difference that matters. If a positional feed shifts by one element, every row still parses, the row count does not change, and the price column starts reporting a number that is not the price. A reworded sentence cannot fail that way. The parse rate collapses, this Actor's health checks fail, the run stops, and you are charged nothing.

Currency is read the same way. The Actor takes the currency from the page rather than trusting the one it asked for, because Google does not reject a currency it cannot serve. It prices in a different one instead. When that happens the run stops and names the currency it got, rather than billing you for prices in the wrong money.

Checked against the leading alternative in this category, this Actor found a real mispricing in it: two Zurich-connecting SWISS itineraries an hour apart, with the overnight departure's cheaper fare attached to the morning flight. That is the failure described above, in production. This Actor also returns layover airports and durations, operating carriers, and correct next-day arrival dates, which that Actor does not.

Limitations

Multi-city is priced leg by leg, not as one ticket. This is deliberate. Google's own multi-city cannot be read reliably without a browser. Asked one way it returns an empty page. Asked another it returns a healthy-looking page that has priced a plain round trip instead, at prices identical to the pound, for a search that never happened. Each leg is therefore searched on its own. If another scraper offers combined multi-city fares at HTTP speed, compare one of its open-jaw prices against the equivalent round trip before trusting it.

Nine seated passengers is the maximum. Above that Google returns one-passenger fares without saying so, so the search is refused rather than answered wrongly.

A route with no flights fails the run instead of returning an empty dataset. The page this Actor reads never says "no flights". A route with no service renders the same endless loading shell as a rate-limited request, so an empty answer cannot be told apart from a blocked one. Reporting "no flights exist" on evidence that might mean "we were throttled" would be a guess, so the run fails, says which it cannot rule out, and charges you nothing. If you think the route should have flights, run it again.

No flight numbers. Google does not put them in the data this Actor reads.

English only. Results are requested in English so the fields can be read reliably.

Pricing

Pay per result, and nothing else. No per-run fee, no charge for compute, no charge for retries.

PlanPer 1,000 results
Free$1.00
Bronze$0.90
Silver$0.80
Gold$0.70
Platinum$0.70
Diamond$0.70

You pay only for results you actually receive. If the run fails, returns nothing, or Google changes the page and the health checks catch it, you are charged nothing. Duplicate itineraries are removed before billing, so the same flight is never sold to you twice.

Tick Dry run first to see the cost before you spend anything.

A real dry run's estimate: 50 itineraries for $0.05 against caps of 60 results and $0.10, with $0.00 charged, beside the three billing rules

How a run becomes a bill: your search is fetched, parsed and held in a ledger, every row is checked, and only a run that passes is charged

Support and feature requests

Email actors@montyburrows.com if you find a bug, need an extra field, or want a filter that is not here yet. Feature requests are welcome and usually quick.