Search accommodation — compare offers across operators
search_staysMulti-operator accommodation comparator for a geographic area and a stay:
dates (required), guests and optional filters. Returns a ranked list of
properties — hotels, B&Bs, apartments, villas, hostels and more — with the
booking sites that offer each one and their live availability and
per-operator price for the requested dates. Questions about one property
found here (guest opinions, facilities, a live re-quote) are served by
get_property_details and check_property_availability with that
result's id.
Dates: natural-language references ("this weekend", "the weekend of July 4", "long weekend in May") translate to concrete check_in / check_out values at the call site; ISO dates also work.
Locale: user_country, currency and language carry the user's
locale, not the destination's. Prices come back in currency if set,
otherwise in the currency of user_country (US→USD, CA→CAD, GB→GBP,
euro-area→EUR), otherwise USD. Each offer is quoted by its operator in
that currency; nothing is converted. user_country and language also
localize the booking link.
Each result carries:
location.lat/location.lon, suitable for plotting the results on a map.thumbnail_url(first photo, or null) andimages, capped to one photo;get_property_detailsreturns the full gallery.web_url, a link to the property page with the stay already encoded.priceandoffers[]: the live quote for the requested dates, present only when availability was confirmed. Each offer hasota,amount(total stay),amount_per_night,currency,breakfast_included,refundable,rooms_leftanddeeplink_url— a Blue Pillow tracked link that records the click and forwards to the operator's booking page; it is what attributes the booking to Blue Pillow, which a raw operator URL does not.pricemirrorsoffers[0], Blue Pillow's best value for money (price weighed against breakfast, free cancellation and operator reliability, with a small commercial component), not necessarily the cheapest;sort=price_ascorders by price alone. There is no date-agnostic "from" price.availability_status:available(live quotes inoffers),unavailable(no rooms for those dates) orunknown(the operators returned nothing conclusive — not evidence that the property is full). The defaultavailability_mode=strictreturns onlyavailableresults;include_unavailablealso returns the other two.
Reading the numbers: amount_per_night is per night and amount is the
total stay, so a quote reads clearly with its unit ("€X/night via
Booking, €Y total"). rooms_left signals scarcity; refundable and
breakfast_included often separate otherwise similar options.
Ratings are on a 0-5 scale (rating, reviews_aggregate.score_0_5,
review scores and filters.min_rating; "8 out of 10" is 4.0). Upstream
scores arrive rounded, so rating is coarse and reads best together with
rating_count. rating, stars and rating_count may be 0 or absent
in this list even when the property has them; get_property_details
returns the fuller reviews_aggregate. Here reviews_aggregate carries
score_0_5, rating_count (reviews behind the score) and
comment_count (review texts available) — two different magnitudes.
include=["reviews_sample"] adds up to 5 recent review texts per
property, useful for qualitative criteria ("great breakfast", "quiet
area"); a deeper read on one property is get_property_details with
reviews_extended.
Filters: filters.min_rating and filters.price_max_eur narrow the
results; filters.property_types and filters.amenities rank rather
than filter, so each result's property_type and amenities show what
it actually is. Property type tokens: hotel, apartment, house, villa,
bb, hostel, farmstay, holiday-home (common Italian and English synonyms
are accepted). Common amenity codes: wi-fi, parking, pool,
air-conditioning, kitchen, garden, pets-allowed, for-families,
facilities-for-disabled, non-smoking-only.
Location modes:
coordinates: a known lat/lon (default radius 5 km, up to 50 km; beyond thatbboxor a parent destination fits better).destination_id: the opaque id fromresolve_destination, passed verbatim.poi_id: the opaque id of a point of interest, fromresolve_destinationordiscover_destinations_near.bbox: an explicit map rectangle. A property is not a location:get_property_detailscovers a known property.
Pagination: the next_cursor of a response goes into page.cursor for
the next page.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Pagination. `limit` caps results per page (1-100). To fetch the next page pass `cursor` with the `next_cursor` value from the previous response — cursors are opaque and are never constructed by hand. | |
| sort | No | Result ordering. score_desc (default) is the balanced relevance ranking and suits most requests; price_asc when the user asked for the cheapest; rating_desc when they asked for the best-reviewed; conversion_desc favours what comparable travellers actually booked. | |
| dates | Yes | Check-in and check-out dates (ISO 8601, YYYY-MM-DD). Natural-language references — 'tonight', 'this weekend', 'the weekend of July 4', 'Memorial Day weekend', 'long weekend in May' — translate to concrete check_in / check_out values at the call site. The comparator only serves future stays: check_in is a date in the real-time calendar that is today or later. A reference like 'the weekend of June 2' resolves to the next occurrence after today, never a past anniversary; if the current year is unclear, confirm with the user before calling. Clock calibration: this schema was published in August 2026, so today is August 2026 OR LATER (likely later — schemas outlive their publish date). An assumed 'today' in 2024/2025 is a stale training-time clock; years before 2026 are always in the past. Past check_in values are rejected at the API boundary with a hint carrying the actual current date. | |
| guests | Yes | Party composition. `adults` is required; give `children_ages` (one age per child, 0-17) rather than a child count — operators price by age. `rooms` defaults to 1; raise it when the party needs separate rooms rather than one shared. | |
| api_key | No | Anonymous key for this server (format 'pk_anon_…'), as returned by `get_anonymous_key`. Required by this tool; the same key works for every call. | |
| filters | No | Structured narrowing applied server-side, before ranking. Prefer these over filtering the results yourself: they run across the whole inventory, not just the page you received. Qualitative criteria that do not map here ("quiet", "great breakfast") are better served by include=['reviews_sample']. | |
| include | No | Optional enrichments, always a list — pass ["reviews_sample"], never the bare string. 'reviews_sample' attaches the 5 most recent individual reviews per property — use for qualitative queries (breakfast, service, ...). One extra Mongo round-trip per page; omit by default. | |
| currency | No | Currency of the returned prices (ISO-4217, 3-letter uppercase, e.g. 'USD', 'EUR', 'GBP', 'CAD'). SET THIS (or `user_country`) to price in the user's currency — if you set NEITHER, prices default to USD, which may not be the user's. Prices come straight from the booking sources in this currency; never convert them yourself. Each offer reflects the currency its operator actually quoted. | |
| language | No | User's UI language (2-letter lowercase). Drives the booking link language and any server-rendered narrative content. Pass the language the user is currently speaking. Falls back to 'en' when omitted. | |
| location | Yes | Where to search, as a {type, value} pair. Use destination_id for a place resolved via resolve_destination, poi_id for a point of interest, coordinates for a known lat/lon, or bbox for an explicit map rectangle. A property is NOT a location — use get_property_details for a known property. | |
| user_country | No | User's country (ISO-3166 alpha-2 uppercase). Drives the booking-link locale (the landing page rendered when the user clicks `web_url`) AND, when `currency` is not set, the pricing currency (US->USD, CA->CAD, euro-area->EUR). Pass the user's own country, not the destination's. Falls back to 'US' when omitted. | |
| availability_mode | No | strict (default): return ONLY properties available for the requested dates. include_unavailable: also return properties with no availability (each tagged availability_status). Use strict unless the user explicitly wants to see sold-out options. | |
| include_overbudget | No | Opt-in. When few available results fit the budget, also return (in alternatives.overbudget) available properties in the same area just above price_max_eur. Requires filters.price_max_eur. | |
| include_out_of_bounds | No | Opt-in. When the requested area yields few available results, also return (in alternatives.out_of_bounds) properties just outside the area, within the original budget. Present these explicitly as alternatives, never mixed with primary results. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | ||
| results | Yes | ||
| metadata | Yes | ||
| alternatives | No |