Real-time Google Flights: one-way and round-trip fares over date ranges, with price verdicts.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Your own RapidAPI key for the Google Flights Live API. Free tier at https://rapidapi.com/mtnrabi/api/google-flights-live-api
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
FlightPowers one-way fare search: live prices read from Google Flights. Input: origin and destination IATA codes -- the destination may be several codes, as "BCN,LIS,ATH" or ["BCN","LIS","ATH"] -- plus either one departure date or a date range. Returns each flight's price, airline, duration, stops, a bookable buy_link, and Google's historical price range (price_insights_low / price_insights_high), the band that shows whether a fare is actually a good deal. Suited to any one-way fare question, including open-ended ones. One call accepts a date range and several destinations and searches every combination: 'Cheapest flight to Sri Lanka anywhere in October' is one call, not thirty. That holds with the caller's own key. On the free sign-in allowance (10 searches a day, one per combination) a grid larger than what is left today is refused before anything runs; a grid within what is left runs, and a whole-month scan needs the caller's own key. Each date/destination combination is one search; the count comes back in `api_usage`. `by_destination` carries one entry per requested destination -- empty ones included, each with a `reason` that separates a destination with no flights from one that was not searched, whose search failed, or whose fares did not fit in `limit`. Fares go stale within minutes: a current price comes from a new search, not from an earlier result.
Destination airport. One IATA code ("BCN"), several separated by commas ("BCN,LIS,ATH"), or a list (["BCN","LIS","ATH"]) -- every shape is accepted and the destinations are compared in the same search.
Origin IATA code, e.g. "TLV". One origin per search; a second one is refused rather than searched.
Maximum flights to return, after merging and sorting.
"best" (the default) and "price" both order by price, cheapest first; "duration" orders shortest first. Applied across all results.
Returns every field the upstream sends on each fare, and every fare that was selected, with no row bound. Off by default: a result carries the best rows by the requested sort_by in a compact shape (dates, destination, airline, stops, duration, price, trip length and the booking link), because a wide search over a month and several destinations otherwise produces a megabyte of JSON that some hosts refuse to put in the conversation at all. When true, it adds the arrival times, the per-leg stop counts, the raw stop details and every row past results_returned; results_total always says how many there were.
ISO currency code, default "usd".
Only flights at or below this price are returned.
Maximum stops per flight. 0 means non-stop only.
1 economy, 2 premium economy, 3 business, 4 first.
One entry per traveller, not a count: 1 adult, 2 child (aged 2-11), 3 infant on lap, 4 infant in seat, e.g. [1, 1, 2] for two adults and a child. At least one adult, each infant on lap needs its own adult, at most 9. Left out, it means one adult. A counts list [adults, children, infants], e.g. [2, 1, 0], or a bare [2] for two adults, is recognised and converted to codes before the search; a list that is valid as codes is searched as codes.
The searches this call may make, up or down. Unset is the normal behaviour: with the caller's own key the cap covers the request when the request is reasonable (a whole month at three trip lengths is 93 combinations and a whole month x 3 nights x 3 destinations is 279; both run in full) and anything past it is sampled evenly across the range rather than cut short. A lower value spends fewer searches on a wide search; a higher one -- to a hard maximum of 300 -- covers a grid wider than that.
Default: unset. Switches the search to a second, independent flight data source instead of the usual Google Flights page read. Unset already escalates to that source once, automatically, after a search's retries have failed. true forces it inline on every attempt -- much slower, and it can time out. false disables it entirely, that automatic retry included.
Restricts the search to these airline codes, e.g. ["LY"].
Single departure date, "YYYY-MM-DD".
Latest arrival hour, 0-23.
Earliest arrival hour, 0-23.
Last date of a departure range.
Latest departure hour, 0-23.
Earliest departure hour, 0-23.
First date of a departure range.
Airline codes left out of the results.
FlightPowers one-way fare search: live prices read from Google Flights. Input: origin and destination IATA codes -- the destination may be several codes, as "BCN,LIS,ATH" or ["BCN","LIS","ATH"] -- plus either one departure date or a date range. Returns each flight's price, airline, duration, stops, a bookable buy_link, and Google's historical price range (price_insights_low / price_insights_high), the band that shows whether a fare is actually a good deal. Suited to any one-way fare question, including open-ended ones. One call accepts a date range and several destinations and searches every combination: 'Cheapest flight to Sri Lanka anywhere in October' is one call, not thirty. That holds with the caller's own key. On the free sign-in allowance (10 searches a day, one per combination) a grid larger than what is left today is refused before anything runs; a grid within what is left runs, and a whole-month scan needs the caller's own key. Each date/destination combination is one search; the count comes back in `api_usage`. `by_destination` carries one entry per requested destination -- empty ones included, each with a `reason` that separates a destination with no flights from one that was not searched, whose search failed, or whose fares did not fit in `limit`. Fares go stale within minutes: a current price comes from a new search, not from an earlier result.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum flights to return, after merging and sorting. |
| sort_by | string | "best" (the default) and "price" both order by price, cheapest first; "duration" orders shortest first. Applied across all results. |
| verbose | boolean | Returns every field the upstream sends on each fare, and every fare that was selected, with no row bound. Off by default: a result carries the best rows by the requested sort_by in a compact shape (dates, destination, airline, stops, duration, price, trip length and the booking link), because a wide search over a month and several destinations otherwise produces a megabyte of JSON that some hosts refuse to put in the conversation at all. When true, it adds the arrival times, the per-leg stop counts, the raw stop details and every row past results_returned; results_total always says how many there were. |
| currency | string | ISO currency code, default "usd". |
| max_price | any | Only flights at or below this price are returned. |
| max_stops | any | Maximum stops per flight. 0 means non-stop only. |
| seat_type | any | 1 economy, 2 premium economy, 3 business, 4 first. |
| passengers | any | One entry per traveller, not a count: 1 adult, 2 child (aged 2-11), 3 infant on lap, 4 infant in seat, e.g. [1, 1, 2] for two adults and a child. At least one adult, each infant on lap needs its own adult, at most 9. Left out, it means one adult. A counts list [adults, children, infants], e.g. [2, 1, 0], or a bare [2] for two adults, is recognised and converted to codes before the search; a list that is valid as codes is searched as codes. |
| to_airport* | any | Destination airport. One IATA code ("BCN"), several separated by commas ("BCN,LIS,ATH"), or a list (["BCN","LIS","ATH"]) -- every shape is accepted and the destinations are compared in the same search. |
| from_airport* | string | Origin IATA code, e.g. "TLV". One origin per search; a second one is refused rather than searched. |
| max_searches | any | The searches this call may make, up or down. Unset is the normal behaviour: with the caller's own key the cap covers the request when the request is reasonable (a whole month at three trip lengths is 93 combinations and a whole month x 3 nights x 3 destinations is 279; both run in full) and anything past it is sampled evenly across the range rather than cut short. A lower value spends fewer searches on a wide search; a higher one -- to a hard maximum of 300 -- covers a grid wider than that. |
| use_fallback | any | Default: unset. Switches the search to a second, independent flight data source instead of the usual Google Flights page read. Unset already escalates to that source once, automatically, after a search's retries have failed. true forces it inline on every attempt -- much slower, and it can time out. false disables it entirely, that automatic retry included. |
| airline_codes | any | Restricts the search to these airline codes, e.g. ["LY"]. |
| departure_date | any | Single departure date, "YYYY-MM-DD". |
| arrival_time_max | any | Latest arrival hour, 0-23. |
| arrival_time_min | any | Earliest arrival hour, 0-23. |
| departure_date_to | any | Last date of a departure range. |
| departure_time_max | any | Latest departure hour, 0-23. |
| departure_time_min | any | Earliest departure hour, 0-23. |
| departure_date_from | any | First date of a departure range. |
| exclude_airline_codes | any | Airline codes left out of the results. |
{
"type": "object",
"required": [
"from_airport",
"to_airport"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"description": "Maximum flights to return, after merging and sorting."
},
"sort_by": {
"type": "string",
"default": "best",
"description": "\"best\" (the default) and \"price\" both order by price, cheapest first; \"duration\" orders shortest first. Applied across all results."
},
"verbose": {
"type": "boolean",
"default": false,
"description": "Returns every field the upstream sends on each fare, and every fare that was selected, with no row bound. Off by default: a result carries the best rows by the requested sort_by in a compact shape (dates, destination, airline, stops, duration, price, trip length and the booking link), because a wide search over a month and several destinations otherwise produces a megabyte of JSON that some hosts refuse to put in the conversation at all. When true, it adds the arrival times, the per-leg stop counts, the raw stop details and every row past results_returned; results_total always says how many there were."
},
"currency": {
"type": "string",
"default": "usd",
"description": "ISO currency code, default \"usd\"."
},
"max_price": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Only flights at or below this price are returned."
},
"max_stops": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Maximum stops per flight. 0 means non-stop only."
},
"seat_type": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "1 economy, 2 premium economy, 3 business, 4 first."
},
"passengers": {
"anyOf": [
{
"type": "array",
"items": {
"type": "integer"
}
},
{
"type": "null"
}
],
"default": null,
"description": "One entry per traveller, not a count: 1 adult, 2 child (aged 2-11), 3 infant on lap, 4 infant in seat, e.g. [1, 1, 2] for two adults and a child. At least one adult, each infant on lap needs its own adult, at most 9. Left out, it means one adult. A counts list [adults, children, infants], e.g. [2, 1, 0], or a bare [2] for two adults, is recognised and converted to codes before the search; a list that is valid as codes is searched as codes."
},
"to_airport": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Destination airport. One IATA code (\"BCN\"), several separated by commas (\"BCN,LIS,ATH\"), or a list ([\"BCN\",\"LIS\",\"ATH\"]) -- every shape is accepted and the destinations are compared in the same search."
},
"from_airport": {
"type": "string",
"description": "Origin IATA code, e.g. \"TLV\". One origin per search; a second one is refused rather than searched."
},
"max_searches": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "The searches this call may make, up or down. Unset is the normal behaviour: with the caller's own key the cap covers the request when the request is reasonable (a whole month at three trip lengths is 93 combinations and a whole month x 3 nights x 3 destinations is 279; both run in full) and anything past it is sampled evenly across the range rather than cut short. A lower value spends fewer searches on a wide search; a higher one -- to a hard maximum of 300 -- covers a grid wider than that."
},
"use_fallback": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Default: unset. Switches the search to a second, independent flight data source instead of the usual Google Flights page read. Unset already escalates to that source once, automatically, after a search's retries have failed. true forces it inline on every attempt -- much slower, and it can time out. false disables it entirely, that automatic retry included."
},
"airline_codes": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null,
"description": "Restricts the search to these airline codes, e.g. [\"LY\"]."
},
"departure_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Single departure date, \"YYYY-MM-DD\"."
},
"arrival_time_max": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Latest arrival hour, 0-23."
},
"arrival_time_min": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Earliest arrival hour, 0-23."
},
"departure_date_to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Last date of a departure range."
},
"departure_time_max": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Latest departure hour, 0-23."
},
"departure_time_min": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Earliest departure hour, 0-23."
},
"departure_date_from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "First date of a departure range."
},
"exclude_airline_codes": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null,
"description": "Airline codes left out of the results."
}
},
"additionalProperties": false
}FlightPowers round-trip fare search: live prices read from Google Flights, priced as paired legs rather than two separate one-ways. Input: origin and destination IATA codes -- the destination may be several codes, as "BCN,LIS,ATH" or ["BCN","LIS","ATH"] -- a departure date or range, and either a return date or a trip length in nights. Returns the total price for both legs, per-leg airline, stops and duration, and a single bookable buy_link for the trip. Suited to any return-trip fare question. A flexible search is ONE call: departure_date_from / departure_date_to set the outbound range and `nights`, in place of return_date, compares trip lengths -- '5 to 7 nights in Rome sometime in May' is one call. A WHOLE MONTH is one call too. departure_date_from "2026-10-01", departure_date_to "2026-10-31" and nights [3, 4, 5] prices every departure day in October at three trip lengths and shows which combination is cheapest. That is 93 date/night combinations and the cap rises to cover them by itself, so the whole grid runs in that one call. That holds with the caller's own key. On the free sign-in allowance (10 searches a day, one per combination) a grid larger than what is left today is refused before anything runs; a grid within what is left runs, and a whole-month scan needs the caller's own key. Each date/night/destination combination is ONE search, so a month at three trip lengths is 93 of them and the same month across two destinations is 186. A search that fails with a server error is retried once, so with the caller's own key the figure the plan is charged is `api_usage.hub_requests_billed` (retries included), not the combination count. `by_destination` carries one entry per requested destination -- empty ones included, each with a `reason` that separates a destination with no flights from one that was not searched, whose search failed, or whose fares did not fit in `limit`. Fares go stale within minutes: a current price comes from a new search, not from an earlier result.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum trips to return, after merging and sorting. |
| nights | any | Trip length in nights; a number, or a list like [5, 6, 7]. The return date is derived from each departure date. |
| sort_by | string | "best" (the default) and "price" both order by price, cheapest first; "duration" orders shortest first. Applied across all results. |
| verbose | boolean | Returns every field the upstream sends on each fare, and every fare that was selected, with no row bound. Off by default: a result carries the best rows by the requested sort_by in a compact shape (dates, destination, airline, stops, duration, price, trip length and the booking link), because a wide search over a month and several destinations otherwise produces a megabyte of JSON that some hosts refuse to put in the conversation at all. When true, it adds the arrival times, the per-leg stop counts, the raw stop details and every row past results_returned; results_total always says how many there were. |
| currency | string | ISO currency code, default "usd". |
| max_price | any | Only trips at or below this total price are returned. |
| seat_type | any | 1 economy, 2 premium economy, 3 business, 4 first. |
| passengers | any | One entry per traveller, not a count: 1 adult, 2 child (aged 2-11), 3 infant on lap, 4 infant in seat, e.g. [1, 1, 2] for two adults and a child. At least one adult, each infant on lap needs its own adult, at most 9. Left out, it means one adult. A counts list [adults, children, infants], e.g. [2, 1, 0], or a bare [2] for two adults, is recognised and converted to codes before the search; a list that is valid as codes is searched as codes. |
| to_airport* | any | Destination airport. One IATA code ("BCN"), several separated by commas ("BCN,LIS,ATH"), or a list (["BCN","LIS","ATH"]) -- every shape is accepted and the destinations are compared in the same search. |
| return_date | any | Fixed return date. Mutually exclusive with `nights`. |
| from_airport* | string | Origin IATA code, e.g. "TLV". One origin per search; a second one is refused rather than searched. |
| max_searches | any | The searches this call may make, up or down. Unset is the normal behaviour: with the caller's own key the cap covers the request when the request is reasonable (a whole month at three trip lengths is 93 combinations and a whole month x 3 nights x 3 destinations is 279; both run in full) and anything past it is sampled evenly across the range rather than cut short. A lower value spends fewer searches on a wide search; a higher one -- to a hard maximum of 300 -- covers a grid wider than that. |
| use_fallback | any | Default: unset. Switches the search to a second, independent flight data source instead of the usual Google Flights page read. Unset already escalates to that source once, automatically, after a search's retries have failed. true forces it inline on every attempt -- much slower, and it can time out. false disables it entirely, that automatic retry included. |
| departure_date | any | Single outbound date, "YYYY-MM-DD". |
| max_return_stops | any | Maximum stops on the return leg. |
| departure_date_to | any | Last date of an outbound range. |
| departure_date_from | any | First date of an outbound range. |
| max_departure_stops | any | Maximum stops on the outbound leg. |
| return_airline_codes | any | Restricts the return leg to these airlines. |
| returns_per_outbound | any | How many return flights to pair with each outbound flight, 1 to 5 (default 2). Each date/destination combination searched still returns at most 10 trips; at 5 they are picked from up to 50 pairings instead of 20. It adds no requests. Not applied when results come from the fallback source. |
| departure_airline_codes | any | Restricts the outbound leg to these airlines. |
{
"type": "object",
"required": [
"from_airport",
"to_airport"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"description": "Maximum trips to return, after merging and sorting."
},
"nights": {
"anyOf": [
{
"type": "integer"
},
{
"type": "array",
"items": {
"type": "integer"
}
},
{
"type": "null"
}
],
"default": null,
"description": "Trip length in nights; a number, or a list like [5, 6, 7]. The return date is derived from each departure date."
},
"sort_by": {
"type": "string",
"default": "best",
"description": "\"best\" (the default) and \"price\" both order by price, cheapest first; \"duration\" orders shortest first. Applied across all results."
},
"verbose": {
"type": "boolean",
"default": false,
"description": "Returns every field the upstream sends on each fare, and every fare that was selected, with no row bound. Off by default: a result carries the best rows by the requested sort_by in a compact shape (dates, destination, airline, stops, duration, price, trip length and the booking link), because a wide search over a month and several destinations otherwise produces a megabyte of JSON that some hosts refuse to put in the conversation at all. When true, it adds the arrival times, the per-leg stop counts, the raw stop details and every row past results_returned; results_total always says how many there were."
},
"currency": {
"type": "string",
"default": "usd",
"description": "ISO currency code, default \"usd\"."
},
"max_price": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Only trips at or below this total price are returned."
},
"seat_type": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "1 economy, 2 premium economy, 3 business, 4 first."
},
"passengers": {
"anyOf": [
{
"type": "array",
"items": {
"type": "integer"
}
},
{
"type": "null"
}
],
"default": null,
"description": "One entry per traveller, not a count: 1 adult, 2 child (aged 2-11), 3 infant on lap, 4 infant in seat, e.g. [1, 1, 2] for two adults and a child. At least one adult, each infant on lap needs its own adult, at most 9. Left out, it means one adult. A counts list [adults, children, infants], e.g. [2, 1, 0], or a bare [2] for two adults, is recognised and converted to codes before the search; a list that is valid as codes is searched as codes."
},
"to_airport": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Destination airport. One IATA code (\"BCN\"), several separated by commas (\"BCN,LIS,ATH\"), or a list ([\"BCN\",\"LIS\",\"ATH\"]) -- every shape is accepted and the destinations are compared in the same search."
},
"return_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Fixed return date. Mutually exclusive with `nights`."
},
"from_airport": {
"type": "string",
"description": "Origin IATA code, e.g. \"TLV\". One origin per search; a second one is refused rather than searched."
},
"max_searches": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "The searches this call may make, up or down. Unset is the normal behaviour: with the caller's own key the cap covers the request when the request is reasonable (a whole month at three trip lengths is 93 combinations and a whole month x 3 nights x 3 destinations is 279; both run in full) and anything past it is sampled evenly across the range rather than cut short. A lower value spends fewer searches on a wide search; a higher one -- to a hard maximum of 300 -- covers a grid wider than that."
},
"use_fallback": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Default: unset. Switches the search to a second, independent flight data source instead of the usual Google Flights page read. Unset already escalates to that source once, automatically, after a search's retries have failed. true forces it inline on every attempt -- much slower, and it can time out. false disables it entirely, that automatic retry included."
},
"departure_date": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Single outbound date, \"YYYY-MM-DD\"."
},
"max_return_stops": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Maximum stops on the return leg."
},
"departure_date_to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Last date of an outbound range."
},
"departure_date_from": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "First date of an outbound range."
},
"max_departure_stops": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Maximum stops on the outbound leg."
},
"return_airline_codes": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null,
"description": "Restricts the return leg to these airlines."
},
"returns_per_outbound": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "How many return flights to pair with each outbound flight, 1 to 5 (default 2). Each date/destination combination searched still returns at most 10 trips; at 5 they are picked from up to 50 pairings instead of 20. It adds no requests. Not applied when results come from the fallback source."
},
"departure_airline_codes": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"default": null,
"description": "Restricts the outbound leg to these airlines."
}
},
"additionalProperties": false
}