Google Flights Scraper & Price Monitor API 💰$2/1k avatar

Google Flights Scraper & Price Monitor API 💰$2/1k

Pricing

from $1.40 / 1,000 itineraries

Go to Apify Store
Google Flights Scraper & Price Monitor API 💰$2/1k

Google Flights Scraper & Price Monitor API 💰$2/1k

Scrape Google Flights itineraries and the cheapest fare per route and date, with exact prices, legs, aircraft, CO2 and a 60-day price history. Monitor mode outputs only fares that changed since the last run. No browser, no login.

Pricing

from $1.40 / 1,000 itineraries

Rating

0.0

(0)

Developer

ProgrammX

ProgrammX

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

20 days ago

Last modified

Share

Keywords: google flights scraper, google flights api, flight price scraper, google flights price history, airfare monitor, cheapest flight finder api, flight price tracker, google flights scraper no login, fare alert feed, travel price data, flight itinerary scraper, google flights price insights, round trip flight prices

Scrape Google Flights itineraries and fares for any route and date grid: price, exact price to the cent, airlines, flight numbers, departure and arrival times, duration, stops, layovers, aircraft, legroom and CO2. Add a cheapest-fare snapshot per route-date with Google's price insights and about 60 days of daily price history, so your very first run already has two months of history.

Turn on monitoring mode and schedule it daily: the actor remembers every fare and outputs only flights that are new or re-priced since the last run, or skips route-dates whose cheapest fare did not move. You pay for changes, not for the same fares again (with onlyNew, set includeSummaryRow: false too, otherwise the per-route-date snapshot row is still output and charged on every run).

No browser, no Google login, no API key. One fast request per route-date (about 20-90 KB), so a 30-route x 60-date grid finishes in minutes.

Who it is for

  • Fare-deal newsletters and alert channels: re-query a fixed route x date grid every morning and publish the drops (changeType, priceChangePct).
  • Travel agencies, TMCs and OTA analytics teams: benchmark your fares against Google's "best" bucket per route and date.
  • Airline revenue-management and consulting shops: track competitor fares and schedules on specific routes, daily.
  • Researchers and data journalists: fares, CO2 per itinerary and route-level price history.

What you get

Two row types in one dataset (rowType):

FieldDescription
rowTypeitinerary (one per flight option) or fare-snapshot (one per route-date)
queryOrigin, queryDestination, queryDate, returnDate, tripType, cabin, adults, currencyWhat was searched
bucketGoogle's best or other list
priceDisplay price (total for all passengers, rounded up by Google)
priceExactExact price decoded from Google's booking token, e.g. 294.50
airlineCodes, airlinesCarriers on the itinerary
departDate, departTime, arriveDate, arriveTime, durationMin, stopsSchedule (local times)
layovers[]Airport, airport name, city, minutes
legs[]Per flight: from/to, times, flightNumber, carrier, aircraft, legroom, CO2
flightKeyFlight numbers joined by +, the stable key for change detection
co2Grams, co2TypicalGrams, co2DiffPctGoogle's emissions estimate vs typical for the route
bookingTokenGoogle's token for the offer
changeType, previousPrice, priceChangePctMonitoring mode: new, changed (unchanged on snapshots)
resultCountItineraries Google returned for the route-date
insightLevel, insightCurrentLowest, insightTypicalLow, insightTypicalHighGoogle price insights (snapshot rows)
priceRangeMin, priceRangeMaxCheapest and most expensive fare for the route-date
priceHistoryAbout 62 daily [YYYY-MM-DD, price] points (snapshot rows)
exitCountry, source, scrapedAtRun metadata

Input

FieldDefaultDescription
origins / destinations["JFK"] / ["LHR"]IATA codes; every origin is paired with every destination. A Google city id such as /m/02_286 (New York) searches all its airports at once.
routes[]Alternative: explicit pairs like DXB-LHR, SFO>NRT
dates[]Explicit departure dates YYYY-MM-DD
daysAheadFrom / daysAheadTo / everyNDays30 / 32 / 1Rolling window used when dates is empty (best for schedules)
tripTypeone-wayround-trip returns outbound options priced as a round trip
returnAfterDays / returnDate7 / emptyRound-trip return date
cabineconomyeconomy, premium_economy, business, first
adults1Prices are totals for all passengers
maxStopsemptyKeep itineraries with at most N stops
currency / language / countryUSD / en / USForced in the URL, so the proxy exit country does not change the data
outputModeitinerariesor cheapest (one snapshot row per route-date)
includeSummaryRowtrueAdd the snapshot row in itineraries mode
maxItinerariesPerSearch15Keep the first N itineraries per route-date (Google returns about 20-30)
onlyNewfalseMonitoring: output only new or re-priced itineraries
onlyChangedfalseMonitoring: skip route-dates whose cheapest fare is unchanged
minPriceChangePct0Ignore smaller price changes in onlyNew mode
maxSearches / maxItems20 / 50Hard caps per run (route-date searches / rows and charges). Searches run route by route (all dates of the first route first), so a low maxSearches can leave later routes unsearched. Duplicate routes are searched once.
ssrFallbacktrueLoad the full search page if the fast call fails
proxyConfigurationno proxyOptional Apify Proxy; see FAQ

Example: daily grid of 3 routes x the next 60 days, cheapest fare only:

{
"routes": ["JFK-LHR", "LAX-NRT", "DXB-LHR"],
"daysAheadFrom": 1,
"daysAheadTo": 60,
"outputMode": "cheapest",
"onlyChanged": true,
"maxSearches": 200,
"maxItems": 200
}

Output sample

Real rows from a test run on 2026-10-03 (JFK-LHR, 2026-11-02, one-way economy; truncated):

{
"rowType": "itinerary",
"queryOrigin": "JFK", "queryDestination": "LHR", "queryDate": "2026-11-02",
"tripType": "one-way", "cabin": "economy", "adults": 1, "currency": "USD",
"bucket": "best", "price": 299, "priceExact": 299,
"airlineCodes": ["AA"], "airlines": ["American"],
"origin": "JFK", "destination": "LHR",
"departDate": "2026-11-02", "departTime": "17:29", "arriveDate": "2026-11-03", "arriveTime": "09:20",
"durationMin": 651, "stops": 1,
"layovers": [{ "durationMin": 63, "airport": "RDU", "airportName": "Raleigh-Durham International Airport", "city": "Raleigh" }],
"legs": [
{ "from": "JFK", "to": "RDU", "departTime": "17:29", "arriveTime": "19:32", "durationMin": 123, "flightNumber": "AA4501", "aircraft": "Embraer 175", "legroom": "30 in", "co2Grams": 110704 },
{ "from": "RDU", "to": "LHR", "departTime": "20:35", "arriveTime": "09:20", "durationMin": 465, "flightNumber": "AA174", "aircraft": "Boeing 777", "legroom": "31 in", "co2Grams": 502495 }
],
"flightKey": "AA4501+AA174",
"co2Grams": 613000, "co2TypicalGrams": 431000, "co2DiffPct": 42,
"bookingToken": "CjRIcjVkZ1lRb0xDd0VBSENnWXdCRy0tLS0tLS0t...",
"changeType": null, "resultCount": 31, "source": "rpc", "exitCountry": "MY",
"scrapedAt": "2026-10-03T15:53:50.554Z"
}
{
"rowType": "fare-snapshot",
"queryOrigin": "JFK", "queryDestination": "LHR", "queryDate": "2026-11-02", "currency": "USD",
"price": 299, "priceExact": 299, "airlines": ["Delta", "Virgin Atlantic"], "flightKey": "DL5638+VS22", "stops": 1,
"resultCount": 31,
"insightLevel": 5, "insightCurrentLowest": 299, "insightTypicalLow": 170, "insightTypicalHigh": 295,
"priceRangeMin": 299, "priceRangeMax": 2884,
"priceHistory": [["2026-08-04", 295], ["2026-08-05", 295], ["2026-08-06", 295], "... about 62 points"]
}

Pricing (pay per event)

EventWhat you pay forFree planStarter (Bronze)Scale (Silver)Business (Gold)
itineraryOne itinerary row (only new or re-priced rows in onlyNew mode)$0.002$0.0018$0.0016$0.0014
fare-snapshotOne cheapest-fare row per route-date with insights and 60-day history$0.005$0.0045$0.004$0.0035

That is $2 per 1,000 itineraries and $5 per 1,000 route-date snapshots on the free plan, plus Apify's small actor-start fee. Route-dates with no flights (invalid route, or Google returned no itineraries) are output as a row with error set and are not charged. The default input costs under $0.11. Set a maximum cost per run in the Console and the actor stops cleanly when it is reached.

How to schedule daily (monitoring mode)

  1. Create a task with your routes and a rolling window, e.g. daysAheadFrom: 7, daysAheadTo: 60, and set onlyNew: true (itineraries) or outputMode: "cheapest" with onlyChanged: true (one row per route-date that moved).
  2. Add a schedule to the task: daily at 05:00 UTC (0 5 * * *). For departures within 14 days, a second task every 6 hours catches intraday moves.
  3. Connect the dataset to Google Sheets, a webhook, Slack, Zapier, Make or n8n. Each run outputs only what changed, with previousPrice and priceChangePct.

The state lives in the named key-value store google-flights-fare-feed-state in your account (one record per route, date, cabin, passengers and currency). Delete it to start fresh. Keep adults, cabin and currency fixed per task so prices stay comparable.

Use it from the API, n8n, Make, Zapier or an AI agent

  • API: start a run and get the results in one call:
    curl -X POST "https://api.apify.com/v2/acts/programmx~google-flights-fare-feed/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"routes": ["JFK-LHR"], "daysAheadFrom": 30, "daysAheadTo": 32}'
    The response is the dataset as JSON; add &format=csv for CSV. This endpoint waits up to 5 minutes; for longer runs, start the run asynchronously and read the dataset when it finishes.
  • n8n, Make and Zapier: use the Apify node or app, choose Run Actor, pick this actor and paste the input JSON.
  • Google Sheets, Slack, email and webhooks: add an integration on the actor or task in Apify Console.
  • AI agents: add this actor to Apify's MCP server (https://mcp.apify.com) and call it from any MCP client.

FAQ

Do I need a proxy?

Usually not: in our tests Google Flights answered without one. If you see blocks, select Apify Proxy (datacenter first, then residential). The actor checks proxy health before the run and retries each request up to 4 times with a fresh session.

Why is the price total for all passengers?

That is how Google shows it. 2 adults = about twice the one-adult fare.

What is priceExact?

Google rounds the display price up to a whole unit; the booking token carries the exact amount (e.g. 294.50), which makes change detection reliable.

Which currencies work?

Any code Google supports; USD, EUR, GBP, MXN and ZAR were verified. If Google rejects a currency, the actor retries the search in USD and labels the rows accordingly.

Does it return the return flights of a round trip?

Not yet: round-trip searches return the outbound options with the round-trip total price, like Google's first results page.

Why do some searches take a few seconds?

Google sometimes answers a valid search with a temporary error; the actor retries it automatically (counted in RUN_STATS.errorResponseRetries). An invalid route is reported after 5 tries (10 with a non-USD currency, because a rejected currency is retried in USD) and is not charged.

Can I get statistics for a run?

Yes, the RUN_STATS record in the run's default key-value store has requests, retries, rows per search, proxy mode, exit country and duration.

How much does daily fare monitoring cost?

Example on the Free plan: 5 routes × 30 departure dates in cheapest mode is 150 route-dates. If every one changed, a run would cost 150 × $0.005 = $0.75; with onlyChanged you pay only for the route-dates whose cheapest fare moved.

Can I export Google Flights data to CSV or Google Sheets?

Yes. Each run's dataset downloads as CSV, Excel or JSON, and the Google Sheets integration can append every run to a sheet.

Can an AI agent use this actor?

Yes. Apify's MCP server (https://mcp.apify.com) can expose this actor as a tool to Claude, Cursor, VS Code and other MCP clients, so an agent can fetch fresh fares on request.

Limitations

  • One-way and round-trip (outbound options) only; multi-city is not supported. Return-leg selection is not implemented.
  • Google's price-insight labels (insightLevel, typical low/high) are not documented by Google; the field meanings are our best reading.
  • Prices are what Google shows to an anonymous user at the time of the run; they can differ from the airline's checkout.
  • Google can change its internal response format at any time; the actor flags a suspected change in RUN_STATS.parseDriftSuspected and the maintainer fixes it.
  • Children, infants and loyalty fares are not supported.