Google Flights Scraper
Under maintenancePricing
from $3.99 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
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?
| Group | Fields |
|---|---|
| 💰 Price | price, currency, is_best (Google's "best" flag) |
| ✈️ Route | departure_airport, arrival_airport, type (one-way / round-trip / multi-city) |
| 🏢 Carrier | airline |
| ⏱️ Timing | duration_minutes, plus per-leg departure and arrival times |
| 🧾 Full detail | raw_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
- Open the Actor and enter a Departure Airport and Destination Airport as IATA codes (
LAX,JFK). Multiple destinations are supported, comma-separated. - Set a Departure Date, and a Return Date for round-trips (leave empty for one-way).
- Set passengers, Cabin Class and any filters — stops, alliances, airlines, budget.
- Set Max Results and Scroll Depth (how many "More flights" expansions to click).
- Keep Residential proxy ON — see the reliability notes below.
- 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
| Field | Type | Default | Description |
|---|---|---|---|
departureIATA | string | LAX | 3-letter IATA code(s) for departure. Multiple codes supported. |
arrivalIATA | string | JFK | Destination IATA codes, comma-separated for bulk input. london expands to LHR, LGW, STN, LTN, LCY. |
departureDate | string | — | Outbound date. |
arrivalDate | string | — | Return date. Leave empty for a one-way search. |
departureDateRng | string | — | Flex days on departure (e.g. +1, -1). |
arrivalDateRng | string | — | Flex days on return. |
multi_city_json | string | — | JSON string for multi-city trips: [{"departure_id":"…","arrival_id":"…","date":"…"}]. When supplied, the single-route fields are not required. |
Passengers and cabin
| Field | Type | Default | Description |
|---|---|---|---|
adults | integer | 1 | Adult passengers (12+). |
children | integer | 0 | Children (2–12). |
infants | integer | 0 | Infants under 2, on lap. |
seatclass | string | 1 | Cabin class: 1 Economy, 2 Premium Economy, 3 Business, 4 First. |
Filters
| Field | Type | Default | Description |
|---|---|---|---|
stops | string | 0 | Maximum layovers: 0, 1 or 2. |
alliances | string | ALL | STAR, SKYTEAM or ONEWORLD. |
airlines | string | ALL | Comma-separated airline codes (e.g. AA,DL). |
maxPrice | integer | 0 | Budget ceiling; 0 means no limit. |
Localisation and volume
| Field | Type | Default | Description |
|---|---|---|---|
currency | string | USD | Preferred currency (USD, EUR, GBP, BDT…). |
hl | string | en | Result language — 29 options. |
gl | string | us | Country market — 39 options. Changes which fares and providers Google surfaces. |
max_pages | integer | 1 | How many "More flights" expansions to click. |
maximum | integer | 20 | Total flights to collect. |
Network
| Field | Type | Default | Description |
|---|---|---|---|
proxyConfiguration | object | Apify Residential | Keep 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:
airplaneis a fixed placeholder ("Boeing/Airbus"), not the actual aircraft type.legroomis a fixed placeholder ("31 in").airline_logois returned empty.carbon_emissionsvalues 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 ApifyClientclient = 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.
maximumandmax_pagesinteract. More results require more "More flights" expansions, which lengthens the run.glandcurrencygenuinely change results — Google shows different fares and providers by market. Set them to match the traveller you are pricing for.- Some
raw_flight_datafields 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.
Is it legal to scrape Google Flights?
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.
Can I get booking links?
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.
🔗 Related scrapers
- Google Search Results Scraper with Local Businesses — organic results and local listings from Google Search.
- Apartments.com Scraper — accommodation data to pair with travel research.
- Realtor.com Agent Scraper — relocation-adjacent property and agent 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.