Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Added "compare_hotel_rates" and "search_airbnb" (2 tools before, 4 now)
FlightPowers: compare hotel rates across sources — 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 w…
FlightPowers: search Airbnb stays — 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 tax…
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Certificate changed, valid to 2027-01-17
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Certificate changed, valid to 2027-01-17
Authorization not required, issuer https://hotels.flightpowers.com
Removed "compare_hotel_rates"; changed the definition of "find_hotel_by_name" and "search_hotels" (3 tools before, 2 now)
⟨35 unchanged words⟩ -- no internal property ID needed, theresolution isserverdoneresolvesfortheyou.name. Returns the property's price, review score, room type, latitude/longitude and a booking link.Use it toItcheckchecks one specific hotel, orto tracktracks a single property's price over time. A date range and a nights value price several stays in one call,like the flights tools: passcheckin_date_from, checkin_date_to and nights (a number, or a list like [2, 3, 7])
Certificate changed, valid to 2027-01-17
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Changed the definition of "find_hotel_by_name" and "search_hotels"
⟨48 unchanged words⟩ the property's price, review score, room type, latitude/longitude and a booking link. Use it to check ⟨267 unchanged words⟩
⟨889 unchanged words⟩ integer"},"results":{"description":"Theitineraries orproperties 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.","items":{"additionalProperties":true,"properties":{"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"type":"object"},"type":"array ⟨708 unchanged words⟩
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Servers that share this record's repository now have records of their own: "google-flights-search-real-time-fares". Checks before this date include them.
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization not required, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization not required, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Changed the definition of "search_oneway_flights" and "search_roundtrip_flights"
The earlier definition is no longer stored; only the fact of the change is.
The earlier definition is no longer stored; only the fact of the change is.
Changed the definition of "compare_hotel_rates", "find_hotel_by_name" and "search_hotels"
⟨93 unchanged words⟩ failed was still billed.","properties":{"hub_requests_billed":{"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"},"note":{"description":"The same figures as ⟨13 unchanged words⟩ :{"type":"integer"},"requests_used_by_this_call":{"description":"How many date/destination combinations were searched -- what the answer COVERS.","minimum":0,"type":"integer"}}, ⟨588 unchanged words⟩
⟨206 unchanged words⟩ Changed the definition of "search_oneway_flights" and "search_roundtrip_flights"
The earlier definition is no longer stored; only the fact of the change is.
The earlier definition is no longer stored; only the fact of the change is.
Authorization not required, issuer https://flights.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Changed the definition of "search_oneway_flights" and "search_roundtrip_flights"
The earlier definition is no longer stored; only the fact of the change is.
The earlier definition is no longer stored; only the fact of the change is.
Changed the definition of "compare_hotel_rates", "find_hotel_by_name" and "search_hotels"
⟨212 unchanged words⟩ it spent and what is left in `api_usage`. No key? Sign in with Google and the first 10 searches each day are free on this server -- ad-free, nothing to paste. Connect your own RapidAPI key at https://hotels.flightpowers.com/connect to remove the cap.
⟨287 unchanged words⟩ it spent and what is left in `api_usage`. No key? Sign in with Google and the first 10 searches each day are free on this server -- ad-free, nothing to paste. Connect your own RapidAPI key at https://hotels.flightpowers.com/connect to remove the cap.
Authorization not required, issuer https://hotels.flightpowers.com
Authorization not required, issuer https://flights.flightpowers.com
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Authorization not required, issuer https://hotels.flightpowers.com
Authorization required, Bearer, issuer https://flights.flightpowers.com
Authorization not required, issuer https://flights.flightpowers.com
Certificate recorded, valid to 2026-11-16
Authorization not required, issuer https://hotels.flightpowers.com
Certificate recorded, valid to 2026-11-16
Authorization required, Bearer, issuer https://hotels.flightpowers.com
Certificate recorded, valid to 2026-11-16
Authorization required, Bearer, issuer https://flights.flightpowers.com
Certificate recorded, valid to 2026-11-16
Authorization not required, issuer https://flights.flightpowers.com
First tool surface recorded: 3 tools (server version 1.0.0)
First tool surface recorded: 2 tools (server version 1.0.0)
Showing the latest 82 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨26 unchanged words⟩ night of the stay, \"YYYY-MM-DD\".Give this withWith checkout_datefor oneitstay,pricesoroneusestay; checkin_date_from plus checkin_date_toforgive a ratecalendar.calendar instead."},"checkin_date_from":{"anyOf":[{"type ⟨65 unchanged words⟩ , \"YYYY-MM-DD\". Must be after checkin_date.Give either this orMutuallynights,exclusivenotwithboth.`nights`."},"children":{"anyOf":[{"type ⟨73 unchanged words⟩ }],"default":null,"description":"Thebilled requestssearches 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 ⟨91 unchanged words⟩ shopper resident in that country would see it.CallRateseachmovecountrybetween calls and gaps are usually modest and property-dependent, so a gap holds only when it repeats over a fewtimescalls per country on this same property."},"verbose":{"default":false,"description":"Returns the propertybeforeexactlyreportingasathegapsource sent it,becauseimageratesURLmoveandbetweenthecallsfullandtrackinggapslinkareincluded.usuallyOffmodestby default: the row leaves out the image URL, the booking link keeps only its stay parameters, andproperty-dependent.price_per_night is added.","type":"boolean"}},"required":["hotel_name"],"type":"object"}
before
{"additionalProperties":true,"description":"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.","properties":{"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":{"hub_requests_billed":{"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"},"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":{"description":"How many date/destination combinations were searched -- what the answer COVERS.","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."},"caveats":{"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"},"cheapest_overall":{"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."},"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"},"partial":{"description":"Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers.","type":"string"},"providers":{"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"},"providers_skipped":{"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"},"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 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.","items":{"additionalProperties":true,"properties":{"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"type":"object"},"type":"array"},"results_for_stay":{"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."},"search_coverage":{"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"},"stopped_early":{"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"},"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"},"search_status":{"description":"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.","enum":["ok","empty","partial","degraded","trial_exhausted","quota_exceeded"],"type":"string"},"signup_url":{"description":"Where the caller subscribes or changes plan.","type":"string"},"stays":{"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"}},"required":["results"],"title":"Hotel search result","type":"object"}after
{"additionalProperties":true,"description":"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.","properties":{"api_usage":{"additionalProperties":true,"description":"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.","properties":{"free_searches_day_cap":{"minimum":0,"type":"integer"},"free_searches_remaining_today":{"minimum":0,"type":"integer"},"free_searches_used_today":{"minimum":0,"type":"integer"},"hub_requests_billed":{"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. With the caller's own key this is the figure their RapidAPI plan is charged. Absent on a free search.","minimum":0,"type":"integer"},"note":{"description":"The same figures as one plain sentence.","type":"string"},"plan_requests_limit":{"type":"integer"},"plan_requests_remaining":{"type":"integer"},"requests_used_by_this_call":{"description":"How many date/destination combinations were searched -- what the answer COVERS.","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."},"cheapest_overall":{"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, so image URLs are dropped to keep the payload small. 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."},"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 describe the fix.","type":"boolean"},"partial":{"description":"Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers.","type":"string"},"quota_exhausted":{"description":"True when the caller's RapidAPI plan has no requests left for the current period.","type":"boolean"},"result_count":{"minimum":0,"type":"integer"},"results":{"description":"The 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.","items":{"additionalProperties":true,"properties":{"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"price_per_night":{"anyOf":[{"type":"number"},{"type":"null"}]}},"type":"object"},"type":"array"},"results_for_stay":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"description":"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."},"results_note":{"description":"Present when `limit` left properties out: how many were found and how to see more.","type":"string"},"results_total":{"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"},"search_coverage":{"additionalProperties":true,"description":"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.","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"},"stopped_early":{"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 cover only part of the range.","type":"string"},"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"},"search_status":{"description":"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.","enum":["ok","empty","partial","degraded","trial_exhausted","quota_exceeded"],"type":"string"},"signup_url":{"description":"Where the caller subscribes or changes plan.","type":"string"},"stays":{"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\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.","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, so image URLs are dropped to keep the payload small. 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"}},"required":["results"],"title":"Hotel search result","type":"object"}⟨16 unchanged words⟩ a free-text destination the way a person wouldsaywrite it ("Rome", "Tokyo Shibuya"), ⟨11 unchanged words⟩ room type, location, latitude/longitude and a bookinglink. Setlink:price_as_seen_from10toproperties 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 codeto,priceprices the same stay the way a shopper resident in that country would seeit, which no other travel tool here can do.it. Gaps are real but usually modest and property-dependent, and rates move between calls, soholdonenamedcallpropertyperfixed,countrycalliseachnotcountryevidence of afewgap;times,aandparitynevercheckreadholds onecallnamedperpropertycountryfixedasand calls each country agap.few times. A date range and a nights value price several stays in one call, like the flights tools:passcheckin_date_from, checkin_date_to and nights (a number, or a list like [2, 3, 7])instead ofreplace a fixed checkin_date/checkout_date, and every check-in date ⟨29 unchanged words⟩ the cheapest stay only. Each stay is onerequest billed to your plan;search; max_searches caps it, and a request that ⟨7 unchanged words⟩ across the range and says so in search_coverage.Setproviders to priceWith thesame stay on morecaller'sthanownonekeysourcetheincaponerisescall:by["booking"]itself(thetodefault),cover["airbnb"],aormonth-sizedboth.range.BookingOnrowstheratefreeoutsign-inofallowance (10and Airbnb rows outsearchesofa5day,soonereadperrating_scalestay)onaeveryrangerowlargerbeforethancomparingwhattwoisofleftthem.todayAissourcerefusedyoubeforehaveanythingnoruns;RapidAPIakeyrangeforwithin what isnotleftcalledruns, andis named in providers_skippedawithwiderarangesubscribeneedslink,thenevercaller'squietlyowndropped.key. Rates go stale within minutes:never reuse an earlier result, search again. Requires 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 countscurrentagainstpricethecomescaller'sfromownaRapidAPInewplansearch, notours; every response reports what it spent and what is left in `api_usage`. No key? Sign in with Google and the first 10 searches each day are free on this server -- ad-free, nothing to paste. Connect your own RapidAPI key at https://hotels.flightpowers.com/connect tofromremoveantheearliercap.result.
⟨29 unchanged words⟩ }],"default":null,"description":"Onlyreturnproperties at or below this nightly price, in`currency`.`currency`, are returned."},"checkin_date":{"anyOf":[{"type ⟨7 unchanged words⟩ night of the stay, \"YYYY-MM-DD\".Give this withWith checkout_datefor oneitstay,pricesoroneusestay; checkin_date_from plus checkin_date_toforprice a range of check-indates.dates instead."},"checkin_date_from":{"anyOf":[{"type ⟨20 unchanged words⟩ prices one stay per check-in date in therange -- the hotel equivalent of the flights daterange."},"checkin_date_to":{"anyOf":[{" ⟨27 unchanged words⟩ , \"YYYY-MM-DD\". Must be after checkin_date.Give either this orMutuallynights,
before
{"additionalProperties":true,"description":"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.","properties":{"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":{"hub_requests_billed":{"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"},"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":{"description":"How many date/destination combinations were searched -- what the answer COVERS.","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."},"caveats":{"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"},"cheapest_overall":{"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."},"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"},"partial":{"description":"Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers.","type":"string"},"providers":{"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"},"providers_skipped":{"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"},"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 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.","items":{"additionalProperties":true,"properties":{"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"type":"object"},"type":"array"},"results_for_stay":{"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."},"search_coverage":{"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"},"stopped_early":{"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"},"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"},"search_status":{"description":"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.","enum":["ok","empty","partial","degraded","trial_exhausted","quota_exceeded"],"type":"string"},"signup_url":{"description":"Where the caller subscribes or changes plan.","type":"string"},"stays":{"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"}},"required":["results"],"title":"Hotel search result","type":"object"}FlightPowers: compare hotel rates across sources — FlightPowers cross-source comparison: prices one stay on every source you have a key for. Input: a free-text destination the way a person would say 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. Read the caveats on every row before you say 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 es…
⟨36 unchanged words⟩ property's price, review score, room type, location, latitude/longitude and a booking link. Set price_as_seen_from to a ⟨348 unchanged words⟩
⟨889 unchanged words⟩ integer"},"results":{"description":"Theitineraries orproperties 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.","items":{"additionalProperties":true,"properties":{"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]}},"type":"object"},"type":"array ⟨708 unchanged words⟩
before
{"additionalProperties":true,"description":"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.","properties":{"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."},"caveats":{"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"},"cheapest_overall":{"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."},"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"},"partial":{"description":"Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers.","type":"string"},"providers":{"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"},"providers_skipped":{"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"},"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"},"results_for_stay":{"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."},"search_coverage":{"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"},"search_status":{"description":"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.","enum":["ok","empty","partial","degraded","trial_exhausted"],"type":"string"},"signup_url":{"description":"Where the caller subscribes or changes plan.","type":"string"},"stays":{"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"}},"required":["results"],"title":"Hotel search result","type":"object"}after
{"additionalProperties":true,"description":"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.","properties":{"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":{"hub_requests_billed":{"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"},"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":{"description":"How many date/destination combinations were searched -- what the answer COVERS.","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."},"caveats":{"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"},"cheapest_overall":{"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."},"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"},"partial":{"description":"Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers.","type":"string"},"providers":{"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"},"providers_skipped":{"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"},"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"},"results_for_stay":{"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."},"search_coverage":{"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"},"stopped_early":{"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"},"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"},"search_status":{"description":"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.","enum":["ok","empty","partial","degraded","trial_exhausted","quota_exceeded"],"type":"string"},"signup_url":{"description":"Where the caller subscribes or changes plan.","type":"string"},"stays":{"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"}},"required":["results"],"title":"Hotel search result","type":"object"}⟨278 unchanged words⟩ null"}],"default":null,"description":"Cap theThe billed requests this call maymake.make, up or down. One stay is one request, so a 30-day range at two lengths is60;60lowerandthisa month at three is 93 -- the cap rises to cover a request that size by itself. Set it lower to spend less,andor higher (hard maximum 200) for a wider grid; either way the range is sampled evenly across the calendar ⟨233 unchanged words⟩
before
{"additionalProperties":true,"description":"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.","properties":{"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."},"caveats":{"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"},"cheapest_overall":{"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."},"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"},"partial":{"description":"Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers.","type":"string"},"providers":{"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"},"providers_skipped":{"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"},"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"},"results_for_stay":{"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."},"search_coverage":{"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"},"search_status":{"description":"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.","enum":["ok","empty","partial","degraded","trial_exhausted"],"type":"string"},"signup_url":{"description":"Where the caller subscribes or changes plan.","type":"string"},"stays":{"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"}},"required":["results"],"title":"Hotel search result","type":"object"}after
{"additionalProperties":true,"description":"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.","properties":{"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":{"hub_requests_billed":{"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"},"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":{"description":"How many date/destination combinations were searched -- what the answer COVERS.","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."},"caveats":{"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"},"cheapest_overall":{"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."},"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"},"partial":{"description":"Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers.","type":"string"},"providers":{"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"},"providers_skipped":{"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"},"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"},"results_for_stay":{"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."},"search_coverage":{"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"},"stopped_early":{"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"},"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"},"search_status":{"description":"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.","enum":["ok","empty","partial","degraded","trial_exhausted","quota_exceeded"],"type":"string"},"signup_url":{"description":"Where the caller subscribes or changes plan.","type":"string"},"stays":{"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"}},"required":["results"],"title":"Hotel search result","type":"object"}⟨1018 unchanged words⟩ },"search_status":{"description":"Date-range searchesonly.only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': ⟨23 unchanged words⟩ 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.","enum":["ok","empty","partial","degraded","trial_exhausted"],"type":"string"},"signup_url": ⟨360 unchanged words⟩
⟨356 unchanged words⟩ it spent and what is left in `api_usage`. No key? Sign in with Google and the first 10 searches each day are free on this server -- ad-free, nothing to paste. Connect your own RapidAPI key at https://hotels.flightpowers.com/connect to remove the cap.
⟨1018 unchanged words⟩ },"search_status":{"description":"Date-range searchesonly.only, except 'trial_exhausted'. 'ok': every stay searched was priced. 'empty': ⟨23 unchanged words⟩ 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.","enum":["ok","empty","partial","degraded","trial_exhausted"],"type":"string"},"signup_url": ⟨360 unchanged words⟩
after
{"additionalProperties":true,"description":"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.","properties":{"api_usage":{"additionalProperties":true,"description":"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.","properties":{"free_searches_day_cap":{"minimum":0,"type":"integer"},"free_searches_remaining_today":{"minimum":0,"type":"integer"},"free_searches_used_today":{"minimum":0,"type":"integer"},"hub_requests_billed":{"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. With the caller's own key this is the figure their RapidAPI plan is charged. Absent on a free search.","minimum":0,"type":"integer"},"note":{"description":"The same figures as one plain sentence.","type":"string"},"plan_requests_limit":{"type":"integer"},"plan_requests_remaining":{"type":"integer"},"requests_used_by_this_call":{"description":"How many date/destination combinations were searched -- what the answer COVERS.","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."},"cheapest_overall":{"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, so image URLs are dropped to keep the payload small. 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."},"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 describe the fix.","type":"boolean"},"partial":{"description":"Present when some stays failed but others were priced. Plain text saying how much of the request the answer covers.","type":"string"},"quota_exhausted":{"description":"True when the caller's RapidAPI plan has no requests left for the current period.","type":"boolean"},"result_count":{"minimum":0,"type":"integer"},"results":{"description":"The 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.","items":{"additionalProperties":true,"properties":{"latitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"longitude":{"anyOf":[{"type":"number"},{"type":"null"}]},"price_per_night":{"anyOf":[{"type":"number"},{"type":"null"}]}},"type":"object"},"type":"array"},"results_for_stay":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"description":"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."},"results_note":{"description":"Present when `limit` left properties out: how many were found and how to see more.","type":"string"},"results_total":{"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"},"search_coverage":{"additionalProperties":true,"description":"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.","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"},"stopped_early":{"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 cover only part of the range.","type":"string"},"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"},"search_status":{"description":"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.","enum":["ok","empty","partial","degraded","trial_exhausted","quota_exceeded"],"type":"string"},"signup_url":{"description":"Where the caller subscribes or changes plan.","type":"string"},"stays":{"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\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.","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, so image URLs are dropped to keep the payload small. 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"}},"required":["results"],"title":"Hotel search result","type":"object"}