Vexaloom Labs

Use Google Flights Fare & Itinerary Filter Scraper with Python

Search Google Flights for one-way or round-trip fares across any cabin class, then narrow results by stops, total duration, airline, and price range, with an optional price-alert flag.

1. Choose the data you need

Review the published README for supported collection modes, examples, and limits. The recipe below uses the current published input definition.

2. Prepare a source-based input

This JSON contains published prefills and required-field defaults. Review every value for your task before running it; it is not a promise of successful collection.

{
  "adults": 1,
  "airlines": [],
  "arrivalTimeRange": "any",
  "cabinClass": "economy",
  "children": 0,
  "country": "US",
  "currency": "USD",
  "departureTimeRange": "any",
  "destinationAirport": "LHR",
  "excludeAirlines": [],
  "includePriceInsights": false,
  "infants": 0,
  "infantsInSeat": 0,
  "language": "en",
  "lessEmissions": false,
  "maxResults": 1,
  "maxStops": "any",
  "mode": "search",
  "originAirport": "JFK",
  "outboundDate": "2026-12-10",
  "priceGraphDays": 1,
  "returnOptionsPerOutbound": 5,
  "returnOptionsTop": 0,
  "sortBy": "top"
}

Download input.example.json and save your reviewed copy as input.json.

FieldTypeRequiredDescription
modestringrequiredSearch flights, or collect the cheapest fare for each date around your departure date.
originAirportstringoptionalThree-letter IATA airport or city code, e.g. JFK, LHR, NYC. One code per search; use `searches` for alternate airports.
destinationAirportstringoptionalThree-letter IATA airport or city code, e.g. LHR, HND, LON. One code per search; use `searches` for alternate airports.
outboundDatestringoptionalDeparture date in YYYY-MM-DD format. Leave empty to use 30 days from today (UTC); the chosen date is logged.
returnDatestringoptionalReturn date in YYYY-MM-DD format. Leave empty for a one-way search.
adultsintegeroptionalTravellers aged 12 and over (1-9).
childrenintegeroptionalTravellers aged 2-11 (0-8).
infantsintegeroptionalInfants under 2 travelling on an adult lap (0-8). Cannot exceed the number of adults.
infantsInSeatintegeroptionalInfants under 2 travelling in their own seat (0-8).
cabinClassstringoptionalCabin to search.
currencystringoptionalCurrency for every price.
languagestringoptionalLanguage Google Flights uses for airport and airline names.
countrystringoptionalCountry whose fares and availability Google should show.
maxStopsstringoptionalLargest number of stops allowed on any leg.
airlinesarrayoptionalTwo-letter IATA airline codes to keep, e.g. ["BA","AA"]. Flights marketed by or codesharing with these airlines are kept. Empty means all airlines.
excludeAirlinesarrayoptionalTwo-letter IATA airline codes to remove, e.g. ["FR"].
minPriceintegeroptionalDrop fares below this price, in the chosen currency.
maxPriceintegeroptionalDrop fares above this price, in the chosen currency.
maxDurationMinutesintegeroptionalDrop itineraries longer than this, including layovers.
departureTimeRangestringoptionalOnly departures in this local-time window.
arrivalTimeRangestringoptionalOnly arrivals in this local-time window.
lessEmissionsbooleanoptionalKeep itineraries Google marks as producing less CO2 than typical for the route.
sortBystringoptionalHow to order the returned flights.
maxResultsintegeroptionalMaximum number of flight or calendar rows to return; in calendar mode it also caps the number of days.
returnOptionsTopintegeroptionalFor round trips, fetch return flights for this many top outbound options. 0 turns this off.
returnOptionsPerOutboundintegeroptionalHow many return flights to attach to each selected outbound.
includePriceInsightsbooleanoptionalAdd Google's current, typical and historical price range when available.
priceGraphDaysintegeroptionalNumber of calendar days to return in price-calendar mode (1-61), starting on the departure date; also capped by maxResults.
priceAlertThresholdnumberoptionalWhen set, add a priceBelowThreshold flag to every fare in the chosen currency.
searchesarrayoptionalOptional list of searches to run in one go. Each item needs originAirport, destinationAirport, outboundDate and an optional returnDate. Up to 20.

3. Start an Actor run

Set APIFY_TOKEN in your environment. Python 3.10 or newer is sufficient; this recipe uses no third-party packages.

Execution may incur charges. Review current pricing on Apify. The request asks for a 120-second timeout and a charge limit; these settings are subject to Apify’s pricing and do not guarantee an all-inclusive spending cap.

import json
import os
import urllib.request

# Save the schema-derived example as input.json; review and edit it first.
with open("input.json", encoding="utf-8") as stream:
    actor_input = json.load(stream)

token = os.environ["APIFY_TOKEN"]
request = urllib.request.Request(
    "https://api.apify.com/v2/acts/8lx7PfBaJQLrtPwBv/runs?timeout=120&maxTotalChargeUsd=0.50",
    data=json.dumps(actor_input).encode("utf-8"),
    headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
    method="POST",
)
# This starts a potentially billable run. Do not automatically retry this POST.
with urllib.request.urlopen(request, timeout=40) as response:
    run = json.load(response)["data"]
print("Run ID:", run["id"])
print("Status:", run["status"])
# Inspect and download results in Apify Console once the run succeeds.

4. Inspect the actual results

Open the run in Apify Console and wait for a successful completion. Use the published output schema to locate results and the dataset schema to understand declared views. Missing or optional record fields must not be treated as guaranteed values.

Flight itinerary records with fares, airlines, schedules, layovers, aircraft, emissions and booking links, plus price-calendar day records.

Questions before you run

Which inputs are required?

The published required fields are mode

What does this guide verify?

The fields, prefills, and schema links are rendered from the published build. This is a usage recipe, not a paid live extraction test. Source availability and collection results can vary.

What if the run request times out?

Check Apify Console before retrying. The first request may already have created a run. Do not automatically repeat a run-creation POST.

Generated from source build JMe14jW0FAs170tz8 and its README and schemas. Source changes regenerate this guide; no third-party editorial claims are inferred.