Google Flights is the best flight search on the internet, and one of the few major Google products with no self-serve API attached to it. QPX Express, the public tier that used to do this, was withdrawn on 10 April 2018. The engine itself never went away — ITA's QPX Enterprise is still sold to airlines — but nothing replaced the tier a developer could just sign up for.
What's left is the page. It's worth more than people assume, because it carries something the airlines themselves don't publish.
Here is a real run, Bali to Singapore, departing 15 October 2026, pulled this month:
{
"type": "search",
"origin": "DPS",
"destination": "SIN",
"departureDate": "2026-10-15",
"tripType": "one_way",
"currency": "USD",
"flightsFound": 164,
"lowestPrice": 82,
"priceLevel": "typical",
"typicalPrice": 68,
"typicalPriceLow": 55,
"typicalPriceHigh": 110,
"priceHistory": [
{"date": "2026-07-05", "price": 54},
{"date": "2026-07-06", "price": 58},
{"date": "2026-07-07", "price": 58}
]
}
Look at priceLevel, typicalPrice and priceHistory. Google tracks what this route normally costs and tells you where today sits in that band. $82 against a typical $68, in a normal range of $55 to $110. It's "typical", not a deal.
No airline gives you that. No aggregator gives you that for free. It's the single most useful field on the page and it exists because Google has been recording every route's fares for years.
Why there's no API
The data isn't simply Google's to hand over. By QPX's own documentation the inputs are schedules from OAG, published fares from ATPCO, and availability supplied directly or indirectly by the carriers. Google can compute and display itineraries from those inputs. Reselling the underlying feeds is a different question with a different set of licensors.
The industry alternatives are expensive. Amadeus and Sabre sell developer access, with per-call pricing, contracts and certification. Duffel and Kiwi are friendlier but priced for booking flows, not research: they expect you to sell tickets, not analyse fares.
The page is a heavy client-side app. Google Flights renders results in the browser from an internal protocol buffer payload. There's no HTML table of flights to parse, which is why most naive attempts return an empty list and conclude the data isn't there.
Results are personalised and regional. Currency, available carriers and sometimes price depend on where the request comes from. A fare pulled from a US datacenter is not necessarily the fare a user in Jakarta sees, and if you're doing price comparison research that difference is your entire result.
What you get per flight
Each flight in the results is a full itinerary, not a price tag:
{
"type": "flight",
"price": 82,
"isBestFlight": true,
"airline": "Scoot",
"flightNumbers": ["TR289"],
"stops": 0,
"departAirport": "DPS",
"departAt": "2026-10-15T14:05",
"arriveAirport": "SIN",
"arriveAt": "2026-10-15T16:55",
"totalDurationMinutes": 170,
"duration": "2 hr 50 min",
"legs": [
{
"flightNumber": "TR289",
"airline": "Scoot",
"airlineCode": "TR",
"from": "DPS",
"fromName": "I Gusti Ngurah Rai International Airport",
"to": "SIN",
"toName": "Singapore Changi Airport",
"departAt": "2026-10-15T14:05",
"arriveAt": "2026-10-15T16:55",
"durationMinutes": 170
}
]
}
Multi-leg itineraries come back with every leg, its operating carrier, and the layover between them — which matters, because a $40 saving that costs a nine-hour layover in Kuala Lumpur isn't a saving.
isBestFlight is Google's own flag combining price, duration and stops. Useful as a shortcut, and useful to ignore deliberately when you're studying what a route actually costs rather than what Google recommends.
What it's genuinely good for
Price monitoring on routes you care about. Run the same route daily, keep the results, and priceLevel plus your own history tells you when to buy. This is the use case that pays for itself in one trip.
Route research. Which carriers fly a city pair, how often, at what times. For anyone planning capacity, a travel business, or a relocation, that's a survey nobody publishes in one place.
Fare benchmarking for travel agencies. Comparing your GDS fare against the public best price on the same route, daily, tells you where your inventory is uncompetitive.
Seasonality studies. Run a route across a range of departure dates and the shape of the year appears — the shoulder seasons, the holiday spikes, the exact week a route gets expensive.
Visa and immigration paperwork. Several consulates want proof of onward travel. Knowing the real price band of the cheapest exit flight, for the right date, is the difference between a $60 ticket and a $300 one.
Running it
Google Flights Scraper takes IATA codes and dates:
{
"origin": "DPS",
"destination": "SIN",
"departureDate": "2026-10-15",
"adults": 1
}
Round trips take returnDate. Several routes in one run go in routes. Open-jaw and multi-city itineraries go in multiCityLegs. Cabin class, passenger mix and currency are all inputs.
From the API:
curl -X POST "https://api.apify.com/v2/acts/lergassy~google-flights-scraper/runs" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" \
-d '{"origin":"DPS","destination":"SIN","departureDate":"2026-10-15","adults":1}'
Output is one search row per query — with the price band, the history and the totals — followed by one flight row per itinerary. The search row alone answers "is this cheap right now", which for monitoring is the only row you need to keep.
What you don't get
No booking. This is research data. Booking requires an airline or an OTA, and the fare you saw may be gone by the time you get there, which is normal for airline pricing rather than a defect in the data.
No seat availability or fare rules. Change fees, baggage allowance and refundability aren't on the results page. They live in the fare rules, which are a GDS product.
Prices are indicative. Google shows fares from its partners, and the same flight can be cheaper direct or on a regional OTA. Treat the number as a benchmark, not a quote.
Personalisation is real. If you need the fare a specific market sees, the request has to originate in that market. Comparing "the DPS–SIN price" across regions requires deciding which region you mean.
The honest build-versus-buy note
Parsing Google Flights is not a weekend project. The payload is a nested protocol buffer with no field names, positional rather than keyed, and the positions move when Google ships a change. Every published parser is a set of magic array indices that somebody re-derived by hand after the last break.
If flight data is your core product, you'll end up owning that maintenance regardless. If it's one input among many, someone else's parser is the right answer — this one is currently free to run, with only Apify's platform usage to pay — and the two hours you'd spend on the first version are better spent on what you do with the numbers.
Actor: apify.com/lergassy/google-flights-scraper
Related: Agoda Reviews Scraper and Trip.com Scraper for the hotel half of the same trip.
Top comments (0)