Google Flights Scraper avatar

Google Flights Scraper

Pricing

from $2.00 / 1,000 per flight results

Go to Apify Store
Google Flights Scraper

Google Flights Scraper

Search Google Flights for fares on one route or dozens in a single run, with flexible dates and scheduled price tracking. Every row carries price, currency, price_tag, booking_url and the full departure and return itineraries. Export JSON, CSV or Excel.

Pricing

from $2.00 / 1,000 per flight results

Rating

0.0

(0)

Developer

herus13

herus13

Maintained by Community

Actor stats

1

Bookmarked

9

Total users

1

Monthly active users

3 days ago

Last modified

Share

The Google Flights Scraper searches fares on Google Flights — one route or dozens in a single run. Every itinerary comes back with price, cabin, stops, each segment's airline, flight number, aircraft and legroom, carbon emissions, and a bookable Google Flights link.

What you get

One dataset row per itinerary. Export as JSON, CSV or Excel.

{
"origin": "SGN",
"destination": "HAN",
"departure_date": "2026-05-15",
"return_date": null,
"price": 178.0,
"currency": "USD",
"price_tag": "best",
"booking_url": "https://www.google.com/travel/flights/...",
"departure": {
"stops": 0,
"duration_minutes": 130,
"emissions_kg": 113.0,
"emissions_typical_kg": 111.0,
"arrives_next_day": false,
"segments": [
{
"airline": "Vietnam Airlines",
"airline_code": "VN",
"flight_number": "251",
"from": "SGN",
"to": "HAN",
"departure_time": "2026-05-15T07:00:00",
"arrival_time": "2026-05-15T09:10:00",
"duration_minutes": 130,
"aircraft": "Airbus A321",
"legroom": "31 in"
}
],
"layovers": []
},
"return": null,
"scraped_at": "2026-05-15T00:00:00Z",
"_meta": {"author": "https://apify.com/herus13", "status": "ok", "message": null}
}

_meta is run metadata, not scraped data. A target that fails appears as a row with only _meta (status failed, the reason in message); those rows are never charged.

departure, and return on a round trip, hold the trip detail: segments, stops, duration_minutes, layovers, emissions_kg against the route's emissions_typical_kg, and arrives_next_day. price_tag labels a row best, cheapest or fastest. Turn price tracking on and every row also carries previous_price, price_change, pct_change, alert and checked_at.

What it costs

EventFreeBronzeSilverGold+
Per flight result (flight-result)$0.003$0.00267$0.00233$0.002
Actor Start (apify-actor-start)$0.02$0.02$0.02$0.02

You pay per itinerary returned, plus a start fee for the run: $0.02 to start, and $0.003 an itinerary on the Free tier down to $0.002 on Gold and above. One route at 20 results is about $0.08. Ten routes at 20 results each is about $0.42, because bulk routes share the one start fee instead of paying it ten times. The residential proxy every run needs is included in that price. A search that fails returns only a row with _meta naming the route and why, and costs nothing; a run where every search failed ends as failed rather than as an empty success.

Input

FieldTypeRequiredDefaultWhat it does
searchesarrayno—Several routes in one run, as a JSON array. Each entry is an object with origin, destination and departure_date, and optionally return_date, flex_days and max_stops — for example [{"origin": "SGN", "destination": "HAN", "departure_date": "2026-05-15"}]. When this is set, the single-route fields below are ignored. Leave empty to search the one route those fields describe.
originstringno—Where the trip starts, as an IATA airport code or a city name — for example SGN or Ho Chi Minh City. A city name is matched against an airport list, so you do not have to look the code up. Leave empty when you are filling in searches, which carries its own origin per route.
destinationstringno—Where the trip ends, as an IATA airport code or a city name — for example HAN or Hanoi. Leave empty when you are filling in searches, which carries its own destination per route.
departure_datestringno—Outbound date, written as YYYY-MM-DD — for example 2026-05-15. It must be in the future. Leave empty and a date about 30 days from today is used, which is handy for a quick price check on a route.
return_datestringno—Return date, written as YYYY-MM-DD, on or after the departure date. Leave empty for a one-way search.
flex_daysintegerno0Also search this many days on each side of the departure date, from 0 to 14. Default 0, which searches the one date. Setting 3 turns one date into a seven-day window and shows which day is actually cheap; every extra date returns its own results.
max_stopsintegerno—Most stops an itinerary may have, from 0 to 3 — 0 keeps direct flights only. Leave empty to keep itineraries with any number of stops.
adultsintegerno1How many adult passengers the trip is priced for, from 1 to 9. Default 1. The price on each row is the one Google Flights quotes for that party.
childrenintegerno0How many child passengers to include in the party, from 0 to 9. Default 0.
cabinstringno"economy"Which cabin to price: economy, premium for premium economy, business, or first. Default economy. A route with no seats in the cabin you pick returns no results for that route.
currencystringno"USD"Currency every price is returned in, as an ISO 4217 code. Default USD. Supported: USD, EUR, GBP, INR, JPY, CNY, AUD, CAD, CHF, SGD, HKD, AED, SAR, ZAR, BRL, MXN and other major currencies. An unsupported code stops the run rather than quietly returning US dollars.
max_pricenumberno—Drop any itinerary priced above this, in the currency you chose — for example 200. Leave empty to keep every price. Combined with flex days it turns a route search into a deal hunt.
max_results_per_searchintegerno50Most itineraries to keep per route, from 1 to 200. Default 50. The cap applies to each route separately, so ten routes at 50 is up to 500 rows. You pay per row returned, so this is the ceiling on what a run costs.
track_historybooleannofalseTurn a scheduled run into price monitoring: each run keeps the fares it found and compares them with the run before, adding previous_price, price_change, pct_change and alert to every row. Default false. Pair it with a daily schedule and alert_threshold_pct.
alert_threshold_pctintegerno10How far a fare must fall, as a percentage, before its row is flagged with an alert, from 1 to 90. Default 10, so a drop of a tenth raises one. It does nothing unless track_history is true.
tracking_keystringno—Name for the price history this run writes to. Leave empty and a name is derived from the route and dates, which is what you want unless you run two schedules over the same route and need their histories kept apart. It does nothing unless track_history is true.
request_delayintegerno0Extra seconds to wait between requests, 0 or more. Default 0, which adds no wait at all. Raise it to be gentler on a long bulk run.
proxyUrlsarrayno—Leave empty and the run uses the residential proxy this actor ships with, included in the price of the run. To route the run through your own account instead, add one gateway URL per entry, for example http://user:pass@host:port — works with DataImpulse, Bright Data, Oxylabs, Smartproxy or any provider that issues URLs. When set, only these URLs are used.

How to run it

  1. Open the actor on Apify Console and click Try for free.
  2. Fill in Origin, Destination and Departure date for one route, or paste a Bulk searches array for many.
  3. Add flex days or a maximum price if you are hunting a deal, then Run. Export JSON, CSV or Excel from the dataset.
{
"searches": [
{"origin": "SGN", "destination": "HAN", "departure_date": "2026-05-15"},
{"origin": "SGN", "destination": "DAD", "departure_date": "2026-05-16"}
],
"adults": 2,
"cabin": "economy",
"currency": "USD",
"max_price": 200,
"max_results_per_search": 10
}

Minimal input:

{
"origin": "SGN",
"destination": "HAN"
}

Available as the MCP tool herus13--flight-search on mcp.apify.com and through the Apify API; send the same JSON.

Why this scraper

  • Many routes, one start fee. Bulk searches put a whole route set in a single run, where one-route actors charge a start fee for every route you check.
  • Flex dates find the cheap day. Set flex days and the search fans out around your date, so the price surface across a week is visible instead of one point on it.
  • Segment detail, not just a price. Airline, flight number, aircraft, legroom, layovers and duration are on the row, so a cheap fare hiding a twelve-hour connection is obvious before anyone books it.
  • Scheduled tracking with alerts. Turn on price tracking, schedule the run daily, and each row reports its change against the last run and flags a drop past your threshold.
  • Carbon numbers included. Emissions per itinerary against the route's typical figure, which is what a travel policy needs at the point of choice.
  • Airport names work. Type a city name instead of hunting for its IATA code.

Use cases

  • Flexible-date fare hunting — One route plus flex days and a maximum price returns only the itineraries worth booking, with the day-by-day spread visible.
  • Scheduled price tracking and drop alerts — Run the same route set every day and let the run flag the drops; each row carries a bookable link, so an alert can point straight at the fare.
  • Fare datasets for analysis — Many routes in one run makes a longitudinal dataset practical: how far ahead prices bottom out, how carriers differ on a city pair, what a stop is worth in money.
  • Carbon-aware travel policy — Compare the emissions of the cheap connection against the direct flight in the same table as the price.
  • Travel agency and OTA price checks — Benchmark your own quoted fares against what a traveller sees on Google Flights for the same day and cabin.

FAQ

Can I search several routes in one run? Yes — that is what Bulk searches is for. Paste an array of {origin, destination, departure_date} objects and they all run under one start fee. The single-route fields are ignored when it is set.

How do the price alerts work? Set Track price history to true and schedule the actor. Each run compares the fares it finds with the previous run's and adds previous_price, price_change, pct_change and alert to every row; alert turns on once the drop passes Alert threshold (%), which defaults to 10.

Which currencies can I price in? USD, EUR, GBP, INR, JPY, CNY, AUD, CAD, CHF, SGD, HKD, AED, SAR, ZAR, BRL, MXN and other major currencies. An unsupported code stops the run rather than quietly returning US dollars.

Do I need the IATA code? No. A city name is matched against an airport list, so Ho Chi Minh City works as well as SGN.

Is a proxy included? A residential proxy is included in the price of the run. To use your own, paste gateway URLs into Your own proxy URLs. Scraping at volume? Your own DataImpulse account is cheaper per GB.

Is scraping Google Flights legal? This actor collects only publicly visible fare and itinerary data. You are responsible for complying with Google's terms and applicable laws. Fares change constantly — always confirm on the booking link before you buy.

Building a travel or pricing pipeline? Pair this actor with: