[{"slug":"ZV-2026-0963","server_name":"hotels.flightpowers.com","severity":"breaking","title":"hotels.flightpowers.com: Type of checkin_date on find_hotel_by_name changed string → unset.","summary":"[safe] Tool compare_hotel_rates was added. [safe] Description of find_hotel_by_name changed (23% word delta). [risky] Optional field checkin_date_from was added to find_hotel_by_name; may shift model behaviour. [risky] Optional field checkin_date_to was added to find_hotel_by_name; may shift model behaviour. [risky] Optional field max_searches was added to find_hotel_by_name; may shift model behaviour. [risky] Optional field nights was added to find_hotel_by_name; may shift model behaviour. [safe] Field checkin_date on find_hotel_by_name is no longer required. [safe] Field checkout_date on find_hotel_by_name is no longer required. [breaking] Type of checkin_date on find_hotel_by_name changed string → unset. [risky] Default of checkin_date on find_hotel_by_name changed unset → null. [breaking] Type of checkout_date on find_hotel_by_name changed string → unset. [risky] Default of checkout_date on find_hotel_by_name changed unset → null. [risky] Field caveats was added to find_hotel_by_name output. [risky] Field cheapest_overall was added to find_hotel_by_name output. [risky] Field partial was added to find_hotel_by_name output. [risky] Field providers was added to find_hotel_by_name output. [risky] Field providers_skipped was added to find_hotel_by_name output. [risky] Field results_for_stay was added to find_hotel_by_name output. [risky] Field search_coverage was added to find_hotel_by_name output. [risky] Field search_status was added to find_hotel_by_name output. [risky] Field stays was added to find_hotel_by_name output. [risky] Description of search_hotels changed (31% word delta). [risky] Optional field checkin_date_from was added to search_hotels; may shift model behaviour. [risky] Optional field checkin_date_to was added to search_hotels; may shift model behaviour. [risky] Optional field max_searches was added to search_hotels; may shift model behaviour. [risky] Optional field nights was added to search_hotels; may shift model behaviour. [risky] Optional field","changes":[{"kind":"tool_added","tool":"compare_hotel_rates","detail":"Tool `compare_hotel_rates` was added.","severity":"safe"},{"kind":"description_changed","tool":"find_hotel_by_name","after":"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 resolution is done for you. Returns the property's price, review score, room type and a booking link. Use it to check one specific hotel, or to track a single property's price over time.\n\nA date range and a nights value price several stays in one call, like the flights tools: pass checkin_date_from, checkin_date_to and nights (a number, or a list like [2, 3, 7]) instead of 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 request billed to your plan; max_searches caps it, and a range that expands past the cap is sampled evenly across the calendar and says so in search_coverage.\n\nprice_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 call each country a few times on this same property before reporting a gap.\n\nRates go stale within minutes: never reuse an earlier result.\n\nRequires the caller's own RapidAPI key for the Booking Live API. Get one (free tier available) at https://rapidapi.com/mtnrabi/api/booking-live-api, then pass it as an `x-rapidapi-key` header (preferred), a `?rapidapi_key=` query parameter on the server URL, or your client's own API key field -- first non-empty wins. Usage counts against the caller's own RapidAPI plan, not ours; every response reports what it spent and what is left in `api_usage`.","before":"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 resolution is done for you. Returns the property's price, review score, room type and a booking link. Use it to check one specific hotel, or to track a single property's price over time.\n\nprice_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 call each country a few times on this same property before reporting a gap.\n\nRates go stale within minutes: never reuse an earlier result.\n\nRequires the caller's own RapidAPI key for the Booking Live API. Get one (free tier available) at https://rapidapi.com/mtnrabi/api/booking-live-api, then pass it as an `x-rapidapi-key` header (preferred), a `?rapidapi_key=` query parameter on the server URL, or your client's own API key field -- first non-empty wins. Usage counts against the caller's own RapidAPI plan, not ours; every response reports what it spent and what is left in `api_usage`.","detail":"Description of `find_hotel_by_name` changed (23% word delta).","severity":"safe","descriptionDelta":0.23076923076923073},{"kind":"input_property_added","path":"inputSchema.properties.checkin_date_from","tool":"find_hotel_by_name","after":{"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."},"detail":"Optional field `checkin_date_from` was added to `find_hotel_by_name`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.checkin_date_to","tool":"find_hotel_by_name","after":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Last check-in date of the range, \"YYYY-MM-DD\"."},"detail":"Optional field `checkin_date_to` was added to `find_hotel_by_name`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.max_searches","tool":"find_hotel_by_name","after":{"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."},"detail":"Optional field `max_searches` was added to `find_hotel_by_name`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.nights","tool":"find_hotel_by_name","after":{"anyOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}},{"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."},"detail":"Optional field `nights` was added to `find_hotel_by_name`; may shift model behaviour.","severity":"risky"},{"kind":"input_required_removed","path":"inputSchema.required.checkin_date","tool":"find_hotel_by_name","detail":"Field `checkin_date` on `find_hotel_by_name` is no longer required.","severity":"safe"},{"kind":"input_required_removed","path":"inputSchema.required.checkout_date","tool":"find_hotel_by_name","detail":"Field `checkout_date` on `find_hotel_by_name` is no longer required.","severity":"safe"},{"kind":"input_type_changed","path":"inputSchema.properties.checkin_date","tool":"find_hotel_by_name","after":"unset","before":"string","detail":"Type of `checkin_date` on `find_hotel_by_name` changed string → unset.","severity":"breaking"},{"kind":"default_changed","path":"inputSchema.properties.checkin_date","tool":"find_hotel_by_name","after":null,"detail":"Default of `checkin_date` on `find_hotel_by_name` changed unset → null.","severity":"risky"},{"kind":"input_type_changed","path":"inputSchema.properties.checkout_date","tool":"find_hotel_by_name","after":"unset","before":"string","detail":"Type of `checkout_date` on `find_hotel_by_name` changed string → unset.","severity":"breaking"},{"kind":"default_changed","path":"inputSchema.properties.checkout_date","tool":"find_hotel_by_name","after":null,"detail":"Default of `checkout_date` on `find_hotel_by_name` changed unset → null.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.caveats","tool":"find_hotel_by_name","after":{"type":"array","items":{"type":"string"},"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."},"detail":"Field `caveats` was added to `find_hotel_by_name` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.cheapest_overall","tool":"find_hotel_by_name","after":{"anyOf":[{"type":"object","properties":{"total":{"type":"number"},"nights":{"anyOf":[{"type":"integer"},{"type":"null"}]},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"property":{"anyOf":[{"type":"object","additionalProperties":true},{"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."},"checkin_date":{"type":"string"},"checkout_date":{"type":"string"},"price_per_night":{"anyOf":[{"type":"number"},{"type":"null"}]}},"additionalProperties":true},{"type":"null"}],"description":"The cheapest stay across everything priced, or null when nothing was. `results` holds this stay's full property list."},"detail":"Field `cheapest_overall` was added to `find_hotel_by_name` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.partial","tool":"find_hotel_by_name","after":{"type":"string","description":"Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers."},"detail":"Field `partial` was added to `find_hotel_by_name` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.providers","tool":"find_hotel_by_name","after":{"type":"array","items":{"type":"object","required":["provider","search_status"],"properties":{"top":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"The cheapest few priced rows from this source."},"count":{"anyOf":[{"type":"integer","minimum":0},{"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."},"detail":{"type":"string","description":"Plain text for the model to relay to a human."},"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."},"provider":{"type":"string","description":"Which source this row is about, e.g. 'booking'."},"median_total":{"anyOf":[{"type":"number"},{"type":"null"}]},"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."},"cheapest_link":{"anyOf":[{"type":"string"},{"type":"null"}]},"cheapest_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"search_reason":{"type":"string"},"search_status":{"enum":["ok","empty","degraded","skipped"],"type":"string","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."},"cheapest_total":{"anyOf":[{"type":"number"},{"type":"null"}]},"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."}},"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.","additionalProperties":true},"description":"One entry per source that was called, in the order they were requested. Only present when `providers` named more than the default source."},"detail":"Field `providers` was added to `find_hotel_by_name` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.providers_skipped","tool":"find_hotel_by_name","after":{"type":"array","items":{"type":"object","required":["provider","reason"],"properties":{"detail":{"type":"string"},"reason":{"type":"string","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."},"provider":{"type":"string"},"subscribe_url":{"type":"string"}},"additionalProperties":true},"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."},"detail":"Field `providers_skipped` was added to `find_hotel_by_name` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.results_for_stay","tool":"find_hotel_by_name","after":{"anyOf":[{"type":"object","additionalProperties":true},{"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."},"detail":"Field `results_for_stay` was added to `find_hotel_by_name` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.search_coverage","tool":"find_hotel_by_name","after":{"type":"object","properties":{"note":{"type":"string"},"truncated":{"type":"boolean","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."},"stays_searched":{"type":"array","items":{"type":"object","properties":{"checkin_date":{"type":"string"},"checkout_date":{"type":"string"}},"additionalProperties":true},"description":"The exact date pairs priced."},"searched_combinations":{"type":"integer","minimum":0},"checkin_dates_searched":{"type":"array","items":{"type":"string"}},"requested_combinations":{"type":"integer","minimum":0},"max_searches_per_request":{"type":"integer","minimum":1}},"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.","additionalProperties":true},"detail":"Field `search_coverage` was added to `find_hotel_by_name` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.search_status","tool":"find_hotel_by_name","after":{"enum":["ok","empty","partial","degraded"],"type":"string","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."},"detail":"Field `search_status` was added to `find_hotel_by_name` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.stays","tool":"find_hotel_by_name","after":{"type":"array","items":{"type":"object","required":["checkin_date","checkout_date","search_status","reason"],"properties":{"nights":{"anyOf":[{"type":"integer"},{"type":"null"}]},"reason":{"enum":["ok","no_availability","no_price","search_failed","not_searched"],"type":"string"},"cheapest":{"anyOf":[{"type":"object","additionalProperties":true},{"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."},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"checkin_date":{"type":"string"},"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."},"priced_count":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"How many of those carried a price. The others are not evidence about what the stay costs."},"checkout_date":{"type":"string"},"search_status":{"enum":["ok","empty","degraded","not_searched"],"type":"string"},"cheapest_total":{"anyOf":[{"type":"number"},{"type":"null"}]},"property_count":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Properties returned for this stay. Null when it was not searched or its search errored."},"price_per_night":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"cheapest_total divided by nights, rounded."}},"additionalProperties":true},"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."},"detail":"Field `stays` was added to `find_hotel_by_name` output.","severity":"risky"},{"kind":"description_changed","tool":"search_hotels","after":"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 say it (\"Rome\", \"Tokyo Shibuya\"), plus check-in and check-out dates. Returns each property's price, review score, room type, location and a booking link.\n\nSet price_as_seen_from to a two-letter country code to price the same stay the way a shopper resident in that country would see it, which no other travel tool here can do. Gaps are real but usually modest and property-dependent, and rates move between calls, so hold one named property fixed, call each country a few times, and never read one call per country as a gap.\n\nA date range and a nights value price several stays in one call, like the flights tools: pass checkin_date_from, checkin_date_to and nights (a number, or a list like [2, 3, 7]) instead of 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 request billed to your plan; max_searches caps it, and a request that expands past the cap is sampled evenly across the range and says so in search_coverage.\n\nSet providers to price the same stay on more than one source in one call: [\"booking\"] (the default), [\"airbnb\"], or both. Booking rows rate out of 10 and Airbnb rows out of 5, so read rating_scale on every row before comparing two of them. A source you have no RapidAPI key for is not called and is named in providers_skipped with a subscribe link, never quietly dropped.\n\nRates go stale within minutes: never reuse an earlier result, search again.\n\nRequires the caller's own RapidAPI key for the Booking Live API. Get one (free tier available) at https://rapidapi.com/mtnrabi/api/booking-live-api, then pass it as an `x-rapidapi-key` header (preferred), a `?rapidapi_key=` query parameter on the server URL, or your client's own API key field -- first non-empty wins. Usage counts against the caller's own RapidAPI plan, not ours; every response reports what it spent and what is left in `api_usage`.","before":"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 say it (\"Rome\", \"Tokyo Shibuya\"), plus check-in and check-out dates. Returns each property's price, review score, room type, location and a booking link.\n\nSet price_as_seen_from to a two-letter country code to price the same stay the way a shopper resident in that country would see it, which no other travel tool here can do. Gaps are real but usually modest and property-dependent, and rates move between calls, so hold one named property fixed, call each country a few times, and never read one call per country as a gap.\n\nRates go stale within minutes: never reuse an earlier result, search again.\n\nRequires the caller's own RapidAPI key for the Booking Live API. Get one (free tier available) at https://rapidapi.com/mtnrabi/api/booking-live-api, then pass it as an `x-rapidapi-key` header (preferred), a `?rapidapi_key=` query parameter on the server URL, or your client's own API key field -- first non-empty wins. Usage counts against the caller's own RapidAPI plan, not ours; every response reports what it spent and what is left in `api_usage`.","detail":"Description of `search_hotels` changed (31% word delta).","severity":"risky","descriptionDelta":0.31400966183574874},{"kind":"input_property_added","path":"inputSchema.properties.checkin_date_from","tool":"search_hotels","after":{"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."},"detail":"Optional field `checkin_date_from` was added to `search_hotels`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.checkin_date_to","tool":"search_hotels","after":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Last check-in date of the range, \"YYYY-MM-DD\"."},"detail":"Optional field `checkin_date_to` was added to `search_hotels`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.max_searches","tool":"search_hotels","after":{"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."},"detail":"Optional field `max_searches` was added to `search_hotels`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.nights","tool":"search_hotels","after":{"anyOf":[{"type":"integer"},{"type":"array","items":{"type":"integer"}},{"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."},"detail":"Optional field `nights` was added to `search_hotels`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.providers","tool":"search_hotels","after":{"anyOf":[{"type":"array","items":{"type":"string"}},{"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."},"detail":"Optional field `providers` was added to `search_hotels`; may shift model behaviour.","severity":"risky"},{"kind":"input_required_removed","path":"inputSchema.required.checkin_date","tool":"search_hotels","detail":"Field `checkin_date` on `search_hotels` is no longer required.","severity":"safe"},{"kind":"input_required_removed","path":"inputSchema.required.checkout_date","tool":"search_hotels","detail":"Field `checkout_date` on `search_hotels` is no longer required.","severity":"safe"},{"kind":"input_type_changed","path":"inputSchema.properties.checkin_date","tool":"search_hotels","after":"unset","before":"string","detail":"Type of `checkin_date` on `search_hotels` changed string → unset.","severity":"breaking"},{"kind":"default_changed","path":"inputSchema.properties.checkin_date","tool":"search_hotels","after":null,"detail":"Default of `checkin_date` on `search_hotels` changed unset → null.","severity":"risky"},{"kind":"input_type_changed","path":"inputSchema.properties.checkout_date","tool":"search_hotels","after":"unset","before":"string","detail":"Type of `checkout_date` on `search_hotels` changed string → unset.","severity":"breaking"},{"kind":"default_changed","path":"inputSchema.properties.checkout_date","tool":"search_hotels","after":null,"detail":"Default of `checkout_date` on `search_hotels` changed unset → null.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.caveats","tool":"search_hotels","after":{"type":"array","items":{"type":"string"},"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."},"detail":"Field `caveats` was added to `search_hotels` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.cheapest_overall","tool":"search_hotels","after":{"anyOf":[{"type":"object","properties":{"total":{"type":"number"},"nights":{"anyOf":[{"type":"integer"},{"type":"null"}]},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"property":{"anyOf":[{"type":"object","additionalProperties":true},{"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."},"checkin_date":{"type":"string"},"checkout_date":{"type":"string"},"price_per_night":{"anyOf":[{"type":"number"},{"type":"null"}]}},"additionalProperties":true},{"type":"null"}],"description":"The cheapest stay across everything priced, or null when nothing was. `results` holds this stay's full property list."},"detail":"Field `cheapest_overall` was added to `search_hotels` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.partial","tool":"search_hotels","after":{"type":"string","description":"Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers."},"detail":"Field `partial` was added to `search_hotels` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.providers","tool":"search_hotels","after":{"type":"array","items":{"type":"object","required":["provider","search_status"],"properties":{"top":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"The cheapest few priced rows from this source."},"count":{"anyOf":[{"type":"integer","minimum":0},{"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."},"detail":{"type":"string","description":"Plain text for the model to relay to a human."},"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."},"provider":{"type":"string","description":"Which source this row is about, e.g. 'booking'."},"median_total":{"anyOf":[{"type":"number"},{"type":"null"}]},"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."},"cheapest_link":{"anyOf":[{"type":"string"},{"type":"null"}]},"cheapest_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"search_reason":{"type":"string"},"search_status":{"enum":["ok","empty","degraded","skipped"],"type":"string","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."},"cheapest_total":{"anyOf":[{"type":"number"},{"type":"null"}]},"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."}},"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.","additionalProperties":true},"description":"One entry per source that was called, in the order they were requested. Only present when `providers` named more than the default source."},"detail":"Field `providers` was added to `search_hotels` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.providers_skipped","tool":"search_hotels","after":{"type":"array","items":{"type":"object","required":["provider","reason"],"properties":{"detail":{"type":"string"},"reason":{"type":"string","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."},"provider":{"type":"string"},"subscribe_url":{"type":"string"}},"additionalProperties":true},"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."},"detail":"Field `providers_skipped` was added to `search_hotels` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.results_for_stay","tool":"search_hotels","after":{"anyOf":[{"type":"object","additionalProperties":true},{"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."},"detail":"Field `results_for_stay` was added to `search_hotels` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.search_coverage","tool":"search_hotels","after":{"type":"object","properties":{"note":{"type":"string"},"truncated":{"type":"boolean","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."},"stays_searched":{"type":"array","items":{"type":"object","properties":{"checkin_date":{"type":"string"},"checkout_date":{"type":"string"}},"additionalProperties":true},"description":"The exact date pairs priced."},"searched_combinations":{"type":"integer","minimum":0},"checkin_dates_searched":{"type":"array","items":{"type":"string"}},"requested_combinations":{"type":"integer","minimum":0},"max_searches_per_request":{"type":"integer","minimum":1}},"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.","additionalProperties":true},"detail":"Field `search_coverage` was added to `search_hotels` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.search_status","tool":"search_hotels","after":{"enum":["ok","empty","partial","degraded"],"type":"string","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."},"detail":"Field `search_status` was added to `search_hotels` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.stays","tool":"search_hotels","after":{"type":"array","items":{"type":"object","required":["checkin_date","checkout_date","search_status","reason"],"properties":{"nights":{"anyOf":[{"type":"integer"},{"type":"null"}]},"reason":{"enum":["ok","no_availability","no_price","search_failed","not_searched"],"type":"string"},"cheapest":{"anyOf":[{"type":"object","additionalProperties":true},{"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."},"currency":{"anyOf":[{"type":"string"},{"type":"null"}]},"checkin_date":{"type":"string"},"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."},"priced_count":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"How many of those carried a price. The others are not evidence about what the stay costs."},"checkout_date":{"type":"string"},"search_status":{"enum":["ok","empty","degraded","not_searched"],"type":"string"},"cheapest_total":{"anyOf":[{"type":"number"},{"type":"null"}]},"property_count":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Properties returned for this stay. Null when it was not searched or its search errored."},"price_per_night":{"anyOf":[{"type":"number"},{"type":"null"}],"description":"cheapest_total divided by nights, rounded."}},"additionalProperties":true},"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."},"detail":"Field `stays` was added to `search_hotels` output.","severity":"risky"}],"published_at":"2026-09-11T08:07:13.052Z"}]