How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
BKKin From (airport code). Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Google Flights Scraper searches Google Flights for your route and dates and returns one row per flight: airline, flight numbers, departure and arrival time, duration, stops, layovers, CO₂ and the exact price in your currency.
Good for
- Compare fares and flight times for one route on one or more dates.
- Find the cheapest departure day in a short date range.
- Collect flight prices on a schedule to see how they change over time.
Not a good fit
- No booking, no booking links and no airline-site prices: the Actor only reads what Google Flights shows on its results page.
- No price insights (price level, price history graph) and no multi-city trips.
- Round trip: each row is an outbound flight with the round-trip total price, as Google shows it on the first step. Return flights are not listed.
- Searches with children or lap infants: on some routes Google does not put the flights into the page and loads them later in the browser. Such a date gets a free
errorrow withSOURCE_INCOMPLETE. With children, Google can also show fewer flights than for adults only. - Prices change often and can differ from the price on the airline website.
Who uses it
Travellers
Find the cheapest day in a short date range.
Travel managers
Compare fares and CO2 for business trips.
Travel bloggers and analysts
Track route prices over time.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Flight search with results | $0.025 (from $0.014 on paid Apify plans) | One route and date searched on Google Flights that listed flights. Includes every flight row up to maxResults. |
| Flight search without results | $0.001 | One route and date searched on Google Flights that listed no flights. Saves one not_found row. Searches that fail are free. |
Examples
- One result: about $0.03.
- 1,000 results: about $25.00.
- Every day 100 results, for 30 days: about $75.00 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 200 results.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Is there an official Google Flights API?
No public one. This tool gives you the flight list as data.
Can I book flights with it?
No. It only reads the results page. There are no booking links.
Is the price the same as the airline price?
Not always. It is the price Google Flights shows at that time.
Does it show return flights?
For round trips, each row is an outbound flight with the round-trip total.
Do I need a Google account, login or API key?
No. The Actor reads the public Google Flights results page, without login or cookies.
Why do I get fewer flights than in my browser?
The Actor returns the flights Google puts on the first results page, up to maxResults. With children, Google can put fewer flights into the page. Booking options for each flight are not part of the output.
Details
Step by step on Apify
- Open the Input tab.
- Keep the prefilled route
BKK→SINanddepartureDate+30(30 days from today), or add your own airport codes and date. - Click Start.
- Open the Flights view of the Dataset and check
airline,departure,priceandcurrency.
Use cases
| Task | Input | Key fields | Next step |
|---|---|---|---|
| Compare fares for a trip | origin, destination, departureDate, returnDate | airline, departure, arrival, stops, price | Export to CSV or a spreadsheet |
| Find the cheapest day | additionalDepartureDays | departureDate, price (or cheapestPrice in RUN_SUMMARY) | Sort by price |
| Track a route over time | Same input on a schedule | flightNumbers, departure, price, fetchedAt | Compare runs by flight number and departure time |
| Travel CO₂ reports | Route and dates | emissionsKg, typicalEmissionsKg, durationMin | Join with your trip list |
Tips for better results
- Search a date range to find the cheapest day to fly.
- Set the country and currency to match where you buy.
- Schedule the same search to build your own price history.
Limits and good to know
- Up to 15 departure dates per run (
additionalDepartureDays0–14) and up to 300 rows per date. This is a limit, not a typical count: in our tests Google listed 10–60 flights per date - In our tests a search took about 1–3 seconds; 15 dates with 260 flights took 4.3 seconds
- Dates can be up to about 330 days ahead, as on Google Flights
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"status": "complete",
"statusReason": null,
"errorCode": null,
"route": "BKK-SIN",
"tripType": "one_way",
"departureDate": "2026-11-14",
"returnDate": null,
"cabinClass": "economy",
"adults": 1,
"rank": 1,
"isBest": true,
"airline": "Scoot",
"airlineCodes": ["TR"],
"flightNumbers": ["TR625"],
"departureAirport": "BKK",
"arrivalAirport": "SIN",
"departure": "2026-11-14T11:50",
"arrival": "2026-11-14T15:25",
"durationMin": 155,
"stops": 0,
"layovers": [],
"segments": [
{
"flightNumber": "TR625",
"airline": "Scoot",
"operatedBy": null,
"departureAirport": "BKK",
"arrivalAirport": "SIN",
"aircraft": "Boeing 787",
"legroom": "31 in"
}
],
"price": 129.05,
"currency": "USD",
"emissionsKg": 96,
"typicalEmissionsKg": 103,
"sourceUrl": "https://www.google.com/travel/flights?tfs=GhoSCjIwMjYtMTEtMTRqBRIDQktLcgUSA1NJTkABSAGYAQI&hl=en&gl=US&curr=USD",
"fetchedAt": "2026-10-15T04:36:08.068Z"
}Use it from code
Actor ID: cliqtomedia/google-flights-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/google-flights-scraper").call(run_input={
"origin": "BKK",
"destination": "SIN"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~google-flights-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"origin": "BKK", "destination": "SIN"}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/google-flights-scraper")
result = tool.invoke({"run_input": {"origin": "BKK", "destination": "SIN"}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (33)
| Field | Type | Meaning |
|---|---|---|
status | string | complete (a flight), not_found (Google shows no flights; one row per search) or error. Charges are per search, not per row: a date with flights is one flight-search event, a not_found row is one empty-search event, error rows are free. |
statusReason | string | Plain-English reason for not_found and error rows; null for flights. |
errorCode | string | Machine code for error rows, e.g. SOURCE_BLOCKED, DEADLINE_REACHED; null otherwise. |
route | string | Route as ORIGIN-DESTINATION, e.g. BKK-SIN. |
origin | string | Departure airport you searched (IATA). |
destination | string | Arrival airport you searched (IATA). |
tripType | string | one_way or round_trip. |
departureDate | string | Searched departure date (YYYY-MM-DD). |
returnDate | string | Searched return date for round trips; null for one-way. |
cabinClass | string | Searched cabin class. |
adults | integer | Adults in the search. |
children | integer | Children in the search. |
infantsOnLap | integer | Infants on lap in the search. |
rank | integer | Position in Google's list for this date, 1 = first. |
isBest | boolean | True when Google lists the flight among its "best" options. |
airline | string | Airline name(s) as Google shows them, comma-separated. |
airlines | array | Airline names. |
airlineCodes | array | IATA codes of the marketing carriers. |
flightNumbers | array | Flight numbers of every segment, e.g. ["SQ709"]. |
departureAirport | string | Departure airport of this flight (IATA). |
arrivalAirport | string | Arrival airport of this flight (IATA). |
departure | string | Local departure date and time, YYYY-MM-DDTHH:MM (airport time zone). |
arrival | string | Local arrival date and time, YYYY-MM-DDTHH:MM (airport time zone). |
durationMin | integer | Total travel time in minutes, layovers included. |
stops | integer | Number of stops (0 = nonstop). |
layovers | array | Layovers: airport, city and duration in minutes. |
segments | array | Each flown segment: flight number, airports, times, duration, aircraft, legroom. |
price | number | Total price for all passengers in the given currency (round trip: total for both directions). null when Google shows no price. |
currency | string | Currency of price (ISO code) as Google returned it. |
emissionsKg | integer | Google's CO2 estimate for this flight per passenger, kg. |
typicalEmissionsKg | integer | Google's typical CO2 for this route, kg. |
sourceUrl | string | Google Flights URL of this search. |
fetchedAt | string | When the row was fetched (ISO timestamp, UTC). |
Input settings (14)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| From (airport code) required | origin | string | "BKK" |
| To (airport code) required | destination | string | "SIN" |
| Departure date required | departureDate | string | "+30" |
| Return date (round trip) | returnDate | string | |
| Extra departure days | additionalDepartureDays | integer | 0 |
| Adults | adults | integer | 1 |
| Children (2–11) | children | integer | 0 |
| Infants on lap | infantsOnLap | integer | 0 |
| Cabin class | cabinClass | string | "economy" |
| Stops | maxStops | string | "any" |
| Currency | currency | string | "USD" |
| Search from country | country | string | "US" |
| Max flights per date | maxResults | integer | 20 |
| Proxy | proxyConfiguration | object | {"useApifyProxy": false} |






