Google Flights Scraper | Real-Time Flight Prices API avatar

Google Flights Scraper | Real-Time Flight Prices API

Pricing

from $5.00 / 1,000 results

Go to Apify Store
Google Flights Scraper | Real-Time Flight Prices API

Google Flights Scraper | Real-Time Flight Prices API

Real-time Google Flights prices. One-way and round-trip fares with airlines, layovers, durations, Google price insights and a direct booking link on every result. Per-leg filters for stops, airlines and departure times. Ideal for price monitoring, travel apps, fare analytics and AI agents.

Pricing

from $5.00 / 1,000 results

Rating

0.0

(0)

Developer

Matan Rabi

Matan Rabi

Maintained by Community

Actor stats

0

Bookmarked

110

Total users

18

Monthly active users

13 days ago

Last modified

Share

✈️ Google Flights Scraper and Real Time Flight Price API

Live Google Flights fares in one call. One-way and round-trip, with airlines, layovers, durations, Google's own price insights and a working booking link on every result.

Every search is scanned against Google Flights at the moment you call it. Nothing is served from a cache, so the price you get back is the price the traveller will see. 4,712 runs in the last 30 days, 100% of them succeeded.

🌟 Why choose this Google Flights API

Google's price verdict, not just a number. Every result carries price_insights_low, price_insights_high and a low / typical / high rating for that route and those dates. That is what lets your product say "$56 is a good price for this route" instead of just "$56". Most Google Flights scrapers do not return this at all.

Round-trip is a real search. Not two one-way queries stapled together. You get one object per itinerary with a combined total_price, total_duration_seconds, total_stops, and the outbound and return legs already paired, each with its own airline, duration, stop count and layovers.

Per leg filtering. Require a nonstop outbound and accept one connection on the way home. Restrict the return to a specific airline. Set a departure window on one leg and an arrival window on the other. Every filter splits per leg on round-trip searches.

Flat JSON, one row per flight. No HTML, no nested scrape output to flatten before you can use it. It drops straight into a dataframe, a database, or an LLM tool call.

Built to fan out. The backend takes up to 150 concurrent requests per minute, so a flexible date scan across a whole month finishes in one burst rather than a slow serial loop.

No second bill. No SerpApi key, no separate proxy account, no monthly rental. Residential proxy routing is included and on by default.

🚀 What you get back

FieldWhat it is
price / price_as_numberFare as a display string and as a number you can sort on
airlineOperating carrier
duration / duration_secondsTotal trip time, formatted and in seconds
stops / stops_info[]Stop count plus every layover airport and its duration in seconds
departure_description / arrival_descriptionLocal departure and arrival times in plain text
buy_linkDeep link into Google Flights for that exact itinerary
price_insights_low / price_insights_highGoogle's historical price band for this route and these dates
price_range_in_relation_to_other_periodsGoogle's low, typical or high verdict on the fare

Round-trip results add total_price, total_price_as_number, total_duration_seconds, total_stops, and a full set of departure_flight_* and return_flight_* fields for each leg.

📖 Usage examples

From the Apify Console

Pick One-way or Round-trip, fill in the airports and dates, press Start. The form is prefilled with a working search, so you can run it once before typing anything.

Example 1: cheapest one-way, nonstop only

{
"endpoint": "oneway",
"from_airport": "JFK",
"to_airport": "LAX",
"departure_date": "2026-12-01",
"max_stops": 0,
"sort_type": "Price",
"currency": "usd"
}

Example 2: round-trip, nonstop out, one stop allowed home

{
"endpoint": "roundtrip",
"from_airport": "JFK",
"to_airport": "TLV",
"departure_date": "2026-12-01",
"return_date": "2026-12-08",
"max_departure_stops": 0,
"max_return_stops": 1,
"seat_type": 1,
"currency": "usd"
}

Example 3: business class, specific airlines, morning departures

{
"endpoint": "oneway",
"from_airport": "LHR",
"to_airport": "SIN",
"departure_date": "2026-12-01",
"airline_codes": ["SQ", "BA"],
"departure_time_min": 6,
"departure_time_max": 12,
"seat_type": 3,
"limit": 20
}

Example 4: family of four, budget capped

{
"endpoint": "roundtrip",
"from_airport": "BER",
"to_airport": "CDG",
"departure_date": "2026-12-01",
"return_date": "2026-12-05",
"passengers": [1, 1, 2, 2],
"max_price": 400,
"currency": "eur"
}

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("mtnrabi/google-flights-real-time-api").call(run_input={
"endpoint": "roundtrip",
"from_airport": "JFK",
"to_airport": "TLV",
"departure_date": "2026-12-01",
"return_date": "2026-12-08",
"currency": "usd",
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
for trip in sorted(items, key=lambda t: t["total_price_as_number"]):
print(trip["total_price"], trip["departure_flight_airline"], trip["buy_link"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('mtnrabi/google-flights-real-time-api').call({
endpoint: 'oneway',
from_airport: 'JFK',
to_airport: 'LAX',
departure_date: '2026-12-01',
currency: 'usd',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.sort((a, b) => a.price_as_number - b.price_as_number);
console.log(items[0].price, items[0].airline, items[0].buy_link);

REST

curl -X POST "https://api.apify.com/v2/acts/mtnrabi~google-flights-real-time-api/run-sync-get-dataset-items" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-d '{
"endpoint": "oneway",
"from_airport": "JFK",
"to_airport": "LAX",
"departure_date": "2026-12-01",
"max_stops": 1,
"currency": "usd"
}'

🔍 Input parameters

ParameterTypeRequiredDefaultDescription
endpointstringonewayoneway or roundtrip
from_airportstringJFKDeparture airport IATA code
to_airportstringLAXDestination airport IATA code
departure_datestringOutbound date, YYYY-MM-DD
return_datestring✅*Return date, YYYY-MM-DD. Required for roundtrip
limitinteger10How many flights to return
currencystringusdCurrency for all prices
seat_typeinteger11 Economy, 3 Business
passengersinteger[][1]1 adult, 2 child, 3 infant on lap, 4 infant in seat
max_priceintegerOnly return fares at or below this price
sort_typestringOverallOverall, Price or Duration
use_fallbackbooleanfalseWait longer on hard routes instead of returning empty
use_ext_proxybooleantrueRoute through a residential proxy
max_stopsintegerOne-way only. 0 for nonstop
airline_codesstring[]One-way only. Include only these carriers
exclude_airline_codesstring[]One-way only. Exclude these carriers
departure_time_min / _maxintegerOne-way only. Departure hour window, 0 to 23
arrival_time_min / _maxintegerOne-way only. Arrival hour window, 0 to 23
max_departure_stops / max_return_stopsintegerRound-trip only. Max stops per leg
departure_airline_codes / return_airline_codesstring[]Round-trip only. Carriers per leg
departure_exclude_airline_codes / return_exclude_airline_codesstring[]Round-trip only. Exclusions per leg
departure_departure_time_min / _maxintegerRound-trip only. Outbound departure window
departure_arrival_time_min / _maxintegerRound-trip only. Outbound arrival window
return_departure_time_min / _maxintegerRound-trip only. Return departure window
return_arrival_time_min / _maxintegerRound-trip only. Return arrival window

* return_date is required only when endpoint is roundtrip.

📊 Output format

One dataset row per flight. Set limit to control how many rows a search produces.

One-way

{
"price_range_in_relation_to_other_periods": "low",
"price_insights_low": 65,
"price_insights_high": 135,
"from_airport": "Berlin (BER)",
"to_airport": "Paris (CDG)",
"departure_date": "2026-06-15",
"price": "$56",
"price_as_number": 56,
"duration": "1 hr 50 min",
"duration_seconds": 6600,
"buy_link": "https://www.google.com/travel/flights?tfs=...&curr=usd",
"airline": "easyJet",
"stops": 0,
"stops_info": [],
"departure_description": "10:15 AM on Mon, Jun 15",
"arrival_description": "12:05 PM on Mon, Jun 15"
}

stops_info is empty on nonstop flights. Otherwise it lists each layover:

"stops_info": [
{ "stop_airport": "AUH", "stop_duration_seconds": 5700 }
]

Round-trip

{
"price_range_in_relation_to_other_periods": "low",
"price_insights_low": 135,
"price_insights_high": 205,
"from_airport": "Berlin (BER)",
"to_airport": "Paris (CDG)",
"departure_date": "2026-06-01",
"return_date": "2026-06-05",
"total_price": "$119",
"total_price_as_number": 119,
"total_duration_seconds": 12900,
"total_stops": 0,
"buy_link": "https://www.google.com/travel/flights?tfs=...&curr=usd",
"departure_flight_departure_description": "7:00 AM on Mon, Jun 1",
"departure_flight_arrival_description": "8:50 AM on Mon, Jun 1",
"departure_flight_airline": "easyJet",
"departure_flight_stops": 0,
"departure_flight_duration": "1 hr 50 min",
"departure_stops_info": [],
"return_flight_departure_description": "8:20 PM on Fri, Jun 5",
"return_flight_arrival_description": "10:05 PM on Fri, Jun 5",
"return_flight_airline": "easyJet",
"return_flight_stops": 0,
"return_flight_duration": "1 hr 45 min",
"return_stops_info": []
}

🎯 Use cases

  • Travel agents and AI assistants. Flat JSON that drops straight into a tool call, with a booking link on every row so the agent can hand the user somewhere to buy.
  • Price alerts. Poll a route on a schedule and fire when price_range_in_relation_to_other_periods flips to low.
  • Fare calendars and cheapest month views. Scan a month of departure dates and chart price_as_number by day.
  • Metasearch and comparison sites. Every result ships with a working buy_link, so you never have to reconstruct a booking URL.
  • Revenue and route analysis. Track how fares on a route move over weeks, by carrier and by cabin.
  • Corporate travel tooling. Per leg airline and time-of-day filters map directly onto travel policy rules.

🔌 Integrations

Schedules. Save a search as a Task and put it on a cron. 0 7 * * * checks a route every morning, 0 */6 * * * every six hours.

Webhooks. Fire ACTOR.RUN.SUCCEEDED at your own endpoint to push new fares into your database the moment a run finishes.

Make, Zapier and n8n. Apify's connectors let you route results into a spreadsheet, a Slack alert or a CRM without writing code.

Python and JavaScript clients. apify-client on PyPI and npm, examples above.

🤖 Use it from an AI agent over MCP

This Actor is available through Apify's MCP server, so any MCP capable client can search flights as a tool. That includes Claude, Cursor, ChatGPT and anything else that speaks MCP.

https://mcp.apify.com/?tools=actors,docs,mtnrabi/google-flights-real-time-api

The response shape matters here. A model can read a flat object with price_as_number, airline and buy_link and answer a question in one hop. Scrapers that return nested page dumps force you to flatten and summarise before the model can use anything.

There is also an OpenClaw skill built on the same backend: clawhub.ai/mtnrabi/google-flights-realtime-api

📝 Notes worth reading before your first run

Results are live, so response time tracks route complexity. A trunk route between two major hubs comes back fast. A small regional airport with two connections takes longer, because Google itself takes longer. Turn on use_fallback for those instead of accepting an empty result.

sort_type: "Price" follows Google's ordering, which is not a strict numeric sort. If you need exact price order, sort on price_as_number yourself. Every example above does.

Dates are YYYY-MM-DD and airports are IATA codes. New York is JFK, London Heathrow is LHR, Tel Aviv is TLV.

limit controls how many rows you get and therefore what a search costs. The default is 10.

❓ Frequently asked questions

Does Google Flights have a public API?

No. Google shut down the QPX Express API in 2018 and has not replaced it for general use. Anything calling itself a Google Flights API is either scraping the site or reselling someone else who does. This Actor scrapes it directly and returns the result as clean JSON, with no third party reseller in the chain.

How is this different from the other Google Flights scrapers on Apify?

Three things, and they are all checkable on the listing pages. Round-trip is a first class search that returns paired itineraries with a combined total, rather than two separate one-way result sets you have to match up. Google's own price insights come back on every row, so you can tell a user whether a fare is good. And filters split per leg on round-trips, so an outbound and a return can have different rules. Store numbers move, so compare the current pages yourself.

Can I use this as a flight price API for one specific route?

Yes, and it is the most common use. Save the search as a Task, schedule it, and read price_as_number and price_range_in_relation_to_other_periods on each run. That gives you both the fare and Google's judgement of whether the fare is good.

Can I search flexible dates or a whole month?

Yes. Run one search per date and fan them out in parallel. The backend takes up to 150 concurrent requests per minute, so a 31 day scan finishes in one burst. That is how cheapest-month calendars and fare heatmaps get built on top of this.

Every result includes buy_link, a deep link into Google Flights for that exact itinerary. It is a real link you can put behind a button, not a search URL the user has to refine.

Can Claude or Cursor call this as an MCP tool?

Yes. Point your MCP client at the URL in the MCP section above. The flat response shape means a model can answer a route and price question without any post-processing.

How do I scrape Google Flights with Python?

Use the apify-client package and call this Actor, as in the Python example above. Writing your own Google Flights scraper means maintaining a headless browser, rotating residential proxies, and rewriting your parser every time Google changes the page. That is the work this Actor already does.

Which airport codes does it accept?

Three letter IATA codes. JFK, LHR, CDG, TLV, SIN. City level codes such as NYC and LON also work where Google supports them.

What happens if a route has no flights?

You get an empty result rather than an error. On difficult routes, small airports or itineraries with two or more stops, set use_fallback to true and the search waits longer for Google instead of giving up early.


Using this Actor? A rating takes ten seconds and helps other developers find it. Found a bug or need a field that is not here? Open an issue with the input you used and the output you got, and I will answer.