Skip to main content
Glama

Google Flights Search (Real-Time Fares)

FlightPowers: search one-way flights

search_oneway_flights
Read-only

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.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "from_airport": "<from_airport>",
      "to_airport": "<to_airport>"
    },
    "name": "search_oneway_flights"
  }
}

Input Schema

NameRequiredDescriptionDefault
limitNoMaximum flights to return, after merging and sorting.
sort_byNo"best" (the default) and "price" both order by price, cheapest first; "duration" orders shortest first. Applied across all results.best
verboseNoReturns 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.
currencyNoISO currency code, default "usd".usd
max_priceNoOnly flights at or below this price are returned.
max_stopsNoMaximum stops per flight. 0 means non-stop only.
seat_typeNo1 economy, 2 premium economy, 3 business, 4 first.
passengersNoOne 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_airportYesDestination 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_airportYesOrigin IATA code, e.g. "TLV". One origin per search; a second one is refused rather than searched.
max_searchesNoThe 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_fallbackNoDefault: 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_codesNoRestricts the search to these airline codes, e.g. ["LY"].
departure_dateNoSingle departure date, "YYYY-MM-DD".
arrival_time_maxNoLatest arrival hour, 0-23.
arrival_time_minNoEarliest arrival hour, 0-23.
departure_date_toNoLast date of a departure range.
departure_time_maxNoLatest departure hour, 0-23.
departure_time_minNoEarliest departure hour, 0-23.
departure_date_fromNoFirst date of a departure range.
exclude_airline_codesNoAirline codes left out of the results.

Output Schema

NameRequiredDescriptionDefault
messageNoPresent when the result carries a statement for the person who asked -- no results, a degraded search, a missing key or a spent quota.
partialNoPresent when some searches failed but others succeeded. Plain text saying how much of the request the results cover.
resultsYesThe fares found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'. This is the TOP results_returned of results_total rows by the requested sort -- cheapest first by default, shortest first on sort_by 'duration' -- with every destination that has fares still represented. Each row is in a compact shape: destination, the date or dates, trip length in nights on a round trip, airline (both legs on a round trip), stops, duration, the price as a string and a number, Google's price band with its verdict, and the booking link. The origin is on the response as from_airport rather than repeated on every row. Arrival descriptions, per-leg stop counts, raw stop details and the duration in seconds are dropped; `verbose: true` returns them, and every row that was selected, on that call.
api_usageNoWith the caller's own key: what this call cost their RapidAPI plan, and what remains on it. On a free signed-in search (`trial` present): the day's free-search counter instead, and no plan figures -- the search ran on FlightPowers' key and nothing is billed to the user. Present on every response that reached the upstream, including a degraded one.
signup_urlNoWhere the caller subscribes or changes plan.
from_airportNoThe origin, as the upstream renders it ('Tel Aviv (TLV)'). One origin per search, so it is on the response rather than repeated on every row.
result_countNoHow many rows are in `results`; same as results_returned.
needs_api_keyNoTrue when no usable RapidAPI key arrived with the call, or the upstream rejected the one that did. No search was run and nothing was billed; signup_url and message describe the fix.
results_totalNoHow many fares the search selected across every searched combination, before any row bound. Equal to results_returned unless the server bounded a response it had widened itself.
search_statusNoWhether the underlying search actually completed, read from the backend's X-Search-Status header. 'ok': every combination searched returned results. 'empty': the search completed and Google genuinely has no itineraries for it -- a real answer, not a failure. 'partial': some combinations returned results and some failed, so the list is incomplete. 'degraded': every combination failed, so the search did not happen and an empty list means nothing; this case is also flagged with isError: true. A repeat is a new billed request: repeat it at most once, and not when the error says the backend expects a repeat to fail (retry: false). 'trial_exhausted': the free signed-in allowance on this server is spent for today, so nothing was searched and nothing was billed; it renews at 00:00 UTC and the caller's own RapidAPI key, once connected, removes the cap. Retrying does not help. 'quota_exceeded': the search was refused because the caller's remaining allowance or plan quota cannot cover the number of combinations asked for; combos_requested and combos_allowed_now carry the two numbers. Nothing was searched beyond what it cost to read the quota. Retrying the same search does not help; a request with fewer dates or nights, or a larger plan, does.
by_destinationNoOne entry per destination the REQUEST asked for, in request order, present whether or not that destination has any flights in `results`. A destination with an empty `rows` array is a hole in the answer, and `reason` says which kind of hole: 'no_flights' (searched, answered, Google has nothing), 'search_failed' (searched and the search errored, so nothing is known), 'not_in_limit' (searched, found flights, none fitted in `limit`) or 'not_searched' (never searched -- the per-call fan-out cap sampled it away). 'ok' means it has rows. Coverage comes from here, not from `results`: a destination missing from `results` looks identical to one that has no flights, and they are not the same answer. `row_count` is how many of this destination's fares were selected; the fares themselves are in `results` and are not repeated here. `verbose: true` restores the `rows` array for callers that consume it.
quota_exhaustedNoTrue when the caller's RapidAPI plan has no requests left for the current period.
search_coverageNoWhat was actually searched. Present whether or not the request was truncated, so the answer's basis is on the record either way.
results_returnedNoHow many of them are in `results` -- the best ones by the sort_by asked for, cheapest first by default, and never all of one destination at the expense of another. Lower than results_total only when `limit` was raised by the server to cover the fan-out rather than asked for; search_coverage.note says so when it happens, and `verbose: true` returns them all.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / search_status / description
      Previous value: -"Whether the underlying search actually completed, read from the backend's X-Search-Status header. 'ok': every combination searched returned results. 'empty': the search completed and Google genuinely has no itineraries for it -- a real answer, not a failure. 'partial': some combinations returned results and some failed, so the list is incomplete. 'degraded': every combination failed, so the search did not happen and an empty list means nothing; this case is also flagged with isError: true and is safe to retry. 'trial_exhausted': the free signed-in allowance on this server is spent for today, so nothing was searched and nothing was billed; it renews at 00:00 UTC and the caller's own RapidAPI key, once connected, removes the cap. Retrying does not help. 'quota_exceeded': the search was refused because the caller's remaining allowance or plan quota cannot cover the number of combinations asked for; combos_requested and combos_allowed_now carry the two numbers. Nothing was searched beyond what it cost to read the quota. Retrying the same search does not help; a request with fewer dates or nights, or a larger plan, does."New value: +"Whether the underlying search actually completed, read from the backend's X-Search-Status header. 'ok': every combination searched returned results. 'empty': the search completed and Google genuinely has no itineraries for it -- a real answer, not a failure. 'partial': some combinations returned results and some failed, so the list is incomplete. 'degraded': every combination failed, so the search did not happen and an empty list means nothing; this case is also flagged with isError: true. A repeat is a new billed request: repeat it at most once, and not when the error says the backend expects a repeat to fail (retry: false). 'trial_exhausted': the free signed-in allowance on this server is spent for today, so nothing was searched and nothing was billed; it renews at 00:00 UTC and the caller's own RapidAPI key, once connected, removes the cap. Retrying does not help. 'quota_exceeded': the search was refused because the caller's remaining allowance or plan quota cannot cover the number of combinations asked for; combos_requested and combos_allowed_now carry the two numbers. Nothing was searched beyond what it cost to read the quota. Retrying the same search does not help; a request with fewer dates or nights, or a larger plan, does."
  2. Changed16 schema fields changed
    • changedInput schema / properties / airline_codes / description
      Previous value: -"Restrict to these airline codes, e.g. [\"LY\"]."New value: +"Restricts the search to these airline codes, e.g. [\"LY\"]."
    • changedInput schema / properties / exclude_airline_codes / description
      Previous value: -"Exclude these airline codes."New value: +"Airline codes left out of the results."
    • changedInput schema / properties / max_price / description
      Previous value: -"Only return flights at or below this price."New value: +"Only flights at or below this price are returned."
    • changedInput schema / properties / max_searches / description
      Previous value: -"The searches this call may make, up or down. Leave it out for 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. Set it lower to spend fewer searches on a wide search, or higher -- to a hard maximum of 300 -- for a grid wider than that."New value: +"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."
    • changedInput schema / properties / passengers / description
      Previous value: -"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. Omit for 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."New value: +"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."
    • changedInput schema / properties / use_fallback / description
      Previous value: -"Leave 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."New value: +"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."
    • changedInput schema / properties / verbose / description
      Previous value: -"Return 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 your 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. Turn it on when you need the arrival times, the per-leg stop counts, the raw stop details or more rows than results_returned; results_total always says how many there were."New value: +"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."
    • changedOutput schema / description
      Previous value: -"A completed flight search. Read search_status before reading results: an empty array means 'no flights' only when search_status is 'empty'."New value: +"A completed flight search. An empty `results` array means 'no flights' only when search_status is 'empty'."
    • changedOutput schema / properties / api_usage / properties / note / description
      Previous value: -"The same figures as a sentence, for the model to relay."New value: +"The same figures as one plain sentence."
    • changedOutput schema / properties / by_destination / description
      Previous value: -"One entry per destination the REQUEST asked for, in request order, present whether or not that destination has any flights in `results`. A destination with an empty `rows` array is a hole in the answer, and `reason` says which kind of hole: 'no_flights' (searched, answered, Google has nothing), 'search_failed' (searched and the search errored, so nothing is known), 'not_in_limit' (searched, found flights, none fitted in `limit`) or 'not_searched' (never searched -- the per-call fan-out cap sampled it away). 'ok' means it has rows.\n\nRead this rather than inferring coverage from `results`: a destination missing from `results` looks identical to one that has no flights, and they are not the same answer. `row_count` is how many of this destination's fares were selected; the fares themselves are in `results` and are not repeated here. `verbose: true` restores the `rows` array for callers that read it."New value: +"One entry per destination the REQUEST asked for, in request order, present whether or not that destination has any flights in `results`. A destination with an empty `rows` array is a hole in the answer, and `reason` says which kind of hole: 'no_flights' (searched, answered, Google has nothing), 'search_failed' (searched and the search errored, so nothing is known), 'not_in_limit' (searched, found flights, none fitted in `limit`) or 'not_searched' (never searched -- the per-call fan-out cap sampled it away). 'ok' means it has rows.\n\nCoverage comes from here, not from `results`: a destination missing from `results` looks identical to one that has no flights, and they are not the same answer. `row_count` is how many of this destination's fares were selected; the fares themselves are in `results` and are not repeated here. `verbose: true` restores the `rows` array for callers that consume it."
    • changedOutput schema / properties / message / description
      Previous value: -"Present when there is something the model must relay to the user rather than silently absorb -- no results, a degraded search, a missing key or a spent quota."New value: +"Present when the result carries a statement for the person who asked -- no results, a degraded search, a missing key or a spent quota."
    • changedOutput schema / properties / needs_api_key / description
      Previous value: -"True when no usable RapidAPI key arrived with the call, or the upstream rejected the one that did. No search was run and nothing was billed; signup_url and message say how to fix it."New value: +"True when no usable RapidAPI key arrived with the call, or the upstream rejected the one that did. No search was run and nothing was billed; signup_url and message describe the fix."
    • changedOutput schema / properties / results / description
      Previous value: -"The fares found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'.\n\nThis is the TOP results_returned of results_total rows by the sort you asked for -- cheapest first by default, shortest first on sort_by 'duration' -- with every destination that has fares still represented. Each row is in a compact shape: destination, the date or dates, trip length in nights on a round trip, airline (both legs on a round trip), stops, duration, the price as a string and a number, Google's price band with its verdict, and the booking link. The origin is on the response as from_airport rather than repeated on every row. Arrival descriptions, per-leg stop counts, raw stop details and the duration in seconds are dropped; `verbose: true` returns them, and every row that was selected, on that call."New value: +"The fares found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'.\n\nThis is the TOP results_returned of results_total rows by the requested sort -- cheapest first by default, shortest first on sort_by 'duration' -- with every destination that has fares still represented. Each row is in a compact shape: destination, the date or dates, trip length in nights on a round trip, airline (both legs on a round trip), stops, duration, the price as a string and a number, Google's price band with its verdict, and the booking link. The origin is on the response as from_airport rather than repeated on every row. Arrival descriptions, per-leg stop counts, raw stop details and the duration in seconds are dropped; `verbose: true` returns them, and every row that was selected, on that call."
    • changedOutput schema / properties / search_coverage / description
      Previous value: -"What was actually searched. Present whether or not the request was truncated, so a model can state honestly what its answer rests on."New value: +"What was actually searched. Present whether or not the request was truncated, so the answer's basis is on the record either way."
    • changedOutput schema / properties / search_coverage / properties / stopped_early / description
      Previous value: -"Present when something other than the cap ended the fan-out. 'deadline': the call reached its time limit and the remaining combinations were never sent or billed, so the results are real but do not cover the whole range."New value: +"Present when something other than the cap ended the fan-out. 'deadline': the call reached its time limit and the remaining combinations were never sent or billed, so the results are real but cover only part of the range."
    • changedOutput schema / properties / search_status / description
      Previous value: -"Whether the underlying search actually completed, read from the backend's X-Search-Status header. 'ok': every combination searched returned results. 'empty': the search completed and Google genuinely has no itineraries for it -- a real answer, not a failure. 'partial': some combinations returned results and some failed, so the list is incomplete. 'degraded': every combination failed, so the search did not happen and an empty list means nothing; this case is also flagged with isError: true and is safe to retry. 'trial_exhausted': the free signed-in allowance on this server is spent for today, so nothing was searched and nothing was billed; it renews at 00:00 UTC and connecting your own RapidAPI key removes the cap. Retrying does not help. 'quota_exceeded': the search was refused because the caller's remaining allowance or plan quota cannot cover the number of combinations asked for; combos_requested and combos_allowed_now carry the two numbers. Nothing was searched beyond what it cost to read the quota. Retrying the same search does not help -- ask for fewer dates or nights, or move to a larger plan."New value: +"Whether the underlying search actually completed, read from the backend's X-Search-Status header. 'ok': every combination searched returned results. 'empty': the search completed and Google genuinely has no itineraries for it -- a real answer, not a failure. 'partial': some combinations returned results and some failed, so the list is incomplete. 'degraded': every combination failed, so the search did not happen and an empty list means nothing; this case is also flagged with isError: true and is safe to retry. 'trial_exhausted': the free signed-in allowance on this server is spent for today, so nothing was searched and nothing was billed; it renews at 00:00 UTC and the caller's own RapidAPI key, once connected, removes the cap. Retrying does not help. 'quota_exceeded': the search was refused because the caller's remaining allowance or plan quota cannot cover the number of combinations asked for; combos_requested and combos_allowed_now carry the two numbers. Nothing was searched beyond what it cost to read the quota. Retrying the same search does not help; a request with fewer dates or nights, or a larger plan, does."
  3. Changed7 schema fields changed
    • changedInput schema / properties / max_searches / description
      Previous value: -"The billed requests this call may make, up or down. Leave it out for the normal behaviour: 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. Set it lower to spend less of the plan's quota on a wide search, or higher -- to a hard maximum of 300 -- for a grid wider than that."New value: +"The searches this call may make, up or down. Leave it out for 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. Set it lower to spend fewer searches on a wide search, or higher -- to a hard maximum of 300 -- for a grid wider than that."
    • changedInput schema / properties / sort_by / description
      Previous value: -"\"best\", \"price\", or \"duration\". Applied across all results."New value: +"\"best\" (the default) and \"price\" both order by price, cheapest first; \"duration\" orders shortest first. Applied across all results."
    • changedOutput schema / properties / api_usage / description
      Previous value: -"What this call cost the caller's own RapidAPI plan, and what remains on it. Present on every response that reached the upstream, including a degraded one -- a search that failed was still billed."New value: +"With the caller's own key: what this call cost their RapidAPI plan, and what remains on it. On a free signed-in search (`trial` present): the day's free-search counter instead, and no plan figures -- the search ran on FlightPowers' key and nothing is billed to the user. Present on every response that reached the upstream, including a degraded one."
    • addedOutput schema / properties / api_usage / properties / free_searches_day_cap
      Added value: +{
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / api_usage / properties / free_searches_remaining_today
      Added value: +{
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / api_usage / properties / free_searches_used_today
      Added value: +{
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / api_usage / properties / hub_requests_billed / description
      Previous value: -"How many HTTP requests RapidAPI actually billed. Larger than requests_used_by_this_call when a search failed with a server error and was retried, because the retry is billed too. This is the figure the invoice will show."New value: +"How many HTTP requests RapidAPI actually billed. Larger than requests_used_by_this_call when a search failed with a server error and was retried, because the retry is billed too. With the caller's own key this is the figure their RapidAPI plan is charged. Absent on a free search."
  4. Changed1 schema field changed
    • changedInput schema / properties / passengers / description
      Previous value: -"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. Omit for one adult."New value: +"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. Omit for 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."
  5. Changed1 schema field changed
    • changedInput schema / properties / passengers / description
      Previous value: -"Passenger counts as [adults, children, infants]."New value: +"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. Omit for one adult."
  6. Changed10 schema fields changed
    • addedInput schema / properties / verbose
      Added value: +{
      +  "default": false,
      +  "description": "Return 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 your 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. Turn it on when you need the arrival times, the per-leg stop counts, the raw stop details or more rows than results_returned; results_total always says how many there were.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / by_destination / additionalProperties / properties / row_count
      Added value: +{
      +  "description": "How many of this destination's fares were selected. Not all of them are necessarily in `results`: a wide search returns the top results_returned of results_total overall, and `cheapest` below is this destination's own best fare either way.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / by_destination / additionalProperties / properties / rows / description
      Added value: +"Only on `verbose: true`: this destination's selected rows, the same objects that are in `results`."
    • changedOutput schema / properties / by_destination / additionalProperties / required
      Previous value: -[
      -  "rows",
      -  "searched",
      -  "reason"
      -]New value: +[
      +  "row_count",
      +  "searched",
      +  "reason"
      +]
    • changedOutput schema / properties / by_destination / description
      Previous value: -"One entry per destination the REQUEST asked for, in request order, present whether or not that destination has any flights in `results`. A destination with an empty `rows` array is a hole in the answer, and `reason` says which kind of hole: 'no_flights' (searched, answered, Google has nothing), 'search_failed' (searched and the search errored, so nothing is known), 'not_in_limit' (searched, found flights, none fitted in `limit`) or 'not_searched' (never searched -- the per-call fan-out cap sampled it away). 'ok' means it has rows.\n\nRead this rather than inferring coverage from `results`: a destination missing from `results` looks identical to one that has no flights, and they are not the same answer. `rows` are the same row objects that are in `results`, in the same order -- nothing here is data the answer does not already contain."New value: +"One entry per destination the REQUEST asked for, in request order, present whether or not that destination has any flights in `results`. A destination with an empty `rows` array is a hole in the answer, and `reason` says which kind of hole: 'no_flights' (searched, answered, Google has nothing), 'search_failed' (searched and the search errored, so nothing is known), 'not_in_limit' (searched, found flights, none fitted in `limit`) or 'not_searched' (never searched -- the per-call fan-out cap sampled it away). 'ok' means it has rows.\n\nRead this rather than inferring coverage from `results`: a destination missing from `results` looks identical to one that has no flights, and they are not the same answer. `row_count` is how many of this destination's fares were selected; the fares themselves are in `results` and are not repeated here. `verbose: true` restores the `rows` array for callers that read it."
    • addedOutput schema / properties / from_airport
      Added value: +{
      +  "description": "The origin, as the upstream renders it ('Tel Aviv (TLV)'). One origin per search, so it is on the response rather than repeated on every row.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / result_count / description
      Added value: +"How many rows are in `results`; same as results_returned."
    • changedOutput schema / properties / results / description
      Previous value: -"The itineraries or properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'."New value: +"The fares found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'.\n\nThis is the TOP results_returned of results_total rows by the sort you asked for -- cheapest first by default, shortest first on sort_by 'duration' -- with every destination that has fares still represented. Each row is in a compact shape: destination, the date or dates, trip length in nights on a round trip, airline (both legs on a round trip), stops, duration, the price as a string and a number, Google's price band with its verdict, and the booking link. The origin is on the response as from_airport rather than repeated on every row. Arrival descriptions, per-leg stop counts, raw stop details and the duration in seconds are dropped; `verbose: true` returns them, and every row that was selected, on that call."
    • addedOutput schema / properties / results_returned
      Added value: +{
      +  "description": "How many of them are in `results` -- the best ones by the sort_by asked for, cheapest first by default, and never all of one destination at the expense of another. Lower than results_total only when `limit` was raised by the server to cover the fan-out rather than asked for; search_coverage.note says so when it happens, and `verbose: true` returns them all.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / results_total
      Added value: +{
      +  "description": "How many fares the search selected across every searched combination, before any row bound. Equal to results_returned unless the server bounded a response it had widened itself.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
  7. Changed1 schema field changed
    • changedInput schema / properties / max_searches / description
      Previous value: -"The billed requests this call may make, up or down. Leave it out for the normal behaviour: the cap covers the request when the request is reasonable (a whole month at three trip lengths, 93 combinations, runs in full) and anything past it is sampled evenly across the range rather than cut short. Set it lower to spend less of the plan's quota on a wide search, or higher -- to a hard maximum of 200 -- for a grid wider than that."New value: +"The billed requests this call may make, up or down. Leave it out for the normal behaviour: 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. Set it lower to spend less of the plan's quota on a wide search, or higher -- to a hard maximum of 300 -- for a grid wider than that."
  8. Changed7 schema fields changed
    • changedInput schema / properties / max_searches / description
      Previous value: -"Cap the billed requests this call may make. Lower it to spend less of the plan's quota on a wide search; the range is then sampled evenly rather than cut short."New value: +"The billed requests this call may make, up or down. Leave it out for the normal behaviour: the cap covers the request when the request is reasonable (a whole month at three trip lengths, 93 combinations, runs in full) and anything past it is sampled evenly across the range rather than cut short. Set it lower to spend less of the plan's quota on a wide search, or higher -- to a hard maximum of 200 -- for a grid wider than that."
    • addedOutput schema / properties / api_usage / properties / hub_requests_billed
      Added value: +{
      +  "description": "How many HTTP requests RapidAPI actually billed. Larger than requests_used_by_this_call when a search failed with a server error and was retried, because the retry is billed too. This is the figure the invoice will show.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / api_usage / properties / requests_used_by_this_call / description
      Added value: +"How many date/destination combinations were searched -- what the answer COVERS."
    • addedOutput schema / properties / search_coverage / properties / hub_requests_billed
      Added value: +{
      +  "description": "HTTP requests billed by RapidAPI for this call, retries included; see api_usage.hub_requests_billed.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / search_coverage / properties / stopped_early
      Added value: +{
      +  "description": "Present when something other than the cap ended the fan-out. 'deadline': the call reached its time limit and the remaining combinations were never sent or billed, so the results are real but do not cover the whole range.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / search_status / description
      Previous value: -"Whether the underlying search actually completed, read from the backend's X-Search-Status header. 'ok': every combination searched returned results. 'empty': the search completed and Google genuinely has no itineraries for it -- a real answer, not a failure. 'partial': some combinations returned results and some failed, so the list is incomplete. 'degraded': every combination failed, so the search did not happen and an empty list means nothing; this case is also flagged with isError: true and is safe to retry. 'trial_exhausted': the free signed-in allowance on this server is spent for today, so nothing was searched and nothing was billed; it renews at 00:00 UTC and connecting your own RapidAPI key removes the cap. Retrying does not help."New value: +"Whether the underlying search actually completed, read from the backend's X-Search-Status header. 'ok': every combination searched returned results. 'empty': the search completed and Google genuinely has no itineraries for it -- a real answer, not a failure. 'partial': some combinations returned results and some failed, so the list is incomplete. 'degraded': every combination failed, so the search did not happen and an empty list means nothing; this case is also flagged with isError: true and is safe to retry. 'trial_exhausted': the free signed-in allowance on this server is spent for today, so nothing was searched and nothing was billed; it renews at 00:00 UTC and connecting your own RapidAPI key removes the cap. Retrying does not help. 'quota_exceeded': the search was refused because the caller's remaining allowance or plan quota cannot cover the number of combinations asked for; combos_requested and combos_allowed_now carry the two numbers. Nothing was searched beyond what it cost to read the quota. Retrying the same search does not help -- ask for fewer dates or nights, or move to a larger plan."
    • changedOutput schema / properties / search_status / enum
      Previous value: -[
      -  "ok",
      -  "empty",
      -  "partial",
      -  "degraded",
      -  "trial_exhausted"
      -]New value: +[
      +  "ok",
      +  "empty",
      +  "partial",
      +  "degraded",
      +  "trial_exhausted",
      +  "quota_exceeded"
      +]
  9. Changed2 schema fields changed
    • changedOutput schema / properties / search_status / description
      Previous value: -"Whether the underlying search actually completed, read from the backend's X-Search-Status header. 'ok': every combination searched returned results. 'empty': the search completed and Google genuinely has no itineraries for it -- a real answer, not a failure. 'partial': some combinations returned results and some failed, so the list is incomplete. 'degraded': every combination failed, so the search did not happen and an empty list means nothing; this case is also flagged with isError: true and is safe to retry."New value: +"Whether the underlying search actually completed, read from the backend's X-Search-Status header. 'ok': every combination searched returned results. 'empty': the search completed and Google genuinely has no itineraries for it -- a real answer, not a failure. 'partial': some combinations returned results and some failed, so the list is incomplete. 'degraded': every combination failed, so the search did not happen and an empty list means nothing; this case is also flagged with isError: true and is safe to retry. 'trial_exhausted': the free signed-in allowance on this server is spent for today, so nothing was searched and nothing was billed; it renews at 00:00 UTC and connecting your own RapidAPI key removes the cap. Retrying does not help."
    • changedOutput schema / properties / search_status / enum
      Previous value: -[
      -  "ok",
      -  "empty",
      -  "partial",
      -  "degraded"
      -]New value: +[
      +  "ok",
      +  "empty",
      +  "partial",
      +  "degraded",
      +  "trial_exhausted"
      +]
  10. Changed5 schema fields changed
    • removedOutput schema / properties / by_destination / additionalProperties / properties / cheapest / additionalProperties
      Removed value: -true
    • addedOutput schema / properties / by_destination / additionalProperties / properties / cheapest / anyOf
      Added value: +[
      +  {
      +    "additionalProperties": true,
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / by_destination / additionalProperties / properties / cheapest / type
      Removed value: -[
      -  "object",
      -  "null"
      -]
    • addedOutput schema / properties / by_destination / additionalProperties / properties / dates / additionalProperties / properties / cheapest_price / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / by_destination / additionalProperties / properties / dates / additionalProperties / properties / cheapest_price / type
      Removed value: -[
      -  "number",
      -  "null"
      -]
  11. Changed1 schema field changed
    • addedOutput schema / properties / by_destination
      Added value: +{
      +  "additionalProperties": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "cheapest": {
      +        "additionalProperties": true,
      +        "description": "The lowest-priced of this destination's rows in `results`, or null when it has none.",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "dates": {
      +        "additionalProperties": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "cheapest_price": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "reason": {
      +              "enum": [
      +                "ok",
      +                "no_flights",
      +                "search_failed",
      +                "not_in_limit",
      +                "not_searched"
      +              ],
      +              "type": "string"
      +            },
      +            "row_count": {
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "searched": {
      +              "type": "boolean"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "description": "Present only on multi-date searches: one entry per departure date requested for this destination, so a date the fan-out cap sampled away is visible rather than absent. `cheapest_price` is null when that date has no row in `results`.",
      +        "type": "object"
      +      },
      +      "reason": {
      +        "enum": [
      +          "ok",
      +          "no_flights",
      +          "search_failed",
      +          "not_in_limit",
      +          "not_searched"
      +        ],
      +        "type": "string"
      +      },
      +      "rows": {
      +        "items": {
      +          "additionalProperties": true,
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "searched": {
      +        "description": "Whether at least one search actually ran for this destination. False means the fan-out cap dropped it.",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "rows",
      +      "searched",
      +      "reason"
      +    ],
      +    "type": "object"
      +  },
      +  "description": "One entry per destination the REQUEST asked for, in request order, present whether or not that destination has any flights in `results`. A destination with an empty `rows` array is a hole in the answer, and `reason` says which kind of hole: 'no_flights' (searched, answered, Google has nothing), 'search_failed' (searched and the search errored, so nothing is known), 'not_in_limit' (searched, found flights, none fitted in `limit`) or 'not_searched' (never searched -- the per-call fan-out cap sampled it away). 'ok' means it has rows.\n\nRead this rather than inferring coverage from `results`: a destination missing from `results` looks identical to one that has no flights, and they are not the same answer. `rows` are the same row objects that are in `results`, in the same order -- nothing here is data the answer does not already contain.",
      +  "type": "object"
      +}
  12. Changed2 schema fields changed
    • changedInput schema / properties / from_airport / description
      Previous value: -"Origin IATA code, e.g. \"TLV\"."New value: +"Origin IATA code, e.g. \"TLV\". One origin per search; a second one is refused rather than searched."
    • changedInput schema / properties / to_airport / description
      Previous value: -"Destination IATA code, or a list of them to compare."New value: +"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."
  13. Changed4 schema fields changed
    • addedOutput schema / description
      Added value: +"A completed flight search. Read search_status before reading results: an empty array means 'no flights' only when search_status is 'empty'."
    • addedOutput schema / properties
      Added value: +{
      +  "api_usage": {
      +    "additionalProperties": true,
      +    "description": "What this call cost the caller's own RapidAPI plan, and what remains on it. Present on every response that reached the upstream, including a degraded one -- a search that failed was still billed.",
      +    "properties": {
      +      "note": {
      +        "description": "The same figures as a sentence, for the model to relay.",
      +        "type": "string"
      +      },
      +      "plan_requests_limit": {
      +        "type": "integer"
      +      },
      +      "plan_requests_remaining": {
      +        "type": "integer"
      +      },
      +      "requests_used_by_this_call": {
      +        "minimum": 0,
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "message": {
      +    "description": "Present when there is something the model must relay to the user rather than silently absorb -- no results, a degraded search, a missing key or a spent quota.",
      +    "type": "string"
      +  },
      +  "needs_api_key": {
      +    "description": "True when no usable RapidAPI key arrived with the call, or the upstream rejected the one that did. No search was run and nothing was billed; signup_url and message say how to fix it.",
      +    "type": "boolean"
      +  },
      +  "partial": {
      +    "description": "Present when some searches failed but others succeeded. Plain text saying how much of the request the results cover.",
      +    "type": "string"
      +  },
      +  "quota_exhausted": {
      +    "description": "True when the caller's RapidAPI plan has no requests left for the current period.",
      +    "type": "boolean"
      +  },
      +  "result_count": {
      +    "minimum": 0,
      +    "type": "integer"
      +  },
      +  "results": {
      +    "description": "The itineraries or properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'.",
      +    "items": {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  "search_coverage": {
      +    "additionalProperties": true,
      +    "description": "What was actually searched. Present whether or not the request was truncated, so a model can state honestly what its answer rests on.",
      +    "properties": {
      +      "departure_dates_searched": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "destinations_searched": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "max_searches_per_request": {
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "note": {
      +        "type": "string"
      +      },
      +      "requested_combinations": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "searched_combinations": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "truncated": {
      +        "description": "True when the request expanded past this call's spend ceiling and was sampled. A date absent from departure_dates_searched was never searched, which is not the same as having no flights.",
      +        "type": "boolean"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "search_status": {
      +    "description": "Whether the underlying search actually completed, read from the backend's X-Search-Status header. 'ok': every combination searched returned results. 'empty': the search completed and Google genuinely has no itineraries for it -- a real answer, not a failure. 'partial': some combinations returned results and some failed, so the list is incomplete. 'degraded': every combination failed, so the search did not happen and an empty list means nothing; this case is also flagged with isError: true and is safe to retry.",
      +    "enum": [
      +      "ok",
      +      "empty",
      +      "partial",
      +      "degraded"
      +    ],
      +    "type": "string"
      +  },
      +  "signup_url": {
      +    "description": "Where the caller subscribes or changes plan.",
      +    "type": "string"
      +  }
      +}
    • addedOutput schema / required
      Added value: +[
      +  "results"
      +]
    • addedOutput schema / title
      Added value: +"Flight search result"
  14. Changed23 schema fields changed
    • addedInput schema / properties / airline_codes / description
      Added value: +"Restrict to these airline codes, e.g. [\"LY\"]."
    • addedInput schema / properties / arrival_time_max / description
      Added value: +"Latest arrival hour, 0-23."
    • addedInput schema / properties / arrival_time_min / description
      Added value: +"Earliest arrival hour, 0-23."
    • addedInput schema / properties / currency / description
      Added value: +"ISO currency code, default \"usd\"."
    • addedInput schema / properties / departure_date / description
      Added value: +"Single departure date, \"YYYY-MM-DD\"."
    • addedInput schema / properties / departure_date_from / description
      Added value: +"First date of a departure range."
    • addedInput schema / properties / departure_date_to / description
      Added value: +"Last date of a departure range."
    • addedInput schema / properties / departure_time_max / description
      Added value: +"Latest departure hour, 0-23."
    • addedInput schema / properties / departure_time_min / description
      Added value: +"Earliest departure hour, 0-23."
    • addedInput schema / properties / exclude_airline_codes / description
      Added value: +"Exclude these airline codes."
    • addedInput schema / properties / from_airport / description
      Added value: +"Origin IATA code, e.g. \"TLV\"."
    • addedInput schema / properties / limit / description
      Added value: +"Maximum flights to return, after merging and sorting."
    • addedInput schema / properties / max_price / description
      Added value: +"Only return flights at or below this price."
    • addedInput schema / properties / max_searches / description
      Added value: +"Cap the billed requests this call may make. Lower it to spend less of the plan's quota on a wide search; the range is then sampled evenly rather than cut short."
    • addedInput schema / properties / max_stops / description
      Added value: +"Maximum stops per flight. 0 means non-stop only."
    • addedInput schema / properties / passengers / description
      Added value: +"Passenger counts as [adults, children, infants]."
    • addedInput schema / properties / seat_type / description
      Added value: +"1 economy, 2 premium economy, 3 business, 4 first."
    • addedInput schema / properties / sort_by / description
      Added value: +"\"best\", \"price\", or \"duration\". Applied across all results."
    • addedInput schema / properties / to_airport / description
      Added value: +"Destination IATA code, or a list of them to compare."
    • addedInput schema / properties / use_fallback / anyOf
      Added value: +[
      +  {
      +    "type": "boolean"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / use_fallback / default
      Previous value: -falseNew value: +null
    • addedInput schema / properties / use_fallback / description
      Added value: +"Leave 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."
    • removedInput schema / properties / use_fallback / type
      Removed value: -"boolean"
  15. First observed

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses important behavior: live prices come from Google Flights, results can go stale within minutes, a fresh search is required for a current price, and free-tier search grids may be refused before running. It also explains fallback behavior, per-combination search accounting, and the by_destination reason semantics, which are meaningful operational details not covered by the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and core usage, then moves into constraints, result shape, and staleness. It is information-dense rather than padded, but it is long and somewhat repetitive around search-count limits, so it is not maximally tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex 21-parameter search tool, the description covers the essential behavioral context: input shapes, multi-combination searches, rate-limit refusal, fallback behavior, per-destination result accounting, and price staleness. An output schema exists, and the description appropriately focuses on behavior rather than exhaustively restating return fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the schema already documents all 21 parameters thoroughly, including destination shapes, date ranges, passenger codes, and sort behavior. The description adds useful context about multi-destination/date-range searching and api_usage, but most parameter-level meaning is already supplied by the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb/resource (one-way fare search) and immediately distinguishes the scope from its sibling by specifying one-way rather than round-trip travel. It also states the data source and the core inputs/outputs, so an agent can identify the tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: suited to any one-way fare question, including open-ended ones, with an example showing a whole-month multi-destination search as one call. It also explains search-count and API-key constraints that affect when the tool can run, though it stops short of explicitly naming search_roundtrip_flights as the alternative for round-trip queries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.