Google Flights Scraper - Prices and Calendar avatar

Google Flights Scraper - Prices and Calendar

Pricing

from $0.30 / 1,000 flight itineraries

Go to Apify Store
Google Flights Scraper - Prices and Calendar

Google Flights Scraper - Prices and Calendar

Export public Google Flights itineraries with numeric fares, airlines, stops, layovers, airports and local times. Compare one-way or round-trip searches, or find the lowest fare per calendar day. Relative dates keep scheduled price checks in the future.

Pricing

from $0.30 / 1,000 flight itineraries

Rating

0.0

(0)

Developer

Sumitr Mardy

Sumitr Mardy

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Categories

Share

Google Flights Scraper — Prices and Cheapest-Date Calendar

Export public Google Flights first-page itineraries with numeric prices, airlines, stops, layovers, airports, local times and duration. Search one-way or round-trip fares, or build a cheapest-date calendar. No login, cookie, Google API key or browser required.

Not affiliated with Google. Fares are what Google Flights displays for the query, currency and country at run time; they are not booking quotes. No booking links or ticket purchase in v1.

Quick start

A date that stays in the future:

{"routes":[{"from":"JFK","to":"LIS"}],"departureDaysFromToday":45,"maxResultsPerSearch":5}

Fixed-date one way:

{"routes":[{"from":"JFK","to":"LIS"}],"departureDate":"2026-12-10","maxResultsPerSearch":30}

Relative round trip:

{"routes":[{"from":"JFK","to":"CDG"}],"departureDaysFromToday":45,"returnDaysAfterDeparture":7,"maxResultsPerSearch":30}

Fourteen-day cheapest-date calendar:

{"routes":[{"from":"LHR","to":"BKK"}],"departureDaysFromToday":45,"calendarDays":14,"cheapestPerDayOnly":true}

The fixed-date example eventually expires. Use relative dates for daily checks.

Input

FieldDefaultMeaning
routesrequiredArray of {from,to}; IATA codes or city names. Optional departureDate/returnDate per route override global fixed dates.
departureDateabsentFixed YYYY-MM-DD for ordinary searches.
departureDaysFromToday45UTC days ahead, 0–365, used when there is no fixed date.
returnDateabsentFixed return date; turns the search into a round trip.
returnDaysAfterDepartureabsentRelative return interval, 0–365 days; useful for schedules.
dateFrom, dateToabsentInclusive fixed calendar range, at most 60 dates. Calendar mode is one way.
calendarDaysabsentRelative calendar of 1–60 dates beginning departureDaysFromToday ahead. Alternative to dateFrom/dateTo.
cheapestPerDayOnlytrueIn calendar mode return one lowest-priced eligible itinerary per route/day.
maxResultsPerSearch50Maximum unique first-page rows, 1–200. Cheapest-only calendars return one.
currencyUSDISO currency sent as curr.
language, countryen, usFlights UI language and country. Full structured parsing is verified for English; other languages may produce partial rows with raw labels.
nonstopOnlyfalseLocal filter, no surcharge. Ambiguous/unparsed stop counts are excluded.

At most 100 generated route/date searches per run. Invalid routes/dates become free invalid_input rows. Exact normalized route/date searches and repeated DOM itinerary labels are deduplicated. Calendar ranges cannot be combined with return dates. Past dates, invalid dates, return-before-departure and ranges over 60 days are rejected.

The calendar makes one search per day. It is not Google's private calendar API. With cheapestPerDayOnly=false, it exports up to maxResultsPerSearch per day instead.

What is returned

All 30 keys are present, never null. Missing strings are "", numbers are 0 and arrays are [].

FieldMeaning
inputIndex, from, toOriginal route index and supplied origin/destination.
departureDate, returnDate, tripTypeRequested dates and one_way or round_trip.
price, currency, priceTextParsed numeric displayed fare, requested currency and raw fare text.
airlines, airlineAirline array and joined display names.
stops, layoversStop count and array of {airport,city,duration}.
departureAirport, departureTime, departureDayAirport and local displayed departure time/day.
arrivalAirport, arrivalTime, arrivalDayAirport and local displayed arrival time/day.
arrivesNextDayTrue when the displayed arrival day differs; can mean more than one day. Not a UTC-normalized date calculation.
durationText, durationMinutesRaw elapsed duration and parsed minutes.
isCheapestOfDay, positionLowest positive fare among eligible first-page rows for this route/day; one-based output position.
searchUrl, labelReproducible public query URL and original decoded itinerary aria-label.
status, subStatus, error, scrapedAtStable outcome, machine-readable reason, explanation and ISO scrape time.

Rows are ordered by numeric fare, with unknown prices last. Tied lowest fares can all have isCheapestOfDay=true in full mode; cheapest-only mode keeps the first tie. If no fare parses, the first raw-label row is retained with isCheapestOfDay=false, rather than inventing a cheapest price.

Unparsed labels are not discarded by the parser: available fields and the raw label remain in an ok/flight row. User filters and result limits still apply. A 0 price or stop count in such a partial row is missing information, not a verified free or nonstop flight.

Round-trip rows describe the outbound itinerary choice and the displayed round-trip total. The return date is the requested search date; complete return-flight legs, selected booking options, taxes/baggage breakdowns and final ticket availability are outside v1. Airport times/day labels are local display text; no timezone offsets or exact UTC times are inferred.

Status and billing

statussubStatusFlight charge
okflightYes
no_resultsno_resultsNo
failedinvalid_input, http_CODE, blocked, empty_page, parse_error, network_error, free_work_limit, cost_limit_reachedNo

Failed, empty and locally filtered rows have no flight event charge. A partially completed calendar can contain successful dates plus free failure rows for other dates. Already saved itineraries remain charged.

Apify tierPer itinerary rowPer 1,000 rows
FREE$0.0006$0.60
BRONZE$0.0005$0.50
SILVER$0.0004$0.40
GOLD+$0.0003$0.30

Default Actor start event: $0.00005 per GB, minimum one event. It still applies to an empty/failed run. Dataset-item billing is disabled; platform usage is included under PPE. The calendar is charged only for selected saved rows, not all itineraries parsed internally. User spending limits can stop output early.

Schedule a daily price check

  1. Run or save a task with departureDaysFromToday:45 instead of a fixed departureDate.
  2. For a moving 14-day calendar add calendarDays:14 and cheapestPerDayOnly:true. For a round trip add returnDaysAfterDeparture:7.
  3. In Apify Console open Schedules, create a schedule, choose the saved task, select a daily time/timezone and enable it.
  4. Review the run status and dataset, or configure your own integration to consume successful rows.

Each daily run advances the departure/calendar dates relative to that day's UTC date. Fixed departureDate/dateFrom/dateTo values do not advance and eventually need manual updates. No schedule is created automatically by this Actor. A 14-row daily calendar at FREE list price is $0.0084 in flight events plus the start event; no_results/failed days have no flight event charge.

API examples

curl -X POST "https://api.apify.com/v2/acts/sumitr_mardy~google-flights-scraper/run-sync-get-dataset-items?format=json" \
-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"routes":[{"from":"JFK","to":"LIS"}],"departureDaysFromToday":45,"maxResultsPerSearch":5}'
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("sumitr_mardy/google-flights-scraper").call(
run_input={"routes":[{"from":"LHR","to":"BKK"}],
"departureDaysFromToday":45, "calendarDays":14,
"cheapestPerDayOnly":True}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["departureDate"], row["price"], row["currency"], row["status"])

For longer calendars use asynchronous runs and download the dataset after completion.

Use it from AI agents (MCP)

Hosted OAuth:

{"mcpServers":{"flights":{"url":"https://mcp.apify.com/?tools=sumitr_mardy/google-flights-scraper"}}}

Hosted Bearer alternative:

{"mcpServers":{"flights":{"url":"https://mcp.apify.com/?tools=sumitr_mardy/google-flights-scraper","headers":{"Authorization":"Bearer YOUR_APIFY_TOKEN"}}}}

Stdio:

{"mcpServers":{"flights":{"command":"npx","args":["-y","@apify/actors-mcp-server","--tools","sumitr_mardy/google-flights-scraper"],"env":{"APIFY_TOKEN":"YOUR_APIFY_TOKEN"}}}}

Specify origin, destination, currency and date strategy. Ask for a cheapest-only calendar when comparing dates. Inspect status/subStatus and the raw label before interpreting missing fields or comparing fares.

Limits and reliability

Only the first server-rendered best/other lists are used. The Actor does not call internal RPC, paginate beyond the first results page or collect booking links. Duplicate mobile/desktop labels are removed, so unique itinerary counts can be lower than the raw DOM label count.

Transient empty HTML shells are retried up to two more times directly. Non-challenge failures can use one final default datacenter attempt. A real CAPTCHA, /sorry/ or consent challenge stops the host for the run; no cookie, login, residential proxy, IP rotation around challenges or CAPTCHA solving. At most two searches concurrently, with a 500 ms pause after each response per worker. Hard deadlines and a free-work loss guard bound unproductive requests.

Prices, result availability, airport groupings and UI wording can change. Currency and country affect displayed fares. A city name can include nearby airports. If a city-name query repeatedly returns an empty server-rendered page, use specific IATA airports; the verified New York–Paris round-trip preset uses JFK and CDG. Nothing here reserves or purchases a ticket.

For hotel nightly prices and two-adult stays, use the sister Google Hotels Scraper.