Google Flights API
Pricing
from $1.00 / 1,000 flight results
Google Flights API
Scrape flight prices, airlines, durations, stops and times from Google Flights. Supports one-way, round-trip and multi-city searches. Outputs structured flight records and an Excel export.
Pricing
from $1.00 / 1,000 flight results
Rating
0.0
(0)
Developer
Rajas Samarth
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Security
Limited permissionsShare
What is Google Flights Scraper?
Google Flights Scraper turns a Google Flights search into a clean, structured dataset you can filter, export, and monitor.
Give it an origin, a destination and a date — or a list of multi-city legs — and it returns one row per flight with the price, airline, departure and arrival times, duration, stops, airports, cabin class and a link back to Google Flights.
It supports one-way, round-trip and multi-city trips, economy through first class, multiple passengers, and the filters fare trackers actually use: airline, total price, price per person, maximum duration, departure-time window and result order.
Because it runs on Apify, you also get scheduling, run monitoring, proxy rotation, an API and integrations without maintaining a server.
What data can you extract?
| Field | Example | Meaning |
|---|---|---|
airline | IndiGo | Operating airline |
dep_airport / arr_airport | BOM / DEL | Origin and destination airports |
dep_time / arr_time | 08:00 AM / 10:10 AM | Local departure and arrival times |
flight_date | 2026-12-01 | Flight date |
duration / duration_min | 2h 10m / 130 | Total journey time |
stops | 0 | Number of stops |
price / currency | 5480.0 / INR | Price Google displays for the search |
cabin_class | economy | Cabin searched |
trip_type | one-way | Trip type searched |
booking_link | https://www.google.com/travel/flights/... | Google Flights search URL for that leg |
detail_status | Complete | Whether the detail view was read |
price_missing | false | True when Google showed "price unavailable" |
Each run also writes:
- Dataset — one row per flight, ready for CSV, Excel, Sheets, BigQuery or an API.
SUMMARY— search metadata, row counts, parsed price range, price history and any filter warning.OUTPUT— a formatted Excel workbook built from the same data.
Why use this Actor?
- Excel included. Every run stores a ready-to-open
.xlsxinOUTPUT, not just JSON rows. - Built-in price alerts. Persist the minimum price per route and POST a Discord, Slack or generic JSON message when the price drops by your threshold — or when the run fails.
- Per-person budgets. Google shows the total for all passengers.
max_price_per_personlets you filter by the number you actually care about, without mental math. - Filter safety. If your filters remove every row, the Actor does not silently return an empty run. It reports the real parsed price range in
filter_warningand returns the unfiltered results so you can see what went wrong. - Relative dates.
depart_days_aheadandtrip_length_dayskeep scheduled searches moving forward instead of pointing at a date that has already passed. - Real browser. It reads the same JavaScript-rendered results a person sees on Google Flights, including fares that appear after the first page load.
- Apify Proxy on by default. Browser traffic is routed through Apify Proxy, the main lever against Google returning empty results to datacenter IPs.
- Sorting built in. Keep Google's ranking, or sort by price, duration, departure time or arrival time.
How to use it
- Enter the origin and destination as three-letter IATA codes, for example
BOMandDEL. - Set an outbound date in
YYYY-MM-DD, or usedepart_days_aheadto search relative to the run day. - Choose the trip type, cabin class, passengers and currency.
- Optionally add filters: airline, total price, price per person, maximum duration, departure window and sort order.
- Run the Actor and open the Dataset tab, or download the
OUTPUTExcel workbook from the key-value store. - For monitoring, attach a schedule and a webhook so you get notified when the price drops.
No Google account, login or API key is required.
Inputs
| Input | Type | What it does |
|---|---|---|
departure | string | Origin IATA code, e.g. BOM |
destination | string | Destination IATA code, e.g. DEL |
outbound_date | string | Departure date, YYYY-MM-DD |
return_date | string | Return date for round-trip |
depart_days_ahead | integer | Depart this many days after the run starts; overrides outbound_date |
trip_length_days | integer | Return this many days after departure; switches the search to round-trip |
legs | array | Multi-city legs: {origin, destination, date} objects |
trip_type | enum | one-way, round-trip or multi-city |
cabin_class | enum | economy, premium, business or first |
adults | integer | 1–9 |
children | integer | 0–8 |
infants | integer | 0–4 |
currency | string | Three-letter code, e.g. USD, EUR, INR |
stops | enum | any, nonstop, 1-stop or 2-stops |
max_results | integer | 1–500 rows |
force_fresh | boolean | Skip the short-lived cache and scrape live |
airlines | array | Keep flights whose airline matches any name (substring, case-insensitive) |
max_price | number | Keep flights at or below this total price |
max_price_per_person | number | Keep flights whose price ÷ passengers is at or below this value |
max_duration_minutes | integer | Keep flights at or below this total duration |
departure_time_from / departure_time_to | string | Departure-time window, e.g. 06:00 and 22:00 |
sort_by | enum | google, price, duration, departure or arrival |
proxyConfiguration | object | Apify Proxy settings; Apify Proxy is used by default |
usePlaywrightSource | boolean | Use the live browser scraper (default true) |
trackPriceHistory | boolean | Persist the per-route minimum price across runs |
priceDropAlertPercent | number | Alert threshold, default 10 (%) |
alertWebhookUrl | string | Discord, Slack, Make, n8n or any JSON endpoint |
alertWebhookFormat | enum | json, slack or discord |
alertOnFailure | boolean | Send a webhook when the run fails |
Example inputs
One-way, cheapest first
{"departure": "BOM","destination": "DEL","outbound_date": "2026-12-01","trip_type": "one-way","cabin_class": "economy","adults": 1,"currency": "INR","max_results": 50,"sort_by": "price"}
Round-trip, nonstop, with a per-person budget
{"departure": "BOM","destination": "DEL","outbound_date": "2026-12-01","return_date": "2026-12-08","trip_type": "round-trip","adults": 2,"currency": "INR","stops": "nonstop","max_price_per_person": 6000,"sort_by": "price","max_results": 100}
Multi-city
{"trip_type": "multi-city","legs": [{ "origin": "BOM", "destination": "DEL", "date": "2026-12-01" },{ "origin": "DEL", "destination": "BOM", "date": "2026-12-08" }],"adults": 1,"currency": "INR","max_results": 100}
Daily price watch (relative dates plus a Discord alert)
{"departure": "BOM","destination": "DEL","depart_days_ahead": 30,"trip_length_days": 7,"adults": 2,"currency": "INR","max_results": 100,"trackPriceHistory": true,"priceDropAlertPercent": 10,"alertWebhookUrl": "https://discord.com/api/webhooks/...","alertWebhookFormat": "discord"}
trip_length_days automatically turns this into a round-trip search.
Output
Dataset
One row per flight. Rows keep Google's order unless you set sort_by. Unpriced or partially read rows are still returned but flagged with price_missing or detail_status, so you can filter them out downstream.
{"airline": "IndiGo","dep_airport": "BOM","arr_airport": "DEL","dep_time": "08:00 AM","arr_time": "10:10 AM","flight_date": "2026-12-01","duration": "2h 10m","duration_min": 130,"stops": 0,"price": 5480.0,"currency": "INR","cabin_class": "economy","trip_type": "one-way","booking_link": "https://www.google.com/travel/flights/...","detail_status": "Complete","price_missing": false}
SUMMARY
A compact JSON record with the search parameters, total_available, returned, raw_total, price_stats, filter_warning, and — when price history is on — current_min_price, previous_min_price, price_change_percent and best_min_price.
OUTPUT
An .xlsx workbook with the same rows, ready to download and open.
Price tracking and alerts
When trackPriceHistory is enabled (the default), the Actor stores the minimum price for the route, cabin, passenger mix and currency in a persistent key-value store. On the next run it compares the new minimum with the previous one.
price_change_percentis negative when the price fell.- A webhook is sent when the drop is at least
priceDropAlertPercent. best_min_pricekeeps the lowest price ever seen for that exact search.- Set
alertWebhookFormattodiscordorslackfor incoming webhooks; leave it onjsonfor Make, n8n, Zapier or your own endpoint. - Set
alertOnFailureto also receive a message when a run fails. - To test the webhook immediately, set
priceDropAlertPercentto0for one run, then restore it.
Changing the passengers, cabin or currency starts a new price baseline, because the comparison would otherwise be misleading.
Scheduling
Create a schedule in Apify Console → Schedules and point it at this Actor. Use relative dates so the search stays current:
{"departure": "BOM","destination": "DEL","depart_days_ahead": 30,"trip_length_days": 7,"adults": 2,"currency": "INR","trackPriceHistory": true,"priceDropAlertPercent": 10}
A daily run at 08:00 with a 10% threshold gives you a simple fare-watch service without any server.
How much does it cost?
This Actor is paid per result, with a small per-run start fee:
| Event | Price |
|---|---|
| Flight result | $1 per 1,000 rows ($0.001 per row) |
| Actor start | $0.0025 per GB — about $0.005 per run at the default 2 GB |
A typical 100-row run costs about $0.11; a 500-row run costs about $0.51. The per-result price includes the dataset rows, the Excel workbook and price-history tracking. Apify platform usage is included in the per-event price.
- You are charged only for rows that are saved to the dataset.
- A run that returns no rows is charged only the start fee.
- Set
max_resultsto cap the cost of a run. - Apify's Maximum charge setting caps your spend per run. If the cap is reached, the Actor stops saving rows and skips the Excel export, so you are not charged for data you did not receive.
- Cached results are still billed per row, because they are still returned to you.
FAQ
Do I need a proxy?
Apify Proxy is on by default and recommended. Google sometimes serves empty results or a consent screen to datacenter IPs. If a run returns nothing, retry, switch the proxy group, or run without a proxy from a residential IP.
Why did I get zero rows?
The most common causes are a proxy/IP block, a Google consent screen, or a filter that removed everything. Check the run log and SUMMARY.filter_warning. The Actor deliberately returns unfiltered results with a warning instead of an empty dataset when filters are the cause.
Is the price per person or for all passengers?
Google shows the total for all selected passengers. Use max_price for the total, or max_price_per_person for a per-seat budget. The raw price field is the total Google displayed.
How many results can I get?
Set max_results up to 500. Google typically exposes roughly 100–200 itineraries for a busy route, and fewer for thin routes. The Actor returns what the page provides.
Does multi-city price the whole trip as one ticket?
No. Multi-city returns flight options for each leg. Group rows by dep_airport, arr_airport and flight_date to reconstruct the itinerary. It does not produce a single through-ticket price the way Google's multi-city booking flow does.
Can I sort by price or duration?
Yes. Set sort_by to price, duration, departure or arrival. The default, google, keeps Google's own ranking.
Can I use relative dates?
Yes. depart_days_ahead searches N days from the run day. trip_length_days sets the return date N days later and switches to round-trip. Both are ignored for multi-city, whose legs carry explicit dates.
Does it support business or first class?
Yes. Set cabin_class to premium, business or first.
Can I get return flights, a price graph or booking options?
Not currently. This Actor focuses on the flight results list, filters, Excel export and price alerts. Return-flight lists, a date/price graph and per-OTA booking options are not part of this version.
Can I call it from Python, JavaScript or an automation tool?
Yes. Every Apify Actor has a REST API and official Python and JavaScript clients. You can also connect it to Make, n8n, Zapier or the Apify MCP server for AI agents. Results land in the dataset and key-value store either way.
Is this an official Google API?
No. It reads publicly available Google Flights search results. It is not affiliated with, endorsed by or sponsored by Google LLC. "Google Flights" is a trademark of Google LLC, used here only to describe the data source.
Is scraping Google Flights legal?
That depends on your jurisdiction and your use. You are responsible for complying with Google's Terms of Service and applicable data-protection law. Use the data for legitimate research, market intelligence or your own travel planning, and do not overload Google's infrastructure.
Does it book tickets?
No. It only reads search results. Booking, payment, seat selection, hotels and car hire are out of scope.
Why is it slower than a pure-HTTP scraper?
It drives a real browser, which renders the same page a person sees. That is more robust to JavaScript-only content but slower than calling an internal API directly.
Limitations
- Browser-based — slower and heavier than pure-HTTP scrapers.
- Google UI changes can break selectors; retries and diagnostics are built in, but a major redesign may require an update.
- Prices are snapshots — Google updates fares continuously.
- Multi-city is per leg, not a single through-ticket price.
- No booking, seat selection, hotels or car hire.
- Result depth is limited to what Google exposes for the route and date.
- Flight numbers and per-layover details are not extracted —
stopsis, so you can filter nonstop versus connecting flights. - Not every row has a price — Google sometimes shows "price unavailable"; those rows are flagged.
Support
Found a bug or need an extra field? Open an issue on the Actor's Issues tab in Apify Console and include:
- your input JSON (remove secrets),
- the run ID,
- what you expected versus what you got.
Disclaimer
This Actor accesses publicly available flight search data for legitimate research, market-intelligence and business-analysis purposes. It is not affiliated with, endorsed by or sponsored by Google LLC. Use it in compliance with Google's Terms of Service and all applicable laws, including data-protection regulations. The publisher is not responsible for misuse. No warranty is provided; verify prices before making travel decisions.
Keywords
Google Flights scraper, Google Flights API, flight price scraper, airfare scraper, flight data API, flight price tracker, fare monitoring, price drop alerts, Google Flights Excel export, multi-city flight scraper, round-trip flight scraper, one-way flight scraper, business class flight data, nonstop flight scraper, airline price comparison, travel data, Apify flight scraper, Google Flights dataset, flight itinerary data, cheapest flight finder.