Google Flights Scraper & MCP [💰$1.50/1K] | Fares | Alerts avatar

Google Flights Scraper & MCP [💰$1.50/1K] | Fares | Alerts

Pricing

from $1.40 / 1,000 results

Go to Apify Store
Google Flights Scraper & MCP [💰$1.50/1K] | Fares | Alerts

Google Flights Scraper & MCP [💰$1.50/1K] | Fares | Alerts

Scrape live Google Flights fares by route and date as clean JSON — airline, price, stops, duration, layovers and CO₂. Batch routes, filter by cabin and stops, monitor fares for price drops with webhooks, or call it from AI agents as a built-in MCP server.

Pricing

from $1.40 / 1,000 results

Rating

0.0

(0)

Developer

Ahmed Jasarevic

Ahmed Jasarevic

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Categories

Share

Google Flights Scraper & MCP Server — Live Fares, Price Alerts & No Browser

Scrape Google Flights fares, airlines, stops, times, durations and CO₂ estimates for any route and date — as clean, structured JSON rows ready for dashboards, price alerts and AI agents. This Actor reads the same result set the site renders by sending Google Flights' own tfs query over plain HTTP: no browser, no headless Chrome, no Playwright. One request per route, a few seconds per run.

Google retired the public Google Flights API (QPX Express) in 2018 and never replaced it. This Actor is a working alternative: it reads the full itinerary list from google.com/travel/flights (including Google's own "best flights" ranking) and adds a built-in fare monitor mode that emits a row only when a price actually changes. It also runs as a Standby MCP server, so AI agents (Claude, Cursor, n8n AI nodes) can call search_flights, watch_route and price_history as tools.

Google Flights Fares For Fare Monitoring, Price Alerts & Travel Apps

  • Airfare price monitoring — re-check routes on a schedule and emit a row only when the cheapest fare moves
  • Flight price alerts — POST every drop or rise to a webhook so n8n, Make or Zapier can notify you
  • Google Flights API alternative — structured fares without an API key, a Google account or a retired travel API
  • Travel price comparison and route research — one request per route, batch many routes and dates in a single run
  • Building a flight-price dataset — one row per itinerary with airline, stops, times, duration and CO₂ estimate
  • AI agent and LLM flight search — a hosted MCP server exposes the fares as tools an agent can call

How It Works

How the Google Flights Scraper works: route queries become live itinerary rows with fares, segments and emissions.

The Actor encodes each route, date and filter set into Google Flights' own tfs protobuf, fetches the result page once with undici and parses the embedded ds:1 result data. Monitor mode re-checks routes and emits fare changes.

Each itinerary row includes price, currency, airline, stops, duration, departure and arrival times, segments and emissions. Use it to compare live fares or trigger alerts when a route moves.

  1. Your search (route, dates, passengers, cabin, filters) is encoded into Google Flights' own tfs query parameter — the base64 protobuf the web app itself uses.
  2. The fetched page embeds the complete result set in a ds:1 data script; the Actor parses it into flat rows (Google's best and other ranking groups, deduplicated).
  3. Everything runs on undici with a single GET per route — no browser binaries, low memory, a few seconds per search.

Input Parameters

FieldTypeRequiredDefaultNotes
modestring (select)Nosearchsearch = one-off fare search. monitor = re-check routes, diff the cheapest fare and emit changes (plus optional webhook). In monitor with no routes set, the MCP watchlist is used.
routesarrayNo—One or more searches, each { origin, destination, departureDate, returnDate? }. Takes priority over the single origin/destination fields below.
originstringNoZAG (prefill)3-letter IATA code, used when routes is empty.
destinationstringNoLHR (prefill)3-letter IATA code, used when routes is empty.
departureDatestringNo—YYYY-MM-DD, used when routes is empty.
returnDatestringNo—YYYY-MM-DD. Set for round-trip fares.
cabinClassstring (select)Noeconomyeconomy, premium-economy, business, first.
adultsintegerNo1Adult passengers (total passengers 1–9).
childrenintegerNo0Children aged 2–11.
infantsInSeatintegerNo0Infants under 2 with their own seat.
infantsOnLapintegerNo0Infants under 2 on a lap (one adult each).
currencystringNoUSDISO 4217 code — Google converts fares into this currency (USD, EUR, GBP, BAM, …).
languagestringNoenGoogle UI language (hl), e.g. en, de, hr.
maxStopsintegerNo—Maximum stops per itinerary. 0 = non-stop only. Leave empty for any number of stops.
maxPriceintegerNo—Only return itineraries up to this price in the selected currency.
carryOnBagsintegerNo0Include estimated bag fees for this many carry-on bags in the fare.
checkedBagsintegerNo0Include estimated bag fees for this many checked bags in the fare.
earliestDepartureHourintegerNo—Local airport time 0–23. Leave empty for no restriction.
latestDepartureHourintegerNo—Local airport time 0–23. Leave empty for no restriction.
lessEmissionsOnlybooleanNofalseOnly itineraries with lower CO₂ than typical for the route.
hideSeparateAndSelfTransferbooleanNofalseHide tickets split across airlines that need a self-transfer or separate bookings.
excludeBasicEconomybooleanNofalseExclude basic economy fares (usually no checked bag and no seat selection).
maxResultsPerRouteintegerNo50Cap on dataset rows pushed per route (1–1000). Google typically returns 50–150 itineraries per route.
includeUnpricedbooleanNotrueKeep itineraries Google lists without a bookable fare (price: null) or drop them.
cacheTtlSecondsintegerNo900Reuse an identical search result from the last N seconds instead of hitting Google again. Makes repeated monitor runs cheap. 0 disables the cache.
onlyChangesbooleanNotruemonitor mode only — push a record only when the cheapest price changed (or on the first check). Disable to push a snapshot every run.
webhookUrlstringNo—monitor mode only — POST a small JSON payload (route, event, previous price, current price, delta) here on every price drop or rise.
proxyConfigurationobjectNoApify Proxy (auto)On the Apify platform a proxy is applied automatically when this is left empty — Google answers bare datacenter IPs with an error. Datacenter is fine for light use; switch the group to RESIDENTIAL for heavy or scheduled monitoring.

Output Fields

One row per flight itinerary in search mode, or one row per fare-change event in monitor mode, in the run's default dataset.

FieldDescription
routeIdStable key like ZAG-LHR-2026-11-20 (or ZAG-LHR-2026-11-20_2026-11-27 for round-trips).
rank1-based position in Google's combined result list. Search mode.
sectionGoogle's ranking group: best or other. Search mode.
isCheapesttrue for the lowest-priced itinerary in the result set. Search mode.
origin, destinationRoute airport IATA codes.
departureDate, returnDateTravel dates (returnDate is null for one-way).
tripTypeone-way or round-trip.
cabinClassCabin searched.
price, currencyTotal fare per passenger in the selected currency; null when Google lists no bookable price. Search mode.
typeMarketing carrier IATA code (e.g. KL, LH) or multi for mixed-airline itineraries.
airlinesAirline display names.
stopsNumber of stops.
durationMinutesTotal duration, gate to gate, including layovers.
layoverMinutesTotal layover time in minutes.
departure, arrivalObjects with airport, airportName, date and local time of the first departure / final arrival.
segmentsEvery leg: airports, date/time, duration, plane type, carrier code, carrier name and flight number.
emissionsGrams, typicalEmissionsGramsEstimated CO₂ for this itinerary vs typical for the route.
eventMonitor mode: first_seen, price_drop, price_rise, unchanged or no_prices.
previousPrice, currentPrice, priceDelta, priceDeltaPctMonitor mode: cheapest fare before and now, and the change in absolute and percentage terms.
sourceUrlThe Google Flights URL (tfs query) that produced this row.
scrapedAtISO 8601 timestamp.
checkedAtMonitor mode: ISO 8601 timestamp of the check.

Example Input

A single route, search mode:

{
"origin": "ZAG",
"destination": "LHR",
"departureDate": "2026-12-05",
"currency": "EUR"
}

Batch routes with filters:

{
"routes": [
{ "origin": "ZAG", "destination": "LHR", "departureDate": "2026-12-05" },
{ "origin": "ZAG", "destination": "LHR", "departureDate": "2026-12-12", "returnDate": "2026-12-19" }
],
"cabinClass": "economy",
"maxStops": 1,
"earliestDepartureHour": 6,
"latestDepartureHour": 20,
"checkedBags": 1,
"maxResultsPerRoute": 100
}

Monitor mode with a webhook:

{
"mode": "monitor",
"routes": [{ "origin": "ZAG", "destination": "LHR", "departureDate": "2026-12-05" }],
"currency": "EUR",
"cacheTtlSeconds": 600,
"webhookUrl": "https://your-app.com/hooks/flight-price"
}

Example Output

Search mode — one itinerary row (abridged):

{
"routeId": "ZAG-LHR-2026-12-05",
"rank": 1,
"section": "best",
"isCheapest": true,
"origin": "ZAG",
"destination": "LHR",
"departureDate": "2026-12-05",
"returnDate": null,
"tripType": "one-way",
"cabinClass": "economy",
"price": 102,
"currency": "EUR",
"type": "KL",
"airlines": ["KLM", "Air Serbia"],
"stops": 1,
"durationMinutes": 305,
"layoverMinutes": 75,
"departure": { "airport": "ZAG", "airportName": "Franjo Tuđman Airport", "date": "2026-12-05", "time": "16:35" },
"arrival": { "airport": "LHR", "airportName": "Heathrow Airport", "date": "2026-12-05", "time": "20:40" },
"segments": [
{ "fromAirport": "ZAG", "toAirport": "AMS", "departureTime": "16:35", "arrivalTime": "18:40", "durationMinutes": 125, "planeType": "Embraer 190", "flightNumber": "KL 1968" },
{ "fromAirport": "AMS", "toAirport": "LHR", "departureTime": "19:55", "arrivalTime": "20:40", "durationMinutes": 45, "planeType": "Boeing 737", "flightNumber": "KL 1017" }
],
"emissionsGrams": 128000,
"typicalEmissionsGrams": 141000,
"sourceUrl": "https://www.google.com/travel/flights?tfs=...&hl=en&curr=EUR",
"scrapedAt": "2026-10-17T09:12:44.000Z"
}

Monitor mode — one fare-change row:

{
"routeId": "ZAG-LHR-2026-12-05",
"event": "price_drop",
"previousPrice": 161,
"currentPrice": 138,
"priceDelta": -23,
"priceDeltaPct": -14.29,
"currency": "EUR",
"origin": "ZAG",
"destination": "LHR",
"departureDate": "2026-12-05",
"returnDate": null,
"tripType": "one-way",
"cabinClass": "economy",
"totalResults": 48,
"pricedResults": 45,
"checkedAt": "2026-10-17T09:12:44.000Z"
}

Automate Fare Monitoring With Schedules, Webhooks & n8n

  • Schedule the Actor (Apify scheduler or cron) in monitor mode — every 6–12 hours works well for fare tracking. Recurring runs build the price history the price_history MCP tool reads.
  • Webhooks — set webhookUrl and the same record is POSTed on every drop or rise, so n8n, Make or Zapier can send an email, Slack or Telegram alert.
  • Apify API — start runs and pull datasets programmatically with the JavaScript or Python client (results in the run's dataset).
  • Export — download the dataset as JSON, CSV or Excel from the console, or pull it from the Apify dataset API.
  • AI agents — connect any MCP client to the hosted Standby endpoint (see below).

Frequently Asked Questions

Why use this Actor instead of the official Google Flights API?

There is no official public Google Flights API — Google shut down QPX Express in 2018 and never replaced it. This Actor reads the same public result set the site shows (including Google's own "best flights" ranking), returns it as structured JSON, and adds a fare-monitor mode that only emits rows when a price changes. It runs as plain HTTP (no browser) and needs no API key, no Google account and no OAuth.

What are alternatives to Google Flights for programmatic fare data?

Licensed or partner APIs are the usual alternatives: Amadeus and Sabre/Travelport (GDS), Duffel and Kiwi.com (modern aggregators), and Skyscanner or KAYAK (affiliate/meta-search). They give SLAs and negotiating terms but require commercial agreements. Scraping Google Flights is the self-serve route when you want what travelers actually see without a contract. On Apify, other Google Flights Actors exist too (see Related Actors).

Can I monitor flight prices and get price-drop alerts automatically?

Yes. Set mode to monitor, list your routes and schedule the Actor. Each run re-checks the routes, diffs the cheapest fare against the previous check and emits only price_drop / price_rise records (first_seen on the first check). Set webhookUrl and the record is POSTed to your endpoint on every change. Price history for each watched route is kept in the Actor's key-value store and read by the price_history MCP tool.

Does this work without a browser or an API key?

Yes. The Actor encodes the search into Google Flights' own tfs query and fetches the page over HTTP with undici — no headless Chrome, no Playwright, no browser binaries. There is no API key, login or quota to manage. On the Apify platform a proxy is applied automatically so the first run works.

Can AI agents call this Actor (MCP)?

Yes. The Actor runs in Standby mode and exposes a Model Context Protocol endpoint at POST /mcp with three tools: search_flights (live fare search), watch_route (manage the fare watchlist) and price_history (recorded cheapest-fare history). Any MCP client can connect with the Actor's standby URL and an Apify API token.

How much does it cost?

Pay-per-event: one result event per dataset row in search mode ($1.50 per 1,000 rows), one route-check per route re-checked in monitor mode ($4 per 1,000 checks), one search-flight event per live MCP search_flights call ($8 per 1,000 calls) and one tool-call per MCP watch_route add/remove ($1 per 1,000 calls), plus an Actor-start event scaled by memory. The cacheTtlSeconds cache (default 900 s) keeps repeated monitor runs cheap.

For AI Agents & LLM Apps

Purpose: return priced Google Flights itineraries for a route and date (search mode), or cheapest-fare change events for watched routes (monitor mode), as JSON rows.

Minimal input (search):

{ "origin": "ZAG", "destination": "LHR", "departureDate": "2026-12-05" }

Variant — monitor a route with a webhook:

{
"mode": "monitor",
"routes": [{ "origin": "ZAG", "destination": "LHR", "departureDate": "2026-12-05" }],
"webhookUrl": "https://your-app.com/hooks/flight-price"
}

MCP tools (Standby endpoint, POST /mcp): search_flights, watch_route, price_history.

Output fields (default dataset): routeId, rank, section, isCheapest, origin, destination, departureDate, returnDate, tripType, cabinClass, price, currency, type, airlines, stops, durationMinutes, layoverMinutes, departure, arrival, segments, emissionsGrams, typicalEmissionsGrams, event, previousPrice, currentPrice, priceDelta, priceDeltaPct, sourceUrl, scrapedAt, checkedAt.

Behaviors an agent should know:

  • routes takes priority over the single origin/destination/departureDate fields when both are set.
  • In search mode with no routes at all, a demo ZAG → LHR search runs automatically (~45 days out) so the run always returns data.
  • In monitor mode with no routes, the routes registered on the MCP watchlist are used; if the watchlist is empty the run fails with "No routes to monitor".
  • cacheTtlSeconds defaults to 900; set 0 to force a fresh fetch. Monitor runs reuse Google's last result inside that window.
  • maxResultsPerRoute defaults to 50 (hard cap 1000); Google usually returns 50–150 itineraries per route.
  • In monitor mode onlyChanges defaults to true: the first check ever for a route is always emitted (first_seen); later unchanged checks are skipped unless you set onlyChanges to false.
  • Passenger total (adults + children + infantsInSeat + infantsOnLap) must be 1–9; each infant on lap needs an adult.
  • Round-trip only — set returnDate. Multi-city is not supported by the underlying query.
  • On the Apify platform a proxy is applied automatically when proxyConfiguration is empty.
  • The Actor's standby MCP endpoint is POST /mcp on the standby URL; GET / returns service info and the tool list.

Billing: pay-per-event. Search runs charge one result event per row ($1.50 / 1,000); monitor runs charge one route-check per route re-checked ($4 / 1,000) even when nothing changed; live MCP search_flights charges search-flight ($8 / 1,000 calls) and MCP watch_route add/remove charges tool-call ($1 / 1,000). An Actor-start event is charged based on memory. Budget monitor runs by the number of routes, not by the number of changes.

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Google. It reads only publicly available pages on google.com/travel/flights — no login, no account and no access to private data. It does not book, hold or purchase anything; fares are a snapshot at the moment of the check and can change before booking. You are responsible for how you use the data and for complying with Google's Terms of Service and any applicable law.

SEO Keywords

google flights scraper, google flights api alternative, scrape google flights, google flights price tracker, flight price monitoring, flight price alerts, track airfare prices, google flights mcp server, flight fares json, flight data api, airfare data extraction, cheapest flight api, google flights api no key, google flights without api, flight price drop alert, flight webhook alerts, round trip flight scraper, one way flight fares, google flights co2 emissions, google qpx express alternative, travel fare api, flight monitoring automation, google flights dataset, airfare price history, flight price api