Google Flights Scraper avatar

Google Flights Scraper

Under maintenance

Pricing

from $3.99 / 1,000 results

Go to Apify Store
Google Flights Scraper

Google Flights Scraper

Under maintenance

✈️ Google Flights Scraper extracts real-time flight data with price, availability, routes & schedules. ⚡️ Automate travel research, monitor fares & compare options fast great for businesses and developers.

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

ScraperForge

ScraperForge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Google Flights Scraper — Fares, Routes, Airlines & Schedules from Google Flights

Search Google Flights programmatically and export every result as structured data: price and currency, airline, departure and arrival airports with times, total duration, stop count, cabin class and trip type.

One-way, round-trip and multi-city searches, flexible dates, 29 languages and 39 country markets, plus filters for stops, alliances, specific airlines, cabin class and a maximum budget.


What is Google Flights Scraper?

Google Flights aggregates fares from hundreds of airlines and OTAs, and it is the price reference most travellers actually check. It has no public API — the interface is designed for humans, and prices change constantly.

This Actor drives that search programmatically. You describe the trip the same way you would in the UI — airports, dates, passengers, cabin, filters — and it returns the result cards as rows you can compare, store and monitor over time.

Because Google Flights blocks datacenter traffic, the Actor is configured for residential proxies by default, and that setting matters more here than in most scrapers.


What data can you extract?

GroupFields
💰 Priceprice, currency, is_best (Google's "best" flag)
✈️ Routedeparture_airport, arrival_airport, type (one-way / round-trip / multi-city)
🏢 Carrierairline
⏱️ Timingduration_minutes, plus per-leg departure and arrival times
🧾 Full detailraw_flight_data — the complete result card, including every leg with airports, times, flight number, travel class, stop labels and total duration

Why teams scrape Google Flights

For travel agencies and OTAs

Comparing your own fares against Google's aggregated view tells you instantly where you are uncompetitive on a route. Because you can run many routes in one job, that becomes a daily competitiveness report rather than a manual spot-check.

For fare monitoring and price alerts

Fares move constantly. A scheduled run on a fixed route builds a price history, which is the only way to know whether today's fare is genuinely good or merely normal.

For corporate travel and finance teams

Policy compliance needs a reference price. Scraping the market rate for common corporate routes gives you a defensible benchmark for expense rules and supplier negotiations.

For travel content and comparison sites

Route pricing, airline mix and duration data feed "cheapest month to fly to X" style content, which is durable, high-intent SEO material.

For data and research teams

Airline competition, route pricing and schedule density are hard datasets to obtain otherwise — most airline APIs are commercial and restricted to partners.


How to scrape Google Flights step by step

  1. Open the Actor and enter a Departure Airport and Destination Airport as IATA codes (LAX, JFK). Multiple destinations are supported, comma-separated.
  2. Set a Departure Date, and a Return Date for round-trips (leave empty for one-way).
  3. Set passengers, Cabin Class and any filters — stops, alliances, airlines, budget.
  4. Set Max Results and Scroll Depth (how many "More flights" expansions to click).
  5. Keep Residential proxy ON — see the reliability notes below.
  6. Click Start, then export the Output tab as JSON or CSV.

⬇️ Input

Example input — one-way

{
"departureIATA": "LAX",
"arrivalIATA": "JFK",
"departureDate": "2026-09-14",
"adults": 1,
"seatclass": "1",
"currency": "USD",
"maximum": 20
}

Example input — round-trip with filters

{
"departureIATA": "LHR",
"arrivalIATA": "JFK",
"departureDate": "2026-10-03",
"arrivalDate": "2026-10-10",
"adults": 2,
"seatclass": "3",
"stops": "0",
"airlines": "BA,AA",
"maxPrice": 2500,
"currency": "GBP",
"gl": "uk",
"maximum": 50
}

Example input — multi-city

{
"multi_city_json": "[{\"departure_id\":\"LHR\",\"arrival_id\":\"CDG\",\"date\":\"2026-09-14\"},{\"departure_id\":\"CDG\",\"arrival_id\":\"FCO\",\"date\":\"2026-09-18\"}]",
"adults": 1,
"maximum": 30
}

Input reference

Route and dates

FieldTypeDefaultDescription
departureIATAstringLAX3-letter IATA code(s) for departure. Multiple codes supported.
arrivalIATAstringJFKDestination IATA codes, comma-separated for bulk input. london expands to LHR, LGW, STN, LTN, LCY.
departureDatestringOutbound date.
arrivalDatestringReturn date. Leave empty for a one-way search.
departureDateRngstringFlex days on departure (e.g. +1, -1).
arrivalDateRngstringFlex days on return.
multi_city_jsonstringJSON string for multi-city trips: [{"departure_id":"…","arrival_id":"…","date":"…"}]. When supplied, the single-route fields are not required.

Passengers and cabin

FieldTypeDefaultDescription
adultsinteger1Adult passengers (12+).
childreninteger0Children (2–12).
infantsinteger0Infants under 2, on lap.
seatclassstring1Cabin class: 1 Economy, 2 Premium Economy, 3 Business, 4 First.

Filters

FieldTypeDefaultDescription
stopsstring0Maximum layovers: 0, 1 or 2.
alliancesstringALLSTAR, SKYTEAM or ONEWORLD.
airlinesstringALLComma-separated airline codes (e.g. AA,DL).
maxPriceinteger0Budget ceiling; 0 means no limit.

Localisation and volume

FieldTypeDefaultDescription
currencystringUSDPreferred currency (USD, EUR, GBP, BDT…).
hlstringenResult language — 29 options.
glstringusCountry market — 39 options. Changes which fares and providers Google surfaces.
max_pagesinteger1How many "More flights" expansions to click.
maximuminteger20Total flights to collect.

Network

FieldTypeDefaultDescription
proxyConfigurationobjectApify ResidentialKeep residential on. Google Flights blocks datacenter IPs, and runs without residential proxy are unreliable.

⬆️ Output

Example output

{
"is_best": true,
"type": "Round trip",
"price": 486,
"currency": "USD",
"duration_minutes": 337,
"airline": "Delta",
"departure_airport": "LAX",
"arrival_airport": "JFK",
"raw_flight_data": {
"flights": [
{
"departure_airport": { "id": "LAX", "name": "LAX", "time": "08:15" },
"arrival_airport": { "id": "JFK", "name": "JFK", "time": "16:52" },
"airline": "Delta",
"flight_number": "DL 412",
"duration": 337,
"travel_class": "Economy",
"extensions": ["Nonstop", "Delta"]
}
],
"total_duration": 337,
"price": 486,
"type": "Round trip",
"departure_token": "TOKEN_48210377"
}
}

Illustrative values — a live run returns current Google Flights data.

⚠️ Placeholder fields — read before relying on them

A few fields inside raw_flight_data exist to keep the card structure stable but are not scraped values:

  • airplane is a fixed placeholder ("Boeing/Airbus"), not the actual aircraft type.
  • legroom is a fixed placeholder ("31 in").
  • airline_logo is returned empty.
  • carbon_emissions values are zeros, not real emissions estimates.

Everything else — price, currency, airline, airports, times, duration, stops, travel class and trip type — is extracted from the live search. This is stated explicitly so you do not build a report on a constant.


Usage recipes

Cheapest option on a route

{
"departureIATA": "LHR",
"arrivalIATA": "JFK",
"departureDate": "2026-10-03",
"arrivalDate": "2026-10-10",
"stops": "0",
"maximum": 50,
"currency": "GBP",
"gl": "uk"
}

Sort your export by price, or filter on is_best for the options Google itself highlights.

Compare several destinations at once

{
"departureIATA": "JFK",
"arrivalIATA": "LHR,CDG,AMS,FCO",
"departureDate": "2026-09-14",
"maximum": 100
}

Flexible dates

{
"departureIATA": "SFO",
"arrivalIATA": "NRT",
"departureDate": "2026-11-05",
"departureDateRng": "+1",
"arrivalDate": "2026-11-19",
"arrivalDateRng": "-1",
"maximum": 60
}

Business class on one alliance

{
"departureIATA": "FRA",
"arrivalIATA": "SIN",
"departureDate": "2026-10-20",
"seatclass": "3",
"alliances": "STAR",
"maximum": 40
}

Fare monitoring

Save your route as a Task, attach a daily Schedule, and append each run to a sheet. Comparing price over time is the only reliable way to spot a genuine fare drop.


How does this compare to an official flights API?

Google Flights has no public API. The QPX Express API was retired years ago, and the Google Flights data that exists commercially sits behind partner agreements with ITA Software.

The alternatives are airline or GDS APIs (Amadeus, Sabre, Duffel), which are commercial, contract-based and return their own inventory rather than Google's aggregated comparison view. If you specifically want the fares a traveller sees on Google Flights, scraping the public interface is the only route — which is what this Actor does.


Integrate and automate

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run = client.actor("scraperforge/google-flights-scraper").call(run_input={
"departureIATA": "LAX",
"arrivalIATA": "JFK",
"departureDate": "2026-09-14",
"maximum": 30,
})
for f in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f["price"], f["currency"], "|", f["airline"], "|",
f["departure_airport"], "→", f["arrival_airport"], "|", f["duration_minutes"], "min")

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });
const run = await client.actor('scraperforge/google-flights-scraper').call({
departureIATA: 'LAX',
arrivalIATA: 'JFK',
departureDate: '2026-09-14',
maximum: 30,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

REST API

curl -X POST "https://api.apify.com/v2/acts/scraperforge~google-flights-scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"departureIATA":"LAX","arrivalIATA":"JFK","departureDate":"2026-09-14","maximum":30}'

n8n, Make, Zapier and AI agents

Call the Actor from n8n, Make, Zapier or an MCP-capable agent — the classic pattern being a fare-drop alert that compares today's lowest price against yesterday's.

Schedules and webhooks

Attach a Schedule for recurring fare checks and use webhooks to trigger alerts, or push results into Google Sheets, Airtable or Slack for a running fare history.


Pricing and what you are charged for

Pay-per-event: a small Actor-start charge plus a charge per flight row delivered to your dataset. maximum is the direct cost lever — a monitoring run that only needs the cheapest few options should not ask for 100 results.

Current rates are on the Pricing tab of this Actor's page, and Apify shows an estimate before and during every run.

Because residential proxy is required in practice, that proxy traffic is billed separately by the platform according to your plan.


Limits, reliability and blocking

  • Residential proxy is effectively required. Google Flights blocks datacenter IP ranges; runs without residential are unreliable and may return nothing.
  • Google Flights is a hard target. It changes markup frequently and defends aggressively, so individual runs can fail or return partial results more often than with simpler sites. Build retries into any automated workflow rather than assuming a single run always succeeds.
  • Prices are point-in-time. Fares change by the minute; a scraped price is a snapshot, not a bookable guarantee.
  • maximum and max_pages interact. More results require more "More flights" expansions, which lengthens the run.
  • gl and currency genuinely change results — Google shows different fares and providers by market. Set them to match the traveller you are pricing for.
  • Some raw_flight_data fields are placeholders (see the output warning above).
  • No booking links or seat inventory are returned — this is a fare comparison scraper, not a booking API.
  • Default run options are 4 GB memory and a 1-hour timeout.

This Actor reads publicly displayed flight search results — the same information any visitor sees on Google Flights without logging in. It does not log in, book, hold seats, or access private data.

Fare data is factual information rather than creative work, but Google's terms restrict automated access, so operate conservatively: keep volumes reasonable, do not resell scraped fares as a bookable product, and treat prices as indicative rather than contractual. You are responsible for ensuring your use complies with Google's terms and applicable law in your jurisdiction.


❓ Frequently asked questions

Does Google Flights have a public API?

No. QPX Express was shut down, and Google Flights data is otherwise only available through commercial ITA Software partnerships. Scraping the public interface is the practical alternative.

Can I search multi-city trips?

Yes — supply multi_city_json with one object per segment. The single-route fields are then optional.

How do I search several destinations at once?

Put comma-separated IATA codes in arrivalIATA. The shortcut london expands to all five London airports.

Why do I get different prices than I see in my browser?

Because gl (country) and currency change what Google serves, and fares move continuously. Match those settings to your own market for comparable numbers.

No. This Actor returns fare comparison data — price, airline, route, times and duration — not booking URLs or seat availability.

Are the aircraft type and legroom fields real?

No. airplane, legroom, airline_logo and carbon_emissions inside raw_flight_data are structural placeholders, not scraped values. This is documented deliberately so nobody builds analysis on them.

What does is_best mean?

Google's own "best flight" designation, which balances price against duration and convenience — not simply the cheapest option.

Why did my run fail or return nothing?

Almost always blocking. Confirm residential proxy is enabled, reduce maximum, and retry. Google Flights is one of the more aggressively defended targets on the web, and intermittent failures are normal.

Can I monitor a fare daily?

Yes — that is the strongest use case. Save a Task, attach a Schedule, and compare price across runs.

Which export format should I use?

CSV or Excel for price analysis using the flat top-level fields; JSON when you want the per-leg detail inside raw_flight_data.


Browse the full collection on the ScraperForge profile.


💬 Feedback

Need booking links, calendar-price grids, or a custom fare-monitoring pipeline? Open an issue on the Issues tab of this Actor.