Google Flights Scraper - Most Comprehensive
Pricing
from $0.05 / 1,000 flights
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
Maintained by CommunityActor stats
2
Bookmarked
459
Total users
236
Monthly active users
7 days ago
Last modified
Categories
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.
Choose a flight search
| Goal | Input to use |
|---|---|
| Search one route or a batch of independent routes | Add one object per route to searches. A returnDate makes that route a round trip. |
| Build one ordered journey with several legs | Set tripType to multi-city and put the legs in travel order. |
| Compare nearby travel dates | Set includeCalendarPrices and choose the Calendar mode that matches the date question. |
| Find destinations for a flexible month and stay length | Set exploreOrigin and use an empty searches array for an Explore-only run. |
| Get provider prices and booking forms for each flight | Set 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.
One-way search
{"searches": [{"origin": "SFO","destination": "LAX","departureDate": "2026-10-15"}]}
Round-trip search
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"}]}
Multi-city search
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:00–23:59 or 00:00–06: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.
| Mode | Date window | Default size |
|---|---|---|
graph | A forward series of departure dates that starts on the requested date. | 61 dates |
grid | A window centered on the requested departure date. | 7 dates |
picker | A 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
| Field | Type | Default | Description |
|---|---|---|---|
searches | object[] | Up to 20 routes with origin, destination, departureDate, and optional returnDate; omission uses a sample SFO to LAX route, while [] requests no route work | |
tripType | string | one-way, round-trip, or multi-city; independent routes are inferred from their dates, while multi-city treats the list as one ordered journey | |
exploreOrigin | string | Three-letter IATA airport code for a destination search | |
tripDuration | string | 1-week | weekend means 1–4 days, 1-week means 6–9 days, and 2-weeks means 13–16 days |
exploreMonth | string | next-6-months | next-6-months, january, february, march, april, may, june, july, august, september, october, november, or december |
cabinClass | string | economy | economy, premium-economy, business, or first |
adults | integer | 1 | Adults from 1 to 9 |
children | integer | 0 | Children from 0 to 9 |
infantsOnLap | integer | 0 | Infants on an adult's lap, from 0 to 9 |
infantsInSeat | integer | 0 | Infants in their own seat, from 0 to 9 |
currency | string | USD | Three-letter price currency; values are trimmed and changed to uppercase, malformed values use USD, and currency also applies to Explore-only runs |
maxStops | string | 0 for nonstop, 1 for up to one stop, or 2 for up to two stops | |
maxPrice | number | Positive whole-number maximum for the total itinerary price in the selected currency | |
maxDuration | number | Positive whole-number maximum for each flight leg, in minutes | |
airlines | string[] | Airline codes or alliance names; values are trimmed and changed to uppercase | |
departureTimeEarliest | string | Earliest local departure as an hour or HH:MM | |
departureTimeLatest | string | Latest local departure as an hour or HH:MM | |
arrivalTimeEarliest | string | Earliest local arrival as an hour or HH:MM | |
arrivalTimeLatest | string | Latest local arrival as an hour or HH:MM | |
sortBy | string | best | best, cheapest, fastest, departure-time, or arrival-time |
showAllResults | boolean | false | Request more flight choices before filters are applied |
includeCalendarPrices | boolean | false | Add flexible-date prices to the first flight, or write a Calendar record when no flight matches |
calendarMode | string | graph | graph for a forward one-way window, grid for a centered window, or picker for departure and return pairs |
calendarDays | number | Number of dates or date pairs; the Actor truncates and limits it to 1 through 90, and makes a Grid window odd | |
includeBookingDetails | boolean | false | Add provider choices, booking forms, and baggage-policy links when a flight has a booking token |
proxyConfiguration | object | {"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-DDdates. 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": []}withoutexploreOriginrequests no work and finishes without output. - Each independent route is a round trip when it has a
returnDateand one-way otherwise. An explicittripTypeofone-wayorround-tripdoes 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.
maxPriceandmaxDurationmust be positive whole numbers. Decimal, zero, and negative values are ignored with a warning.- Blank or non-string
airlinesentries are ignored with a warning. Alliance names areONEWORLD,STAR_ALLIANCE, andSKYTEAM. - 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, emptyapifyProxyGroupsorproxyUrlslists are treated as unset. Anullvalue 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
| Object | Field types |
|---|---|
| Flight strings | origin, destination, departureDate, tripType, cabinClass, and currency: string; returnDate, co2EmissionsLabel, bookingToken, and fareClass: string or null |
| Flight numbers | totalDuration and stops: number; price, pricePerPassenger, and co2Emissions: number or null |
| Flight arrays | airlines and airlineCodes: string[]; optional legs: Leg[]; calendarPrices: Calendar price[] or null; optional googleResponses: Response[] |
| Flight objects | outbound: Leg; return: Leg or null; bookingDetails: object or null |
| Leg | duration and stops: number; segments: Segment[] |
| Segment | airline, airlineCode, flightNumber, departureAirport, arrivalAirport, departureTime, and arrivalTime: string; aircraft: string or null; duration: number; layover: Layover or null |
| Layover | airport: string; duration: number |
| Calendar price | date: 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": []}
| Field | JSON type |
|---|---|
recordType | string; always "calendar" |
origin, destination, departureDate, tripType, cabinClass, calendarMode, currency | string |
returnDate | string or null |
adults, children, infantsOnLap, infantsInSeat, calendarDays | number |
calendarPrices | Calendar price[] |
googleResponses | optional 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.
| Object | Field types |
|---|---|
bookingDetails | baggageAllowance: object or null; fareRules: string[]; bookingLinks: Booking link[]; bookingOptions: Booking option[]; baggagePolicies: Baggage policy[]; googleFlightsUrl: string or null |
baggageAllowance | carryOn and checked: string or null |
| Booking link | airline and url: string |
| Booking option | providerCode, displayUrl: string or null; provider, currency: string; isAirlineDirect: boolean or null; flightNumbers: string[]; price: number or null; bookingForm: object or null |
bookingForm | action: string; fields: object whose values are strings. Submit all supplied fields to the action together. |
| Baggage policy | airlineCode, 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}]
| Field | JSON type |
|---|---|
destinationId, city, country, airport, currency | string |
departureDate, returnDate, airline, airlineCode | string or null |
price, cheapestPrice, stops, duration | number or null |
googleResponses | optional 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.
| Object | Field types |
|---|---|
| Manifest | recordType: string, always "google-response"; googleResponses: Response[] |
| Response identity | operation: search, journey, booking, calendar, or explore; method and transport: string; status: number; contentType: string or null |
| Response body | optional rawResponse: string; optional rawResponseKey: string; optional rawResponseKeys: string[]; optional rawResponseBytes: number; responseBlocks: JSON array[] or null |
normalization | object with status: normalized or unavailable; an unavailable value also has reason: no-response-blocks, decoder-rejected, or decoder-error |
requestContext | optional 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 withshowAllResults. 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.