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"
}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.
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.
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 → |
Every plan includes every endpoint. You only choose volume and rate limit. Read from the live listing on 2026-08-26; the listing is authoritative.
Questions, answered plainly
- 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.