Google Flights Scraper & Google Flights API: Fares, Calendar
Pricing
from $0.50 / 1,000 itineraries
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
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,topthe first view; every row saysitineraries_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 freefailedrow, 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.bookingOptionsForadds 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.
calendarDaysreads Google's price calendar (one row per priced day, about 90 days per call) andcheapestDaysruns 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
searchrows 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):
| field | meaning |
|---|---|
row_type | itinerary (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_id | The 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_label | The 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)). |
status | On 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_detail | Why 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_at | When the row was read (UTC). |
trip_type | one_way, round_trip, multi_city or explore. |
origin | The 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. |
destination | The 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_date | The 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_date | The return date of a round trip (null on Explore's destination rows: an Explore search is one-way). |
legs_asked | A multi-city trip's legs as asked: origins, destinations, date each. |
passengers | adults, children, infants_on_lap, infants_in_seat of the search; every price is the total for them. |
cabin | The cabin of the search: economy, premium_economy, business, first. |
market | The market (country) the view was asked for (US, GB, DE, …). |
language | The language of the texts (en, de, …). |
currency | The currency asked for every price. |
currency_served | The 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. |
view | all (the full list) or top (Google's first view) on itinerary and summary rows; calendar / explore on their summary rows. |
rank | The 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). |
group | best (Google's top picks, 3–5) or other. |
leg_index | 1 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_flights | On a row of leg 2 or later: the flight numbers chosen on the legs before (["DL 951"]). |
price_scope | itinerary 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. |
price | The 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_exact | The exact fare behind the shown price (203.40 for a shown $204), from the itinerary's token. |
airlines | The airline names of the itinerary, in leg order, each once; on a destination row the airline of the fare Google priced. |
airline_codes | The 2-letter airline codes, each once. |
flight_numbers | The flight numbers in leg order (DL 951, B6 500, …). |
departure_at | The departure of the first leg, local time with the UTC offset (2026-11-04T10:40:00-08:00). |
arrival_at | The arrival of the last leg, local time with the UTC offset. |
duration_minutes | The total duration, layovers included; on a destination row the flight time of the fare Google priced. |
stops | The number of stops (0 = nonstop); on a destination row the stops of the fare Google priced. |
layovers | Each stop: airport, name, city, minutes. |
legs | Each 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. |
aircraft | The aircraft of each leg (Airbus A330, Boeing 737MAX 9 Passenger). |
legroom | The legroom of each leg as Google states it (31 in, 79 cm). |
legroom_unit | in or cm: the unit of the view (inches on the US view, centimetres on European ones). |
overnight | true when the itinerary arrives after its departure day. |
often_delayed | true when Google flags a leg as often delayed by over 30 minutes. |
co2_kg | Google's CO₂ estimate for the itinerary, in kg. |
co2_typical_kg | The typical CO₂ for the route, in kg. |
co2_vs_typical_percent | The itinerary's emissions against the route's typical, in percent (−24 = 24 % less). |
checked_bags_included | Checked 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_included | Carry-on bags included in the fare. |
booking_token | Google's token of the itinerary (its fare and currency inside): the key for the booking page. |
google_flights_url | The Google Flights booking page of this itinerary (the search with its flights selected, plus the token). |
itineraries_found | How 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_level | Google's price insight for the search: low, typical or high against the route's usual fares. |
lowest_price | The lowest fare of the search as Google's insight states it. |
typical_price_low | The low end of Google's typical price range for the route and dates. |
typical_price_high | The high end of Google's typical price range. |
booking_options | With 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_count | How many booking options the row carries (0 when asked and not served; null when not asked). |
change_type | With onlyChanges: new (not in the memory yet), changed (the price moved since the last delivery) — unchanged itineraries are not delivered. |
previous_price | With onlyChanges: the price last delivered for this itinerary. |
price_change | With onlyChanges: the price now minus the previous price. |
price_history_own | With onlyChanges: the prices of this itinerary across your own runs (at, price). |
best_count | On a summary row: how many itineraries Google put in its best group. |
cheapest_price | On a summary row: the cheapest price of the list (of the calendar's days, of the Explore destinations). |
price_history | On a summary row: Google's 61-day price history for the search (date, price). |
airports | On a summary row: the route's airports as Google names them (code, name, city, country_code, country, latitude, longitude). |
airlines_available | On a summary row: the airlines Google offers in the filter of this search (code, name). |
alliances | On a summary row: the alliances Google offers in the filter (code, name). |
price_range_min | On a summary row: the lowest price Google's filter range starts at. |
price_range_max | On a summary row: the highest price of Google's filter range. |
date | On a calendar row: the day; on a calendar summary row the window read. |
is_cheapest | On a calendar row: true on the cheapest day(s) of the calendar read. |
trip_length_days | On 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_rank | On a destination row: its place in the list, cheapest first (maxItems keeps the cheapest). |
destination_city | On a destination row: the city. |
destination_country | On a destination row: the country. |
latitude | On a destination row: the city's latitude. |
longitude | On a destination row: the city's longitude. |
distance_text | On 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_url | On 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,000 | Free | Starter | Scale | Business |
|---|---|---|---|---|
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,destinationanddepartureDate(airport codes, several comma-separated:LAX,BUR), addreturnDatefor a round trip orlegsfor a multi-city trip; or list searches insearches(objects, texts such asLAX JFK 2026-11-04, or Google Flights URLs) andsearchUrls. A date isYYYY-MM-DDor+N, N days after the day of the run (UTC):+30/+37for 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 freeinvalidrow that says so).flexibleDaysadds one search per following day. Every row carriessearch_idandsearch_label, and every search gets one freesearchrow with its status. - What a row is —
row_type=itinerary: one itinerary Google lists, in Google's order (rank,groupbest 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 inlegs, 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_dayanddestination: 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_index1).returnsForreads the return flights of the first N outbounds: rows withleg_index2, the outbound inselected_flights, priced as the whole trip. A multi-city trip works the same leg by leg.bookingOptionsForapplies to the rows of the last leg, so setreturnsForwith it. - Filters and order — Stops and airlines are applied by Google (
maxStops,includeAirlines,excludeAirlines);maxPrice,maxDurationMinutes,departureTimeRangeandarrivalTimeRangeare applied on Google's full list at no extra call;sortByorders the rows (Google's order by default).itineraries_foundalways says how many Google listed before your filters, and the summary row'sstatus_detailhow many matched them. Ready-made: Google Flights filters: nonstop morning flights under $300. - Market, language, currency —
market,languageandcurrencyset 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 (understateStoreName, or a name derived from the searches); the next runs deliver only new itineraries and the ones whose price moved, withchange_type,previous_price,price_changeandprice_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+Ndate 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
| field | type | default | what it does |
|---|---|---|---|
origin | string | "" | 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. |
destination | string | "" | 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. |
departureDate | string | "" | 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. |
returnDate | string | "" | 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. |
legs | array | [] | 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. |
searches | array | [] | 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. |
searchUrls | array | [] | 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. |
flexibleDays | integer | 0 | One more search for each of the N days after the departure date (a round trip keeps its length). 0 = the dates given only. |
adults | integer | 1 | Adult passengers (1–9; at most 9 passengers in all). Prices are the total for every passenger. |
children | integer | 0 | Children (2–11). |
infantsInSeat | integer | 0 | Infants under 2 with their own seat. |
infantsOnLap | integer | 0 | Infants under 2 on an adult's lap (at most one per adult). |
cabin | economy / premium_economy / business / first | "economy" | The cabin class of the search; every row carries it. |
maxStops | any / nonstop / one_stop / two_stops | "any" | Applied by Google (the list is filtered at the source). |
includeAirlines | array | [] | 2-letter airline codes (DL, B6, AA) or an alliance (STAR_ALLIANCE, ONEWORLD, SKYTEAM); applied by Google. Empty = every airline. |
excludeAirlines | array | [] | 2-letter airline codes (or an alliance) to leave out; applied by Google. |
maxPrice | integer | 0 | Keep 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. |
maxDurationMinutes | integer | 0 | Keep itineraries up to this total duration; applied on Google's full list. 0 = no limit. |
departureTimeRange | string | "" | Keep itineraries departing inside this local-time window, HH:MM-HH:MM (06:00-12:00); applied on Google's full list. |
arrivalTimeRange | string | "" | Keep itineraries arriving inside this local-time window, HH:MM-HH:MM; applied on Google's full list. |
sortBy | best / 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. |
view | all / 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. |
returnsFor | integer | 0 | Round 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. |
bookingOptionsFor | integer | 0 | Read 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. |
calendarDays | integer | 0 | Also 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. |
cheapestDays | integer | 0 | With calendarDays: also run the full search for the N cheapest days of the calendar (one more search each). 0 = the calendar alone. |
market | string | "US" | The two-letter country Google serves the view for (US, GB, DE, …): the fares and the booking sellers of that market. |
language | string | "en" | The language of the texts (en, de, fr, es, pt-BR, …): airport names, legroom units (inches or centimetres). |
currency | string | "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. |
onlyChanges | boolean | false | Remember 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. |
stateStoreName | string | "" | 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. |
maxItems | integer | 0 | Stop 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
ERRORholds 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 ApifyClientclient = 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
This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.