# Google Flights Scraper and Fare Tracker (`cleanscrape/google-flights-scraper`) Actor

Scrape Google Flights fares by route and date: prices, airlines, flight numbers, stops, layovers, times with time zones, CO2 and Google's price level. Track only new flights or lower prices on a schedule. No login. $1 per 1,000 flights plus $0.50 per 1,000 searches. Maintained by CleanScrape.

- **URL**: https://apify.com/cleanscrape/google-flights-scraper.md
- **Developed by:** [CleanScrape](https://apify.com/cleanscrape) (community)
- **Categories:** Travel, Automation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 flights

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Flights Scraper and Fare Tracker

A Google Flights scraper and flight price tracker: check fares for your routes and dates and export them to a spreadsheet, with price, airlines, flight numbers, stops and layovers, departure and arrival times with time zones, aircraft and CO2. Each search also gets a summary row with the cheapest fare, Google's typical price and its price level for the trip (low, typical or high). Schedule it with **Only new flights or lower prices** and each run gives you only what changed.

**$1.00 per 1,000 flights and $0.50 per 1,000 searches.** No login or API key is needed.

This Actor reads Google Flights result pages. It is not affiliated with Google and is not an official API.

### Watch the walkthrough

New York to London goes in, and every flight comes out as a row with local times. In this 75-second demo on real runs, one search returns 20 flights in 3 seconds and a month of departure days shows the cheapest day to fly.

https://youtu.be/IeIzIX1f_hc

### Start with a small run

The form opens with two routes, **JFK-LAX** and **London to Rome**, departing **30 days after the run date**, and 10 flights per search. Start it as it is, or replace the routes with your own.

1. Enter **Routes**, one per line.
2. Choose **Departure dates**: a date, a range, or `+30` for 30 days after the run date.
3. Start the run. Open **Flights** for the itineraries and **Searches** for the cheapest fare per route and date.
4. Download either table as CSV, Excel or JSON.

On 5 November 2026 this run saved 20 flights in 3 to 6 seconds.

### Choose a ready-to-run example

| Example | What you get |
| --- | --- |
| [Track Google Flights prices for a route every day](https://apify.com/cleanscrape/google-flights-scraper/examples/track-google-flights-prices-daily) | Schedule it daily: JFK to LAX 30 days ahead, saving only flights that are new or cheaper than last time |
| [Find the cheapest day to fly in the next month](https://apify.com/cleanscrape/google-flights-scraper/examples/cheapest-day-to-fly-next-month) | New York to London for each departure day 30 to 60 days ahead, the cheapest flight per day, as a price calendar |
| [Round-trip flights with return options](https://apify.com/cleanscrape/google-flights-scraper/examples/round-trip-flights-with-returns) | London to Barcelona for 4 days, with the return flights for the 2 cheapest outbound options |
| [Compare nonstop business-class fares](https://apify.com/cleanscrape/google-flights-scraper/examples/nonstop-business-class-fares) | Nonstop business-class flights from New York to London, cheapest first, with aircraft and flight numbers |
| [Compare flight prices from several cities](https://apify.com/cleanscrape/google-flights-scraper/examples/flight-prices-from-several-cities) | Chicago, Dallas and Los Angeles to Cancun, to see which departure city is cheapest |

### Routes

| You write | The Actor searches |
| --- | --- |
| `JFK-LAX` | One airport to another |
| `NYC-LON` | All New York airports to all London airports (city codes) |
| `London to Rome`, `Helsinki → Paris` | Cities by name. Big cities use all their airports. |
| `jfk lax` | Same as `JFK-LAX` |

City codes that cover several airports: NYC, LON, PAR, TYO, OSA, SEL, BJS, CHI, WAS, YTO (Toronto), SAO, RIO, BUE, MIL, ROM, MOW. DTT, YMQ, STO, REK and JKT work too and use their main airport. A city name that matches one airport uses that airport, and the run says which one it picked. Use a code when you want a particular airport.

### Dates

| You write | Departure dates |
| --- | --- |
| `2026-12-08` | That day |
| `2026-12-01..2026-12-07` | Each day in the range (7 searches per route) |
| `+30` | 30 days after the run date: a scheduled run always looks the same distance ahead |
| `+30..+36` | A week, starting 30 days after the run date |

Every route is searched for every date. Past dates and dates more than 330 days ahead are skipped with a note. **Maximum searches** (default 200) caps the route and date combinations in one run.

### Round trips

Choose **Round trip** and a **Trip length** in days. The outbound flights are priced as Google shows them for the whole trip. Set **Return flights for the cheapest outbound flights** to 1-5 to also save the return flights Google offers with each of the cheapest outbound flights; return rows have `leg: return` and `outboundFlightNumbers`, and their price is the total for that outbound and return together.

### Fare tracking

Turn on **Only new flights or lower prices**, give it a **Tracking name** (optional), and schedule the run, for example daily. Each run then saves a flight only when:

- it wasn't saved before for the same route and dates, or
- its price is lower than last time (`previousPrice` and `priceChange` show by how much).

The **Searches** table still gets a row for every search, with `cheapestPrice`, `previousCheapestPrice` and `cheapestChange`, so you can see the trend even when no flight is new. The history is kept for 60 days in your own Apify account. Use `+N` dates so each run looks the same distance ahead.

### Filters and options

| Setting | What it does |
| --- | --- |
| Passengers | Adults, children, infants in seat or on lap (up to 9) |
| Cabin | Economy, premium economy, business or first |
| Stops | Any, nonstop only, 1 or 2 stops at most |
| Airlines | Codes such as BA or UA, or ONEWORLD, SKYTEAM, STAR_ALLIANCE |
| Currency and country | 22 currencies; the country (point of sale) can change prices |
| Flights per search | Up to 100 |
| Which flights to keep | Cheapest first (default), Google's order, shortest, or earliest |

### Output

**Flights** (one row per itinerary):

| Field | Example |
| --- | --- |
| `route`, `from`, `to` | `JFK-LAX`, `JFK`, `LAX` |
| `departure`, `arrival` | `2026-12-08T21:35:00-05:00`, `2026-12-09T00:57:00-08:00` |
| `duration`, `stops`, `layovers` | `6 h 22 min`, `1`, `MUC 2 h 20 min` |
| `airlines`, `flightNumbers`, `aircraft` | `Lufthansa`, `LH2485, LH1868`, `Airbus A320neo` |
| `price`, `currency`, `priceFor` | `295`, `USD`, `1 passenger, round trip` |
| `co2Kg`, `co2VsTypicalPercent` | `157`, `27` |
| `isNew`, `previousPrice`, `priceChange` | With tracking |
| `segments`, `layoverDetails` | Each flight and connection in detail |
| `googleFlightsUrl` | The same search on Google Flights |

Times are local to each airport and include the UTC offset, so an overnight arrival keeps its own date. `price` is Google's total for all passengers in the chosen currency.

**Searches** (one row per route and date): `cheapestPrice`, `cheapestFlight`, `nonstopCheapestPrice`, `bestPrice`, `googlePriceLevel` (low, typical or high), `googleTypicalPrice`, `googleTypicalLow`, `googleTypicalHigh`, `priceHistory` (Google's lowest price per day for about 60 days), `flightsFound`, `flightsSaved`, `status` and `note`. With tracking, also `previousCheapestPrice` and `cheapestChange`.

The run report (`SUMMARY` in the key-value store) counts searches with flights, without flights and failed.

### Use it from the API

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cleanscrape/google-flights-scraper").call(run_input={
    "routes": ["JFK-LAX", "London to Rome"],
    "departureDates": ["+30"],
    "maxFlightsPerSearch": 10,
})
for f in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f["route"], f["departure"], f["flightNumbers"], f["price"], f["currency"])
## The Searches table is the run's second dataset:
searches = client.dataset(run["storageIds"]["datasets"]["searches"]).list_items().items
```

### Pricing

**$1.00 per 1,000 flights saved** and **$0.50 per 1,000 searches** ($0.90 and $0.45 on Bronze, $0.85 and $0.425 on Silver, $0.80 and $0.40 on Gold and above). No start fee, and no charge for Apify platform usage.

- One route on one date with 20 flights: about $0.021.
- 5 routes over 7 dates with 5 flights each: 175 flights and 35 searches, about $0.19.
- Tracking one route daily for a month, with a few new or cheaper flights per day: about $0.10.

A search counts when Google Flights answers it, including an answer with no flights. Searches that fail are free, and an unchanged flight on a tracking run isn't saved or charged.

### Speed and limits

- About 0.5 to 1 second per search, up to 6 routes and dates at a time. 300 searches took about 3 minutes in tests.
- Google's results page lists about 15 to 75 flights per search. **Flights per search** (default 20, up to 100) keeps the cheapest by default.
- About 1% of flights show no price on Google; their `price` is empty.
- Departure dates up to 330 days ahead.

### Common questions

#### Is this the Google Flights API?

No. Google doesn't offer a public flights API. This Actor reads the same result pages a browser shows.

#### Can I export to Excel or CSV?

Yes. Open the run's **Flights** or **Searches** table and choose Export: CSV, Excel, JSON and more.

#### How much does it cost?

$1 per 1,000 flights plus $0.50 per 1,000 searches; one route on one date with 20 flights costs about two cents. See **Pricing** above.

#### Do I need a Google account or a proxy?

No. The Actor needs no login, cookies or API key. It uses Apify Proxy on its own only if Google refuses the run's connection.

#### Why does a run have fewer flights than Google shows?

**Flights per search** (default 20) limits each search, and **Which flights to keep** decides which ones: the cheapest by default. Raise it to 100 to keep every flight the results page lists.

#### Are prices final?

They are the prices Google Flights shows at that moment for the chosen passengers, cabin, currency and country. Bags and seat selection can cost extra, and prices change often. Book on the airline's or agency's site.

#### Can I search a whole month?

Yes: `2026-12-01..2026-12-31` searches each day of December. Set **Flights per search** to 1 to get just the cheapest flight per day; the Searches table then works as a price calendar.

#### Is it legal?

The Actor reads publicly available flight prices and schedules, with no login. You're responsible for how you use the data and for following the laws and terms that apply to you. If unsure, ask a lawyer.

### Support

Questions or a problem? Open an issue on the Issues tab or write to contact.cleanscrape@gmail.com with the run ID and the route. Never include API tokens or private data.

If the Actor was useful, an honest review on its Store page helps other people find it.

CleanScrape is independent and not affiliated with, endorsed by, or sponsored by Google. Google and Google Flights are trademarks of Google LLC. Prices and schedules belong to the airlines and are shown as Google Flights displays them.

### More tools from CleanScrape

- [ATP and WTA Tennis Rankings Scraper](https://apify.com/cleanscrape/tennis-rankings-scraper): current ATP and WTA singles, doubles and race rankings with points and movement
- [Flashscore Tennis Scraper for Match History and Stats](https://apify.com/cleanscrape/tennis-match-data): tennis results, statistics, point-by-point and head-to-head
- [Kick Sponsor Tracker for Streamers, Brands and Promo Codes](https://apify.com/cleanscrape/kick-sponsor-tracker): which Kick streamers promote which brands, with codes and broadcast hours
- [Whatnot Scraper for Listings and Live Shows](https://apify.com/cleanscrape/whatnot-scraper): Whatnot listings with prices and seller stats, and live shows
- [Whatnot Seller Tracker for Top Sellers and Sales](https://apify.com/cleanscrape/whatnot-seller-tracker): top sellers per category, items sold, sales per day and followers over time
- [TikTok Shop Product Scraper](https://apify.com/cleanscrape/tiktok-shop-product-scraper): US TikTok Shop prices, sellers and ratings
- [Bilibili Scraper (哔哩哔哩) for Videos, Comments and Danmaku](https://apify.com/cleanscrape/bilibili-scraper): Bilibili videos, danmaku, comments and creators
- [App Store Reviews & Google Play Reviews Scraper (Play Store)](https://apify.com/cleanscrape/app-store-reviews-scraper): reviews from both app stores in one table
- [Google Trends Scraper API for Interest Over Time](https://apify.com/cleanscrape/google-trends-scraper): search interest over time, by region, related queries and trending searches
- [Map Your Show Exhibitor List Scraper for Trade Shows](https://apify.com/cleanscrape/event-exhibitor-monitor): trade show exhibitor lists and booth changes
- [Shopify Product Reviews Scraper for Judge.me and Okendo](https://apify.com/cleanscrape/shopify-reviews-scraper): Judge.me and Okendo reviews from Shopify product links
- [Google News Scraper and RSS Feed Reader](https://apify.com/cleanscrape/google-news-scraper): headlines from Google News and publisher feeds
- [Google Jobs Scraper for Job Search, Listings and Salaries](https://apify.com/cleanscrape/google-jobs-scraper): job listings with salaries and apply links
- [Pinterest Scraper API](https://apify.com/cleanscrape/pinterest-scraper): keyword search, public pin links and board previews; search results may lack a pin link
- [Google Hotels Scraper for Google Travel Hotel Prices](https://apify.com/cleanscrape/google-hotels-scraper): hotel prices and booking offers for your dates
- [Meta Threads Scraper for Posts and Replies](https://apify.com/cleanscrape/threads-scraper): public Threads posts from accounts or post links
- [Likee Scraper API](https://apify.com/cleanscrape/likee-scraper): Likee videos and comments
- [Casino Bonus Checker for Affiliate and Review Sites](https://apify.com/cleanscrape/casino-bonus-checker): the casino bonus each affiliate and review site shows, with promo codes, 18+ notices and affiliate IDs
- [Video Frame Extractor for Scene Changes and Thumbnails](https://apify.com/cleanscrape/video-frame-extractor): still images from video files at scene changes, intervals or timestamps, with contact sheets
- [Career Site Job Listings from Workday, Greenhouse and Lever](https://apify.com/cleanscrape/career-site-jobs-scraper): open jobs from company career pages, with salaries and new or closed jobs per company
- [Economic Calendar Scraper for Official Release Dates](https://apify.com/cleanscrape/economic-calendar-api): central bank decisions and economic releases with dates and times
- [Audio Transcription and Speech to Text for Podcasts](https://apify.com/cleanscrape/podcast-transcription): podcast episodes and audio files to text with timestamps and subtitles

# Actor input Schema

## `routes` (type: `array`):

One route per line: airport codes (JFK-LAX), city codes for all of a city's airports (NYC-LON), or city names (London to Rome).

## `departureDates` (type: `array`):

YYYY-MM-DD, a range such as 2026-12-01..2026-12-07, or +30 for 30 days after the run date (useful for schedules). Empty: 30 days from the run date.

## `tripType` (type: `string`):

One way, or round trip with the return after Trip length.

## `tripLengthDays` (type: `integer`):

Round trips: the return is this many days after each departure date.

## `returnFlightsFor` (type: `integer`):

Round trips: for this many of the cheapest outbound flights, also save the return flights Google offers with them (each priced as the whole trip). 0 saves outbound flights only.

## `maxFlightsPerSearch` (type: `integer`):

Most flights saved for each route and date.

## `sortBy` (type: `string`):

Decides which flights fill Flights per search.

## `onlyNewOrCheaper` (type: `boolean`):

For scheduled runs: saves a flight only when it wasn't saved for the same route and dates before, or its price dropped. The Searches table shows the cheapest price against the last run.

## `watchName` (type: `string`):

Names the tracking history, for example "Winter trips". Empty: one history per set of routes and settings.

## `adults` (type: `integer`):

Passengers aged 12 and over.

## `children` (type: `integer`):

Passengers aged 2 to 11.

## `infantsInSeat` (type: `integer`):

Under 2, with their own seat.

## `infantsOnLap` (type: `integer`):

Under 2, on an adult's lap (one per adult).

## `cabin` (type: `string`):

Cabin class searched.

## `maxStops` (type: `string`):

Most stops per direction.

## `airlines` (type: `array`):

Only these airlines: two-character codes (BA, UA) or ONEWORLD, SKYTEAM, STAR_ALLIANCE. Empty: all.

## `currency` (type: `string`):

Currency of the prices.

## `country` (type: `string`):

Two-letter country code, such as us, gb or de. Prices can differ by country.

## `maxSearches` (type: `integer`):

Most route and date combinations searched in one run.

## Actor input object example

```json
{
  "routes": [
    "JFK-LAX",
    "London to Rome"
  ],
  "departureDates": [
    "+30"
  ],
  "tripType": "one_way",
  "tripLengthDays": 7,
  "returnFlightsFor": 0,
  "maxFlightsPerSearch": 10,
  "sortBy": "price",
  "onlyNewOrCheaper": false,
  "adults": 1,
  "children": 0,
  "infantsInSeat": 0,
  "infantsOnLap": 0,
  "cabin": "economy",
  "maxStops": "any",
  "currency": "USD",
  "country": "us",
  "maxSearches": 200
}
```

# Actor output Schema

## `flights` (type: `string`):

No description

## `tracking` (type: `string`):

No description

## `searches` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "routes": [
        "JFK-LAX",
        "London to Rome"
    ],
    "departureDates": [
        "+30"
    ],
    "maxFlightsPerSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("cleanscrape/google-flights-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "routes": [
        "JFK-LAX",
        "London to Rome",
    ],
    "departureDates": ["+30"],
    "maxFlightsPerSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("cleanscrape/google-flights-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "routes": [
    "JFK-LAX",
    "London to Rome"
  ],
  "departureDates": [
    "+30"
  ],
  "maxFlightsPerSearch": 10
}' |
apify call cleanscrape/google-flights-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cleanscrape/google-flights-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/d9TljW8bjXeCh0aDu/builds/A1gVFtgeutb2aA11P/openapi.json
