# Flight Price Tracker: Google Flights Fares by Route (`scrapemint/flight-price-tracker`) Actor

Track Google Flights fares by route and date. Returns airline, stops, duration, price, and cabin class for every option. Filter by max stops, max price, preferred airlines, nonstop only. Schedule daily to catch price drops. JSON output. Pay per item.

- **URL**: https://apify.com/scrapemint/flight-price-tracker.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Automation, E-commerce, Travel
- **Stats:** 52 total users, 9 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$10.00 / 1,000 flight price quotes

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Flight Price Tracker: Google Flights Fares by Route and Date

Track live Google Flights fares for any route and date. Every row has airline, stops, total duration, price, cabin class, and stop airports. Works for every IATA airport pair (JFK to LHR, SFO to NRT, LHR to DXB). Filter by max stops, max price, preferred airlines, nonstop only. Pay per fare row.

**Ranks for:** flight price tracker, Google Flights scraper, cheap flight alerts, airline fare monitor, route price history, travel deal API, flight price history, nonstop flight search.

***

### How it works

```mermaid
flowchart LR
    A[Route + dates] --> B[Google Flights search]
    B --> C[Parse fare list]
    C --> D[Filter stops, price,<br/>airline]
    D --> E[JSON fare rows]
```

Paste a route like JFK-LHR and a date range. One row per fare option.

***

### Who uses this

| Role | Use case |
|---|---|
| **Travel blogger** | Publish daily best fare tables by route. |
| **Mileage hacker** | Watch for saver awards priced below a threshold. |
| **Corporate travel ops** | Audit paid fares against market median for the route. |
| **Deal site** | Power a "cheap flights from your city" feed without Skyscanner Partner approval. |
| **Fintech travel app** | Feed live price history into a rewards dashboard. |

***

### Quick start

**One way deal watch:**

```json
{
  "routes": ["JFK-LHR", "JFK-CDG", "JFK-FCO"],
  "departDaysAhead": 21,
  "dateWindowDays": 7,
  "maxPriceUsd": 500,
  "maxStops": 1
}
```

**Round trip, specific dates:**

```json
{
  "routes": ["SFO-NRT"],
  "departureDates": ["2026-06-15"],
  "returnDates": ["2026-06-29"],
  "tripType": "round_trip",
  "cabinClass": "business"
}
```

**Nonstop only, preferred airline:**

```json
{
  "routes": ["LHR-DXB"],
  "preferredAirlines": ["BA", "EK"],
  "maxStops": 0
}
```

***

### Output flags

```mermaid
flowchart LR
    A[Fare row] --> B[nonstop]
    A --> C[cheap<br/>under $200]
    A --> D[premium_fare<br/>over $2000]
    A --> E[short_haul<br/>under 3h]
    A --> F[long_haul<br/>over 10h]
    A --> G[cabin_business<br/>cabin_first]
```

Flags let pipelines filter without parsing titles again.

***

### Flight tracker vs the alternatives

| | Skyscanner Partner API | Amadeus self service | **This actor** |
|---|---|---|---|
| Access | Affiliate approval | Free account + keys | Anyone |
| Setup | Weeks | One hour | 60 seconds |
| Route coverage | Global | Global | Global |
| Price history | No | No | Yes via dedupe off |
| Schedule | Yes | Yes | Every 60s |
| JSON output | Yes | Yes | Yes |
| Pricing | Rev share | Tiered by query | Pay per item |

***

### Sample output

```json
{
  "source": "google_flights",
  "origin": "JFK",
  "destination": "LHR",
  "departureDate": "2026-05-15",
  "returnDate": null,
  "tripType": "one_way",
  "cabinClass": "economy",
  "passengers": 1,
  "airline": "British Airways",
  "airlineCode": "BA",
  "stops": 0,
  "durationMinutes": 425,
  "durationLabel": "7h 5m",
  "priceTotal": 487,
  "pricePerPax": 487,
  "priceCurrency": "USD",
  "departTime": "6:00 PM",
  "arriveTime": "6:25 AM",
  "stopAirports": [],
  "flags": ["nonstop", "long_haul"],
  "sourceUrl": "https://www.google.com/travel/flights?..."
}
```

***

### Pricing

First 2 fares per run are free. After that pay per fare row. A daily snapshot of 10 routes and 14 days lands under $5.

***

### FAQ

**Do I need a Google API key?**
No. The actor reads public Google Flights pages.

**Can I track price changes over time?**
Yes. Set `dedupe: false` and schedule every hour. Each run writes a fresh snapshot with a `scrapedAt` timestamp so you build your own price history table.

**Which airports are supported?**
Every airport with a valid three letter IATA code. JFK, LHR, SFO, NRT, CDG, DXB, SIN, SYD, GRU and so on.

**Does Google block scrapers?**
Google Flights is less aggressive than OTAs but still rate limits. The actor ships with residential proxy by default. Lower concurrency if you run at high volume.

**Is the price total or per passenger?**
Price is the total for the party. `pricePerPax` is the total divided by passenger count.

**Can I get business and first class fares?**
Yes. Set `cabinClass` to premium\_economy, business, or first.

**Is scraping Google Flights allowed?**
This actor reads the same public HTML a browser sees. Respect the site's terms and rate limit sensibly.

***

### Related Scrapemint actors

- **Viator Tours Intelligence: Activities, Prices, Reviews** for tours and activities by city
- **Airbnb Market Intelligence** for short term rental data
- **TripAdvisor Review Intelligence** for hotel and restaurant reviews

Stack these to cover every public travel surface from research to booking.

# Actor input Schema

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

IATA route pairs like JFK-LHR, SFO-NRT, LHR-JFK. Three letter airport codes separated by a dash. One row per airline option on each route and date.

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

ISO dates like 2026-05-15. Leave blank to use departDaysAhead and dateWindowDays for a rolling window.

## `returnDates` (type: `array`):

Optional return dates aligned with departureDates. Leave blank for one way searches.

## `departDaysAhead` (type: `integer`):

Used when departureDates is blank. Starts the rolling window this many days from today.

## `dateWindowDays` (type: `integer`):

Used when departureDates is blank. Number of consecutive days to scan starting at departDaysAhead.

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

one\_way or round\_trip. round\_trip uses return dates if provided, otherwise adds 7 nights to each departure.

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

economy, premium\_economy, business, or first.

## `passengers` (type: `integer`):

Number of adult passengers. Price per the whole party.

## `maxStops` (type: `integer`):

0 for nonstop only, 1 for up to one stop, 2 for any itinerary. Default 2.

## `maxPriceUsd` (type: `number`):

Drop fares above this. Use with a daily schedule for price drop alerts.

## `minPriceUsd` (type: `number`):

Drop fares below this. Useful to filter out error fare noise.

## `preferredAirlines` (type: `array`):

IATA airline codes like BA, DL, UA, LH. Keeps only flights operated by listed carriers. Leave empty for all.

## `excludeAirlines` (type: `array`):

IATA airline codes to drop. Useful to avoid a carrier you never book.

## `maxItemsPerRoute` (type: `integer`):

Cap on fares pushed per route and date combination. Google Flights typically lists 8 to 15 options.

## `maxItemsTotal` (type: `integer`):

Hard cap on rows per run. Controls cost.

## `dedupe` (type: `boolean`):

Skip fares seen on previous runs. Turn off to build your own price history dataset.

## `proxyConfiguration` (type: `object`):

Apify proxy. Residential recommended for hourly schedules.

## Actor input object example

```json
{
  "routes": [
    "JFK-LHR"
  ],
  "departureDates": [],
  "returnDates": [],
  "departDaysAhead": 30,
  "dateWindowDays": 7,
  "tripType": "one_way",
  "cabinClass": "economy",
  "passengers": 1,
  "maxStops": 2,
  "maxPriceUsd": 0,
  "minPriceUsd": 0,
  "preferredAirlines": [],
  "excludeAirlines": [],
  "maxItemsPerRoute": 20,
  "maxItemsTotal": 200,
  "dedupe": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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-LHR"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/flight-price-tracker").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-LHR"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/flight-price-tracker").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-LHR"
  ]
}' |
apify call scrapemint/flight-price-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapemint/flight-price-tracker"
        }
    }
}

```

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/zWCgFtvVtkGuuHJfz/builds/XfHcnbfZ3tByXGx5Q/openapi.json
