Booking.com Hotel Search (Live Prices)
Server Details
Real-time Booking.com rates for agents. Three things people do with this server. Scan for rate gaps: price_as_seen_from prices the same room from another market, so an agent can sample a property across countries and compare. Put live search in your app: search a destination or look a property up by name, no internal IDs, room-level rates as flat JSON. Run a 24/7 AI travel agent: add the server, sign in with Google, and schedule it. No ads, no sponsored content. You bring your own RapidAPI key, so every search is billed to your plan and never to anyone else's. Add https://hotels.flightpowers.com/mcp , click Sign in, sign in with Google, and paste your RapidAPI key once on the page that opens. Scripts and clients without a sign-in button send the key as x-rapidapi-key on the same URL.
- Status
- Healthy
- Uptime
- 99.9% over 83 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- mtnrabi/google-flights-mcp
- GitHub Stars
- 1
- Server Listing
- google-flights-mcp
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 4 tools
The four tools target mostly distinct jobs: destination hotel search, Airbnb search, single-property lookup, and cross-source rate comparison. The main possible confusion is between compare_hotel_rates and the two destination searches, but the descriptions clearly frame compare_hotel_rates as an aggregate multi-source comparison rather than a property listing search.
All names use consistent snake_case with a verb-first pattern: compare_hotel_rates, find_hotel_by_name, search_airbnb, search_hotels. The search_airbnb name is slightly provider-oriented rather than object-oriented, but it still fits the overall convention cleanly.
Four tools is well-scoped for a live hotel/Airbnb search and comparison server. Each tool has a clear role, and the set avoids unnecessary CRUD-style expansion for a read-only pricing domain.
The tool surface covers the core workflows: destination search on Booking, Airbnb search, single-property lookup, and cross-source comparison. Minor gaps remain, such as no explicit provider/metadata listing tool or richer property-detail/amenity search, but agents can work around these through the existing searches and lookups.
Available Tools
4 toolscompare_hotel_ratesFlightPowers: compare hotel rates across sourcesARead-onlyInspect
FlightPowers cross-source comparison: prices one stay on every source the caller has a key for. Input: a free-text destination the way a person would write it ("Rome", "Tokyo Shibuya"), check-in and check-out dates, and how many adults. Returns one row per source: the cheapest and the median stay total, how many places were found, the currency and when it was read.
Every row carries the caveats that decide whether one source is cheaper. rating_scale is 10 on Booking and 5 on Airbnb. taxes_included is true on Booking, where excluded taxes are folded into the price, and null on Airbnb, where we have not established the tax treatment of the display total; a null is not a no. A source the caller has no key for is listed in providers_skipped and is not counted anywhere in the comparison.
Rates go stale within minutes: a current comparison comes from a new call, not from an earlier result.
| Name | Required | Description | Default |
|---|---|---|---|
| adults | No | Number of adult guests. Defaults to the upstream default when omitted. | |
| children | No | Number of children sharing the room. | |
| currency | No | ISO currency code for every row, e.g. "usd". Sources are asked for the same currency so the totals are comparable; a row that came back in a different one says so in its own currency field and is not converted. | |
| providers | No | Which sources to price, e.g. ["booking", "airbnb"]. Defaults to both. A source the caller has no RapidAPI key for is not called and appears in providers_skipped. | |
| destination | Yes | Where to stay, in free text the way a person would write it, e.g. "Rome" or "Tokyo Shibuya". A city, district, landmark or region all work; no internal location ID is needed. | |
| checkin_date | Yes | First night of the stay, "YYYY-MM-DD". | |
| checkout_date | Yes | Departure morning, "YYYY-MM-DD". Must be after checkin_date. |
Output Schema
| Name | Required | Description |
|---|---|---|
| adults | No | |
| nights | No | Nights between the two dates, or null when the dates could not be read as dates. |
| caveats | No | Sentences on what makes the sources' totals differ -- rating scales, tax treatment, currencies, a source that did not answer. |
| message | No | |
| children | No | |
| currency | No | The currency every source was ASKED for. |
| api_usage | No | 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. |
| providers | Yes | |
| signup_url | No | Where the caller subscribes or changes plan. |
| destination | No | |
| checkin_date | No | |
| checkout_date | No | |
| needs_api_key | No | 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. |
| quota_exhausted | No | True when the caller's RapidAPI plan has no requests left for the current period. |
| providers_skipped | No | Sources that were NOT called, each named with why and where to subscribe. A source here contributed nothing to results and is counted nowhere. It is listed rather than dropped because a silently missing source is indistinguishable from a source that had nothing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well past the annotations (readOnlyHint, openWorldHint, idempotentHint=false), disclosing exactly what each returned row contains, that rating_scale is 10 on Booking versus 5 on Airbnb, that taxes_included is null on Airbnb and 'a null is not a no', and that sources without a key land in providers_skipped and are excluded from the comparison. The staleness warning is consistent with idempotentHint=false and adds real decision context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and inputs, then two paragraphs of caveats that each carry decision-relevant information. The enumerated input list slightly duplicates the schema, but the density is purposeful rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an open-world, multi-provider aggregation with an output schema, the description supplies the interpretive layer the schema cannot: how to read rating_scale across sources, how to treat null taxes, and how skipped providers are handled. Nothing an agent needs to call or interpret the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, including the free-text destination format the description restates. The description adds nothing on children or on provider selection beyond what the schema and its examples give, so this sits at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — cross-source comparison of one stay's prices across every source the caller has a key for — and the row-per-source output makes it plainly distinct from the single-source siblings search_hotels, search_airbnb and find_hotel_by_name. An agent can pick it out without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The comparison framing plus the explicit note that 'a current comparison comes from a new call, not from an earlier result' tells the agent when this is the right tool and that results must not be cached. It stops short of naming the sibling tools or stating when a single-source search is preferable, so there is a small routing gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_hotel_by_nameFlightPowers: find one hotel by nameARead-onlyInspect
FlightPowers single-property lookup: live Booking.com availability and pricing for one named property. Input: the hotel name a person would type (adding the city helps when a chain has many properties) plus check-in and check-out dates -- no internal property ID needed, the server resolves the name. Returns the property's price, review score, room type, latitude/longitude and a booking link. It checks one specific hotel, or tracks a single property's price over time.
A date range and a nights value price several stays in one call, checkin_date_from, checkin_date_to and nights (a number, or a list like [2, 3, 7]) replace a fixed checkin_date/checkout_date, and this property is priced for every check-in date -- a rate calendar for one hotel. The answer is stays, one entry per date with that date's price and per-night rate, plus cheapest_overall. Each stay is one search; max_searches caps it, and a range that expands past the cap is sampled evenly across the calendar and says so in search_coverage. With the caller's own key the cap rises by itself to cover a month-sized range. On the free sign-in allowance (10 searches a day, one per stay) a range larger than what is left today is refused before anything runs; a range within what is left runs, and a wider range needs the caller's own key.
price_as_seen_from prices the stay as a shopper resident in that country would see it. Gaps are real but usually modest and property-dependent, and rates move between calls, so a gap holds only when it repeats over a few calls per country on this same property.
Rates go stale within minutes: a current price comes from a new search, not from an earlier result.
| Name | Required | Description | Default |
|---|---|---|---|
| adults | No | Number of adult guests. | |
| nights | No | How many nights to stay, as a number (3) or a list ([2, 3, 7]) to price several lengths. Derives the check-out date from each check-in date, so it replaces checkout_date rather than joining it. | |
| verbose | No | Returns the property exactly as the source sent it, image URL and the full tracking link included. Off by default: the row leaves out the image URL, the booking link keeps only its stay parameters, and price_per_night is added. | |
| children | No | Number of children sharing the room. | |
| currency | No | ISO currency code for the prices returned, e.g. "usd". | |
| hotel_name | Yes | The property name a person would type, e.g. "Hotel Artemide". Adding the city ("Hotel Artemide Rome") disambiguates a chain with many properties. No internal property ID is needed. | |
| checkin_date | No | First night of the stay, "YYYY-MM-DD". With checkout_date it prices one stay; checkin_date_from plus checkin_date_to give a rate calendar instead. | |
| max_searches | No | The searches this call may make, up or down. One stay is one request; with the caller's own key the cap rises by itself to cover a month-sized request, and anything past the cap in force is sampled evenly across the calendar rather than cut short at the front. | |
| checkout_date | No | Departure morning, "YYYY-MM-DD". Must be after checkin_date. Mutually exclusive with `nights`. | |
| checkin_date_to | No | Last check-in date of the range, "YYYY-MM-DD". | |
| checkin_date_from | No | First check-in date of a range, "YYYY-MM-DD". Needs checkin_date_to and nights, and prices this property on every check-in date in the range -- one call, a rate calendar. | |
| price_as_seen_from | No | Two-letter country code, e.g. "de". Prices the stay as a shopper resident in that country would see it. Rates move between calls and gaps are usually modest and property-dependent, so a gap holds only when it repeats over a few calls per country on this same property. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stays | No | One entry per stay the REQUEST asked for, in request order, present whether or not that stay was priced. Only on a date-range search (checkin_date_from / checkin_date_to / nights); a single stay does not carry it. Coverage comes from here, not from `results`: `results` holds the full property list for the CHEAPEST stay only, so a stay missing from it looks identical to a stay that had nothing. `reason` says which kind of hole an unpriced stay is: 'no_availability' (searched, answered, nothing came back), 'no_price' (properties came back, none carried a price), 'search_failed' (the search errored, so nothing is known -- not 'no rooms') or 'not_searched' (the per-call fan-out cap sampled it away). Counts are null rather than zero on those last two, because zero reads as 'nothing there' and neither case knows that. |
| message | No | |
| partial | No | Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers. |
| results | Yes | The properties found, in the order Booking.com returned them. An empty array is only meaningful when search_status is 'empty'. By default at most `limit` rows (10), the cheapest always included, each the source's own object without image URLs, with the booking link cut to its stay parameters and price_per_night (the stay total divided by its nights) added; `verbose: true` returns the source's rows untouched. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from Booking.com, null when it publishes none. |
| api_usage | No | 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. |
| signup_url | No | Where the caller subscribes or changes plan. |
| result_count | No | |
| results_note | No | Present when `limit` left properties out: how many were found and how to see more. |
| needs_api_key | No | 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. |
| results_total | No | How many properties the source returned for the stay in `results`, before `limit`. Absent with `verbose: true` and no `limit`, where every row is in `results`. |
| search_status | No | Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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. |
| applied_filters | No | Which of the requested filters the upstream actually applied. Untyped: the shape is the upstream's, echoed through. |
| quota_exhausted | No | True when the caller's RapidAPI plan has no requests left for the current period. |
| search_coverage | No | What was actually priced on a date-range search. Present whether or not the request was truncated, so the answer's basis is on the record either way. |
| cheapest_overall | No | The cheapest stay across everything priced, or null when nothing was. `results` holds this stay's full property list. |
| results_for_stay | No | Which stay `results` belongs to on a date-range search, or null when nothing was priced. `results` holds this stay's properties only, not the whole range's. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, openWorld, non-idempotent), and the description adds substantial context beyond them: rates go stale within minutes, the free tier allows 10 searches/day, ranges exceeding the remaining allowance are refused before running, and oversize ranges are sampled with a search_coverage disclosure. This is exactly the operational detail an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded well, but the body runs five paragraphs and repeats schema-level parameter text (price_as_seen_from, max_searches) almost word for word. The quota and staleness sentences earn their place; the parameter restatements do not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with two distinct modes, caps, quotas and a currency-view option, the description covers modes, sampling, quota refusal behavior and price freshness, and an output schema exists so return values need not be re-explained. Only the sibling routing is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters in detail, and much of the description's parameter text (nights replacing checkout_date, price_as_seen_from caveats, max_searches sampling) is near-verbatim duplication rather than added meaning. Baseline 3 applies; the description adds little the schema does not already carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'single-property lookup: live Booking.com availability and pricing for one named property.' This directly separates it from the sibling search_hotels by making clear it resolves exactly one property rather than searching many.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the two use cases ('checks one specific hotel, or tracks a single property's price over time') and explains when to use the rate-calendar mode (checkin_date_from/to + nights) versus a fixed stay. It never says when to prefer the sibling search_hotels instead, which is the one obvious routing gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_airbnbFlightPowers: search Airbnb staysARead-onlyInspect
FlightPowers Airbnb search: live Airbnb stays and prices for a destination and dates, read from Airbnb's public search page at request time. Returns each stay's name, stay total, per-night price, currency, rating out of 5, review count, room type, bedrooms, beds, baths and Airbnb link: 10 stays by default, the cheapest always among them.
The guest counts, price, bedroom, bed, bathroom and room-type filters are Airbnb's own; min_rating and sort are applied by FlightPowers to the one page of stays the search returned. Prices are Airbnb's displayed totals for the dates; whether they include taxes is not stated by the page, so taxes_included is null. Rates go stale within minutes: a current price comes from a new search. Data read from Airbnb's public pages; FlightPowers is not affiliated with Airbnb.
| Name | Required | Description | Default |
|---|---|---|---|
| pets | No | Pets travelling. | |
| sort | No | price_asc or price_desc by per-night price, rating_desc by rating; unset keeps Airbnb's order. | |
| limit | No | Stays returned (default 10), in search order (after `sort`), with the cheapest always included. | |
| adults | No | Adult guests. | |
| infants | No | Infants under 2. | |
| verbose | No | Returns the source's full rows (image, coordinates and more), every stay unless limit is set. | |
| children | No | Children aged 2 to 12. | |
| currency | No | ISO currency code, e.g. "eur"; USD when omitted. | |
| min_beds | No | Fewest beds. | |
| price_max | No | Highest price per night, in `currency` (Airbnb's nightly rate, before fees; price_total includes fees and can exceed price_max x nights). | |
| price_min | No | Lowest price per night, in `currency` (Airbnb's nightly rate, before fees). | |
| min_rating | No | Lowest rating kept, out of 5; unrated stays are left out. | |
| room_types | No | Room types to keep, e.g. ["Entire home/apt"]. | |
| destination | Yes | Free-text place, e.g. "Lisbon" or "Tokyo Shibuya". | |
| checkin_date | Yes | First night, "YYYY-MM-DD". | |
| min_bedrooms | No | Fewest bedrooms. | |
| checkout_date | Yes | Departure day, "YYYY-MM-DD", after checkin_date. | |
| min_bathrooms | No | Fewest bathrooms. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| results | Yes | The stays: at most `limit` (default 10), compact rows unless `verbose: true`. taxes_included is null: the page does not state whether its totals include taxes. |
| api_usage | No | What this call cost the caller's RapidAPI plan (one request), and what remains on it. |
| signup_url | No | Where the caller subscribes or changes plan. |
| result_count | No | |
| results_note | No | Present when `limit` left stays out. |
| needs_api_key | No | 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. |
| results_total | No | Stays the source returned, before `limit`. |
| search_status | No | 'ok': stays listed. 'empty': the page listed none for these dates, a real answer. |
| filters_applied | No | Each filter applied, and whether Airbnb or FlightPowers (post_filter) applied it. |
| quota_exhausted | No | True when the caller's RapidAPI plan has no requests left for the current period. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/openWorld annotations: discloses that results come from a single page of Airbnb's search output, that guest/price/bedroom/bed/bathroom/room-type filters are applied by Airbnb while min_rating and sort are applied by FlightPowers on just that one page, that taxes_included is null because the page doesn't state it, and that prices go stale within minutes. Also carries a non-affiliation disclaimer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with purpose and payoff, then filter behavior, then pricing caveats. A bit of the result-field enumeration duplicates what the output schema already carries, but every paragraph delivers usable information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter, open-world search tool with an output schema, it covers the things that matter to correct invocation: freshness/staleness, the one-page limiting behavior of post-filters, cheapest-always-included paging semantics, and the tax ambiguity. Nothing an agent needs to interpret results correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: it separates which filters are Airbnb-side versus FlightPowers-side post-filters (a critical caveat since sort/min_rating operate on only one returned page) and clarifies the default of 10 stays with the cheapest always included.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — live Airbnb stays and prices for a destination and dates — plus how the data is obtained (read from Airbnb's public search page at request time) and what each result contains. Differentiation from the hotel siblings is achieved only implicitly through the Airbnb-specific resource, no sibling is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied (use for Airbnb stays given destination and dates) and there is a genuine operational guidance sentence — rates go stale within minutes, so a current price requires a new search. However, nothing tells the agent when to pick this over search_hotels or compare_hotel_rates, and no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_hotelsFlightPowers: search hotelsARead-onlyInspect
FlightPowers hotel search: live Booking.com availability and nightly prices for a destination and date range. Input: a free-text destination the way a person would write it ("Rome", "Tokyo Shibuya"), plus check-in and check-out dates. Returns each property's price, review score, room type, location, latitude/longitude and a booking link: 10 properties by default, the cheapest always among them; limit asks for more or fewer, and verbose: true returns the source's full rows.
price_as_seen_from, a two-letter country code, prices the same stay the way a shopper resident in that country would see it. Gaps are real but usually modest and property-dependent, and rates move between calls, so one call per country is not evidence of a gap; a parity check holds one named property fixed and calls each country a few times.
A date range and a nights value price several stays in one call: checkin_date_from, checkin_date_to and nights (a number, or a list like [2, 3, 7]) replace a fixed checkin_date/checkout_date, and every check-in date is priced separately. The answer is stays -- one entry per stay with its cheapest property, per-night price and median -- plus cheapest_overall, and the full property list for the cheapest stay only. Each stay is one search; max_searches caps it, and a request that expands past the cap is sampled evenly across the range and says so in search_coverage. With the caller's own key the cap rises by itself to cover a month-sized range. On the free sign-in allowance (10 searches a day, one per stay) a range larger than what is left today is refused before anything runs; a range within what is left runs, and a wider range needs the caller's own key.
Rates go stale within minutes: a current price comes from a new search, not from an earlier result.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many properties to return (default 10; a stay has about 25). They come in the order Booking.com returned them, and the cheapest is always included. results_total says how many there were. | |
| adults | No | Number of adult guests. Defaults to the upstream default when omitted. | |
| nights | No | How many nights to stay, as a number (3) or a list ([2, 3, 7]) to price several lengths. Derives the check-out date from each check-in date, so it replaces checkout_date rather than joining it. | |
| filters | No | Property filters to apply, e.g. ["free_cancellation", "breakfast_included"]. An unknown name is rejected with the list of valid ones rather than being ignored. | |
| verbose | No | Returns each property exactly as the source sent it, image URLs and the full tracking link included, and every property unless limit is set. Off by default: rows leave out image URLs, the booking link keeps only its stay parameters, and price_per_night is added. | |
| children | No | Number of children sharing the room. | |
| currency | No | ISO currency code for the prices returned, e.g. "usd". | |
| destination | Yes | Where to stay, in free text the way a person would write it, e.g. "Rome" or "Tokyo Shibuya". A city, district, landmark or region all work; no internal location ID is needed. | |
| checkin_date | No | First night of the stay, "YYYY-MM-DD". With checkout_date it prices one stay; checkin_date_from plus checkin_date_to price a range of check-in dates instead. | |
| max_searches | No | The searches this call may make, up or down. One stay is one request, so a 30-day range at two lengths is 60 and a month at three is 93 -- with the caller's own key the cap rises to cover a request that size by itself. A lower value spends less and a higher one (hard maximum 200) covers a wider grid; either way the range is sampled evenly across the calendar rather than cut short at the front. | |
| checkout_date | No | Departure morning, "YYYY-MM-DD". Must be after checkin_date. Mutually exclusive with `nights`. | |
| checkin_date_to | No | Last check-in date of the range, "YYYY-MM-DD". | |
| budget_per_night | No | Only properties at or below this nightly price, in `currency`, are returned. | |
| checkin_date_from | No | First check-in date of a range, "YYYY-MM-DD". Needs checkin_date_to and nights, and prices one stay per check-in date in the range. | |
| price_as_seen_from | No | Two-letter country code, e.g. "de". Prices the stay through a residential connection in that country, so the result is what a shopper resident there would be quoted. A rate-parity check holds one named property fixed and calls each country a few times, because rates move between calls and one call per country can show a gap that is not there. Without it the price is neutral. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stays | No | One entry per stay the REQUEST asked for, in request order, present whether or not that stay was priced. Only on a date-range search (checkin_date_from / checkin_date_to / nights); a single stay does not carry it. Coverage comes from here, not from `results`: `results` holds the full property list for the CHEAPEST stay only, so a stay missing from it looks identical to a stay that had nothing. `reason` says which kind of hole an unpriced stay is: 'no_availability' (searched, answered, nothing came back), 'no_price' (properties came back, none carried a price), 'search_failed' (the search errored, so nothing is known -- not 'no rooms') or 'not_searched' (the per-call fan-out cap sampled it away). Counts are null rather than zero on those last two, because zero reads as 'nothing there' and neither case knows that. |
| message | No | |
| partial | No | Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers. |
| results | Yes | The properties found, in the order Booking.com returned them. An empty array is only meaningful when search_status is 'empty'. By default at most `limit` rows (10), the cheapest always included, each the source's own object without image URLs, with the booking link cut to its stay parameters and price_per_night (the stay total divided by its nights) added; `verbose: true` returns the source's rows untouched. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from Booking.com, null when it publishes none. |
| api_usage | No | 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. |
| signup_url | No | Where the caller subscribes or changes plan. |
| result_count | No | |
| results_note | No | Present when `limit` left properties out: how many were found and how to see more. |
| needs_api_key | No | 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. |
| results_total | No | How many properties the source returned for the stay in `results`, before `limit`. Absent with `verbose: true` and no `limit`, where every row is in `results`. |
| search_status | No | Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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. |
| applied_filters | No | Which of the requested filters the upstream actually applied. Untyped: the shape is the upstream's, echoed through. |
| quota_exhausted | No | True when the caller's RapidAPI plan has no requests left for the current period. |
| search_coverage | No | What was actually priced on a date-range search. Present whether or not the request was truncated, so the answer's basis is on the record either way. |
| cheapest_overall | No | The cheapest stay across everything priced, or null when nothing was. `results` holds this stay's full property list. |
| results_for_stay | No | Which stay `results` belongs to on a date-range search, or null when nothing was priced. `results` holds this stay's properties only, not the whole range's. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses critical behavior: rates go stale within minutes, current prices require a fresh search, free sign-in allowance is 10 searches per day, and oversized ranges are refused before running. It also explains sampling under max_searches and that caller-owned keys automatically raise the cap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but mostly front-loaded and information-dense, with core purpose and return shape stated first. Some sentences repeat details already present in the schema, so it is slightly less concise than it could be for a 15-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex parameter set, output schema, and annotations, the description is complete enough to call the tool correctly. It covers freshness, caps, free-tier constraints, sampling behavior, and the difference between fixed and range searches.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains limit, nights, max_searches, price_as_seen_from, and most other parameters in detail. The description adds useful mode-level context, especially for multi-stay range pricing and parity checks, but much of its parameter explanation duplicates the schema rather than adding new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: live Booking.com hotel availability and nightly prices for a destination and date range. The scope is distinct from a name lookup, so an agent can distinguish it from find_hotel_by_name 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational context for fixed-date searches, date-range searches, parity checks, and free-tier limits. It does not explicitly say to use find_hotel_by_name when a property name is already known, so sibling routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Added
compare_hotel_rates - Added
search_airbnb
2 tool updates
- Changed
find_hotel_by_name17 fields changed- changed
Input schema / properties / checkin_date / descriptionPrevious value: -"First night of the stay, \"YYYY-MM-DD\". Give this with checkout_date for one stay, or use checkin_date_from plus checkin_date_to for a rate calendar."New value: +"First night of the stay, \"YYYY-MM-DD\". With checkout_date it prices one stay; checkin_date_from plus checkin_date_to give a rate calendar instead." - changed
Input schema / properties / checkout_date / descriptionPrevious value: -"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date. Give either this or nights, not both."New value: +"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date. Mutually exclusive with `nights`." - changed
Input schema / properties / price_as_seen_from / descriptionPrevious value: -"Two-letter country code, e.g. \"de\". Prices the stay as a shopper resident in that country would see it. Call each country a few times on this same property before reporting a gap, because rates move between calls and gaps are usually modest and property-dependent."New value: +"Two-letter country code, e.g. \"de\". Prices the stay as a shopper resident in that country would see it. Rates move between calls and gaps are usually modest and property-dependent, so a gap holds only when it repeats over a few calls per country on this same property." - added
Input schema / properties / verboseAdded value: +{ + "default": false, + "description": "Returns the property exactly as the source sent it, image URL and the full tracking link included. Off by default: the row leaves out the image URL, the booking link keeps only its stay parameters, and price_per_night is added.", + "type": "boolean" +} - changed
Output schema / properties / api_usage / properties / note / descriptionPrevious value: -"The same figures as a sentence, for the model to relay."New value: +"The same figures as one plain sentence." - changed
Output schema / properties / cheapest_overall / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "checkin_date": { - "type": "string" - }, - "checkout_date": { - "type": "string" - }, - "currency": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "nights": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "price_per_night": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "property": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, and an image CDN link is the half no model can open. The booking link is kept." - }, - "total": { - "type": "number" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "checkin_date": { + "type": "string" + }, + "checkout_date": { + "type": "string" + }, + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "nights": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "price_per_night": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "property": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, so image URLs are dropped to keep the payload small. The booking link is kept." + }, + "total": { + "type": "number" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / needs_api_key / descriptionPrevious 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." - changed
Output schema / properties / results / descriptionPrevious value: -"The properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'. Each row is the source's own object, passed through. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from Booking.com, null when it publishes none."New value: +"The properties found, in the order Booking.com returned them. An empty array is only meaningful when search_status is 'empty'. By default at most `limit` rows (10), the cheapest always included, each the source's own object without image URLs, with the booking link cut to its stay parameters and price_per_night (the stay total divided by its nights) added; `verbose: true` returns the source's rows untouched. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from Booking.com, null when it publishes none." - added
Output schema / properties / results / items / properties / price_per_nightAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / results_for_stay / descriptionPrevious value: -"Which stay `results` belongs to on a date-range search, or null when nothing was priced. Without it the rows read as 'the search's results' and get quoted against the wrong dates."New value: +"Which stay `results` belongs to on a date-range search, or null when nothing was priced. `results` holds this stay's properties only, not the whole range's." - added
Output schema / properties / results_noteAdded value: +{ + "description": "Present when `limit` left properties out: how many were found and how to see more.", + "type": "string" +} - added
Output schema / properties / results_totalAdded value: +{ + "description": "How many properties the source returned for the stay in `results`, before `limit`. Absent with `verbose: true` and no `limit`, where every row is in `results`.", + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / search_coverage / descriptionPrevious value: -"What was actually priced on a date-range search. Present whether or not the request was truncated, so a model can state honestly what its answer rests on."New value: +"What was actually priced on a date-range search. Present whether or not the request was truncated, so the answer's basis is on the record either way." - changed
Output schema / properties / search_coverage / properties / stopped_early / descriptionPrevious 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." - changed
Output schema / properties / search_status / descriptionPrevious value: -"Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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: +"Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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." - changed
Output schema / properties / stays / descriptionPrevious value: -"One entry per stay the REQUEST asked for, in request order, present whether or not that stay was priced. Only on a date-range search (checkin_date_from / checkin_date_to / nights); a single stay does not carry it.\n\nRead this rather than inferring coverage from `results`: `results` holds the full property list for the CHEAPEST stay only, so a stay missing from it looks identical to a stay that had nothing. `reason` says which kind of hole an unpriced stay is: 'no_availability' (searched, answered, nothing came back), 'no_price' (properties came back, none carried a price), 'search_failed' (the search errored, so nothing is known -- not 'no rooms') or 'not_searched' (the per-call fan-out cap sampled it away). Counts are null rather than zero on those last two, because zero reads as 'nothing there' and neither case knows that."New value: +"One entry per stay the REQUEST asked for, in request order, present whether or not that stay was priced. Only on a date-range search (checkin_date_from / checkin_date_to / nights); a single stay does not carry it.\n\nCoverage comes from here, not from `results`: `results` holds the full property list for the CHEAPEST stay only, so a stay missing from it looks identical to a stay that had nothing. `reason` says which kind of hole an unpriced stay is: 'no_availability' (searched, answered, nothing came back), 'no_price' (properties came back, none carried a price), 'search_failed' (the search errored, so nothing is known -- not 'no rooms') or 'not_searched' (the per-call fan-out cap sampled it away). Counts are null rather than zero on those last two, because zero reads as 'nothing there' and neither case knows that." - changed
Output schema / properties / stays / items / properties / cheapest / descriptionPrevious value: -"The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, and an image CDN link is the half no model can open. The booking link is kept."New value: +"The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, so image URLs are dropped to keep the payload small. The booking link is kept."
- Changed
search_hotels22 fields changed- changed
Input schema / properties / budget_per_night / descriptionPrevious value: -"Only return properties at or below this nightly price, in `currency`."New value: +"Only properties at or below this nightly price, in `currency`, are returned." - changed
Input schema / properties / checkin_date / descriptionPrevious value: -"First night of the stay, \"YYYY-MM-DD\". Give this with checkout_date for one stay, or use checkin_date_from plus checkin_date_to for a range of check-in dates."New value: +"First night of the stay, \"YYYY-MM-DD\". With checkout_date it prices one stay; checkin_date_from plus checkin_date_to price a range of check-in dates instead." - changed
Input schema / properties / checkin_date_from / descriptionPrevious value: -"First check-in date of a range, \"YYYY-MM-DD\". Needs checkin_date_to and nights, and prices one stay per check-in date in the range -- the hotel equivalent of the flights date range."New value: +"First check-in date of a range, \"YYYY-MM-DD\". Needs checkin_date_to and nights, and prices one stay per check-in date in the range." - changed
Input schema / properties / checkout_date / descriptionPrevious value: -"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date. Give either this or nights, not both."New value: +"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date. Mutually exclusive with `nights`." - changed
Input schema / properties / destination / descriptionPrevious value: -"Where to stay, in free text the way a person would say it, e.g. \"Rome\" or \"Tokyo Shibuya\". A city, district, landmark or region all work; no internal location ID is needed."New value: +"Where to stay, in free text the way a person would write it, e.g. \"Rome\" or \"Tokyo Shibuya\". A city, district, landmark or region all work; no internal location ID is needed." - added
Input schema / properties / limitAdded value: +{ + "anyOf": [ + { + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "How many properties to return (default 10; a stay has about 25). They come in the order Booking.com returned them, and the cheapest is always included. results_total says how many there were." +} - changed
Input schema / properties / max_searches / descriptionPrevious value: -"The searches this call may make, up or down. One stay is one request, so a 30-day range at two lengths is 60 and a month at three is 93 -- with the caller's own key the cap rises to cover a request that size by itself. Set it lower to spend less, or higher (hard maximum 200) for a wider grid; either way the range is sampled evenly across the calendar rather than cut short at the front."New value: +"The searches this call may make, up or down. One stay is one request, so a 30-day range at two lengths is 60 and a month at three is 93 -- with the caller's own key the cap rises to cover a request that size by itself. A lower value spends less and a higher one (hard maximum 200) covers a wider grid; either way the range is sampled evenly across the calendar rather than cut short at the front." - changed
Input schema / properties / price_as_seen_from / descriptionPrevious value: -"Two-letter country code, e.g. \"de\". Prices the stay through a residential connection in that country, so the result is what a shopper resident there would be quoted. For a rate-parity check hold one named property fixed and call each country a few times, because rates move between calls and one call per country can show a gap that is not there. Omit it for a neutral price."New value: +"Two-letter country code, e.g. \"de\". Prices the stay through a residential connection in that country, so the result is what a shopper resident there would be quoted. A rate-parity check holds one named property fixed and calls each country a few times, because rates move between calls and one call per country can show a gap that is not there. Without it the price is neutral." - added
Input schema / properties / verboseAdded value: +{ + "default": false, + "description": "Returns each property exactly as the source sent it, image URLs and the full tracking link included, and every property unless limit is set. Off by default: rows leave out image URLs, the booking link keeps only its stay parameters, and price_per_night is added.", + "type": "boolean" +} - changed
Output schema / properties / api_usage / properties / note / descriptionPrevious value: -"The same figures as a sentence, for the model to relay."New value: +"The same figures as one plain sentence." - changed
Output schema / properties / cheapest_overall / anyOfPrevious value: -[ - { - "additionalProperties": true, - "properties": { - "checkin_date": { - "type": "string" - }, - "checkout_date": { - "type": "string" - }, - "currency": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "nights": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ] - }, - "price_per_night": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "property": { - "anyOf": [ - { - "additionalProperties": true, - "type": "object" - }, - { - "type": "null" - } - ], - "description": "The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, and an image CDN link is the half no model can open. The booking link is kept." - }, - "total": { - "type": "number" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": true, + "properties": { + "checkin_date": { + "type": "string" + }, + "checkout_date": { + "type": "string" + }, + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "nights": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "price_per_night": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "property": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, so image URLs are dropped to keep the payload small. The booking link is kept." + }, + "total": { + "type": "number" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / needs_api_key / descriptionPrevious 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." - changed
Output schema / properties / results / descriptionPrevious value: -"The properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'. Each row is the source's own object, passed through. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from Booking.com, null when it publishes none."New value: +"The properties found, in the order Booking.com returned them. An empty array is only meaningful when search_status is 'empty'. By default at most `limit` rows (10), the cheapest always included, each the source's own object without image URLs, with the booking link cut to its stay parameters and price_per_night (the stay total divided by its nights) added; `verbose: true` returns the source's rows untouched. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from Booking.com, null when it publishes none." - added
Output schema / properties / results / items / properties / price_per_nightAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] +} - changed
Output schema / properties / results_for_stay / descriptionPrevious value: -"Which stay `results` belongs to on a date-range search, or null when nothing was priced. Without it the rows read as 'the search's results' and get quoted against the wrong dates."New value: +"Which stay `results` belongs to on a date-range search, or null when nothing was priced. `results` holds this stay's properties only, not the whole range's." - added
Output schema / properties / results_noteAdded value: +{ + "description": "Present when `limit` left properties out: how many were found and how to see more.", + "type": "string" +} - added
Output schema / properties / results_totalAdded value: +{ + "description": "How many properties the source returned for the stay in `results`, before `limit`. Absent with `verbose: true` and no `limit`, where every row is in `results`.", + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / search_coverage / descriptionPrevious value: -"What was actually priced on a date-range search. Present whether or not the request was truncated, so a model can state honestly what its answer rests on."New value: +"What was actually priced on a date-range search. Present whether or not the request was truncated, so the answer's basis is on the record either way." - changed
Output schema / properties / search_coverage / properties / stopped_early / descriptionPrevious 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." - changed
Output schema / properties / search_status / descriptionPrevious value: -"Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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: +"Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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." - changed
Output schema / properties / stays / descriptionPrevious value: -"One entry per stay the REQUEST asked for, in request order, present whether or not that stay was priced. Only on a date-range search (checkin_date_from / checkin_date_to / nights); a single stay does not carry it.\n\nRead this rather than inferring coverage from `results`: `results` holds the full property list for the CHEAPEST stay only, so a stay missing from it looks identical to a stay that had nothing. `reason` says which kind of hole an unpriced stay is: 'no_availability' (searched, answered, nothing came back), 'no_price' (properties came back, none carried a price), 'search_failed' (the search errored, so nothing is known -- not 'no rooms') or 'not_searched' (the per-call fan-out cap sampled it away). Counts are null rather than zero on those last two, because zero reads as 'nothing there' and neither case knows that."New value: +"One entry per stay the REQUEST asked for, in request order, present whether or not that stay was priced. Only on a date-range search (checkin_date_from / checkin_date_to / nights); a single stay does not carry it.\n\nCoverage comes from here, not from `results`: `results` holds the full property list for the CHEAPEST stay only, so a stay missing from it looks identical to a stay that had nothing. `reason` says which kind of hole an unpriced stay is: 'no_availability' (searched, answered, nothing came back), 'no_price' (properties came back, none carried a price), 'search_failed' (the search errored, so nothing is known -- not 'no rooms') or 'not_searched' (the per-call fan-out cap sampled it away). Counts are null rather than zero on those last two, because zero reads as 'nothing there' and neither case knows that." - changed
Output schema / properties / stays / items / properties / cheapest / descriptionPrevious value: -"The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, and an image CDN link is the half no model can open. The booking link is kept."New value: +"The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, so image URLs are dropped to keep the payload small. The booking link is kept."
2 tool updates
- Changed
find_hotel_by_name10 fields changed- changed
Input schema / properties / max_searches / descriptionPrevious value: -"The billed requests this call may make, up or down. One stay is one request; the cap rises by itself to cover a month-sized request, and anything past the cap in force is sampled evenly across the calendar rather than cut short at the front."New value: +"The searches this call may make, up or down. One stay is one request; with the caller's own key the cap rises by itself to cover a month-sized request, and anything past the cap in force is sampled evenly across the calendar rather than cut short at the front." - changed
Output schema / properties / api_usage / descriptionPrevious 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." - added
Output schema / properties / api_usage / properties / free_searches_day_capAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / api_usage / properties / free_searches_remaining_todayAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / api_usage / properties / free_searches_used_todayAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / api_usage / properties / hub_requests_billed / descriptionPrevious 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." - removed
Output schema / properties / caveatsRemoved value: -{ - "description": "Sentences that must be read before one source is called cheaper than another -- differing rating scales, differing tax treatment, differing currencies, a source that did not answer.", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Output schema / properties / providersRemoved value: -{ - "description": "One entry per source that was called, in the order they were requested. Only present when `providers` named more than the default source.", - "items": { - "additionalProperties": true, - "description": "What one accommodation source answered. Present for every source that was CALLED, whether or not it answered: a source with search_status 'degraded' carries a reason, a null count and no prices, which is not the same answer as a source that found nothing.", - "properties": { - "cheapest_link": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "cheapest_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "cheapest_total": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "count": { - "anyOf": [ - { - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "How many properties from this source carried a price. Null when the source did not answer -- zero would read as 'nothing there', which a failed search does not know." - }, - "currency": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The currency THIS row's totals are in. Rows in different currencies are not comparable and nothing is converted." - }, - "detail": { - "description": "Plain text for the model to relay to a human.", - "type": "string" - }, - "median_total": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "provider": { - "description": "Which source this row is about, e.g. 'booking'.", - "type": "string" - }, - "rating_scale": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "What a review score from this source is out of: 10 on Booking, 5 on Airbnb. Read it before comparing two scores." - }, - "retrieved_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "When these rows were read, taken from the rows themselves rather than from when this answer was assembled." - }, - "search_reason": { - "type": "string" - }, - "search_status": { - "description": "'ok': the source answered with priced results. 'empty': it answered and had nothing for that stay -- a real answer. 'degraded': it was asked and could not answer, so count is null and an empty list from it means nothing.", - "enum": [ - "ok", - "empty", - "degraded", - "skipped" - ], - "type": "string" - }, - "taxes_included": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "description": "Whether this source's totals include tax. Null means it has not been established for that source, not that tax is excluded." - }, - "top": { - "description": "The cheapest few priced rows from this source.", - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "provider", - "search_status" - ], - "type": "object" - }, - "type": "array" -} - removed
Output schema / properties / providers_skippedRemoved value: -{ - "description": "Sources that were NOT called, each named with why and where to subscribe. A source here contributed nothing to results and is counted nowhere. It is listed rather than dropped because a silently missing source is indistinguishable from a source that had nothing.", - "items": { - "additionalProperties": true, - "properties": { - "detail": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "reason": { - "description": "'no_key': no RapidAPI key for that source's listing arrived with the call. 'not_subscribed': the key supplied is not subscribed to that listing. 'key_rejected': the key was refused outright.", - "type": "string" - }, - "subscribe_url": { - "type": "string" - } - }, - "required": [ - "provider", - "reason" - ], - "type": "object" - }, - "type": "array" -} - changed
Output schema / properties / results / descriptionPrevious value: -"The properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'. Each row is the source's own object, passed through. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from the source that answered (Booking.com on Booking rows, Airbnb on Airbnb rows), null when the source publishes none."New value: +"The properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'. Each row is the source's own object, passed through. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from Booking.com, null when it publishes none."
- Changed
search_hotels11 fields changed- changed
Input schema / properties / max_searches / descriptionPrevious value: -"The billed requests this call may make, up or down. One stay is one request, so a 30-day range at two lengths is 60 and a month at three is 93 -- the cap rises to cover a request that size by itself. Set it lower to spend less, or higher (hard maximum 200) for a wider grid; either way the range is sampled evenly across the calendar rather than cut short at the front."New value: +"The searches this call may make, up or down. One stay is one request, so a 30-day range at two lengths is 60 and a month at three is 93 -- with the caller's own key the cap rises to cover a request that size by itself. Set it lower to spend less, or higher (hard maximum 200) for a wider grid; either way the range is sampled evenly across the calendar rather than cut short at the front." - removed
Input schema / properties / providersRemoved value: -{ - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Which sources to price this stay on, e.g. [\"booking\"], [\"airbnb\"] or [\"booking\", \"airbnb\"]. Defaults to [\"booking\"]. Each source is a separate RapidAPI subscription, so a source you have no key for is not called; it comes back named in providers_skipped with the reason and where to subscribe, rather than silently missing. filters and price_as_seen_from apply to booking only; airbnb takes price_min, price_max and room_types instead, and rows from it carry rating_scale 5 where booking's carry 10." -} - changed
Output schema / properties / api_usage / descriptionPrevious 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." - added
Output schema / properties / api_usage / properties / free_searches_day_capAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / api_usage / properties / free_searches_remaining_todayAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / api_usage / properties / free_searches_used_todayAdded value: +{ + "minimum": 0, + "type": "integer" +} - changed
Output schema / properties / api_usage / properties / hub_requests_billed / descriptionPrevious 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." - removed
Output schema / properties / caveatsRemoved value: -{ - "description": "Sentences that must be read before one source is called cheaper than another -- differing rating scales, differing tax treatment, differing currencies, a source that did not answer.", - "items": { - "type": "string" - }, - "type": "array" -} - removed
Output schema / properties / providersRemoved value: -{ - "description": "One entry per source that was called, in the order they were requested. Only present when `providers` named more than the default source.", - "items": { - "additionalProperties": true, - "description": "What one accommodation source answered. Present for every source that was CALLED, whether or not it answered: a source with search_status 'degraded' carries a reason, a null count and no prices, which is not the same answer as a source that found nothing.", - "properties": { - "cheapest_link": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "cheapest_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ] - }, - "cheapest_total": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "count": { - "anyOf": [ - { - "minimum": 0, - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "How many properties from this source carried a price. Null when the source did not answer -- zero would read as 'nothing there', which a failed search does not know." - }, - "currency": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "The currency THIS row's totals are in. Rows in different currencies are not comparable and nothing is converted." - }, - "detail": { - "description": "Plain text for the model to relay to a human.", - "type": "string" - }, - "median_total": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ] - }, - "provider": { - "description": "Which source this row is about, e.g. 'booking'.", - "type": "string" - }, - "rating_scale": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "What a review score from this source is out of: 10 on Booking, 5 on Airbnb. Read it before comparing two scores." - }, - "retrieved_at": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "When these rows were read, taken from the rows themselves rather than from when this answer was assembled." - }, - "search_reason": { - "type": "string" - }, - "search_status": { - "description": "'ok': the source answered with priced results. 'empty': it answered and had nothing for that stay -- a real answer. 'degraded': it was asked and could not answer, so count is null and an empty list from it means nothing.", - "enum": [ - "ok", - "empty", - "degraded", - "skipped" - ], - "type": "string" - }, - "taxes_included": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "description": "Whether this source's totals include tax. Null means it has not been established for that source, not that tax is excluded." - }, - "top": { - "description": "The cheapest few priced rows from this source.", - "items": { - "additionalProperties": true, - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "provider", - "search_status" - ], - "type": "object" - }, - "type": "array" -} - removed
Output schema / properties / providers_skippedRemoved value: -{ - "description": "Sources that were NOT called, each named with why and where to subscribe. A source here contributed nothing to results and is counted nowhere. It is listed rather than dropped because a silently missing source is indistinguishable from a source that had nothing.", - "items": { - "additionalProperties": true, - "properties": { - "detail": { - "type": "string" - }, - "provider": { - "type": "string" - }, - "reason": { - "description": "'no_key': no RapidAPI key for that source's listing arrived with the call. 'not_subscribed': the key supplied is not subscribed to that listing. 'key_rejected': the key was refused outright.", - "type": "string" - }, - "subscribe_url": { - "type": "string" - } - }, - "required": [ - "provider", - "reason" - ], - "type": "object" - }, - "type": "array" -} - changed
Output schema / properties / results / descriptionPrevious value: -"The properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'. Each row is the source's own object, passed through. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from the source that answered (Booking.com on Booking rows, Airbnb on Airbnb rows), null when the source publishes none."New value: +"The properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'. Each row is the source's own object, passed through. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from Booking.com, null when it publishes none."
1 tool update
- Removed
compare_hotel_rates
2 tool updates
- Changed
find_hotel_by_name2 fields changed- changed
Output schema / properties / results / descriptionPrevious value: -"The itineraries or properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'."New value: +"The properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'. Each row is the source's own object, passed through. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from the source that answered (Booking.com on Booking rows, Airbnb on Airbnb rows), null when the source publishes none." - added
Output schema / properties / results / items / propertiesAdded value: +{ + "latitude": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "longitude": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } +}
- Changed
search_hotels2 fields changed- changed
Output schema / properties / results / descriptionPrevious value: -"The itineraries or properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'."New value: +"The properties found, already sorted and deduplicated. An empty array is only meaningful when search_status is 'empty'. Each row is the source's own object, passed through. latitude and longitude are the property's WGS84 coordinates in decimal degrees, from the source that answered (Booking.com on Booking rows, Airbnb on Airbnb rows), null when the source publishes none." - added
Output schema / properties / results / items / propertiesAdded value: +{ + "latitude": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "longitude": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + } +}
3 tool updates
- Changed
compare_hotel_rates2 fields changed- added
Output schema / properties / api_usage / properties / hub_requests_billedAdded 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" +} - added
Output schema / properties / api_usage / properties / requests_used_by_this_call / descriptionAdded value: +"How many date/destination combinations were searched -- what the answer COVERS."
- Changed
find_hotel_by_name6 fields changed- changed
Input schema / properties / max_searches / descriptionPrevious value: -"Cap the billed requests this call may make. One stay is one request; lower it and the range is sampled evenly across the calendar rather than cut short at the front."New value: +"The billed requests this call may make, up or down. One stay is one request; the cap rises by itself to cover a month-sized request, and anything past the cap in force is sampled evenly across the calendar rather than cut short at the front." - added
Output schema / properties / api_usage / properties / hub_requests_billedAdded 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" +} - added
Output schema / properties / api_usage / properties / requests_used_by_this_call / descriptionAdded value: +"How many date/destination combinations were searched -- what the answer COVERS." - added
Output schema / properties / search_coverage / properties / stopped_earlyAdded 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" +} - changed
Output schema / properties / search_status / descriptionPrevious value: -"Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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: +"Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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." - changed
Output schema / properties / search_status / enumPrevious value: -[ - "ok", - "empty", - "partial", - "degraded", - "trial_exhausted" -]New value: +[ + "ok", + "empty", + "partial", + "degraded", + "trial_exhausted", + "quota_exceeded" +]
- Changed
search_hotels6 fields changed- changed
Input schema / properties / max_searches / descriptionPrevious value: -"Cap the billed requests this call may make. One stay is one request, so a 30-day range at two lengths is 60; lower this to spend less and the range is sampled evenly across the calendar rather than cut short at the front."New value: +"The billed requests this call may make, up or down. One stay is one request, so a 30-day range at two lengths is 60 and a month at three is 93 -- the cap rises to cover a request that size by itself. Set it lower to spend less, or higher (hard maximum 200) for a wider grid; either way the range is sampled evenly across the calendar rather than cut short at the front." - added
Output schema / properties / api_usage / properties / hub_requests_billedAdded 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" +} - added
Output schema / properties / api_usage / properties / requests_used_by_this_call / descriptionAdded value: +"How many date/destination combinations were searched -- what the answer COVERS." - added
Output schema / properties / search_coverage / properties / stopped_earlyAdded 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" +} - changed
Output schema / properties / search_status / descriptionPrevious value: -"Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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: +"Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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." - changed
Output schema / properties / search_status / enumPrevious value: -[ - "ok", - "empty", - "partial", - "degraded", - "trial_exhausted" -]New value: +[ + "ok", + "empty", + "partial", + "degraded", + "trial_exhausted", + "quota_exceeded" +]
2 tool updates
- Changed
find_hotel_by_name2 fields changed- changed
Output schema / properties / search_status / descriptionPrevious value: -"Date-range searches only. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; safe to retry."New value: +"Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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." - changed
Output schema / properties / search_status / enumPrevious value: -[ - "ok", - "empty", - "partial", - "degraded" -]New value: +[ + "ok", + "empty", + "partial", + "degraded", + "trial_exhausted" +]
- Changed
search_hotels2 fields changed- changed
Output schema / properties / search_status / descriptionPrevious value: -"Date-range searches only. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; safe to retry."New value: +"Date-range searches only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; 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." - changed
Output schema / properties / search_status / enumPrevious value: -[ - "ok", - "empty", - "partial", - "degraded" -]New value: +[ + "ok", + "empty", + "partial", + "degraded", + "trial_exhausted" +]
3 tool updates
- Added
compare_hotel_rates - Changed
find_hotel_by_name23 fields changed- added
Input schema / properties / checkin_date / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / checkin_date / defaultAdded value: +null - changed
Input schema / properties / checkin_date / descriptionPrevious value: -"First night of the stay, \"YYYY-MM-DD\"."New value: +"First night of the stay, \"YYYY-MM-DD\". Give this with checkout_date for one stay, or use checkin_date_from plus checkin_date_to for a rate calendar." - removed
Input schema / properties / checkin_date / typeRemoved value: -"string" - added
Input schema / properties / checkin_date_fromAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "First check-in date of a range, \"YYYY-MM-DD\". Needs checkin_date_to and nights, and prices this property on every check-in date in the range -- one call, a rate calendar." +} - added
Input schema / properties / checkin_date_toAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Last check-in date of the range, \"YYYY-MM-DD\"." +} - added
Input schema / properties / checkout_date / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / checkout_date / defaultAdded value: +null - changed
Input schema / properties / checkout_date / descriptionPrevious value: -"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date."New value: +"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date. Give either this or nights, not both." - removed
Input schema / properties / checkout_date / typeRemoved value: -"string" - added
Input schema / properties / max_searchesAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Cap the billed requests this call may make. One stay is one request; lower it and the range is sampled evenly across the calendar rather than cut short at the front." +} - added
Input schema / properties / nightsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "How many nights to stay, as a number (3) or a list ([2, 3, 7]) to price several lengths. Derives the check-out date from each check-in date, so it replaces checkout_date rather than joining it." +} - changed
Input schema / requiredPrevious value: -[ - "hotel_name", - "checkin_date", - "checkout_date" -]New value: +[ + "hotel_name" +] - changed
Output schema / descriptionPrevious value: -"A completed hotel search. The hotels upstream reports no search-status header, so these results carry no search_status field."New value: +"A completed hotel search. A single stay carries no search_status: the hotels upstream reports no search-status header, and one call either answered or raised. A DATE-RANGE search does carry one, derived from the fan-out rather than from the upstream -- some of its stays can fail while others answer, and `results` then holds only the cheapest stay's properties, so `stays` is where the shape of the answer lives." - added
Output schema / properties / caveatsAdded value: +{ + "description": "Sentences that must be read before one source is called cheaper than another -- differing rating scales, differing tax treatment, differing currencies, a source that did not answer.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / cheapest_overallAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "checkin_date": { + "type": "string" + }, + "checkout_date": { + "type": "string" + }, + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "nights": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "price_per_night": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "property": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, and an image CDN link is the half no model can open. The booking link is kept." + }, + "total": { + "type": "number" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The cheapest stay across everything priced, or null when nothing was. `results` holds this stay's full property list." +} - added
Output schema / properties / partialAdded value: +{ + "description": "Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers.", + "type": "string" +} - added
Output schema / properties / providersAdded value: +{ + "description": "One entry per source that was called, in the order they were requested. Only present when `providers` named more than the default source.", + "items": { + "additionalProperties": true, + "description": "What one accommodation source answered. Present for every source that was CALLED, whether or not it answered: a source with search_status 'degraded' carries a reason, a null count and no prices, which is not the same answer as a source that found nothing.", + "properties": { + "cheapest_link": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "cheapest_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "cheapest_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "count": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "How many properties from this source carried a price. Null when the source did not answer -- zero would read as 'nothing there', which a failed search does not know." + }, + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The currency THIS row's totals are in. Rows in different currencies are not comparable and nothing is converted." + }, + "detail": { + "description": "Plain text for the model to relay to a human.", + "type": "string" + }, + "median_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "provider": { + "description": "Which source this row is about, e.g. 'booking'.", + "type": "string" + }, + "rating_scale": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "What a review score from this source is out of: 10 on Booking, 5 on Airbnb. Read it before comparing two scores." + }, + "retrieved_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "When these rows were read, taken from the rows themselves rather than from when this answer was assembled." + }, + "search_reason": { + "type": "string" + }, + "search_status": { + "description": "'ok': the source answered with priced results. 'empty': it answered and had nothing for that stay -- a real answer. 'degraded': it was asked and could not answer, so count is null and an empty list from it means nothing.", + "enum": [ + "ok", + "empty", + "degraded", + "skipped" + ], + "type": "string" + }, + "taxes_included": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether this source's totals include tax. Null means it has not been established for that source, not that tax is excluded." + }, + "top": { + "description": "The cheapest few priced rows from this source.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "provider", + "search_status" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / providers_skippedAdded value: +{ + "description": "Sources that were NOT called, each named with why and where to subscribe. A source here contributed nothing to results and is counted nowhere. It is listed rather than dropped because a silently missing source is indistinguishable from a source that had nothing.", + "items": { + "additionalProperties": true, + "properties": { + "detail": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "reason": { + "description": "'no_key': no RapidAPI key for that source's listing arrived with the call. 'not_subscribed': the key supplied is not subscribed to that listing. 'key_rejected': the key was refused outright.", + "type": "string" + }, + "subscribe_url": { + "type": "string" + } + }, + "required": [ + "provider", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results_for_stayAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Which stay `results` belongs to on a date-range search, or null when nothing was priced. Without it the rows read as 'the search's results' and get quoted against the wrong dates." +} - added
Output schema / properties / search_coverageAdded value: +{ + "additionalProperties": true, + "description": "What was actually priced on a date-range search. Present whether or not the request was truncated, so a model can state honestly what its answer rests on.", + "properties": { + "checkin_dates_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" + }, + "stays_searched": { + "description": "The exact date pairs priced.", + "items": { + "additionalProperties": true, + "properties": { + "checkin_date": { + "type": "string" + }, + "checkout_date": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "truncated": { + "description": "True when the request expanded past this call's spend ceiling and was sampled. A stay absent from stays_searched was never priced, which is not the same as having no rooms.", + "type": "boolean" + } + }, + "type": "object" +} - added
Output schema / properties / search_statusAdded value: +{ + "description": "Date-range searches only. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; safe to retry.", + "enum": [ + "ok", + "empty", + "partial", + "degraded" + ], + "type": "string" +} - added
Output schema / properties / staysAdded value: +{ + "description": "One entry per stay the REQUEST asked for, in request order, present whether or not that stay was priced. Only on a date-range search (checkin_date_from / checkin_date_to / nights); a single stay does not carry it.\n\nRead this rather than inferring coverage from `results`: `results` holds the full property list for the CHEAPEST stay only, so a stay missing from it looks identical to a stay that had nothing. `reason` says which kind of hole an unpriced stay is: 'no_availability' (searched, answered, nothing came back), 'no_price' (properties came back, none carried a price), 'search_failed' (the search errored, so nothing is known -- not 'no rooms') or 'not_searched' (the per-call fan-out cap sampled it away). Counts are null rather than zero on those last two, because zero reads as 'nothing there' and neither case knows that.", + "items": { + "additionalProperties": true, + "properties": { + "cheapest": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, and an image CDN link is the half no model can open. The booking link is kept." + }, + "cheapest_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "checkin_date": { + "type": "string" + }, + "checkout_date": { + "type": "string" + }, + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "median_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Median stay total over this stay's priced properties -- what the date costs generally, next to what its one cheapest room costs." + }, + "nights": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "price_per_night": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "cheapest_total divided by nights, rounded." + }, + "priced_count": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "How many of those carried a price. The others are not evidence about what the stay costs." + }, + "property_count": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "Properties returned for this stay. Null when it was not searched or its search errored." + }, + "reason": { + "enum": [ + "ok", + "no_availability", + "no_price", + "search_failed", + "not_searched" + ], + "type": "string" + }, + "search_status": { + "enum": [ + "ok", + "empty", + "degraded", + "not_searched" + ], + "type": "string" + } + }, + "required": [ + "checkin_date", + "checkout_date", + "search_status", + "reason" + ], + "type": "object" + }, + "type": "array" +}
- Changed
search_hotels24 fields changed- added
Input schema / properties / checkin_date / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / checkin_date / defaultAdded value: +null - changed
Input schema / properties / checkin_date / descriptionPrevious value: -"First night of the stay, \"YYYY-MM-DD\"."New value: +"First night of the stay, \"YYYY-MM-DD\". Give this with checkout_date for one stay, or use checkin_date_from plus checkin_date_to for a range of check-in dates." - removed
Input schema / properties / checkin_date / typeRemoved value: -"string" - added
Input schema / properties / checkin_date_fromAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "First check-in date of a range, \"YYYY-MM-DD\". Needs checkin_date_to and nights, and prices one stay per check-in date in the range -- the hotel equivalent of the flights date range." +} - added
Input schema / properties / checkin_date_toAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Last check-in date of the range, \"YYYY-MM-DD\"." +} - added
Input schema / properties / checkout_date / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / checkout_date / defaultAdded value: +null - changed
Input schema / properties / checkout_date / descriptionPrevious value: -"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date."New value: +"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date. Give either this or nights, not both." - removed
Input schema / properties / checkout_date / typeRemoved value: -"string" - added
Input schema / properties / max_searchesAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Cap the billed requests this call may make. One stay is one request, so a 30-day range at two lengths is 60; lower this to spend less and the range is sampled evenly across the calendar rather than cut short at the front." +} - added
Input schema / properties / nightsAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "How many nights to stay, as a number (3) or a list ([2, 3, 7]) to price several lengths. Derives the check-out date from each check-in date, so it replaces checkout_date rather than joining it." +} - added
Input schema / properties / providersAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Which sources to price this stay on, e.g. [\"booking\"], [\"airbnb\"] or [\"booking\", \"airbnb\"]. Defaults to [\"booking\"]. Each source is a separate RapidAPI subscription, so a source you have no key for is not called; it comes back named in providers_skipped with the reason and where to subscribe, rather than silently missing. filters and price_as_seen_from apply to booking only; airbnb takes price_min, price_max and room_types instead, and rows from it carry rating_scale 5 where booking's carry 10." +} - changed
Input schema / requiredPrevious value: -[ - "destination", - "checkin_date", - "checkout_date" -]New value: +[ + "destination" +] - changed
Output schema / descriptionPrevious value: -"A completed hotel search. The hotels upstream reports no search-status header, so these results carry no search_status field."New value: +"A completed hotel search. A single stay carries no search_status: the hotels upstream reports no search-status header, and one call either answered or raised. A DATE-RANGE search does carry one, derived from the fan-out rather than from the upstream -- some of its stays can fail while others answer, and `results` then holds only the cheapest stay's properties, so `stays` is where the shape of the answer lives." - added
Output schema / properties / caveatsAdded value: +{ + "description": "Sentences that must be read before one source is called cheaper than another -- differing rating scales, differing tax treatment, differing currencies, a source that did not answer.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / cheapest_overallAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "checkin_date": { + "type": "string" + }, + "checkout_date": { + "type": "string" + }, + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "nights": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "price_per_night": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "property": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, and an image CDN link is the half no model can open. The booking link is kept." + }, + "total": { + "type": "number" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The cheapest stay across everything priced, or null when nothing was. `results` holds this stay's full property list." +} - added
Output schema / properties / partialAdded value: +{ + "description": "Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers.", + "type": "string" +} - added
Output schema / properties / providersAdded value: +{ + "description": "One entry per source that was called, in the order they were requested. Only present when `providers` named more than the default source.", + "items": { + "additionalProperties": true, + "description": "What one accommodation source answered. Present for every source that was CALLED, whether or not it answered: a source with search_status 'degraded' carries a reason, a null count and no prices, which is not the same answer as a source that found nothing.", + "properties": { + "cheapest_link": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "cheapest_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "cheapest_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "count": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "How many properties from this source carried a price. Null when the source did not answer -- zero would read as 'nothing there', which a failed search does not know." + }, + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The currency THIS row's totals are in. Rows in different currencies are not comparable and nothing is converted." + }, + "detail": { + "description": "Plain text for the model to relay to a human.", + "type": "string" + }, + "median_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "provider": { + "description": "Which source this row is about, e.g. 'booking'.", + "type": "string" + }, + "rating_scale": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "What a review score from this source is out of: 10 on Booking, 5 on Airbnb. Read it before comparing two scores." + }, + "retrieved_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "When these rows were read, taken from the rows themselves rather than from when this answer was assembled." + }, + "search_reason": { + "type": "string" + }, + "search_status": { + "description": "'ok': the source answered with priced results. 'empty': it answered and had nothing for that stay -- a real answer. 'degraded': it was asked and could not answer, so count is null and an empty list from it means nothing.", + "enum": [ + "ok", + "empty", + "degraded", + "skipped" + ], + "type": "string" + }, + "taxes_included": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Whether this source's totals include tax. Null means it has not been established for that source, not that tax is excluded." + }, + "top": { + "description": "The cheapest few priced rows from this source.", + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "provider", + "search_status" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / providers_skippedAdded value: +{ + "description": "Sources that were NOT called, each named with why and where to subscribe. A source here contributed nothing to results and is counted nowhere. It is listed rather than dropped because a silently missing source is indistinguishable from a source that had nothing.", + "items": { + "additionalProperties": true, + "properties": { + "detail": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "reason": { + "description": "'no_key': no RapidAPI key for that source's listing arrived with the call. 'not_subscribed': the key supplied is not subscribed to that listing. 'key_rejected': the key was refused outright.", + "type": "string" + }, + "subscribe_url": { + "type": "string" + } + }, + "required": [ + "provider", + "reason" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / results_for_stayAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Which stay `results` belongs to on a date-range search, or null when nothing was priced. Without it the rows read as 'the search's results' and get quoted against the wrong dates." +} - added
Output schema / properties / search_coverageAdded value: +{ + "additionalProperties": true, + "description": "What was actually priced on a date-range search. Present whether or not the request was truncated, so a model can state honestly what its answer rests on.", + "properties": { + "checkin_dates_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" + }, + "stays_searched": { + "description": "The exact date pairs priced.", + "items": { + "additionalProperties": true, + "properties": { + "checkin_date": { + "type": "string" + }, + "checkout_date": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "truncated": { + "description": "True when the request expanded past this call's spend ceiling and was sampled. A stay absent from stays_searched was never priced, which is not the same as having no rooms.", + "type": "boolean" + } + }, + "type": "object" +} - added
Output schema / properties / search_statusAdded value: +{ + "description": "Date-range searches only. 'ok': every stay searched was priced. 'empty': they all answered and none had priced availability -- a real answer. 'partial': some stays were priced and some errored. 'degraded': every stay errored, so nothing is known; safe to retry.", + "enum": [ + "ok", + "empty", + "partial", + "degraded" + ], + "type": "string" +} - added
Output schema / properties / staysAdded value: +{ + "description": "One entry per stay the REQUEST asked for, in request order, present whether or not that stay was priced. Only on a date-range search (checkin_date_from / checkin_date_to / nights); a single stay does not carry it.\n\nRead this rather than inferring coverage from `results`: `results` holds the full property list for the CHEAPEST stay only, so a stay missing from it looks identical to a stay that had nothing. `reason` says which kind of hole an unpriced stay is: 'no_availability' (searched, answered, nothing came back), 'no_price' (properties came back, none carried a price), 'search_failed' (the search errored, so nothing is known -- not 'no rooms') or 'not_searched' (the per-call fan-out cap sampled it away). Counts are null rather than zero on those last two, because zero reads as 'nothing there' and neither case knows that.", + "items": { + "additionalProperties": true, + "properties": { + "cheapest": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The cheapest priced property for this stay, or null when it has none. The same row the upstream returned, minus its image URL: on a measured search 73% of the payload was URLs, and an image CDN link is the half no model can open. The booking link is kept." + }, + "cheapest_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "checkin_date": { + "type": "string" + }, + "checkout_date": { + "type": "string" + }, + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "median_total": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Median stay total over this stay's priced properties -- what the date costs generally, next to what its one cheapest room costs." + }, + "nights": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "price_per_night": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "cheapest_total divided by nights, rounded." + }, + "priced_count": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "How many of those carried a price. The others are not evidence about what the stay costs." + }, + "property_count": { + "anyOf": [ + { + "minimum": 0, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "Properties returned for this stay. Null when it was not searched or its search errored." + }, + "reason": { + "enum": [ + "ok", + "no_availability", + "no_price", + "search_failed", + "not_searched" + ], + "type": "string" + }, + "search_status": { + "enum": [ + "ok", + "empty", + "degraded", + "not_searched" + ], + "type": "string" + } + }, + "required": [ + "checkin_date", + "checkout_date", + "search_status", + "reason" + ], + "type": "object" + }, + "type": "array" +}
2 tool updates
- Changed
find_hotel_by_name1 field changed- changed
Input schema / properties / price_as_seen_from / descriptionPrevious value: -"Two-letter country code, e.g. \"de\". Prices the stay as a shopper resident in that country would see it, which is what makes a rate-parity check on one property possible."New value: +"Two-letter country code, e.g. \"de\". Prices the stay as a shopper resident in that country would see it. Call each country a few times on this same property before reporting a gap, because rates move between calls and gaps are usually modest and property-dependent."
- Changed
search_hotels1 field changed- changed
Input schema / properties / price_as_seen_from / descriptionPrevious value: -"Two-letter country code, e.g. \"de\". Prices the stay through a residential connection in that country, so the result is what a shopper resident there would be quoted. This is what makes rate-parity and geo-pricing checks possible; omit it for a neutral price."New value: +"Two-letter country code, e.g. \"de\". Prices the stay through a residential connection in that country, so the result is what a shopper resident there would be quoted. For a rate-parity check hold one named property fixed and call each country a few times, because rates move between calls and one call per country can show a gap that is not there. Omit it for a neutral price."
2 tool updates
- Changed
find_hotel_by_name4 fields changed- added
Output schema / descriptionAdded value: +"A completed hotel search. The hotels upstream reports no search-status header, so these results carry no search_status field." - added
Output schema / propertiesAdded 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" + }, + "applied_filters": { + "description": "Which of the requested filters the upstream actually applied. Untyped: the shape is the upstream's, echoed through." + }, + "message": { + "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" + }, + "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" + }, + "signup_url": { + "description": "Where the caller subscribes or changes plan.", + "type": "string" + } +} - added
Output schema / requiredAdded value: +[ + "results" +] - added
Output schema / titleAdded value: +"Hotel search result"
- Changed
search_hotels4 fields changed- added
Output schema / descriptionAdded value: +"A completed hotel search. The hotels upstream reports no search-status header, so these results carry no search_status field." - added
Output schema / propertiesAdded 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" + }, + "applied_filters": { + "description": "Which of the requested filters the upstream actually applied. Untyped: the shape is the upstream's, echoed through." + }, + "message": { + "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" + }, + "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" + }, + "signup_url": { + "description": "Where the caller subscribes or changes plan.", + "type": "string" + } +} - added
Output schema / requiredAdded value: +[ + "results" +] - added
Output schema / titleAdded value: +"Hotel search result"
2 tool updates
- Changed
find_hotel_by_name7 fields changed- added
Input schema / properties / adults / descriptionAdded value: +"Number of adult guests." - added
Input schema / properties / checkin_date / descriptionAdded value: +"First night of the stay, \"YYYY-MM-DD\"." - added
Input schema / properties / checkout_date / descriptionAdded value: +"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date." - added
Input schema / properties / children / descriptionAdded value: +"Number of children sharing the room." - added
Input schema / properties / currency / descriptionAdded value: +"ISO currency code for the prices returned, e.g. \"usd\"." - added
Input schema / properties / hotel_name / descriptionAdded value: +"The property name a person would type, e.g. \"Hotel Artemide\". Adding the city (\"Hotel Artemide Rome\") disambiguates a chain with many properties. No internal property ID is needed." - added
Input schema / properties / price_as_seen_from / descriptionAdded value: +"Two-letter country code, e.g. \"de\". Prices the stay as a shopper resident in that country would see it, which is what makes a rate-parity check on one property possible."
- Changed
search_hotels9 fields changed- added
Input schema / properties / adults / descriptionAdded value: +"Number of adult guests. Defaults to the upstream default when omitted." - added
Input schema / properties / budget_per_night / descriptionAdded value: +"Only return properties at or below this nightly price, in `currency`." - added
Input schema / properties / checkin_date / descriptionAdded value: +"First night of the stay, \"YYYY-MM-DD\"." - added
Input schema / properties / checkout_date / descriptionAdded value: +"Departure morning, \"YYYY-MM-DD\". Must be after checkin_date." - added
Input schema / properties / children / descriptionAdded value: +"Number of children sharing the room." - added
Input schema / properties / currency / descriptionAdded value: +"ISO currency code for the prices returned, e.g. \"usd\"." - added
Input schema / properties / destination / descriptionAdded value: +"Where to stay, in free text the way a person would say it, e.g. \"Rome\" or \"Tokyo Shibuya\". A city, district, landmark or region all work; no internal location ID is needed." - added
Input schema / properties / filters / descriptionAdded value: +"Property filters to apply, e.g. [\"free_cancellation\", \"breakfast_included\"]. An unknown name is rejected with the list of valid ones rather than being ignored." - added
Input schema / properties / price_as_seen_from / descriptionAdded value: +"Two-letter country code, e.g. \"de\". Prices the stay through a residential connection in that country, so the result is what a shopper resident there would be quoted. This is what makes rate-parity and geo-pricing checks possible; omit it for a neutral price."
2 tool updates
- First observed
find_hotel_by_name - First observed
search_hotels
Related MCP Connectors
Real-time Google Flights fares for agents. Three things people do with this server. Scan for deals: one call takes a date range and a list of destination airports, expands every combination server side, and returns each fare with Google's own low, typical or high verdict. Put live search in your app: flat JSON with a bookable link on every result, and round trips priced as paired legs. Run a 24/7 AI travel agent: add the server, sign in with Google, and schedule it. No ads, no sponsored content. You bring your own RapidAPI key, so every search is billed to your plan and never to anyone else's. Add https://flights.flightpowers.com/mcp , click Sign in, sign in with Google, and paste your RapidAPI key once on the page that opens. Scripts and clients without a sign-in button send the key as x-rapidapi-key on the same URL.
Hotel booking MCP server. Search, book, and manage reservations across 250K+ properties worldwide.
Official MCP server for MAQAMI, a hotel and flight booking platform with 3M+ hotels. Search live hotel rates and flights, look up places, airports and hotel details, then prebook and book. Remote Streamable HTTP endpoint, no API key required.
Booking.com stays by destination and dates, and full property details, as structured JSON.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables MCP clients to search live hotel and vacation-rental listings with the rate each booking site (Booking.com, Expedia, Agoda, Vrbo, Airbnb and others) is charging, and to pull a three-month daily price calendar for a single property. All results come back as JSON using a user-supplied Apify token, with no Google account or local scraping required.31MIT
- AlicenseNot gradedqualityCmaintenanceA hosted remote MCP server that gives AI agents live hotel, Airbnb/Vrbo and flight pricing tools — nightly rate calendars up to 330 nights, every booking site's price for a stay compared against the hotel's own site, guest reviews, and Google Flights search. Clients connect over Streamable HTTP with browser OAuth or an API key, so nothing needs to be installed or run locally.MIT
- FlicenseNot gradedqualityDmaintenanceProvides two MCP servers: one for searching real-time flight prices via FlightAPI.io and another for hotel prices via Booking.com through RapidAPI, both accessible over Streamable HTTP.-
- AlicenseBqualityBmaintenanceOfficial MCP server for MAQAMI, a hotel and flight booking platform with 3M+ hotels. Search live hotel rates and flights, look up places, airports and hotel details, then prebook and book. Remote Streamable HTTP endpoint, no API key required.4197 npm2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.