Google Flights API
Live Google Flights data, with a price verdict
Two endpoints over live Google Flights results: fares as flat JSON, with Google's price band, a low | typical | high verdict, and a booking link.
POST /onewayandPOST /roundtrip: round-trips come back as paired itineraries, not stapled legsprice_insights_low / high+ Google's verdict on every result, on every planX-Search-Statusseparates "no flights" from "the search failed"
Free tier on RapidAPI. No card to try.
{
"from_airport": "JFK",
"to_airport": "CUN",
"departure_date": "2027-01-01",
"limit": 5,
"currency": "usd"
}Short answer
What the FlightPowers Google Flights API returns
POST /v1/flights/oneway and POST /v1/flights/roundtrip, on api.flightpowers.com, or the same two as /api/google_flights/oneway/v1 and /api/google_flights/roundtrip/v1 on google-flights-live-api.p.rapidapi.com with a RapidAPI key. Both take IATA codes and YYYY-MM-DD dates and return flat JSON: live Google Flights fares with a booking link, Google's own price band, and a low | typical | high verdict on every result.[
{
"from_airport": "New York (JFK)",
"to_airport": "Cancun (CUN)",
"departure_date": "2027-01-01",
"airline": "American",
"price": "$177",
"price_as_number": 177,
"duration": "4 hr 25 min",
"stops": 0,
"price_insights_low": 140,
"price_insights_high": 180,
"price_range_in_relation_to_other_periods": "typical"
},
{
"from_airport": "New York (JFK)",
"to_airport": "Cancun (CUN)",
"departure_date": "2027-01-01",
"airline": "American",
"price": "$177",
"price_as_number": 177,
"duration": "4 hr 30 min",
"stops": 0,
"price_insights_low": 140,
"price_insights_high": 180,
"price_range_in_relation_to_other_periods": "typical"
}
]| Field | Type | Meaning | First row |
|---|---|---|---|
price / price_as_number | string · number | The fare as a display string and as a sortable number. On a round trip the same pair is total_price / total_price_as_number, for the whole paired itinerary. | $177 · 177 |
price_insights_low / price_insights_high | number | null | Google's own usual price range for this route and these dates. Null when Google publishes no band. | 140 – 180 |
price_range_in_relation_to_other_periods | "low" | "typical" | "high" | null | Google's verdict on this fare against that band. It rides on the round-trip pair too, so one request judges a whole trip. | typical |
airline · duration · stops | string · string · int | Carrier, flying time (also as duration_seconds) and stop count, with stops_info per layover. | American · 4 hr 25 min · 0 |
buy_link | string | Reopens that exact itinerary on Google Flights, in the currency you requested. | google.com/travel/flights?tfs=… |
X-Search-Status | "ok" | "empty" | "partial" | "degraded" | A response header, not a body field: it separates a real empty result from a search that did not complete. | ok |
Airports come back as "City (IATA)" display strings. A round trip is one request, not two: the return-leg fan-out happens inside the API and bills as a single call.
Rate limits are 150 / 250 / 500 requests/minute on the paid plans, which is what makes a month-long parallel date scan finish in one burst.
The endpoints
Two endpoints, five things worth a page each
Every plan gets all of it. You only ever choose volume and rate limit.
POST /oneway
One-way search
The base endpoint: route and date in, every live fare out. Full filter set, flat JSON.
POST /roundtrip
Round-trip search
One object per itinerary, both legs pre-paired, with combined price, duration, and stops.
response fields
Price insights
Google’s historical price band and its low | typical | high verdict, on every result.
response headers
Search status
ok | empty | partial | degraded. An empty array is an answer, never a shrug.
rate limits
Parallel date scans
150 / 250 / 500 req/min by plan: a whole month of dates in one burst.
After hotel data instead? The Booking.com Hotels API docs are documented to the same depth: destination search, name lookup, room-level pricing and geo-pricing.
POST /api/google_flights/oneway/v1
One-way: the full request surface
Three required fields; everything else narrows the search. The dedicated one-way page covers each response field too.
Required
departure_datestringThe travel date as YYYY-MM-DD.
from_airportstringOrigin IATA code. New York is JFK.
to_airportstringDestination IATA code.
Optional · filtering
max_stopsintMaximum stops per itinerary. 0 for nonstop only.
airline_codes / exclude_airline_codesstring[]Restrict results to these carriers, or keep everything except them.
departure_time_min / _max, arrival_time_min / _maxint 0–23Hour-of-day windows for departure and arrival.
max_priceintUpper bound on the fare, in the requested currency.
seat_typeintCabin: 1 Economy, 3 Business.
Optional · shape & behavior
sort_type"Overall" | "Price" | "Duration"Default Overall. Note that "Price" reflects Google's own ordering, not a strict sort. Sort locally on price_as_number for exact price order.
passengersint[]Passenger mix: 1 adult, 2 child, 3 infant on lap, 4 infant in seat.
currencystringDefaults to USD.
limitintMaximum results returned. Defaults to 10.
strictboolOpt-in, default false: a search that did not complete returns HTTP 503 instead of an empty array. Details on the search-status page.
use_ext_proxyboolDefault true: routes through a residential proxy to reduce blocks. Set false for lower latency on easy routes.
POST /api/google_flights/roundtrip/v1
Round-trip: same controls, split per leg
Four required fields, and every one-way filter exists twice: once for the outbound, once for the return.
Required
departure_date / return_datestringBoth travel dates, YYYY-MM-DD.
from_airport / to_airportstringIATA codes, as on one-way.
Optional · per leg
max_departure_stops / max_return_stopsintStop limits set independently. Nonstop out, one stop back is a valid ask.
departure_airline_codes / return_airline_codesstring[]Per-leg carrier restrictions, with matching _exclude_ variants for both legs.
departure_* / return_* time windowsint 0–23departure_departure_time_min/_max, departure_arrival_time_min/_max, and the return_-prefixed equivalents.
There is no max_stops field here: on the RapidAPI endpoints use max_departure_stops / max_return_stops. It is accepted as a convenience alias only when calling through api.flightpowers.com.
Optional · shared
sort_type · currency · max_price · seat_type · passengers · limit · strict · use_ext_proxyExactly as on one-way, applied to the paired search as a whole.
Why this one
Common gaps in other Google Flights APIs
Each row is a failure mode this API was designed against, and every right-hand answer is provable on the pages above, not adjectives.
| The problem | How this API handles it |
|---|---|
| Round-trips return broken or unpaired legs | A real /roundtrip endpoint with paired itineraries and combined totals. |
| No sense of whether a price is good | Google’s own price band and a low | typical | high verdict on every result. |
| You have to bring your own SerpApi key and pay twice | One subscription. No third-party key, no second bill. |
| An empty response could mean “no flights” or a failed scrape, and you cannot tell which | Failed reads are retried, and an empty array counts as an answer only when the page said so. X-Search-Status tells a real empty apart from a degraded search, and opt-in strict turns a degraded one into a 503. |
| Blocked by Google under load | Residential proxy routing on by default, switchable per request. |
| Filters are a thin subset of the Google Flights UI | Stops, airlines, exclusions, time-of-day windows per leg, cabin, passenger mix, max price, currency. |
| Serial only, so flexible dates take minutes | Rate limits sized for parallel date scans: 150 / 250 / 500 requests per minute by plan. |
Pricing
Every plan gets both endpoints
| Plan | Price / mo | Requests | $ / 1k req | Overage | Rate limit | |
|---|---|---|---|---|---|---|
| BASIC | Free | 10 / mo | — | hard cap | — | Get this plan → |
| PRO | $10 | 2,500 / mo | $4.00 | $0.003 / req | 150 / min | Get this plan → |
| ULTRArecommended | $25 | 10,000 / mo | $2.50 | $0.003 / req | 250 / min | Get this plan → |
| MEGA | $50 | 50,000 / mo | $1.00 | $0.001 / req | 500 / min | Get this plan → |
Swipe the table sideways for overage and rate limits.
Every plan on this API includes all of its endpoints; flights and hotels are separate subscriptions. Read from the live listing on 2026-09-11; the listing is authoritative.
Questions, answered plainly
- Is there a free Google Flights API?
- Yes, with limits. The FlightPowers Google Flights API on RapidAPI has a BASIC plan with 10 requests per month at $0, no card required. That is enough to verify your key and see the response shape, not to evaluate or use day-to-day. Google's own QPX Express API was retired in 2018 and is no longer available. The RapidAPI free tier is not affiliated with or endorsed by Google; it is an independent API that reads the public Google Flights site live at request time. Retrieved 2026-09-01: 368 subscribers, 4.2/5 rating on the RapidAPI listing.
- Is this an official Google API?
- No. FlightPowers is an independent API that reads the public Google Flights site live at request time; it is not affiliated with or endorsed by Google. The fields it returns, including the price band and the low | typical | high verdict, are the values Google shows travellers, passed through as-is.
- What data does each flight result include?
- Flat JSON per itinerary: price as a display string and a number (price / price_as_number), airline, duration in text and seconds, stop count with per-layover details, local departure and arrival times, a buy_link that reopens the exact itinerary on Google Flights, and Google’s price_insights_low / price_insights_high band with a low | typical | high verdict.
- Is the round-trip endpoint really one search?
- Yes. POST /roundtrip returns one object per itinerary with total_price, total_duration_seconds, total_stops, and the outbound and return legs already paired, not two one-way responses you have to combine yourself. Each leg takes its own filters.
- What happens when a route has no flights?
- The response says so explicitly. X-Search-Status: empty means the search completed and Google genuinely has no itineraries. The empty array is the answer. X-Search-Status: degraded means the search did not complete and the empty array says nothing about availability. Opt-in strict: true turns a degraded search into an HTTP 503 instead.
- How do I search flexible dates?
- One request per date, fired in parallel. “3 to 5 nights, JFK to Paris or Prague, anywhere in May” is 31 dates × 3 durations × 2 destinations = 186 requests. The per-minute rate limits (150 on Pro, 250 on Ultra, 500 on Mega) are sized so that finishes in a burst or two, not a serial loop.
- Do I need a SerpApi key or another scraping subscription?
- No. One RapidAPI subscription covers everything on this page. There is no third-party key to bring and no second bill.
- How much does the Google Flights API cost?
- Plans on RapidAPI: a $0 BASIC tier (10 requests/month, hard cap: it verifies your key, it doesn’t evaluate), then $10, $25, $50 per month for 2,500, 10,000, 50,000 requests. Every plan includes both endpoints and every response field.
- How fast is a search?
- Results are scanned live against Google Flights at request time, not served from a cache, so response time tracks route complexity. Dense routes with many connections take longer than trunk routes, and a search that has to retry an unreadable page takes longer still. Set a generous client timeout.
Every fare, judged, from one subscription
Live Google Flights data with the price band, verdict, and booking link attached to every result.
Free tier: 10 requests/month. No card to try.