get_property_details
unverifiedv0.1Static record for a specific property — identified by its id. Returns the complete amenity list, photos, booking sources, dedup metadata, detailed location, and the headline rating (`rating` + `rating_count`) by default. Review DATA beyond the headline — the ratings breakdown and the actual review texts — is opt-in via the `include` parameter (see below); pass it whenever the user's question is about guest experience. Carries no price unless called with dates: a price only exists for a concrete stay window. Useful when the user wants to inspect or compare a specific option in depth — facilities, neighborhood, what guests say — without yet committing to specific dates. HOW TO GET REVIEWS (when you need to reason about guest experience): pass `include`. `reviews_aggregate` gives the score + counts + per-OTA breakdown; `reviews_sample`/`reviews_extended` give the actual review texts. Without `include`, none of these are returned (you get only the headline `rating`/`rating_count`). See the `include` section below. For live availability and a real per-operator quote for a specific stay window, the path is `check_property_availability` instead. The two tools coexist by design: this one answers "what is this property like" with stable, cacheable data; the other answers "can I book it for these dates at what price" with live, date-specific quotes. Calling this tool when the user has specific dates in mind and wants to know whether the property is bookable will not surface the availability/quote — the user will then have to wait for a second round-trip to the availability tool. Input: the `id` field from a `search_stays` result (opaque string starting with `prop_`, e.g. `prop_69ce2ddcbf46061e4095778b`). For a property the user has named directly, resolve the place name through `resolve_destination` and run a targeted `search_stays` first to obtain the id. Optional `include=["reviews_aggregate"]` attaches a per-source breakdown of review counts and average ratings — useful when the user asks about overall sentiment or wants to see how each booking source rates the property. It summarizes ALL reviews (score + total count), so it is the right tool for "how is it rated". Review *texts* are available via two includes, both deliberately capped to avoid token waste: - `reviews_sample` — up to **5** recent review texts. Enough to get the gist of what guests say. - `reviews_extended` — up to **20** recent review texts, for a deeper qualitative read. Supersedes `reviews_sample` when both are passed. Reach for `reviews_extended` only when 5 are genuinely not enough — the returned list carries a `reviews_meta` block (`returned`, `total_available`, `capped`, `note`) that tells you how many texts exist and confirms the cap is intentional: the omitted reviews are older and the aggregate already reflects all of them, so you do NOT need to try to fetch everything. Note: review texts are returned only when called WITHOUT dates (the dated availability path does not carry them). `user_country`, `currency`, and `language` carry the **user's** locale, not the property's. When this call carries dates (live prices), prices come back in `currency` if set, else derived from `user_country`, else **USD** — so pass `user_country` and/or `currency` whenever you know the user's location/currency; don't rely on the USD default. `user_country` and `language` also localize the `web_url` booking link. Language default is "en"; country default is "US". All rating-like fields are on a 0-5 scale (Google Places-compatible): the top-level `rating`, `reviews_aggregate.score_0_5`, and each per-OTA score under `distribution_by_ota`. Without dates this tool returns no price (`price` is null, `offers` empty) and `availability_status` is `unknown` (no dates were considered). The live quote, when needed, comes from `check_property_availability`. `web_url` is a ready-to-open booking link for the property. Pass it verbatim when the user asks for a booking link — booking URLs are not reconstructed by hand.
Updated 9/25/2026 · Created 9/25/2026
Input Schema
{
"type": "object",
"required": [
"property_id"
],
"properties": {
"include": {
"type": "array",
"items": {
"enum": [
"reviews_aggregate",
"reviews_sample",
"reviews_extended"
],
"type": "string"
},
"description": "Optional enrichments, always a list — pass [\"reviews_aggregate\"], never the bare string. reviews_aggregate = score + total count + per-OTA distribution (summarizes ALL reviews). reviews_sample = up to 5 recent review texts. reviews_extended = up to 20 recent review texts (supersedes reviews_sample). The text list is intentionally capped to save tokens; reviews_meta declares returned vs available. Prefer reviews_sample and the aggregate; use reviews_extended only when a deeper qualitative read is genuinely needed."
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "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. Prices come straight from the booking sources in this currency; never convert them yourself."
},
"language": {
"type": "string",
"pattern": "^[a-z]{2}$",
"description": "User's UI language (2-letter lowercase). Drives the booking link language and server-rendered narrative; pass the language the user is speaking. Falls back to 'en'."
},
"property_id": {
"type": "string",
"pattern": "^(prop_|https?://)",
"description": "Opaque property id (e.g. 'prop_69ce2ddcbf...') OR a bluepillow.com property page URL (e.g. 'https://www.bluepillow.com/search/68d1a2...') — the id is extracted automatically. Use the URL form when the user pasted a bluepillow.com link."
},
"user_country": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "User's country (ISO-3166 alpha-2 uppercase). Drives the booking-link locale AND, when `currency` is not set, the pricing currency (US->USD, CA->CAD, euro-area->EUR). Pass the user's own country, not the property's home country. Falls back to 'US' when omitted."
}
},
"additionalProperties": false
}Full Contract
{
"name": "get_property_details",
"description": "Static record for a specific property — identified by its id.\nReturns the complete amenity list, photos, booking sources, dedup\nmetadata, detailed location, and the headline rating (`rating` +\n`rating_count`) by default. Review DATA beyond the headline — the\nratings breakdown and the actual review texts — is opt-in via the\n`include` parameter (see below); pass it whenever the user's question\nis about guest experience. Carries no price unless called with dates:\na price only exists for a concrete stay window.\n\nUseful when the user wants to inspect or compare a specific option\nin depth — facilities, neighborhood, what guests say — without yet\ncommitting to specific dates.\n\nHOW TO GET REVIEWS (when you need to reason about guest experience):\npass `include`. `reviews_aggregate` gives the score + counts + per-OTA\nbreakdown; `reviews_sample`/`reviews_extended` give the actual review\ntexts. Without `include`, none of these are returned (you get only the\nheadline `rating`/`rating_count`). See the `include` section below.\n\nFor live availability and a real per-operator quote for a specific\nstay window, the path is `check_property_availability` instead. The\ntwo tools coexist by design: this one answers \"what is this property\nlike\" with stable, cacheable data; the other answers \"can I book it\nfor these dates at what price\" with live, date-specific quotes.\nCalling this tool when the user has specific dates in mind and wants\nto know whether the property is bookable will not surface the\navailability/quote — the user will then have to wait for a second\nround-trip to the availability tool.\n\nInput: the `id` field from a `search_stays` result (opaque string\nstarting with `prop_`, e.g. `prop_69ce2ddcbf46061e4095778b`). For a\nproperty the user has named directly, resolve the place name through\n`resolve_destination` and run a targeted `search_stays` first to\nobtain the id.\n\nOptional `include=[\"reviews_aggregate\"]` attaches a per-source\nbreakdown of review counts and average ratings — useful when the\nuser asks about overall sentiment or wants to see how each booking\nsource rates the property. It summarizes ALL reviews (score + total\ncount), so it is the right tool for \"how is it rated\".\n\nReview *texts* are available via two includes, both deliberately\ncapped to avoid token waste:\n- `reviews_sample` — up to **5** recent review texts. Enough to get\n the gist of what guests say.\n- `reviews_extended` — up to **20** recent review texts, for a deeper\n qualitative read. Supersedes `reviews_sample` when both are passed.\n\nReach for `reviews_extended` only when 5 are genuinely not enough —\nthe returned list carries a `reviews_meta` block (`returned`,\n`total_available`, `capped`, `note`) that tells you how many texts\nexist and confirms the cap is intentional: the omitted reviews are\nolder and the aggregate already reflects all of them, so you do NOT\nneed to try to fetch everything. Note: review texts are returned only\nwhen called WITHOUT dates (the dated availability path does not carry\nthem).\n\n`user_country`, `currency`, and `language` carry the **user's** locale,\nnot the property's. When this call carries dates (live prices), prices\ncome back in `currency` if set, else derived from `user_country`, else\n**USD** — so pass `user_country` and/or `currency` whenever you know the\nuser's location/currency; don't rely on the USD default. `user_country`\nand `language` also localize the `web_url` booking link. Language default\nis \"en\"; country default is \"US\".\n\nAll rating-like fields are on a 0-5 scale (Google Places-compatible):\nthe top-level `rating`, `reviews_aggregate.score_0_5`, and each\nper-OTA score under `distribution_by_ota`.\n\nWithout dates this tool returns no price (`price` is null, `offers`\nempty) and `availability_status` is `unknown` (no dates were\nconsidered). The live quote, when needed, comes from\n`check_property_availability`.\n\n`web_url` is a ready-to-open booking link for the property. Pass it\nverbatim when the user asks for a booking link — booking URLs are\nnot reconstructed by hand.\n",
"inputSchema": {
"type": "object",
"required": [
"property_id"
],
"properties": {
"include": {
"type": "array",
"items": {
"enum": [
"reviews_aggregate",
"reviews_sample",
"reviews_extended"
],
"type": "string"
},
"description": "Optional enrichments, always a list — pass [\"reviews_aggregate\"], never the bare string. reviews_aggregate = score + total count + per-OTA distribution (summarizes ALL reviews). reviews_sample = up to 5 recent review texts. reviews_extended = up to 20 recent review texts (supersedes reviews_sample). The text list is intentionally capped to save tokens; reviews_meta declares returned vs available. Prefer reviews_sample and the aggregate; use reviews_extended only when a deeper qualitative read is genuinely needed."
},
"currency": {
"type": "string",
"pattern": "^[A-Z]{3}$",
"description": "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. Prices come straight from the booking sources in this currency; never convert them yourself."
},
"language": {
"type": "string",
"pattern": "^[a-z]{2}$",
"description": "User's UI language (2-letter lowercase). Drives the booking link language and server-rendered narrative; pass the language the user is speaking. Falls back to 'en'."
},
"property_id": {
"type": "string",
"pattern": "^(prop_|https?://)",
"description": "Opaque property id (e.g. 'prop_69ce2ddcbf...') OR a bluepillow.com property page URL (e.g. 'https://www.bluepillow.com/search/68d1a2...') — the id is extracted automatically. Use the URL form when the user pasted a bluepillow.com link."
},
"user_country": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "User's country (ISO-3166 alpha-2 uppercase). Drives the booking-link locale AND, when `currency` is not set, the pricing currency (US->USD, CA->CAD, euro-area->EUR). Pass the user's own country, not the property's home country. Falls back to 'US' when omitted."
}
},
"additionalProperties": false
}
}GET /api/tool/b2a.bluepillow.com/webmcp/get_property_details