Blue Pillow Hotels & Stays

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

ParameterTypeDescription
property_id *pathFrom /decide or /search/stays. Prefix prop_.
includequeryComma-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 via reviews_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