GET /v1/properties/{id}
Canonical property record — amenities, reviews, OTA coverage, dedup metadata.
Static property record. Use this for product pages, post-decision detail views, or to inspect amenities and OTA coverage. No idempotency key (read-only).
Endpoint
GET /v1/properties/{property_id}
Parameters
| Parameter | Type | Description |
|---|---|---|
property_id * | path | From /decide or /search/stays. Prefix prop_. |
include | query | Comma-separated. reviews_aggregate (score + counts + per-OTA breakdown), reviews_sample (up to 5 recent review texts), reviews_extended (up to 20 recent review texts). Review data is opt-in — omit include and you get the headline rating only. |
* required
This endpoint returns static facts. It carries no price unless you pass
check_in/check_out (with guests), which triggers a live availability check
and populates offers / price for that window — otherwise use /search/stays
for pricing.
Request
curl "https://api.b2a.bluepillow.com/v1/properties/prop_abc123?include=reviews_aggregate,reviews_extended" \
-H "Authorization: Bearer $B2A_API_KEY"
Response 200
{
"id": "prop_abc123",
"name": "Hotel Blue Sky",
"brand": "Rocco Forte",
"property_type": "hotel",
"rating": 4.7,
"stars": 5,
"location": {
"lat": 41.9097, "lon": 12.4801,
"address": "Via del Babuino 9",
"city": "Rome", "country": "IT",
"neighborhood": "Centro Storico"
},
"amenities": ["wifi", "spa", "restaurant", "bar", "breakfast"],
"images": [{"url": "https://...", "caption": "Lobby"}],
"reviews_aggregate": {
"score_0_5": 4.7,
"rating_count": 1843,
"comment_count": 312,
"distribution_by_ota": {"Booking": {"score": 4.7, "count": 1240}}
},
"reviews_sample": [
{"score": 5.0, "description": "Spotless rooms, superb staff.",
"language": "en", "date": "2026-04-18T09:12:00Z", "connector_name": "Booking"}
],
"reviews_meta": {"returned": 20, "total_available": 312, "capped": true, "cap": 20,
"note": "Returned the 20 most recent of 312 available review texts (capped to keep the response token-efficient)."},
"ota_coverage": ["Booking", "Expedia", "Agoda"],
"dedup_meta": {"source_listings": 4, "confidence": 0.98, "last_reconciled": "2026-05-27T..."}
}
Reviews: two distinct counts
reviews_aggregate carries two different numbers — don’t conflate them:
rating_count— how many reviews back the score (the OTA-published aggregate, e.g. 1843). This is the rating sample size.comment_count— how many individual review texts are available to read (e.g. 312), fetchable viareviews_sample/reviews_extended. Usually much smaller: most guests rate, fewer write text.
reviews_sample / reviews_extended return the most-recent texts, capped at 5
and 20 respectively. reviews_meta declares the cap (returned vs
total_available): the cap is deliberate to keep responses token-efficient —
the aggregate already reflects ALL reviews, so there’s no need to fetch every
text.
Errors
401 authentication_failed · 404 not_found · 429 rate_limited