Google Flights Scraper — Fares, Routes, Booking Links avatar

Google Flights Scraper — Fares, Routes, Booking Links

Pricing

from $3.00 / 1,000 flight itinerary returneds

Go to Apify Store
Google Flights Scraper — Fares, Routes, Booking Links

Google Flights Scraper — Fares, Routes, Booking Links

Scrape Google Flights for one-way and round-trip itineraries. Prices, airlines, stops, layovers, aircraft, carbon emissions, and direct booking deeplinks. MCP-ready.

Pricing

from $3.00 / 1,000 flight itinerary returneds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

Google Flights Scraper — Real-Time Fares, Routes & Booking Links

Scrape Google Flights at scale for one-way and round-trip itineraries with prices, airlines, stops, layovers, aircraft, carbon emissions, and direct booking deeplinks. HTTP-only via a reverse-engineered protobuf URL parameter — no browser overhead, no Selenium, no JavaScript rendering. Built for travel apps, fare-monitoring pipelines, AI travel agents, and analysts who need real-time Google Flights data without a Skyscanner/Amadeus enterprise contract.

What does Google Flights Scraper do?

This actor turns a single search query — origin, destination, dates, passengers — into a clean JSON dataset of every flight option Google Flights would show a human user. Each record includes the full route (with layovers), every segment's airline and flight number, aircraft type, cabin, total duration, current fare, carbon emissions, and a deeplink back into Google Flights so you can review the exact itinerary.

It supports one-way and round-trip searches in all four cabin classes (Economy, Premium Economy, Business, First), 9 adults + 8 children + lap and seated infants, 30+ currencies, 30+ countries, and 29+ languages. Behind the scenes it constructs the same protobuf-encoded tfs URL parameter Google's own frontend uses, fetches the response over Apify's residential proxy pool, and parses the embedded AF_initDataCallback payload — so a typical run finishes in well under 15 seconds and costs roughly for a full LAX→JFK round-trip.

Why use Google Flights Scraper?

  • AI-agent ready (MCP-first): designed so Claude, ChatGPT, and Gemini can pick this tool and call it cleanly. The tool description, input fields, and output keys are all written for an LLM reader, not for a human PM. Typical agent run costs under .25 — well below the x402 default prepay.
  • Premium reliability target: residential proxy pool, session-consistent cookies, exponential-backoff retries, and an automatic HTML snapshot saved to the Key-Value Store whenever the parser fails so we can diagnose Google-side drift fast.
  • No browser, no Playwright tax: the protobuf URL approach is roughly 10–20x faster and far cheaper than headful-browser scrapers. Most runs finish in 5–15 seconds.
  • Richer defaults than the market: carbon emissions, aircraft type, layover airport + duration, cabin per segment, and a stable searchId hash are all returned by default — never gated behind a "premium" flag.
  • Per-itinerary pay-per-event (PPE): you pay only for flights actually returned to your dataset, not for failed pages, blocked requests, or empty responses. Predictable cost-per-search for production planning.

How to use Google Flights Scraper

  1. Open the actor on Apify Store and click Try for free.
  2. Fill the Input form:
    • origin — 3-letter IATA code (e.g., LAX).
    • destination — 3-letter IATA code (e.g., JFK).
    • departureDateYYYY-MM-DD (must be in the future).
    • returnDateYYYY-MM-DD for round-trip, leave empty for one-way.
    • Optional: adults, children, infantsInSeat, infantsOnLap, cabinClass, maxStops, currency, country, language, maxResults.
  3. Start the run. Cost is .005 per flight returned + .00005 start fee. Typical LAX→JFK round-trip returning 40 itineraries: about .20.
  4. Read the dataset in the Output tab. Export as JSON, CSV, Excel, RSS, or HTML — or hit the Apify API directly for programmatic access.
  5. Schedule it to run daily, hourly, or every 15 minutes via Apify Schedules to track fare changes over time.
  6. From Claude / ChatGPT / Gemini: the actor is automatically exposed via Apify MCP as apify--google-flights-scraper. Tool description, input fields, and output shape are all LLM-tuned.

Input

The full input schema is on the Input tab. Required fields are origin, destination, departureDate. Everything else has a sensible default.

Minimal JSON example:

{
"origin": "LAX",
"destination": "JFK",
"departureDate": "2026-08-15",
"returnDate": "2026-08-22",
"adults": 1,
"cabinClass": "economy",
"currency": "USD",
"country": "us",
"maxResults": 30
}

Multi-passenger business-class one-way example:

{
"origin": "SFO",
"destination": "NRT",
"departureDate": "2026-09-10",
"adults": 2,
"children": 1,
"infantsOnLap": 1,
"cabinClass": "business",
"maxStops": 1,
"currency": "USD",
"country": "jp",
"language": "en"
}

Output

Each dataset row is a single flight itinerary. Multi-segment flights and layovers are nested inside outbound and return. Keys are stable across runs; nulls are explicit (we do not omit fields).

{
"searchId": "a1b2c3d4e5f6",
"tripType": "round_trip",
"origin": "LAX",
"destination": "JFK",
"departureDate": "2026-08-15",
"returnDate": "2026-08-22",
"price": 487,
"currency": "USD",
"isBestFlight": true,
"cabinClass": "economy",
"totalDurationMinutes": 720,
"stops": 0,
"airlines": ["Delta"],
"outbound": {
"origin": "LAX",
"destination": "JFK",
"departureTime": "2026-08-15T08:30:00",
"arrivalTime": "2026-08-15T17:00:00",
"durationMinutes": 330,
"stops": 0,
"segments": [
{
"airline": "Delta",
"airlineCode": "DL",
"flightNumber": "DL 423",
"aircraft": "Boeing 767",
"origin": "LAX",
"destination": "JFK",
"departureTime": "2026-08-15T08:30:00",
"arrivalTime": "2026-08-15T17:00:00",
"durationMinutes": 330,
"cabin": null
}
],
"layovers": []
},
"return": {
"origin": "JFK",
"destination": "LAX",
"stops": 0,
"segments": [],
"layovers": []
},
"carbonKg": 412,
"carbonVsTypical": null,
"bookingUrl": null,
"googleFlightsUrl": "https://www.google.com/travel/flights/search?tfs=...",
"scrapedAt": "2026-05-16T18:00:00.000Z"
}

Download the dataset as JSON, CSV, Excel, RSS, or HTML from the Output tab.

Data table

FieldTypeDescription
searchIdstringStable 12-char hash of search inputs — groups runs of the same query
tripTypeenumone_way or round_trip
origin, destinationstringIATA codes for the full trip
departureDate, returnDatestring|nullYYYY-MM-DD; returnDate is null on one-way
pricenumberTotal trip price for selected passengers
currencystringISO 4217
isBestFlightbooleanTrue if Google placed this in the Best Flights block
cabinClassenumeconomy, premium_economy, business, first
totalDurationMinutesnumberSum of leg + layover durations
stopsnumberTotal stops across the itinerary
airlines[]string[]Distinct airline names
outbound, returnobjectPer-leg detail with segments + layovers
outbound.segments[].flightNumberstringe.g., DL 423
outbound.segments[].aircraftstringe.g., Boeing 767
outbound.layovers[].airportstringIATA code
outbound.layovers[].durationMinutesnumberLayover duration
outbound.layovers[].overnightbooleanTrue if the layover spans midnight
carbonKgnumberEstimated CO2 per passenger
bookingUrlstring|nullDirect booking deeplink (may be null on some runs)
googleFlightsUrlstringSearch URL — open in your browser to verify
scrapedAtstringISO 8601 UTC timestamp

Pricing — how much does it cost to scrape Google Flights?

Two pay-per-event line items, no monthly subscription, no rental tier:

EventPriceTriggered
apify-actor-start.00005Once per run
flight-result.005Per flight itinerary saved to the dataset

Typical run costs:

  • LAX→JFK round-trip, 40 itineraries: about .20
  • SFO→NRT one-way business class, 20 itineraries: about .10
  • 100 daily fare-tracking runs across 10 routes (≈30 itineraries each): about ** per day = /month**

Failed pages, blocked requests, and empty responses are not charged. You pay only when flight data lands in your dataset.

The Pay-Per-Usage tier is also enabled alongside PPE — large jobs (millions of itineraries) can opt for compute + proxy passthrough billing if that fits better.

Tips & advanced options

  • Lower maxResults for cheaper, faster runs. The default 50 typically covers Google's "Best flights" plus the first page of "Other flights". Push 100–200 only if you need long-tail itineraries.
  • Country + currency matter. Search market (country) affects which OTAs and airlines appear; currency affects display price (Google converts at its own rate). For local fares, match country and currency to the search market.
  • maxStops=0 for nonstop-only — typically halves the result set and the cost.
  • Run via Schedules with a JSON template for fare-tracking pipelines. Each scheduled invocation gets its own dataset.
  • Webhook integration — fire on completion to push fares into Slack, a database, or a downstream actor (for example pair with email-address-validator for outreach).
  • Multi-city is on the v0.2 roadmap — for now use multiple one-way searches and join on searchId.

FAQ, disclaimers, and support

Is scraping Google Flights legal? This actor scrapes only public-facing flight pricing data. Public-data scraping has been upheld in U.S. courts (hiQ Labs v. LinkedIn, Meta v. Bright Data). You are responsible for complying with Google's Terms of Service and any local regulations in your jurisdiction. Do not use this actor for any purpose prohibited by Google's TOS or applicable law.

Why are some runs returning fewer flights than I see in my browser? Google Flights occasionally A/B-tests result-set sizes by region and account. Try changing country and currency to widen the pool. If you see zero results, the most common cause is a past departureDate.

Why is bookingUrl sometimes null? Direct booking links require an extra request per itinerary; for cost reasons v0.1 returns the search-level googleFlightsUrl and leaves bookingUrl for an opt-in event in v0.2.

Does this work for multi-city trips? v0.1 supports one-way and round-trip. Multi-city is on the v0.2 roadmap.

How reliable is it? Target is 95%+ success rate across diverse routes. We use Apify residential proxies, session-consistent cookies, exponential-backoff retries, and a circuit breaker. When Google updates its internal data structure, the parser returns zero results and saves a snapshot to the Key-Value Store — open an issue and we'll patch within 24–48 hours.

Need help or have feedback? Use the Issues tab on the actor page. Custom features, schema additions, or higher-volume contracts: reach out via Apify's contact form on the actor page.