Google Flights Scraper - Most Comprehensive avatar

Google Flights Scraper - Most Comprehensive

Pricing

from $0.05 / 1,000 flights

Go to Apify Store
Google Flights Scraper - Most Comprehensive

Google Flights Scraper - Most Comprehensive

🔥 ~$0.05/1K flights 🔥 Search one-way, round-trip, and multi-city flights, compare flexible dates and destinations, and add optional booking choices.

Pricing

from $0.05 / 1,000 flights

Rating

0.0

(0)

Developer

Kai

Kai

Maintained by Community

Actor stats

2

Bookmarked

459

Total users

236

Monthly active users

7 days ago

Last modified

Share

Google Flights Scraper

Search one-way, round-trip, and multi-city flights in Google Flights. The Actor returns normalized prices, schedules, stops, airlines, layovers, emissions, flexible-date prices, destinations, and optional booking choices. It keeps the original Google response beside every normalized record.

Use it to compare fares across dates or cabins, monitor a route, find cheap destinations for a flexible month, or collect booking links for a chosen flight.

GoalInput to use
Search one route or a batch of independent routesAdd one object per route to searches. A returnDate makes that route a round trip.
Build one ordered journey with several legsSet tripType to multi-city and put the legs in travel order.
Compare nearby travel datesSet includeCalendarPrices and choose the Calendar mode that matches the date question.
Find destinations for a flexible month and stay lengthSet exploreOrigin and use an empty searches array for an Explore-only run.
Get provider prices and booking forms for each flightSet includeBookingDetails.

All routes in one run share the same passenger, cabin, currency, airline, stop, price, duration, and local-time settings.

Search flights

Paste one of these inputs into the Actor, select Run, and open the default Dataset. Replace the sample dates with current or future travel dates.

{
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15"
}
]
}

A returnDate makes the route a round trip. The result contains both legs.

{
"searches": [
{
"origin": "SFO",
"destination": "JFK",
"departureDate": "2026-10-15",
"returnDate": "2026-10-22"
}
]
}

Batch of routes

Add up to 20 routes. Each route uses its own returnDate, so one batch can mix one-way and round-trip routes. An invalid route is skipped with a warning and the other routes still run.

{
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15"
},
{
"origin": "SFO",
"destination": "SEA",
"departureDate": "2026-10-16",
"returnDate": "2026-10-20"
},
{
"origin": "LAX",
"destination": "LAS",
"departureDate": "2026-10-18"
}
]
}

Set tripType to multi-city. The list is one ordered journey with up to 20 legs. Each result contains every leg and one total price.

{
"tripType": "multi-city",
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15"
},
{
"origin": "LAX",
"destination": "LAS",
"departureDate": "2026-10-18"
}
]
}

Set cabin class, passengers, and currency

Prices cover all passengers and use the selected currency. This example requests business class for two adults, one child, and one infant on a lap, priced in euros.

{
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15"
}
],
"cabinClass": "business",
"adults": 2,
"children": 1,
"infantsOnLap": 1,
"currency": "EUR"
}

Filter and sort flights

Stops, price, duration, and airlines

airlines accepts carrier codes and the alliance names ONEWORLD, STAR_ALLIANCE, and SKYTEAM. For round trips and multi-city journeys, the stop, duration, and airline limits apply to every leg. The price limit applies to the complete itinerary.

{
"searches": [
{
"origin": "SFO",
"destination": "JFK",
"departureDate": "2026-10-15",
"returnDate": "2026-10-22"
}
],
"maxStops": "1",
"maxPrice": 600,
"maxDuration": 480,
"airlines": ["AA", "ONEWORLD"]
}

Local departure and arrival times

Give each bound as a whole hour or as HH:MM. A whole-hour latest time includes the complete hour, so 18 includes departures through 18:59. When the earliest time is later than the latest time, the range crosses midnight: 22 through 6 means 22:0023:59 or 00:0006:59. Times use the local clock of each airport.

{
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15"
}
],
"departureTimeEarliest": "06:30",
"departureTimeLatest": "12",
"arrivalTimeEarliest": "8",
"arrivalTimeLatest": "14:00"
}

This overnight example keeps departures from 22:00 through 06:59:

{
"searches": [
{
"origin": "SFO",
"destination": "JFK",
"departureDate": "2026-10-15"
}
],
"departureTimeEarliest": "22",
"departureTimeLatest": "6"
}

Sort order and more results

best keeps Google's order. cheapest sorts quoted fares from low to high and puts schedules without a quoted fare last. fastest uses the complete itinerary duration. showAllResults asks Google for more flight choices before the filters run, which helps narrow filters return enough rows.

{
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15"
}
],
"sortBy": "fastest",
"showAllResults": true
}

Compare travel dates

Set includeCalendarPrices and choose the mode that matches the date question. Calendar prices use the same stop, price, duration, airline, passenger, cabin, and time settings as the route.

ModeDate windowDefault size
graphA forward series of departure dates that starts on the requested date.61 dates
gridA window centered on the requested departure date.7 dates
pickerA forward series of departure and return pairs that keep the supplied stay length.61 pairs

calendarDays sets the number of dates or pairs. The Actor truncates decimals, limits the value to 1 through 90, and makes a Grid window odd.

Graph, for a forward view of one-way prices:

{
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15"
}
],
"includeCalendarPrices": true,
"calendarMode": "graph",
"calendarDays": 14
}

Grid, for a few days on each side of the requested date:

{
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15"
}
],
"includeCalendarPrices": true,
"calendarMode": "grid",
"calendarDays": 7
}

Picker, for round trips with a fixed stay length. It needs a returnDate. Without one, the Actor warns and keeps the flight rows.

{
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15",
"returnDate": "2026-10-18"
}
],
"includeCalendarPrices": true,
"calendarMode": "picker",
"calendarDays": 5
}

Find destinations

Set exploreOrigin to find priced destinations for a flexible month and stay length. tripDuration accepts weekend for 1–4 days, 1-week for 6–9 days, and 2-weeks for 13–16 days. exploreMonth accepts next-6-months or a calendar month name. Use an empty searches list for an Explore-only run.

{
"searches": [],
"exploreOrigin": "SFO",
"tripDuration": "weekend",
"exploreMonth": "november",
"adults": 2
}

When searches also contains routes, the Actor runs both and saves the destination rows first:

{
"exploreOrigin": "SFO",
"tripDuration": "1-week",
"exploreMonth": "next-6-months",
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15"
}
]
}

Add booking choices

Set includeBookingDetails to add provider prices, booking forms, and baggage-policy links to each returned flight. This adds one request per flight, so combine it with filters to keep the run short.

{
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15",
"returnDate": "2026-10-18"
}
],
"maxStops": "0",
"airlines": ["UA"],
"includeBookingDetails": true
}

Connection settings

Apify Proxy is enabled by default and no proxy group is selected. Keep it enabled. Without a proxy, Google blocks filtered, round-trip, multi-city, Calendar, Explore, and booking requests, and only a plain one-way search returns results.

{
"searches": [
{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15"
}
],
"proxyConfiguration": {
"useApifyProxy": true
}
}

Input

FieldTypeDefaultDescription
searchesobject[]Up to 20 routes with origin, destination, departureDate, and optional returnDate; omission uses a sample SFO to LAX route, while [] requests no route work
tripTypestringone-way, round-trip, or multi-city; independent routes are inferred from their dates, while multi-city treats the list as one ordered journey
exploreOriginstringThree-letter IATA airport code for a destination search
tripDurationstring1-weekweekend means 1–4 days, 1-week means 6–9 days, and 2-weeks means 13–16 days
exploreMonthstringnext-6-monthsnext-6-months, january, february, march, april, may, june, july, august, september, october, november, or december
cabinClassstringeconomyeconomy, premium-economy, business, or first
adultsinteger1Adults from 1 to 9
childreninteger0Children from 0 to 9
infantsOnLapinteger0Infants on an adult's lap, from 0 to 9
infantsInSeatinteger0Infants in their own seat, from 0 to 9
currencystringUSDThree-letter price currency; values are trimmed and changed to uppercase, malformed values use USD, and currency also applies to Explore-only runs
maxStopsstring0 for nonstop, 1 for up to one stop, or 2 for up to two stops
maxPricenumberPositive whole-number maximum for the total itinerary price in the selected currency
maxDurationnumberPositive whole-number maximum for each flight leg, in minutes
airlinesstring[]Airline codes or alliance names; values are trimmed and changed to uppercase
departureTimeEarlieststringEarliest local departure as an hour or HH:MM
departureTimeLateststringLatest local departure as an hour or HH:MM
arrivalTimeEarlieststringEarliest local arrival as an hour or HH:MM
arrivalTimeLateststringLatest local arrival as an hour or HH:MM
sortBystringbestbest, cheapest, fastest, departure-time, or arrival-time
showAllResultsbooleanfalseRequest more flight choices before filters are applied
includeCalendarPricesbooleanfalseAdd flexible-date prices to the first flight, or write a Calendar record when no flight matches
calendarModestringgraphgraph for a forward one-way window, grid for a centered window, or picker for departure and return pairs
calendarDaysnumberNumber of dates or date pairs; the Actor truncates and limits it to 1 through 90, and makes a Grid window odd
includeBookingDetailsbooleanfalseAdd provider choices, booking forms, and baggage-policy links when a flight has a booking token
proxyConfigurationobject{"useApifyProxy":true}Connection settings passed to Apify; the default selects no proxy group

Input behavior

  • Routes use three-letter IATA codes and real YYYY-MM-DD dates. Codes are trimmed and changed to uppercase.
  • Submitting {} runs a sample SFO to LAX search for the first day of the next month. Submitting {"searches": []} without exploreOrigin requests no work and finishes without output.
  • Each independent route is a round trip when it has a returnDate and one-way otherwise. An explicit tripType of one-way or round-trip does not override the dates.
  • Independent routes beyond the first 20 are dropped with a warning. A multi-city journey is one unit: one invalid leg, or more than 20 legs, skips the whole journey. Multi-city legs ignore returnDate.
  • Invalid optional settings warn and use safe defaults. The run is not rejected. Passenger counts outside their ranges are rejected by the input form.
  • maxPrice and maxDuration must be positive whole numbers. Decimal, zero, and negative values are ignored with a warning.
  • Blank or non-string airlines entries are ignored with a warning. Alliance names are ONEWORLD, STAR_ALLIANCE, and SKYTEAM.
  • The Actor accepts equal origin and destination codes and does not apply a combined passenger limit or compare lap infants with adults. Google can return no inventory for these combinations.
  • The Actor requests prices in the selected currency and does not convert them. The amount or currency offered at checkout can differ by provider.
  • For round trips and multi-city trips, stop, duration, airline, departure-time, and arrival-time filters apply to every leg. Price and fastest sorting use the complete itinerary. Departure and arrival sorting use the alternatives for the final leg.
  • Flight time filters use exact minutes. Calendar time bounds use whole hours, so a boundary can include more prices from that hour.
  • Search, Explore, Calendar, and booking settings are accepted when their operation is not active and are then ignored. Unknown top-level fields are ignored.
  • In proxyConfiguration, empty apifyProxyGroups or proxyUrls lists are treated as unset. A null value turns the proxy off.

Other canonical three-letter currency codes are passed through. Google decides whether it can return a price in the requested currency.

The next valid example covers every input field. It runs both Explore and a round-trip route.

Output

Each Dataset item is one of four records. Flight rows contain outbound. Destination rows contain destinationId. Standalone Calendar rows have recordType: "calendar". Google-response manifests have recordType: "google-response". When an input contains Explore and route work, Explore results are saved before flight results. Independent routes follow input order.

The Actor output schema gives links to the Dataset and key-value store. It does not check the fields inside Dataset items. Use the field references below, and allow optional or additional fields when Google changes its response.

The examples in this section are real Dataset items from runs of this Actor on 2026-09-03. Prices and schedules change. Booking tokens and form values are shortened, and googleResponses is omitted.

Flight example

This record came from a successful live run of the one-way search above with includeCalendarPrices and a 14-day Graph window, so calendarPrices is filled. Without Calendar the field is null.

{
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15",
"returnDate": null,
"tripType": "one-way",
"cabinClass": "economy",
"price": 41,
"currency": "USD",
"pricePerPassenger": null,
"totalDuration": 97,
"stops": 0,
"airlines": [
"Frontier"
],
"airlineCodes": [
"F9"
],
"outbound": {
"duration": 97,
"stops": 0,
"segments": [
{
"airline": "Frontier",
"airlineCode": "F9",
"flightNumber": "F93308",
"aircraft": "Airbus A320neo",
"departureAirport": "SFO",
"arrivalAirport": "LAX",
"departureTime": "2026-10-15T08:58:00-07:00",
"arrivalTime": "2026-10-15T10:35:00-07:00",
"duration": 97,
"layover": null
}
]
},
"return": null,
"co2Emissions": 59725,
"co2EmissionsLabel": null,
"bookingToken": "CjRIZHdQSTBRMDQy…",
"fareClass": null,
"bookingDetails": null,
"calendarPrices": [
{
"date": "2026-10-15",
"price": 41
},
{
"date": "2026-10-16",
"price": 41
},
{
"date": "2026-10-17",
"price": 41
},
{
"date": "2026-10-18",
"price": 84
},
{
"date": "2026-10-19",
"price": 41
},
{
"date": "2026-10-20",
"price": 19
},
{
"date": "2026-10-21",
"price": 19
},
{
"date": "2026-10-22",
"price": 59
},
{
"date": "2026-10-23",
"price": 41
},
{
"date": "2026-10-24",
"price": 19
},
{
"date": "2026-10-25",
"price": 84
},
{
"date": "2026-10-26",
"price": 41
},
{
"date": "2026-10-27",
"price": 19
},
{
"date": "2026-10-28",
"price": 41
}
]
}

Durations and layovers are in minutes. co2Emissions is in grams. Departure and arrival timestamps use the local airport time with the exact UTC offset for that flight date. price is null when Google returns a schedule without a quoted fare. The Actor preserves the source-provided bookingToken unchanged. The reserved fields pricePerPassenger, co2EmissionsLabel, and fareClass are currently always null.

Round-trip example

Round-trip and multi-city results also contain legs. outbound is the first leg. return is the second leg for round trips and null otherwise. totalDuration and stops summarize all legs. This record came from the round-trip search above.

Multi-city example

This record came from the two-leg multi-city search above. origin is the first departure airport and destination is the last arrival airport.

Flight field reference

ObjectField types
Flight stringsorigin, destination, departureDate, tripType, cabinClass, and currency: string; returnDate, co2EmissionsLabel, bookingToken, and fareClass: string or null
Flight numberstotalDuration and stops: number; price, pricePerPassenger, and co2Emissions: number or null
Flight arraysairlines and airlineCodes: string[]; optional legs: Leg[]; calendarPrices: Calendar price[] or null; optional googleResponses: Response[]
Flight objectsoutbound: Leg; return: Leg or null; bookingDetails: object or null
Legduration and stops: number; segments: Segment[]
Segmentairline, airlineCode, flightNumber, departureAirport, arrivalAirport, departureTime, and arrivalTime: string; aircraft: string or null; duration: number; layover: Layover or null
Layoverairport: string; duration: number
Calendar pricedate: string; optional returnDate: string; price: number

Calendar prices

calendarPrices is added to the first flight of each route. Calendar prices are in date order. Picker results with the same departure date use return-date order. The array is [] when the check completed without matching prices. It is null when Calendar was not requested or could not be checked.

A Grid window of 7 days centered on 2026-10-15:

[
{
"date": "2026-10-12",
"price": 41
},
{
"date": "2026-10-13",
"price": 19
},
{
"date": "2026-10-14",
"price": 19
},
{
"date": "2026-10-15",
"price": 41
},
{
"date": "2026-10-16",
"price": 41
},
{
"date": "2026-10-17",
"price": 41
},
{
"date": "2026-10-18",
"price": 84
}
]

Five Picker pairs with a three-night stay:

[
{
"date": "2026-10-15",
"returnDate": "2026-10-18",
"price": 237
},
{
"date": "2026-10-16",
"returnDate": "2026-10-19",
"price": 204
},
{
"date": "2026-10-17",
"returnDate": "2026-10-20",
"price": 187
},
{
"date": "2026-10-18",
"returnDate": "2026-10-21",
"price": 237
},
{
"date": "2026-10-19",
"returnDate": "2026-10-22",
"price": 187
}
]

When Calendar work completes but no flight row is available, the Actor writes a standalone Calendar record instead. This one came from a run with maxPrice: 5, so no flight and no calendar date matched:

{
"recordType": "calendar",
"origin": "SFO",
"destination": "LAX",
"departureDate": "2026-10-15",
"returnDate": null,
"tripType": "one-way",
"cabinClass": "economy",
"adults": 1,
"children": 0,
"infantsOnLap": 0,
"infantsInSeat": 0,
"calendarMode": "graph",
"calendarDays": 7,
"currency": "USD",
"calendarPrices": []
}
FieldJSON type
recordTypestring; always "calendar"
origin, destination, departureDate, tripType, cabinClass, calendarMode, currencystring
returnDatestring or null
adults, children, infantsOnLap, infantsInSeat, calendarDaysnumber
calendarPricesCalendar price[]
googleResponsesoptional Response[]

Booking details

bookingDetails is filled on each flight that has a booking token when includeBookingDetails is set. This example came from the booking search above. The run returned five booking options for this flight; two are shown, and the long form value is shortened.

ObjectField types
bookingDetailsbaggageAllowance: object or null; fareRules: string[]; bookingLinks: Booking link[]; bookingOptions: Booking option[]; baggagePolicies: Baggage policy[]; googleFlightsUrl: string or null
baggageAllowancecarryOn and checked: string or null
Booking linkairline and url: string
Booking optionproviderCode, displayUrl: string or null; provider, currency: string; isAirlineDirect: boolean or null; flightNumbers: string[]; price: number or null; bookingForm: object or null
bookingFormaction: string; fields: object whose values are strings. Submit all supplied fields to the action together.
Baggage policyairlineCode, airline, and url: string

displayUrl is the provider text shown by Google and may not be a navigable link. Use bookingForm to reach the provider. bookingDetails stays null when details were not requested or were unavailable. bookingOptions, fareRules, bookingLinks, and baggagePolicies can be empty.

Explore destinations

Each destination is one Dataset row. These two rows came from the Explore-only search above, with weekend stays in November.

[
{
"destinationId": "/m/030qb3t",
"city": "Los Angeles",
"country": "United States",
"airport": "LAX",
"departureDate": "2026-11-05",
"returnDate": "2026-11-09",
"price": 65,
"cheapestPrice": null,
"currency": "USD",
"airline": "Frontier",
"airlineCode": "F9",
"stops": 0,
"duration": 92
},
{
"destinationId": "/m/071vr",
"city": "San Diego",
"country": "United States",
"airport": "SAN",
"departureDate": "2026-11-07",
"returnDate": "2026-11-09",
"price": 78,
"cheapestPrice": null,
"currency": "USD",
"airline": "Frontier",
"airlineCode": "F9",
"stops": 1,
"duration": 101
}
]
FieldJSON type
destinationId, city, country, airport, currencystring
departureDate, returnDate, airline, airlineCodestring or null
price, cheapestPrice, stops, durationnumber or null
googleResponsesoptional Response[]

price is the itinerary quote. cheapestPrice is an optional comparison value and can be higher or lower. Results with an itinerary quote come before comparison-only results, and each group is sorted by its own price. At least one price field has a value. Airline, stops, and duration can be null. A region result can have an empty airport. airlineCode can be "multi" when an itinerary uses more than one airline.

Google response fields

The Actor retains every readable Google response. The first compatible result of each operation carries a googleResponses array, and a booking response stays with the flight that produced it, so the usual number of Dataset rows does not change. If no normalized row can carry the responses, including when every result is filtered out, the Actor writes one recordType: "google-response" manifest.

rawResponse is the authoritative source value. It preserves positional order, repeated values, null values, and unknown fields. requestContext contains only public route identifiers such as origin, destination, dates, journey stage, or Calendar variant. Request payloads and booking tokens are never copied into it. An unfamiliar readable response is kept once and is not a reason to repeat the request.

This manifest came from a run whose only route returned no itineraries. The response text is shortened, and the parsed responseBlocks array and the two identity fields method and transport are left out.

ObjectField types
ManifestrecordType: string, always "google-response"; googleResponses: Response[]
Response identityoperation: search, journey, booking, calendar, or explore; method and transport: string; status: number; contentType: string or null
Response bodyoptional rawResponse: string; optional rawResponseKey: string; optional rawResponseKeys: string[]; optional rawResponseBytes: number; responseBlocks: JSON array[] or null
normalizationobject with status: normalized or unavailable; an unavailable value also has reason: no-response-blocks, decoder-rejected, or decoder-error
requestContextoptional object. origin, destination, departureDate, tripType, calendarMode, tripDuration, exploreMonth, and itinerarySignature are optional strings. returnDate is an optional string or null. stage, requestIndex, and variant are optional numbers.

The Actor keeps at most 1 MB of response text inline across the Dataset. Later bodies are stored exactly in the run's default key-value store under GOOGLE_RESPONSE_ keys, so a body smaller than 1 MB can still be externalized after the inline budget is used. One body uses rawResponseKey. A body too large for one store request is split on UTF-8 boundaries and uses the ordered rawResponseKeys array. Join split values in array order. rawResponseBytes is the UTF-8 byte count, and each key includes the SHA-256 digest of the complete body. An externalized response omits inline rawResponse and sets responseBlocks to null. The key-value store also holds control records such as INPUT.

Limits and failure handling

  • The Actor processes at most 20 independent routes or 20 multi-city legs. It skips invalid independent entries and keeps valid siblings. A multi-city list is one unit, so one invalid leg skips that journey.
  • Past departures and returns before departure are skipped with a warning that names the route. An explicit no-op or a batch with only skipped routes can finish with an empty Dataset.
  • Round-trip and multi-city output contains one complete set of earlier legs plus alternatives for the final leg. It does not contain every possible leg combination.
  • A centered Grid window that reaches into the past fails with a warning while flight rows remain available.
  • showAllResults, Calendar enrichment, and booking details increase run time. Booking details add one request per returned flight, so they take longest with showAllResults. Overnight Calendar ranges also take longer, especially Picker with both departure and arrival ranges crossing midnight.
  • A failed route does not remove completed siblings. The run succeeds with a warning that names the failed route. If every requested Search and Explore operation fails before a readable response is received, the run fails.
  • Calendar, booking, and cleanup failures warn and keep the available flight rows. A readable but unfamiliar Google response is saved as a source record and counts as a success.
  • If a multi-city or round-trip journey receives Google responses and then fails, those responses are saved in a manifest before the failure is reported.
  • Dataset and key-value store write failures stop the run.
  • Google can omit prices or optional details and can change its response fields. Allow for null, missing, and additional fields.