# Google Flights Scraper: Cheapest Dates, Prices & Price History (`euroscrape/google-flights-prices`) Actor

Flight prices from Google Flights for any route and dates: airlines, times, stops, layovers, CO2, Google's typical price range and price history, cheapest day to fly (price calendar), round trips and price-drop alerts.

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

## Pricing

from $1.40 / 1,000 flight delivereds

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: Cheapest Dates, Prices & Price History

**Get flight prices from Google Flights for any route and dates, and find the cheapest day to fly.** One run can check many routes over many dates, one way or round trip, and returns clean, comparable flights plus a free price calendar per route.

![Fare calendar: the cheapest day to fly, from real Google Flights data](https://raw.githubusercontent.com/EuroScrape/apify-actors/main/assets/demo-google-flights-prices.gif)

- ✈️ **Every flight detail**: price, airlines, flight numbers, departure and arrival times, duration, stops and layovers, aircraft, legroom, CO2 emissions vs. typical.
- 📅 **Cheapest dates**: check up to 60 departure dates per route and get the cheapest day, the most expensive one and the full calendar.
- 📈 **Google's price insights**: is the price low, typical or high? The typical price range and, when Google shows it, about 60 days of price history for the route.
- 🔔 **Price-drop alerts**: schedule it with a monitor name and get alerts on Telegram, Discord, Slack or a webhook when a fare falls.

### ✨ Why this Actor

| | |
|---|---|
| 📅 **Price calendar built in** | `numberOfDates` × `daysBetweenDates` (every day, or the same weekday each week), one way or round trips with a fixed trip length. |
| 🗺️ **Many routes in one run** | Airport codes (`CDG-BCN`) or city codes that cover all airports (`PAR-LIS`, `LON-NYC`). |
| 📈 **Price context, not just prices** | Google's typical range and price history tell you whether to book now or wait. |
| 🌱 **CO2 per flight** | Estimated emissions and the difference vs. the typical flight on the route. |
| 🚆 **Train alternative** | When Google suggests a train for the route, the summary shows it with its duration. |
| 💸 **Cheap calendars** | `cheapestOnly: true` returns one flight per route and date, so a 30-day calendar costs about $0.06. |

### 🎯 Use cases

- **Travellers and deal hunters**: the cheapest day to fly in the next weeks, with an alert when the fare drops.
- **Travel agencies and travel media**: fare calendars and price levels for popular routes, refreshed daily.
- **Corporate travel and finance teams**: typical fares, CO2 per itinerary and train alternatives for policy and budgets.
- **Analysts**: route pricing over time, airline price positioning, nonstop vs. connecting fares.

### 🚀 Examples

**Cheapest day to fly Lisbon → Amsterdam in the next weeks (nonstop):**

```json
{
  "routes": ["LIS-AMS"],
  "departureDate": "2026-11-02",
  "numberOfDates": 30,
  "maxStops": "nonstop",
  "cheapestOnly": true
}
```

**Weekend round trips from Paris to Barcelona, every Friday for 8 weeks, 2 adults:**

```json
{
  "routes": ["PAR-BCN"],
  "departureDate": "2026-11-06",
  "numberOfDates": 8,
  "daysBetweenDates": 7,
  "tripLengthDays": 2,
  "adults": 2
}
```

**Daily price-drop alert on a long-haul trip:**

```json
{
  "routes": ["LON-NYC"],
  "departureDate": "2027-03-12",
  "tripLengthDays": 9,
  "cabinClass": "premium_economy",
  "cheapestOnly": true,
  "monitorName": "london-nyc-march",
  "alertOnPriceDropPct": 5,
  "telegramBotToken": "123456:ABC…",
  "telegramChatId": "123456789"
}
```

### 📦 Output

**A flight** (real data):

```json
{
  "type": "flight",
  "route": "PAR-BCN",
  "departureDate": "2026-11-12",
  "returnDate": "2026-11-16",
  "tripType": "round_trip",
  "adults": 1,
  "cabinClass": "economy",
  "currency": "EUR",
  "price": 106,
  "priceLevel": "typical",
  "typicalPriceLow": 50,
  "typicalPriceHigh": 130,
  "airline": "Vueling",
  "flightNumbers": ["VY 8061"],
  "departureAirport": "CDG",
  "arrivalAirport": "BCN",
  "departure": "2026-11-12T09:50",
  "arrival": "2026-11-12T11:45",
  "durationMinutes": 115,
  "stops": 0,
  "aircraft": ["Airbus A320"],
  "co2Kg": 88,
  "co2TypicalKg": 84,
  "co2DiffPct": 5,
  "legs": ["…"],
  "googleFlightsUrl": "https://www.google.com/travel/flights/search?tfs=…"
}
```

**The route summary** (free; real data, Lisbon → Amsterdam, nonstop, 2 adults, prices in USD):

```json
{
  "type": "routeSummary",
  "route": "LIS-AMS",
  "datesChecked": 10,
  "cheapestDepartureDate": "2026-11-11",
  "cheapestPrice": 162,
  "mostExpensiveDate": "2026-11-02",
  "calendar": [
    { "departureDate": "2026-11-02", "cheapestPrice": 362 },
    { "departureDate": "2026-11-03", "cheapestPrice": 234 },
    { "departureDate": "2026-11-04", "cheapestPrice": 183 },
    "…",
    { "departureDate": "2026-11-11", "cheapestPrice": 162 }
  ],
  "typicalPriceLow": 180,
  "typicalPriceHigh": 485
}
```

The dataset has two views: **Flights** and **Price calendar**.

### 💰 Pricing

Pay per event:

| Event | Price |
|---|---|
| Run start | $0.003 |
| Flight delivered | $0.002 |
| Route summaries (calendar, price history) | free |

A 30-day calendar for one route with `cheapestOnly` costs about $0.06. Apify subscribers pay less: −10% (Starter), −20% (Scale), −30% (Business). Set a **maximum cost per run** in the run options and the Actor stops cleanly when it's reached.

### ❓ FAQ

**Are prices per person?** No: `price` is the total for all passengers (round-trip total for round trips). `pricePerPassenger` divides it by the number of passengers.

**Which codes can I use?** IATA airport codes (`CDG`, `ORY`, `JFK`) or city codes covering all airports of a city (`PAR`, `LON`, `NYC`, `ROM`, `MIL`).

**How is `priceLevel` computed?** Like Google: the lowest price of the search compared with Google's typical price range for that trip.

**Why is `priceHistory` sometimes empty?** Google only shows the price history for some searches. The summary takes it from the first date that has one.

**Can I book from the data?** The `googleFlightsUrl` opens the same search on Google Flights, where the booking options are shown.

**Is it affiliated with Google?** No. The Actor reads the public Google Flights pages, at a moderate pace, like a visitor would.

### ⭐ Your feedback

If this Actor saves you time, a short review on Apify Store helps other users find it. Missing a field or a filter? Say it in your review: the most requested features are added first.

### 🔗 More from EuroScrape

- [Google Hotels Scraper: Prices from Every Booking Site](https://apify.com/euroscrape/google-hotels-prices): hotel prices for any destination and dates, with the price on every booking site, rate parity, price calendars and alerts.
- [App Store Reviews Scraper + Google Play Reviews](https://apify.com/euroscrape/app-reviews): reviews from both stores in 58 countries, rating by version and country, alerts on new negative reviews.
- [EU Second-Hand Marketplaces Scraper: Vinted, OLX & More](https://apify.com/euroscrape/eu-marketplace-deals): one search on the top second-hand marketplace of 18 European countries, prices in €, cheapest country and resale margin.
- [EU Public Tenders Scraper: TED, BOAMP & Awards](https://apify.com/euroscrape/eu-public-tenders): open tenders and contract awards from all of Europe (TED) and France (BOAMP, DECP), with winners per lot, values in € and daily alerts.
- [Website Tech Stack Detector: 280+ Technologies, Leads & Signals](https://apify.com/euroscrape/website-intelligence): technologies, company identity, contacts and sales signals for any website.
- [Kleinanzeigen Scraper: Deal Finder & Price-Drop Alerts](https://apify.com/euroscrape/kleinanzeigen-scraper): German classifieds with view counts, full seller details and instant alerts.
- [French Companies Scraper (SIRENE)](https://apify.com/euroscrape/france-companies): every French company by activity, area and size, with verified websites and emails.
- [UK Companies House Scraper](https://apify.com/euroscrape/uk-companies): UK companies by SIC code and location, with directors, websites and emails.
- [Impressum & Legal Notice Scraper (EU)](https://apify.com/euroscrape/company-identity): legal identity, registry numbers and VAT IDs from any website, registry-verified.
- [Vinted Scraper: 26 Countries, Deals, Alerts & Seller Data](https://apify.com/euroscrape/vinted-scraper): search Vinted across 26 countries, prices with buyer fees, seller ratings, cheapest-country comparison and instant alerts on new listings.
- [EU VAT Number Validator (VIES): Bulk Check, Proof & Alerts](https://apify.com/euroscrape/vat-validator): validate VAT numbers in bulk against the EU's official registry, with consultation proof for tax audits and alerts when a customer's number becomes invalid.
- [France Real Estate Sold Prices (DVF): €/m², Sales & Trends](https://apify.com/euroscrape/france-property-prices): every property sale registered by the French State — real prices, €/m², addresses, GPS, market trends per city and alerts on new sales.

# Actor input Schema

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

Origin and destination as 3-letter airport or city codes, e.g. "CDG-BCN", "PAR-LIS" (all Paris airports), "LON-NYC".

## `departureDate` (type: `string`):

First departure date (YYYY-MM-DD). Default: in 30 days.

## `numberOfDates` (type: `integer`):

Search several departure dates in a row, e.g. 30 = every day of the next month, to find the cheapest day to fly.

## `daysBetweenDates` (type: `integer`):

1 = every day, 7 = same weekday every week.

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

0 = one way. For example 7 = return one week after each departure date.

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

Number of adult passengers. Prices are totals for all passengers.

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

Number of children (2-11 years).

## `cabinClass` (type: `string`):

Travel class.

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

Maximum number of stops.

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

Currency of all prices.

## `countryCode` (type: `string`):

Country of the traveller (Google "gl" parameter), e.g. "us", "gb", "fr", "de". It can change prices and booking options.

## `language` (type: `string`):

Language of airport names, e.g. "en", "fr", "de".

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

Google's best flights come first, then other flights.

## `cheapestOnly` (type: `boolean`):

One flight per route and date: the cheapest. Ideal for price calendars and alerts (fewer items, lower cost).

## `includeSummary` (type: `boolean`):

Cheapest date, price calendar, cheapest price per airline, Google's typical price range, price history and the train alternative when Google shows one.

## `monitorName` (type: `string`):

Set a name and schedule the Actor (e.g. daily): each flight then shows its price change since the previous run, and you can get alerts on price drops.

## `alertOnPriceDropPct` (type: `integer`):

Monitoring: send an alert when a flight's price drops by this percentage or more.

## `telegramBotToken` (type: `string`):

Alerts on Telegram: create a bot with @BotFather and paste its token.

## `telegramChatId` (type: `string`):

Your chat ID (send a message to your bot, then open api.telegram.org/bot<token>/getUpdates).

## `discordWebhookUrl` (type: `string`):

Alerts in a Discord channel: Channel settings → Integrations → Webhooks.

## `slackWebhookUrl` (type: `string`):

Alerts in Slack: create an Incoming Webhook for your channel.

## `webhookUrl` (type: `string`):

Receives one POST per run with all price drops (Make, Zapier, n8n…).

## `maxNotifications` (type: `integer`):

Maximum number of alert messages per run.

## Actor input object example

```json
{
  "routes": [
    "PAR-BCN",
    "LON-NYC"
  ],
  "numberOfDates": 3,
  "daysBetweenDates": 1,
  "tripLengthDays": 0,
  "adults": 1,
  "children": 0,
  "cabinClass": "economy",
  "maxStops": "any",
  "currency": "EUR",
  "countryCode": "us",
  "language": "en",
  "maxFlightsPerSearch": 5,
  "cheapestOnly": false,
  "includeSummary": true,
  "alertOnPriceDropPct": 10,
  "maxNotifications": 30
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per flight, route and date.

## `calendar` (type: `string`):

Cheapest price per route and departure date.

## `runSummary` (type: `string`):

Counters for this run (items found, output, errors).

# 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": [
        "PAR-BCN",
        "LON-NYC"
    ],
    "numberOfDates": 3,
    "maxFlightsPerSearch": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("euroscrape/google-flights-prices").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": [
        "PAR-BCN",
        "LON-NYC",
    ],
    "numberOfDates": 3,
    "maxFlightsPerSearch": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("euroscrape/google-flights-prices").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": [
    "PAR-BCN",
    "LON-NYC"
  ],
  "numberOfDates": 3,
  "maxFlightsPerSearch": 5
}' |
apify call euroscrape/google-flights-prices --silent --output-dataset

```

## MCP server setup

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

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/XqZqTlk40mjIq5VYH/builds/6CbgirrE5jG4NOZ00/openapi.json
