Google Flights Scraper & Google Flights API: Fares, Calendar avatar

Google Flights Scraper & Google Flights API: Fares, Calendar

Pricing

from $0.50 / 1,000 itineraries

Go to Apify Store
Google Flights Scraper & Google Flights API: Fares, Calendar

Google Flights Scraper & Google Flights API: Fares, Calendar

Google Flights searches as a flight data API, no login: every itinerary Google lists (not only the first 30) with airlines, flight numbers, times, stops, aircraft, legroom, CO2, exact fare, price insight; round trip flights, multi-city, booking options, price calendar, Explore, 40+ markets.

Pricing

from $0.50 / 1,000 itineraries

Rating

0.0

(0)

Developer

Hyperbach

Hyperbach

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Google Flights search results as data, logged out: one-way, round-trip and multi-city searches in, one row per itinerary out — every flight Google lists for the search (the full "view more flights" board, 146 itineraries for LAX → JFK in our test, where most tools stop at the first 30), with airlines and flight numbers, departure and arrival times with their UTC offsets, duration, stops and layovers, aircraft, legroom, amenities, CO₂ against the route's typical, bags included, the exact fare and the currency Google served, the booking token and link, and Google's price insight (level, lowest, typical range). A free summary row per search carries the count, the cheapest fare, the 61-day price history, the airports and airlines of the route and the status with its reason. On request: the return flights of the first N outbounds and the next legs of a multi-city trip, the booking options of the first N itineraries (sellers, fares, bag fees, links — on round trips too), the price calendar with the full list for the cheapest days, the cheapest destinations from an origin, a date range, Google Flights URLs, batches of searches, 40+ markets, languages and currencies, and a memory that delivers only the itineraries whose price moved. Save a search as a task and schedule it: a price tracker for one trip. Dates as YYYY-MM-DD or +N days from the day of the run, so a saved task never asks for a past day. No login, no Google account, no API key, no browser, proxies handled for you.

Why this Google Flights scraper

  • Every itinerary Google lists, not the first thirty. Google Flights opens with a short list and hides the rest behind "View more flights". For LAX → JFK on one day the first view held 32 itineraries and the full list 146; the lane's leading tool returns 32 or 147 per page depending on which of its two routes answers, and never says which. Here view = all (the default) reads the full list in one call, top the first view; every row says itineraries_found.
  • The exact fare and the currency Google served. Google rounds the shown price ("$204"); the fare behind it is $203.40, and it is in the row (price_exact). The currency Google actually served is read from each itinerary's own token (currency_served) and checked against the one you asked: a list served in another currency is a free failed row, never a charged one. Prices are the total for all passengers asked, as Google shows them.
  • Per-flight detail as the page shows it. Each leg carries the flight number, the airline and the operating carrier ("Republic Airways as American Eagle"), the aircraft, the legroom with Google's rating, the amenities (in-seat power, Wi-Fi free or paid, live TV, on-demand video), the often-delayed flag, the CO₂ estimate, and the departure and arrival times with their UTC offsets, so a 16:30 → 00:52 (+1) flight is unambiguous (overnight).
  • Round trips, multi-city and booking options together. A round trip lists the outbounds priced as the trip, then (returnsFor) the return flights of the first N outbounds; a multi-city trip lists leg 1, then the next legs by selection. bookingOptionsFor adds Google's booking options — sellers, fare names, the first and second checked-bag fees, the booking link — to the first N itineraries, on one-way and on round trips alike (the lane's leader returns none for round trips). Ready-made: Google Flights booking options: sellers, fare names, bag fees.
  • Which day, then which flight. calendarDays reads Google's price calendar (one row per priced day, about 90 days per call) and cheapestDays runs the full search for the N cheapest days of it, in one run. Leave the destination empty and the run lists the cheapest destinations Google prices from the origin (Explore). Ready-made: Cheapest day to fly: Google Flights price calendar, 60 days, Cheap flights from Chicago: Google Flights Explore destinations.
  • Honest runs. A search Google lists no flights for, a value that is no search, a refusal the exits could not pass and a list in the wrong currency are free search rows with the reason; nothing silent, nothing charged. The run summary (RUN_SUMMARY) carries the share of fresh exits Google served in your run's own window.
  • Plain HTTP, 256 MB, about a second a search. The list is one call to the page's own API (26–42 KB on the wire for 147 itineraries): no browser, no page load, no token to mint.

Who it's for

  • Travel apps and fare search — the full list for a route and date with every per-flight field, the exact fare and the booking link, in the market, language and currency of the user.
  • Price monitors — a saved task on a schedule with onlyChanges: only the itineraries whose price moved, with the previous price and the change; the 61-day history on the free summary row.
  • Analysts and travel agencies — batches of routes and dates, the price calendar with the cheapest days opened in full, the booking options with sellers and bag fees, round trips and multi-city trips priced as one ticket.
  • Developers and agents — typed rows keyed by search_id, a free summary row per search with the status and its reason, and a run summary to check a pipeline against.

Quick start

One-way search, the full list

{
"origin": "LAX",
"destination": "JFK",
"departureDate": "+30"
}

Round trip with return flights and booking options

{
"origin": "LAX",
"destination": "JFK",
"departureDate": "+30",
"returnDate": "+35",
"returnsFor": 3,
"bookingOptionsFor": 3
}

A market, language and currency

{
"origin": "LAX",
"destination": "JFK",
"departureDate": "+30",
"market": "DE",
"language": "de",
"currency": "EUR"
}

Price calendar and the full list for the 3 cheapest days

{
"origin": "LAX",
"destination": "JFK",
"departureDate": "+14",
"calendarDays": 60,
"cheapestDays": 3,
"maxItems": 500
}

Output

One row per itinerary (and one free summary row per search; calendar days and Explore destinations are rows of their own kind):

fieldmeaning
row_typeitinerary (charged: one itinerary Google lists), search (free: the summary of a search), calendar_day (charged: a priced day of the price calendar), destination (charged: a priced Explore destination).
search_idThe search this row answers (s1, s2, …), the same on the search's summary row and on every itinerary, calendar and destination row of it.
search_labelThe search as you gave it (LAX → JFK 2026-11-04, the URL, the object), or the derived search (… +2d, … on 2026-11-20 (a cheapest day)).
statusOn a summary row: ok (the list was served), no_flights (Google lists none), failed (a refusal, the source's own error or a list in another currency; free), invalid (the value is no search; free). On a charged row: ok.
status_detailWhy a summary row is not ok, in words; on an ok summary row with maxPrice, maxDurationMinutes or a time window, how many of Google's itineraries match them and the cheapest of them; on a calendar's summary row the days priced; on an itinerary row, a note (booking options not served).
scraped_atWhen the row was read (UTC).
trip_typeone_way, round_trip, multi_city or explore.
originThe departure airport code(s) of the search (several comma-separated), the same on the return and next-leg rows (their own airports are in legs); on a destination row the origin of the Explore search.
destinationThe arrival airport code(s) of the search, the same on the return and next-leg rows (their own airports are in legs); on a destination row the destination airport Google priced.
departure_dateThe departure date of the search (YYYY-MM-DD; a +N date as the day it resolved to), the same on the return and next-leg rows; on a destination row the date Google priced.
return_dateThe return date of a round trip (null on Explore's destination rows: an Explore search is one-way).
legs_askedA multi-city trip's legs as asked: origins, destinations, date each.
passengersadults, children, infants_on_lap, infants_in_seat of the search; every price is the total for them.
cabinThe cabin of the search: economy, premium_economy, business, first.
marketThe market (country) the view was asked for (US, GB, DE, …).
languageThe language of the texts (en, de, …).
currencyThe currency asked for every price.
currency_servedThe currency Google served, read from the itinerary's own token (on a summary row: of the list). A list served in another currency than the one asked is a free failed row.
viewall (the full list) or top (Google's first view) on itinerary and summary rows; calendar / explore on their summary rows.
rankThe itinerary's position in Google's own order over the whole list (the best group first); on a calendar row the day's rank by price (1 = cheapest).
groupbest (Google's top picks, 3–5) or other.
leg_index1 on the first leg's itineraries (the outbounds of a round trip); 2 on the return flights of a chosen outbound or a multi-city leg 2; and so on.
selected_flightsOn a row of leg 2 or later: the flight numbers chosen on the legs before (["DL 951"]).
price_scopeitinerary on a one-way search; trip on a round trip or a multi-city trip, where every row's price is the whole trip's.
priceThe price as Google shows it (rounded), the total for the passengers asked, in currency_served; on a calendar row the day's cheapest fare; on a destination row the destination's fare. Null on an itinerary Google lists without a fare (its token carries none): 20 of 1,037 rows over 8 routes in our probe, all at the end of Google's list.
price_exactThe exact fare behind the shown price (203.40 for a shown $204), from the itinerary's token.
airlinesThe airline names of the itinerary, in leg order, each once; on a destination row the airline of the fare Google priced.
airline_codesThe 2-letter airline codes, each once.
flight_numbersThe flight numbers in leg order (DL 951, B6 500, …).
departure_atThe departure of the first leg, local time with the UTC offset (2026-11-04T10:40:00-08:00).
arrival_atThe arrival of the last leg, local time with the UTC offset.
duration_minutesThe total duration, layovers included; on a destination row the flight time of the fare Google priced.
stopsThe number of stops (0 = nonstop); on a destination row the stops of the fare Google priced.
layoversEach stop: airport, name, city, minutes.
legsEach flight of the itinerary: flight_number, airline_code, airline, airline_logo, operated_by, origin, origin_name, destination, destination_name, departure_at and arrival_at with offsets, departure_time, arrival_time, duration_minutes, aircraft, legroom, legroom_rating (average / above average / below average), legroom_code, amenities (in-seat power & USB outlets, in-seat USB outlet, live TV, on-demand video, stream media), wifi (free / paid), often_delayed, co2_kg.
aircraftThe aircraft of each leg (Airbus A330, Boeing 737MAX 9 Passenger).
legroomThe legroom of each leg as Google states it (31 in, 79 cm).
legroom_unitin or cm: the unit of the view (inches on the US view, centimetres on European ones).
overnighttrue when the itinerary arrives after its departure day.
often_delayedtrue when Google flags a leg as often delayed by over 30 minutes.
co2_kgGoogle's CO₂ estimate for the itinerary, in kg.
co2_typical_kgThe typical CO₂ for the route, in kg.
co2_vs_typical_percentThe itinerary's emissions against the route's typical, in percent (−24 = 24 % less).
checked_bags_includedChecked bags included in the fare as Google states it on the list (0 on most US economy fares); null where the list does not state it (612 of 612 rows of 5 international and non-US searches in our probe).
carry_on_bags_includedCarry-on bags included in the fare.
booking_tokenGoogle's token of the itinerary (its fare and currency inside): the key for the booking page.
google_flights_urlThe Google Flights booking page of this itinerary (the search with its flights selected, plus the token).
itineraries_foundHow many itineraries Google listed for the search (before your filters); on a calendar summary row the priced days, on an Explore summary row the priced destinations.
price_levelGoogle's price insight for the search: low, typical or high against the route's usual fares.
lowest_priceThe lowest fare of the search as Google's insight states it.
typical_price_lowThe low end of Google's typical price range for the route and dates.
typical_price_highThe high end of Google's typical price range.
booking_optionsWith bookingOptionsFor: Google's booking options of the itinerary — seller, seller_code, is_airline, domain, price, price_exact, currency, fare_code, fare_name, flights, checked_bag_fees (the first and second bag; 0 = included), carry_on_fee, fare_features (Google's coded fare attributes), booking_url (Google's click-through link).
booking_options_countHow many booking options the row carries (0 when asked and not served; null when not asked).
change_typeWith onlyChanges: new (not in the memory yet), changed (the price moved since the last delivery) — unchanged itineraries are not delivered.
previous_priceWith onlyChanges: the price last delivered for this itinerary.
price_changeWith onlyChanges: the price now minus the previous price.
price_history_ownWith onlyChanges: the prices of this itinerary across your own runs (at, price).
best_countOn a summary row: how many itineraries Google put in its best group.
cheapest_priceOn a summary row: the cheapest price of the list (of the calendar's days, of the Explore destinations).
price_historyOn a summary row: Google's 61-day price history for the search (date, price).
airportsOn a summary row: the route's airports as Google names them (code, name, city, country_code, country, latitude, longitude).
airlines_availableOn a summary row: the airlines Google offers in the filter of this search (code, name).
alliancesOn a summary row: the alliances Google offers in the filter (code, name).
price_range_minOn a summary row: the lowest price Google's filter range starts at.
price_range_maxOn a summary row: the highest price of Google's filter range.
dateOn a calendar row: the day; on a calendar summary row the window read.
is_cheapestOn a calendar row: true on the cheapest day(s) of the calendar read.
trip_length_daysOn a calendar row of a round trip: the trip's length in days, the asked return date minus the departure date (null on a one-way calendar).
destination_rankOn a destination row: its place in the list, cheapest first (maxItems keeps the cheapest).
destination_cityOn a destination row: the city.
destination_countryOn a destination row: the country.
latitudeOn a destination row: the city's latitude.
longitudeOn a destination row: the city's longitude.
distance_textOn a destination row: the distance from the origin as Google writes it (347 mi), where Google gives one (2 of 62 destinations from SEA in our probe).
image_urlOn a destination row: Google's photo of the destination.

Example record:

{
"row_type": "itinerary",
"search_id": "s1",
"search_label": "LAX → JFK 2026-11-04",
"status": "ok",
"status_detail": null,
"scraped_at": "2026-10-11T14:24:27Z",
"trip_type": "one_way",
"origin": "LAX",
"destination": "JFK",
"departure_date": "2026-11-04",
"return_date": null,
"legs_asked": null,
"passengers": {
"adults": 1,
"children": 0,
"infants_on_lap": 0,
"infants_in_seat": 0
},
"cabin": "economy",
"market": "US",
"language": "en",
"currency": "USD",
"currency_served": "USD",
"view": "all",
"rank": 1,
"group": "best",
"leg_index": 1,
"selected_flights": null,
"price_scope": "itinerary",
"price": 204,
"price_exact": 203.4,
"airlines": [
"Delta"
],
"airline_codes": [
"DL"
],
"flight_numbers": [
"DL 951"
],
"departure_at": "2026-11-04T10:40:00-08:00",
"arrival_at": "2026-11-04T19:16:00-05:00",
"duration_minutes": 336,
"stops": 0,
"layovers": null,
"legs": [
{
"flight_number": "DL 951",
"airline_code": "DL",
"airline": "Delta",
"airline_logo": "https://www.gstatic.com/flights/airline_logos/70px/DL.png",
"operated_by": null,
"origin": "LAX",
"origin_name": "Los Angeles International Airport",
"destination": "JFK",
"destination_name": "John F. Kennedy International Airport",
"departure_at": "2026-11-04T10:40:00-08:00",
"arrival_at": "2026-11-04T19:16:00-05:00",
"departure_time": "10:40",
"arrival_time": "19:16",
"duration_minutes": 336,
"aircraft": "Airbus A330",
"legroom": "31 in",
"legroom_rating": "average",
"legroom_code": 1,
"amenities": [
"in-seat power & USB outlets",
"on-demand video"
],
"wifi": "free",
"often_delayed": false,
"co2_kg": 253
}
],
"aircraft": [
"Airbus A330"
],
"legroom": [
"31 in"
],
"legroom_unit": "in",
"overnight": false,
"often_delayed": false,
"co2_kg": 253,
"co2_typical_kg": 334,
"co2_vs_typical_percent": -24,
"checked_bags_included": 0,
"carry_on_bags_included": 1,
"booking_token": "CjRIcjYyZi1GTkxUcTBBUFRVOXdCRy0tLS0tLXdiYWcxNy1uMkFBQUFBR3JMbkI4SWZNOUNBEgVETDk1MRoLCPSeARACGgNVU0Q4HHD0ngE=",
"google_flights_url": "https://www.google.com/travel/flights/booking?tfs=Gj8SCjIwMjYtMTEtMDQiHwoDTEFYEgoyMDI2LTExLTA0GgNKRksqAkRMMgM5NTFqBwgBEgNMQVhyBwgBEgNKRktAAUgBmAEC&tfu=CjRIcjYyZi1GTkxUcTBBUFRVOXdCRy0tLS0tLXdiYWcxNy1uMkFBQUFBR3JMbkI4SWZNOUNBEgVETDk1MRoLCPSeARACGgNVU0Q4HHD0ngE=&hl=en&gl=us&curr=USD",
"itineraries_found": 147,
"price_level": "typical",
"lowest_price": 184,
"typical_price_low": 85,
"typical_price_high": 270,
"booking_options": [
{
"seller": "Delta",
"seller_code": "DL",
"is_airline": true,
"domain": "www.delta.com/...",
"price": 204,
"price_exact": 203.4,
"currency": "USD",
"fare_code": "DELTA MAIN BASIC",
"fare_name": "Delta Main Basic",
"flights": [
"DL 951"
],
"checked_bag_fees": [
45,
55
],
"carry_on_fee": 0,
"fare_features": [
[
8,
1
],
[
4,
4
],
[
1,
2
],
[
2,
4
],
[
7,
4
],
[
5,
4
]
],
"booking_url": "https://www.google.com/travel/clk/f?u=ADowPOKX3n1pEFf03k1VWrB0_bUS81-zQLTHXlc2jfDgegOlgvZs4W3Q4Kv2yU_bS1th6eOaCKxD-I-swU6yB-Np9nySzpX7k1IYETf1tU-oN7dZNVj_KsIRCG-BmIvAzDXOcrwd6ba71RiM42CC-41Bf5Pdow_pJKfq6n35iYYfroQz3-f8FNiWEFFehfj6c2Jh59EijaUysJ9-A9aEboHDEQKCvwq3-qUTv5kzR0pF8Bcgl5oonqX_jP-W8_r_DlILKsXMxV2tVoo1ZGuJU6CYd5csS4f9LM4mMYrnbfGsujowcj1AljJ0J7LIArXub-eufZ7Z33NOqIcaAzG1uFEDRDimL-K_ThWeKXUTpp4YY1mRVtpBRO-UmMuAUhkq8BXfIMSYYd8dTBa4O75sx4JkBEpbmp77b19CQeKyLlDSnGmRufNUrbUe7z_YpSTNCN7EtwFIX7dNgNxHwMpzft3xdOePBcnDjL7cj_t9bxhBMo-CRWW_Yq2Baja_BkWIkb5n2-iZbHcLyxj66iQcN8Ar2n83DQoE-N10xE4wSqY_h0J5sOTtPu-Ju4jTpqpgEjnAGipzutBDKcvt7cwBGl_1-FVuNCc3C9sBSk9A2ELe6k1Pw3K-CuCwPHZeruYNPiRDDXdZtIMnR1GKW_weqWNBSUZ7mOEe6vbdj4lqdAgY9VvkBYLnym7U06Mpx-kkPHiEjhCJzJiYQXJUVU8McEB6Me5bicBKS8TC89umm3BtTr_Opxfl5XrzNeGiZPHE2ymNFMNhkgtykNHmrxD6sJuFyuZc2vmXH7J514Qntwwg1J9ihcivKJZ50VCkC0POUV4t852f-evTBsvYGY2ZTkwg1KBzyIie1l93cNZMSEi8MJFb7Em9JDNJ59SUjp6z9KmrHq6GxcfyQAZraS7P4w8ot99gaXtraI_zuJysdF57p003cyDXqTish1jCmh7Pk4pKD1M5f_9b1DR979iPCOO1yOCuJJ-Cq5hBhNucCP6B3grPb4CmRiqnyN3Qm0-PrFvGoX7JBV1F6ccI7hZEMVqjTftddcbgkI9rPk2ph6LVlotrseOXY10obUTVvVRDQOP7El0yloUpwry0pMwBFiAaZKU_thZb0vQurfv7OwH2wX3423dx4Xj32oQLIbOwQq-2SzSZg1HSagi4Gs9nEclQ3OqtTk0TKHUwxYpmzG9zNotHx79wkg9Md5OByM4Yy7Jc14xZdZUbvYpuElCg-aS360lEtD-8zRwHMHkDAGTYhvQsgxRbu3iS_tGRO6_98etQq_e-LQGORVmCGnmYKbRBuoAytgWws1E7R1TSTzbu8zyMcE6KEFHoWED9SF_F_7XvVe9kwVZdQ2vAeStjJurrNFNefaS0ewmV8QF7Mea3MslBgLdLBjHKrsgj1NEc9FSjmsa7j2PzgPp9xxfCgami8x8kvF1FQ6S_PWRjmxCJyhfje2UXkDC9EMbz_EkFXhtZdjEvyXrTPx6vUyrRwnrmHpXyiVJIk7MRv7gcMM3lE1gartSAOPo_0gffSfqtJgpQlPyul42BYB5t0l6fYF-TDeJ0VSc7p3CEtClK1-8ARaTkxDDhn7L8PiYTAbzf7XClflQtEHD7gXmAOnRSySYUowOCQdq7ZLw3wQiJGZQsb7Zw1ESpHDHRRHMVoAciT3BOzBAiyG_rlaTZEI2CG1a-ztkn0IzlwQtPOQz5S90aflao8ZP1q5mlwBMb9rx1UMSLwTXCc9bgTytLLpkMCQtDxTH4AXh0w6n45-mHpWsRbucZUYwwyNeaUYEZcKc72-tB22DIt19PrOxslcnmnBeMo9BkPZGCORaDzrQRPstJgzHQKMLr9yaWcXPVbMq07FZuQEZazSlhQAf9qTT1kTMLyzdOMHtIB30C1KE_yIT_53NQJ9ZYtxCDiU1hL96paJo0AkRlmoWGHzEhhXGM77Vbyty2_wSdBIy650MDQLBzXNWFYKZ53PjLiq6UVQv2AlG5v6m9k_VbZhNoYFknBEm_NhL-p5fIfwG6Nyhgpw6_z_r2unGUHUETh3eNBHt40SvsywIAv1KO1U1kJvv-j6tPMBEghozHFA_JXOjPQ55GTwd8GJ25A8k3dgCPEAyzArI3PmR-zRsOFkKoIbLwRNUSBMeFmqnfZ983h43O7Cdq6DlYzo343pq4vag8AD-UPO0S2gMcPa7-Kpc_a16mznzn-Mr_3RX8DeY9wscYFmxjf_lHkXKcXvU6je5eIHMjua-VyywTC4uwCwxJWtYFO9YePFv3Z9Pueh7aYhV_A8DPOBSliavByO_TjUcpzqgy6AiKQtBmqT9tlIFwdGdktVD8ONhiXGLwUo08hOhrP3W-248o329cPc6FQgjL6c_TZWLyLQZLbnHzT4_F9MPdBjhfyBTVaLCZVLxW3BwwOIpRsXmkccGCKYi2c04IF9Q8NkuuDUqVKU32CPHsEn1B1N6fwetMYrr1DPfY1X1DE-7HBB8OUKvwZBgsl19yYzlfKf9fQYzl7grlOu1uDCZJ-_yu93Bn41sUBMUxIkZGZ-hzwtizjbsXvhs2bAQHWLN1asIHHhGyTG6bYLuEz5NpTYba8_NeuWgi1y__rm3JBS4ZU-I8G9V_Z9ska_I1Ds7aSpxDgl74IFUIAJOAB-QAxvBDtbnxkUkz8SYXISB5j0hI2abHn70pIwSK6gtmW59intoU23eJ6CrJMpdwFWPp39TEHzp0EcMlZzu7uKMAYandP26rQpYPIMc-7w9X0mvLL78thMM1kW1gPybHsiaxL93XATLfFzJwM121fU224_HRetI-y8PJlAk4Kq_xVLKkn79XazA5_eWkX1TfKHXLV9tLbf6NJeGpjnAf9gWK0x-1fPV7dyGYZ2eo6FPR-i3INj8fPLPMxSl7DIwffB1jPt7zTjNiQPiLFAg8ref4Yy6F3Buz_rnZ-daKgfOOxj2ZG4CQnygHQiJyk_9pqJaksbOAIlK8kiIhlyD0mfdWUhAUHRNSloe7ja7FHmhkBOnoBkmLT-KCgJm1eZ6jmd4nV8245ff8pCUavZbjBOP72KLUSWNXtVEaFm4qIeTWg1cqp4upOLWvI0AaRbSfHWP8WNuGCOqOFXYTqDDBoVwWH__GTuZrW9S7wqziIOcowjL5J5U3dofOtFhz4ir7HxJo2W7J6a1cUsZVzqoEI7Bo4W6cKswTBkyNHyMwsZaUMq0U8qTaq7uxLBUtjdkTa1pC2162xn1Tqhq6NfHlp_dKly-a2JLk0DU4acnlYp3Lhyz7tNzw73KR0k6V8NPsFUiwAk-rp4LwzYyRJ6Anthmb6fNvlGSQV30K-2MIzFlkNaOB5MI41WdDNgoZ5AoNhccd4Nc6aVoyCTst2PmoTF17FUOOvf69eNIUI8LsB9cH6dy9-9BoVjWH4iiePPFbm2O8vzY5rID6QwENbkfbEW1S2dfoGq-yx53gnoHuqr2Y3ajOgKUemU-nP8Y9lHcM6L_qxJfvamCZZnyZOUHj1wohw-THCdFHQJdgxxsUxQhv1GHKNCfnXE4&v=1"
},
{
"seller": "Delta",
"seller_code": "DL",
"is_airline": true,
"domain": "www.delta.com/...",
"price": 259,
"price_exact": 258.4,
"currency": "USD",
"fare_code": "DELTA MAIN CLASSIC",
"fare_name": "Delta Main Classic",
"flights": [
"DL 951"
],
"checked_bag_fees": [
45,
55
],
"carry_on_fee": 0,
"fare_features": [
[
8,
1
],
[
4,
1
],
[
1,
1
],
[
2,
4
],
[
7,
1
],
[
10,
1
]
],
"booking_url": "https://www.google.com/travel/clk/f?u=ADowPOLDqW3KfCtSmMg3YomfuO7S80QWYlu47XrwA9XZ_ApV7hwV-TvBM5zMhBQXU4g-IXipETPVrl6_x18zB4Hkqpez4oZwwK00s-UJdewWOQq9q8hSlskei7JIR8DQYMpUzM5MPuko6FFMlacUazy_YjBeX4S3kUGEthDTRvf3C_Ej5LkpjrLHL392PbGbITwNYAuZEePXAUC9p2zUYN2KdiKtx9FszPW7DreGXGBFvdgN9spIeFJR-mwkOKsspqnItUleipA-PWkhdG4c_DCTJ_QLefQIZGHiwEDf1dD0GlLzmhP0VIIF40tzrsX7QElKrCPsKSlXuU1ErWyfmrsi8IMJtrkLNOE_ezUEpEg7Qv0YCjyg6_hAOQPRWKz-y3FPRLSLfZkcQTvFgjVBcZKi-c0vGs3aICDCZ2Ffxi1OPS-VNRTfCYVQQ2VLg-VQ3wP7i-GHfGtCjnDmC21D0uK-Kv-WVaQsn7VkHo9VEd9eax8DWDN1fxajOBvyVMABS4VgbzBu8H89gy7IwLR57ExXtHqY8AkFep6vObpROo-t1v7AwT9zWtxLg6xaeKjiKU5HGFYfoK3bCdsxUD_00H6U9Ny-r2YNHFu5WH3qjFFonKsaqHurSEb66QRJ4IuhdOBpguxs1LianjghtrU85GcxnwKlW-xl-b18ZwsZ0lHSnRGUwa2z0rb5jTID4i42ishKpcInfKTZdOWw_OXb0TMrk0WEEru4NLkNJVa7AYUiCclA8AVTdC01674uiAfwyMk0DRFIwkaoCOVM8_mhfyTnr0QY5xHl-aEXHOl6p4SkDXcJ7emEHryJaQvZlqgnI3opzPhfcOOZGfjNHjE2BusWAwCX7_HfQQsmLFOJsuchX3nwbNbykuFacxhPQLnZJ9VXKo-gjpdt5D94EnUmJprNv8D1F2rbx1se5vL5lbiZ1M2wx28GL3zcIKZRpm9_IY4cBIIsUtuWlSFuAOjYNrQBtVUT5Wj_kJXuhsXzwfBiq42-b6lIFIcGdebafe1M-FO-7R3YOL13OMgsGVUU1UrhP8m5GdnahXQK7QE13WLv-BirTu1VwkCtIQF-BICy_iMkjABB1y3Ceejf5Say_risermntQaSa09s6TqRdzelaK_DpEYzAJ3Bj_k4yBIXlW7Xqk2eoNbSY9PDsXokmP7u1gPyW8TYsTDDhD9ia7xkY7wfC1J9hGkq_uSqwGP-TQAZtwmx73L22yNuqmmfA9u1rGTuqmbgv0C5Jaa5TIxKYAbZIFOUiXKLUpwevqBA2p_BR5FcDk_Q8aeQEhx7jH8_-YLMoqtpTKDNg-9LQz1PcXMEV-kHzwcXxM9fDvEfM3iHwxUISeh61IJ2mTrJWgr7_1ZTdn-2atoBOr0bseuUap8gXPdq8Js_PCVUz-33nXozEJj8nqdgiYFh5UWUNaBnLZNEHe3AforBDqFZKivHNgr92JM1AxMeryr3nH0g_5xMfwanNCl4hEJQtCyO9ffTlZ7ltdGT3f2totBME9PcDJ5ELbJGe937fzp-tmP1A2WNH44YihSDjh_B2TGEt5gvGOra_LNBhPj_ZGTQcwCi6AyOWAPRbeuyRu-EDIm7ufFOz_gCnvzsfebaK9MdLjvRr02N-VnH9vDWXRgn9RwZCpSiBXWT8vjVaiwVVBhykWVga7fNY7MlZPlvWOTx0K3yv_FwdrWzcKMTeNY0kUFpvDYc61Pl0VvTLDzCaD9J1PRlSIjW7yWinc8W8CjQ4eZmEkBmqzp56likWxuOa7e895_5TDe2zFtEcHZNx-8AX8TwOR-81zYXzgMP1kdHat8Us-NrdahDwHFEwgaCqrsrYZdhonXOKyJ68M_B7Rk27BAnvPB21nQreI686bWoovbygAIz9j_NccPBi6uJfVKrh4tklCJ-gNhVW9VAymeo5ophur890AasmAFpmuI7TrAjA2ZZmWiEVnoqxRL64rbMUbLjKkN9xwRMHAY3Ma8oLur68R3lO39I73C-V81dGh67124oxGnKWNaNWTJ3E4S0ybxQ-caBN21Xlh9VV-QIT-f8EDXkMTw8h_gbP7njuROQK868rqNOSG-o6Afhy9XegG9WXcNLP3V50e6ilBDjU23e6mgO8b24uY-zeu4bf1av-YKvzOg1xQJoqOGvkf7OB0ECSre_oyYLSVHT2kshO1LlzoIDlUtxsvqfTuSXkiFTWhX-TAPz4K2UJt-88qnq-he9SNqVdgUixhqYc0ZWrA53JC1dzXjlvEBBATjEHKAxlx4su4qq3SiMfa1b3T2_mSS323GmoEmzqX_L-el9w9qOOAxX5QkrlA3SLukrFFDBV98Vip8hmQ32pOkW6Y5PsrhXFVjvuAa3Db_aCENM7ERAX2rY_Kv90tgB-zmDieCF8uytgEpLWY-76ikM-m9-_C-0Tg5wbQXivvt7a2Q8SVPyTXKCIvGMUi1WOZ-qfboriv5yg3RvAmV4DeSkGj2CB0dfGXmtRUhmiH2PCIx_sd-wjs7xGNO2nPZz6u6KgP-PWhBVi_jvIHGdpZAYJ0O542v3hRZ8K7a5ZFGQ59D7KFbWLTAIJ1C9mixtHDpzERo71DvYZ5R396g_3JKGcm1aQrrMSPJIpc5PlekV2NXQUI7Ifes6-Ks_4ydV4biZl2OL3M2vnFFI8IYes_kXvFh203aPpYZ-Qae5rjynEjdTYJVp_YWQVp6JnP8ZM2xk82WmmOW4sYlrVs0fSYICn2UI1SG2TPvHf5QUvI9ZC5E6UXMsoj-6sWo2g7Clya6ia8nWt132bNkiu0l_4HwCpDK8nxNww9JORkwHMOvOyDVSTCwQ7-czsd2zD7aDhahM6tIHifJPodThoTQLMGoi7F8s6qNkGloDVmRHD_LVsyR22GMUuHdYfgC4EVpniCuDgYJgs4zgDL1F7NiwcywCpi0PSFctV0T6_MUCEr0gXP7JBvh5s74yd-fW4VTPW2xv6-mpfFuELxMHiC699YoIvt3FdlNCHyuSrZ-1koqRTuXrqKOetbOp7-SmzpbWd3HDawzf3lAFaUPmFBAZCuHOo3dohTpHhDb6kzxdXMp__CK7KylY2YsK8I28En6f63h9WUreu20_1Icq3us5BFHYBWFp2HQ18_5tKUCj7OLaTjIL0_rp6HpiNBXaNzexLvVDa6igAvCOvxSlmsW4fxma7b0tfT0PWWLsZY-PDefNAov-NBN5oNQJFArLWaX7-R72MzLjvwFjiyZxm6V-WHrYa4_x3AxfbgVtjVR-rmvFS_vhdcYu-Zcg3vaJ2eGfWo2YdN2vnfh7TpYFurpPJVFKpGb7Bo3kbNS5Tld2_SCFZb_oAVhnbXUwPNvBDbZM_MDy65PscCrHnax8COWmKktenQEurDuj4MkbTMveunzNjzezNxent-EgrOgajor-FdKQKw7VQCb66aGaO6HqBf12GvIIb_EKB1JQ1E5eB4NfnU3_tX_FlhdQTdPCYoJ6iiqo10xerdfX2e-0W56sfoXkHAEBd8hzLWtFVmbxNw&v=1"
},
{
"seller": "Delta",
"seller_code": "DL",
"is_airline": true,
"domain": "www.delta.com/...",
"price": 384,
"price_exact": 383.4,
"currency": "USD",
"fare_code": "DELTA MAIN EXTRA",
"fare_name": "Delta Main Extra",
"flights": [
"DL 951"
],
"checked_bag_fees": [
45,
55
],
"carry_on_fee": 0,
"fare_features": [
[
8,
1
],
[
4,
1
],
[
1,
1
],
[
2,
1
],
[
7,
1
],
[
3,
1
]
],
"booking_url": "https://www.google.com/travel/clk/f?u=ADowPOKY8dS0DTOBlqxyWh9FptYXJpNE7FqEnjZ9DjT3OQc3Eks5lKiY6Uy0KQRSVWzHT8ajccAT_w07aYjk6lkXnX6dVFe80paHb5_4zkgQCmVpnqqj-DkgeJWgWyoRFHgMUUJbTr0W4t7Fkb_QLN6zxd38qoK03UwY5yaIe6VpsE78MYwxRKa9dd0PBtnUYrvePbBt6_k5OJ6UHzllVyedyR6Ol7rMsbjaCCFxDgAWY5sqjBHhRMy_L-YkmdlurMtjbsryeUfsuJSwPBPsxDL7cGAaezWE_SegmtTKOk5lPCHfRDwgOuTLhddHQNnTW1n78wVueRlNRgLjBf9kOuoKbeTG0hpV-3E32HuYF7VD3w3-DmSvkYJjUyEt6Yttd4f6yxNJdzMxzMfcp3oF7ns6pE088MEr-n9ittTGKgqiFzLjxSD9yDqQdV2i80skCfRG6hR4NuaJ1ZxuBhN6kBhGNQsjLdw2tfgjF1A-7oYMga7issipBinqn-2xQnQ6Cn4CtklzAc5iaEJYJWzdUbie_YGibIG_268gWWg3H7-ejVQNDnL2O7lNT1iGzUKuzqCABYUR_bwFhDrR6RA7tkyceF7oNHOOXsKavjo2GBWdY7ivpubDs_qx3N3shSu5WShfxzl1oUQTta81GLNDhfcdgKMmPbstqzowjiPkw3zOrHHqvFNbUkROKE-ZDWhxPDMsQ5SPrboa3xzWYc2_ItB7nUDUGFSaeC84ZxKn_Xua8HH-ZgOgNtnFv8zdiIGDA5QghNHkk6dWlFVaCHf1O0l1g6CbgPCUMnqkO9erKFN56HXYwQgKZrPrfJRl9ceqFrrpNqplWoGN5cl2h8bXD0GAQgnQaeKOVhNd890sYmTO9Pz48S9pcgMMsqfElXa2duofxog8tA3rN9hqvbGMxx2XhEGjoCgJrDAzFPuEHMrlf7SY--x5nAQF6APlbo2uxCRR9sruWm-8KeHyZvaeC1lWLlX5iQ_yLyXq3BitN4B6hyecjxRtCLIxCCevi5UnvReQv6fOXu6T4VLx9C02Yig4hu89VrNYaLFw3zDtowVtpWyO9v42uYjddmA_rApROGrdZeS7P7i24X7-29Vi_0G0_NYJNhPL_UGpt2ktpANKYydH5yPC075fkSd5e5WIfai9vHFGgL1w_UQsPbCOIJZN7wI_Y7nJ-n5OBsr0gzTCe_W8oDse-o10-OyvmWPwGmLDUdM1XoIJEUHN8fSHAH9R86dEfnE7pJwC4EsiluYDQ3ihuWglQg3I7XZM3ABDJw4hSpAFh5To4qkDFKesdd3NvFjAc-ofXdAWxiM8VEyiTrBa5VfYf0nMe1ISDKzUvg8yNkhCj9NK41ZKYIwMzEbD7D9snWJD9rRvtFzTu0GQ59ilf2AAOcIULsms5sf1gu8UccC9k4n9sIaWtraWoP87oNZbrKy6GbVRzdbQkDP_X1lqG1XS8Teh_lc1bYeDMYNbQ-ZctS6uHvmb8gpAB3I8n_ZfC_LdXGv-cT1fbKn07LgVWV4B0nZcMhh3DNpC9vRXUFDXMs5LVhkgAQL3aKZfRzmLB5gRCTKH5TIRBsZZqwsD0wonVahhZo6kcjxfOFK-G6EiDq4fjs1zwwpAdZnOfgDNsjzM8v45K3IfBahkD6nJ4-8ASNNxTJBwuaEXaBrUSy87bomwkPYUlWY1m1GWpltjjchlzKLnA1oKgzm-gGpyxNgjd7g0xl3asQny6_0s6-xI2PXjkvAyZrw5FhKTRWSG4iq10WsGW5glE6sDbknvzVfKNqZRyb3AVF000PNqN5E1ImMi9_DkoGTHTH2WAMZjrPlo8bz1NPL5YS7L6piu9wnxsrcFsUeWnjQVNSeXEVNa9k0SCS4f5wot2P9C0Vo6v12lQzoaIm-3cuS5dHV7CAnz2M3X1deoYktun27U6qhjKN0hBci30iL-Pf1KzuD4SktQmyEB-deAl7_58G1FDqZG7aYzGArYpJUO81VigGR-_9YeKjA8YPkbXTCnmUawed6W8sS3B6qG1owP2u2DzdmatfkSLMbH44bJfx03VwI1YeLLan345tFDkZwkLsCQQxep6ATQwtYx-a4NjKa77GkaKXdllBVGpQNktrNKnxPy-DrIZhS-exlEahvkol6pOAEosmSLO-gYRh8vLsCpdUQ-SLfH_BxifnPKnwBE2gcuOQ2Srh2Uz_44pVjkSjiq1XGxWNgbtWBEdslSXphVjQn8lFFLT-fidluMj98KKm81-V0AlNEB0ayc_Bdybh4SkXCu1nZdckimVSePeh06m2zKBWUDpTrAmwezyFfY_HJZkb6l2BrcKtBJVRyu3OtdUx7qi3iqHh2FknalPG6Vpl6Hbu5QJS4N9llm-p-hNxcIKaKB-s8rLs5MCkt5VoQFOn3oMm1P9vVJ8GqP4yN8yEJLmSKW4eRx9jZFoLvnlMFucZFH7NorIN1oZq6c35swH74DGul04ccszjrtffLDu-VabjeMn8BvE8SfQboUTCuS4b1niw5MHpNjhRaTkmQfyA7noPXEfpnSsWpUFQ5y2QNVcWwnOlhL5ZKfvSlQJms8wLrAa09fnoQi04DK6cQIbHBOyk5Xk1Gu8Yt0HyuTBEEu_ztk0Pyjat3YYRKx47vp_52hOjkFSQ8aLmWTURqcUGGhVqqnX05OHgLPfBExXNwtpZKtL-kD7vZdkcVivZxZIXeZUOe-W3iBQhFVwB9aqkMB3ObZfZp2pZTgu_HK0qhgWheP-fpkOGk2xuqnt-AXfwSoS7IiMuEaZyYvFzhLoe39RE6v8QcVlaL-iE4RAOXBeMOKKv59Hg8CHRD-o0KP6YmPcBe4dPrFrUXUp7NwA30RHvYeN8UkEXQmufvEoSOESp0Zrr5D8t8-gcnGtYRDlg0uVES5egIYYM9PVg6OZgiel9qdS9kXnZT89jaTqLGcAqM_J_D-drURsT6AaIrOkKkMLTqT9zQKXbi33lgZho76artRwm7k7fVT5W0l2Xch4CQfnfKoZSYHMjSxBjITVMxTOobEVz2qbPWSzQLFj6qS2ufd_3I7Hy5_dVENphYqUc6nGJ9yLEygxab6iPUw25Nn6E2JDjhB24an6OiUBo3Mw0pCXCVgvoNdoU8QmNum2tGAOlJJiT5w2hlvZRbaOJ-3OMvilyxQk5_s3RnOiJRC8j_VcETkzFp_TQH5yAIofs3d9cnBx-o_rz91a2Z6t2C-UJfdJhs_dGr2TJEi1I5koS8jxH6qfCoOfFGSgzanmCmJioQ5ewYgqsPXapl6uHYsG8waiTMm-qI9S50W9n9N4RGh3q2zViyLKopS9gmfed-XNj6Lm65CsqNIr4k3JfrIUPTTolnuX_XJt9LevtTDIRqduF4ExBHx4zvN9HQyz7FZY6eCvDwKJlOfNuQfOSecKucriJjx-hiBbQrwTndV88cAksPfKOEm6qeayUQ8kv5SwKFoefUCL_1J-7PBNlALYkluyaVyz4DPMfcFM-ThBBdEclDOOHiRSWBoPFfH13XQJNTQU9Uoel5p&v=1"
}
],
"booking_options_count": 3,
"change_type": null,
"previous_price": null,
"price_change": null,
"price_history_own": null,
"best_count": null,
"cheapest_price": null,
"price_history": null,
"airports": null,
"airlines_available": null,
"alliances": null,
"price_range_min": null,
"price_range_max": null,
"date": null,
"is_cheapest": null,
"trip_length_days": null,
"destination_rank": null,
"destination_city": null,
"destination_country": null,
"latitude": null,
"longitude": null,
"distance_text": null,
"image_url": null
}

Pricing

Pay only for the rows a run delivers, with no start fee and no platform usage billed to you. Prices fall with your Apify plan.

per 1,000FreeStarterScaleBusiness
Itinerary (itinerary)$1.00$0.85$0.70$0.50
Booking options of an itinerary (booking_options)$5.00$4.25$3.50$2.50
Price calendar day (calendar_day)$0.30$0.255$0.21$0.15
Explore destination (destination)$0.20$0.17$0.14$0.10

An itinerary row is $1.00 per 1,000 on the Free plan ($0.001 an itinerary) and $0.50 on Business: Google's full list for LAX → JFK (147 itineraries) costs $0.147 on the Free plan, its first view (32) $0.032. Booking options are an extra $0.005 ($0.0025 on Business) on each itinerary row that carries them (booking_options_count > 0), only for the first bookingOptionsFor itineraries you ask for. A priced day of the price calendar and a priced Explore destination are rows of their own at the prices above. Free: every search summary row (the count, the cheapest fare, the price insight and its 61-day history, the status), a search Google lists no flights for (no_flights), a value that is no search (invalid), a refusal the exits could not pass or a list in another currency than the one asked (failed), the unchanged itineraries onlyChanges does not deliver, and a run that failed before its first row. A run that stops early (a timeout, an abort) is charged for the rows it delivered. maxItems counts the charged rows; before the first request the log says the most the run can cost at your plan's prices. Enterprise plans have their own rates — the Actor's Pricing tab shows the price for your plan.

Usage patterns

  • One search or many — Give origin, destination and departureDate (airport codes, several comma-separated: LAX,BUR), add returnDate for a round trip or legs for a multi-city trip; or list searches in searches (objects, texts such as LAX JFK 2026-11-04, or Google Flights URLs) and searchUrls. A date is YYYY-MM-DD or +N, N days after the day of the run (UTC): +30 / +37 for a week's trip a month ahead, so a saved task or a schedule never asks for a past day (a past date is a free invalid row that says so). flexibleDays adds one search per following day. Every row carries search_id and search_label, and every search gets one free search row with its status.
  • What a row is — row_type = itinerary: one itinerary Google lists, in Google's order (rank, group best or other), with its price (the total for the passengers asked), the exact fare, the flights, the times with offsets, stops and layovers, the per-leg details in legs, the booking token and link, and the search's price insight. search: the free summary of a search (count, cheapest, insight with the 61-day history, airports, airlines, status). calendar_day and destination: the calendar's priced days and Explore's priced destinations.
  • Round trips and multi-city — A round trip's rows are the outbound itineraries priced as the round trip (price_scope = trip, leg_index 1). returnsFor reads the return flights of the first N outbounds: rows with leg_index 2, the outbound in selected_flights, priced as the whole trip. A multi-city trip works the same leg by leg. bookingOptionsFor applies to the rows of the last leg, so set returnsFor with it.
  • Filters and order — Stops and airlines are applied by Google (maxStops, includeAirlines, excludeAirlines); maxPrice, maxDurationMinutes, departureTimeRange and arrivalTimeRange are applied on Google's full list at no extra call; sortBy orders the rows (Google's order by default). itineraries_found always says how many Google listed before your filters, and the summary row's status_detail how many matched them. Ready-made: Google Flights filters: nonstop morning flights under $300.
  • Market, language, currency — market, language and currency set the view Google serves (fares and sellers of that market, texts in that language, prices in that currency). Each row says the currency Google served (currency_served) and the legroom unit of the view (legroom_unit): inches on the US view, centimetres on the British, German and Australian ones. Ready-made: Google Flights in 3 markets: fares in GBP, EUR and AUD.
  • Monitoring — Save a task with your searches and onlyChanges, schedule it: the first run delivers everything and remembers it (under stateStoreName, or a name derived from the searches); the next runs deliver only new itineraries and the ones whose price moved, with change_type, previous_price, price_change and price_history_own (the prices of your own earlier runs). Unchanged itineraries are counted in the run summary and not charged. Give the trip's own dates (YYYY-MM-DD): a +N date moves with the day, so each day's list would be new to the memory. Ready-made: Google Flights price tracker: one trip, the fares that moved, Google Flights search: every itinerary for one route and date.

Input configuration

fieldtypedefaultwhat it does
originstring""The departure airport as a 3-letter IATA code (LAX); several airports comma-separated (LAX,BUR). Leave destination empty to get the cheapest destinations from here (Explore). A metro code (NYC, LON, PAR, TYO, CHI, WAS, …) or a Google city id (/m/02_286) searches every airport of the city; city names are not looked up. Not searched when searches or searchUrls has an item: the list is then the whole run, and the dates and options here are its defaults.
destinationstring""The arrival airport as a 3-letter IATA code (JFK); several comma-separated (JFK,EWR), or a metro code (NYC) for every airport of the city. Empty = Explore: one row per destination Google prices from the origin on the departure date.
departureDatestring""The departure date, YYYY-MM-DD, or +N for N days after the day of the run (UTC): +30 keeps a saved task or a schedule on a date ahead. A date in the past is a free search row that says so.
returnDatestring""Set it for a round trip (YYYY-MM-DD, or +N days after the day of the run: +30 and +37 for a week a month ahead): the rows are the outbound flights priced as the round trip, as Google shows them; returnsFor adds the return flights of the first N outbounds.
legsarray[]A multi-city trip as a list of legs, each {"origin": "LAX", "destination": "JFK", "date": "2026-11-04"} (2 to 6 legs; a date may be +N days after the day of the run). When given, the fields above are ignored; not searched when searches or searchUrls has an item. The rows are leg 1 priced as the whole trip; returnsFor adds the next legs for the first N itineraries of the leg before.
searchesarray[]A list of searches, each an object {"origin", "destination", "departureDate", "returnDate", "legs", "cabin", "adults", "children", "infantsInSeat", "infantsOnLap", "maxStops", "includeAirlines", "excludeAirlines", "market", "language", "currency"} (the run's fields apply where an object leaves one out: an object without a date takes the run's departureDate and returnDate; its route is its own), a text "LAX JFK 2026-11-04" or "LAX JFK +30 +37" or a Google Flights URL. Up to 500 searches a run. The list is the whole run: the run's origin, destination and legs are then not searched.
searchUrlsarray[]One Google Flights URL per line, as copied from the browser (https://www.google.com/travel/flights/search?tfs=… or …/flights?q=Flights to JFK from LAX on 2026-11-04 one way): the route, dates, trip type, cabin, passengers, stops and airlines are read from it, hl / gl / curr too. With a URL here, the run's origin, destination and legs are not searched.
flexibleDaysinteger0One more search for each of the N days after the departure date (a round trip keeps its length). 0 = the dates given only.
adultsinteger1Adult passengers (1–9; at most 9 passengers in all). Prices are the total for every passenger.
childreninteger0Children (2–11).
infantsInSeatinteger0Infants under 2 with their own seat.
infantsOnLapinteger0Infants under 2 on an adult's lap (at most one per adult).
cabineconomy / premium_economy / business / first"economy"The cabin class of the search; every row carries it.
maxStopsany / nonstop / one_stop / two_stops"any"Applied by Google (the list is filtered at the source).
includeAirlinesarray[]2-letter airline codes (DL, B6, AA) or an alliance (STAR_ALLIANCE, ONEWORLD, SKYTEAM); applied by Google. Empty = every airline.
excludeAirlinesarray[]2-letter airline codes (or an alliance) to leave out; applied by Google.
maxPriceinteger0Keep itineraries (and Explore destinations) up to this total price in the currency asked; applied on Google's full list at no extra call. 0 = no limit.
maxDurationMinutesinteger0Keep itineraries up to this total duration; applied on Google's full list. 0 = no limit.
departureTimeRangestring""Keep itineraries departing inside this local-time window, HH:MM-HH:MM (06:00-12:00); applied on Google's full list.
arrivalTimeRangestring""Keep itineraries arriving inside this local-time window, HH:MM-HH:MM; applied on Google's full list.
sortBybest / price / duration / departure"best"best keeps Google's own order (the best group first, then the others as Google ranks them; rank says the position); the other orders are applied on the full list.
viewall / top"all"all reads Google's full list ("View more flights": nonstop and connections, 146 for LAX → JFK in our test); top reads the first view Google opens with (32 there). Both are one call.
returnsForinteger0Round trips: also read the return flights of the first N outbound itineraries (one call each; the rows carry leg_index 2 and the outbound in selected_flights, priced as the round trip). Multi-city: the next legs for the first N itineraries of the leg before. 0 = the first leg only.
bookingOptionsForinteger0Read Google's booking options (sellers, fares, bag fees, booking links) for the first N itineraries of each search — on round trips and multi-city trips for the rows of the last leg, so set returnsFor too. One call of about 6 seconds per itinerary; a separate event. 0 = none.
calendarDaysinteger0Also read Google's price calendar: one calendar_day row per priced day from the departure date, for this many days (one-way: about 90 days per call; a round trip: the trip's own length kept, 14 days per call, each row with its return_date). 0 = no calendar.
cheapestDaysinteger0With calendarDays: also run the full search for the N cheapest days of the calendar (one more search each). 0 = the calendar alone.
marketstring"US"The two-letter country Google serves the view for (US, GB, DE, …): the fares and the booking sellers of that market.
languagestring"en"The language of the texts (en, de, fr, es, pt-BR, …): airport names, legroom units (inches or centimetres).
currencystring"USD"The currency of every price (USD, EUR, GBP, …). Each row carries the currency Google served (currency_served); a list served in another currency than the one asked is a free failed row, never a charged one.
onlyChangesbooleanfalseRemember every itinerary delivered (by its flights and departure) and, on the next run of the same searches, deliver only the ones that are new or whose price moved; unchanged ones are counted in the run summary and not charged. The memory is kept for you under stateStoreName. Give the trip's own dates (YYYY-MM-DD): a +N date moves with the day, so each day's list is new to the memory.
stateStoreNamestring""With onlyChanges: the name of the memory to keep between runs (letters, digits, ., _, -). Empty = a name derived from the searches, so a saved task finds its own memory.
maxItemsinteger0Stop after this many charged rows (itineraries, calendar days and destinations; the free search rows do not count). 0 = no cap.

Errors

A run does not fail because of your input. When an input cannot be used — a date that is not a date, an id in the wrong form, two settings that contradict each other — the run ends Succeeded, charges nothing, and says what to change:

  • the status message starts with INPUT REJECTED;
  • the dataset holds one row, {"error": true, "code": "…", "message": "…"}, and no results;
  • the key-value store record ERROR holds the same object.

From code, check error on the first row before reading results.

A search Google lists no flights for is not an error: it gets one free search row with status no_flights and the reason, and the run goes on with the others. A run that ends Failed is a fault on our side, never your input; it charges nothing, and we are alerted.

FAQ

Why does the row count differ from Google's page?

The count moves by the minute (146 then 147 inside three minutes in our test), and Google's page opens with the first view (about 30) while view = all reads the full list. itineraries_found on every row and on the summary row is Google's count at the minute of the run.

Why do some itineraries have no price?

Google lists a few itineraries without a fare, at the end of its list (its own token for them carries no price): 20 of 1,037 rows over 8 routes in our probe, on 4 of the 8 (most on European routes, none on the three US domestic ones). Their price, price_exact and currency_served are null; the flights, times, aircraft and booking link are there, and the row is charged as an itinerary Google lists. sortBy = price puts them last.

Is the price per passenger or the total?

The total for all passengers asked, as Google shows it (two adults on a $204 fare showed $407 in our test). price_exact is the fare behind the rounded figure, in the same currency.

Can I search by city or metro code (NYC, LON)?

Yes for metro codes: NYC, LON, PAR, TYO, CHI, WAS, MIL, ROM, STO, MOW, SAO, RIO, BUE, YTO, YMQ, BJS, SEL, OSA, JKT and DTT search every airport of the city, as Google does when you type the city (NYC → JFK, EWR, LGA); so does a Google city id (/m/02_286), and a Google Flights link of a city search is read as that city. City names are not looked up: give the code, or the airports comma-separated (JFK,EWR,LGA). A value that is neither is a free search row that says so.

How are the booking options charged?

As an extra event on the itinerary rows that carry them (booking_options_count > 0). Each is one more call of about six seconds, so bookingOptionsFor is a small number by design (the first N itineraries of each search, in the order you chose).

What does the price calendar cover?

One calendar_day row per priced day from the departure date for calendarDays days (up to 365). One-way: Google's date picker, about 90 days per call. Round trip: Google's departure × return grid, 14 days per call, each day priced at the trip's own length (return date minus departure date) with its return_date and trip_length_days. A multi-city trip's calendar is not read (its search row says so). cheapestDays opens the full list for the N cheapest days.

Why did a search come back as failed?

Three reasons, each in status_detail: Google refused the search as invalid (code 3: an airport code it does not take, a date it does not serve); Google served the list in another currency than the one asked (the row says which); or the exits could not pass Google's wall for this search in this run (a per-IP state on Google's side; the run summary shows the open rate of the run's exits). None of these is charged.

What is charged?

An itinerary row, a calendar day row and a destination row each carry one event; booking options are an extra event on the rows that carry them. Free: every search row (ok, no flights, failed, invalid) and a run that failed before its first row; a run that stops early (a timeout, an abort) is charged for the rows it delivered. maxItems counts the charged rows; before the first request the log says the most the run can cost at your plan's prices (the rows each search can deliver, the add-ons you switched on, maxItems and your charge limit).

Can an AI agent use it (MCP)?

Yes. Apify's MCP server (https://mcp.apify.com) offers Store Actors as tools to Claude, Cursor and other MCP clients: add this Actor and the agent sends a search and gets the rows back.

Integration

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('hyperbach/google-flights-scraper').call({"origin": "LAX", "destination": "JFK", "departureDate": "+30"});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('hyperbach/google-flights-scraper').call(run_input={'origin': 'LAX', 'destination': 'JFK', 'departureDate': '+30'})
items = client.dataset(run['defaultDatasetId']).list_items().items

CLI

$apify call hyperbach/google-flights-scraper --input '{"origin": "LAX", "destination": "JFK", "departureDate": "+30"}'

REST

curl -X POST "https://api.apify.com/v2/acts/hyperbach~google-flights-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' -d '{"origin": "LAX", "destination": "JFK", "departureDate": "+30"}'

Support

apify@hyperbach.com

This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.