Read one property in full
Read one Booking.com property in full: its formatted address and coordinates, star rating, the seven-category review breakdown, the whole photo gallery, amenities, languages spoken at the property, its check-in and check-out windows, and **every room type it publishes** — each with a description, floor area in square metres, bed configuration, occupancy and its own photos. Seven room types and 51 photos on the property measured. A property is named either by its booking.com URL or by its compact `"countryCode/pageName"` id — `"fr/du-printemps-paris"`. Every search row carries that id in `id`, ready to hand straight to this route, and [`/resolve-url`](/documentation/booking/endpoints/resolve-url) turns a pasted link into one for free. **This route does not price a stay, and it says so when you pass dates.** `checkIn`/`checkOut` are accepted and answered with a note rather than a price: "This route does not return a live price for this stay. Use search-hotels with the same destination and dates to get this property's priced room options." That is the documented answer, not a failure. [`/search-hotels`](/documentation/booking/endpoints/search-hotels) is what prices a stay — and it prices every bookable room option, not just the property. **The category detail is here; the single headline number is not.** On this route `reviewScore` comes back `{average: null, count: null, label: null}` while `reviewScoreBreakdown` carries all seven category scores in full — measured on two unrelated properties. For a property's headline score and review count, read a [`/search-hotels`](/documentation/booking/endpoints/search-hotels) row, which carries `reviewScore` populated (`{average: 8.1, count: 3854, label: "Very Good"}` on the property below), or [`/hotel-reviews`](/documentation/booking/endpoints/hotel-reviews), which reports `totalReviewCount` and the same seven categories. **An id that names no property is a 404 with a message** — `{"error":"no property was found for \"zz/no-such-hotel-xyz\""}` — not a 503. A wrong id is a wrong request, so there is nothing to retry. Billing: 1 credit per page fetched, reported as `pagesFetched`. Measured on 17 September 2026: `{"hotel":"fr/du-printemps-paris"}` returned 200 in 3.62-3.93s across three runs.
/hotel-detail Properties https://api.fetchlayer.dev/booking/hotel-detail Headers
Authorization string required Bearer token — your FetchLayer API key.
Parameters
hotel string required A property: its booking.com URL, or its compact `"countryCode/pageName"` id as returned in every search row's `id`. The only required field.
checkIn string optional Stay start date, YYYY-MM-DD. Accepted, but **this route does not price a stay** — the response answers with a note instead. Use /search-hotels for a priced stay. Must be given together with `checkOut`.
checkOut string optional Stay end date, YYYY-MM-DD. Required if `checkIn` is given, and vice versa. Same caveat: no price comes back.
adults integer optional Adult guests, up to 30. (default: 2)
format string optional Envelope format: json or markdown. (default: json)
Response Fields
hotel-detail
Read one property in full
transport string The source. "booking".
notes string[] Caveats and completeness statements you can act on, in plain words. On /hotel-reviews this is where the "10 of the 3854" line lives; on /search-hotels it is where a default stay window is declared when you passed no dates; on /hotel-detail it is where the "this route does not price a stay" answer lives.
pagesFetched number Pages read, and what the request is billed at: 1 credit per page. A page costs the same whether it comes back full or half empty. /resolve-url reports 0 and is free.
hotel.id string The compact `"countryCode/pageName"` id, echoed back — useful when you passed a URL.
hotel.url string The property's canonical booking.com address.
hotel.name string The property name as published.
hotel.address string The full formatted address, e.g. `"1 RUE DE L'ISLY, 8th arr., 75008 Paris, France"` — fuller than the street line a search row carries.
hotel.city string The city the property is in.
hotel.countryCode string Two-letter country code.
hotel.coordinates object `{latitude, longitude}`.
hotel.starRating object `{value, scheme}`. `scheme` can be null here where a search row carried one — the number is the reliable half on this route.
hotel.reviewScore string **`{average: null, count: null, label: null}` on this route**, measured on two unrelated properties. The headline score is published on a /search-hotels row and the review count on /hotel-reviews; what this route carries is the category breakdown below.
hotel.reviewScoreBreakdown object[] The property's score split seven ways — Staff, Facilities, Cleanliness, Comfort, Value for money, Location, Free Wifi — each as `{category, label, average}`, where `category` is the stable key (`hotel_staff`, `hotel_services`, `hotel_clean`, `hotel_comfort`, `hotel_value`, `hotel_location`, `hotel_free_wifi`) and `label` the human one. A property strong on location and weak on facilities does not look like its opposite: the measured example scores 9.44 on Location against 7.82 on Facilities behind a single 8.1.
hotel.photos object[] `[{url, caption}]` — the full gallery, 51 photos on the property measured, against the handful a search row carries. `caption` is the source's own description of the picture.
hotel.amenities object[] `[{title, group}]`. `title` is the amenity in the source's own wording ("Breakfast", "Pet friendly"); `group` is the heading it sits under where one is published, null otherwise.
hotel.languagesSpoken string[] The languages the property says its staff speak. Empty where the property published none — it was empty on the property measured.
hotel.rooms object[] `[{name, description, sizeSquareMeters, bedConfiguration, occupancy, photos}]` — **the property's room catalogue**, seven entries on the property measured. `sizeSquareMeters` is a number (19, 21), `description` is the source's full paragraph, and each room carries its own photo list. `bedConfiguration` can be an empty string where the property published none. These are room *types*, not priced offers: for prices per room, call /search-hotels.
hotel.checkIn string The property's own check-in window, e.g. its earliest and latest arrival time. Null when you passed no dates.
hotel.checkOut string The check-out window, on the same terms.
Request
curl -X POST "https://api.fetchlayer.dev/booking/hotel-detail" \
-H "Authorization: Bearer ss-your-key" \
-H "Content-Type: application/json" \
-d '{"hotel":"fr/du-printemps-paris"}'Response
{
"transport": "booking",
"notes": [],
"pagesFetched": 1,
"hotel": {
"id": "fr/du-printemps-paris",
"url": "https://www.booking.com/hotel/fr/du-printemps-paris.html",
"name": "HOTEL DU PRINTEMPS",
"address": "1 RUE DE L'ISLY, 8th arr., 75008 Paris, France",
"city": "Paris",
"countryCode": "fr",
"coordinates": {
"latitude": 48.87476116422678,
"longitude": 2.326435976686483
},
"starRating": {
"value": 3,
"scheme": null
},
"reviewScore": {
"average": null,
"count": null,
"label": null
},
"reviewScoreBreakdown": [
{
"category": "hotel_staff",
"label": "Staff",
"average": 8.94481086730957
},
{
"category": "hotel_services",
"label": "Facilities",
"average": 7.824008941650391
},
{
"category": "hotel_clean",
"label": "Cleanliness",
"average": 8.511276245117188
},
{
"category": "hotel_comfort",
"label": "Comfort",
"average": 8.569668769836426
},
{
"category": "hotel_value",
"label": "Value for money",
"average": 8.086325645446777
},
{
"category": "hotel_location",
"label": "Location",
"average": 9.435894966125488
},
{
"category": "hotel_free_wifi",
"label": "Free Wifi",
"average": 8.791600227355957
}
],
"photos": [
{
"url": "https://cf.bstatic.com/xdata/images/hotel/max200/327849635.jpg?k=c66b0bb35f9aeca8fb81238f4ad75ed87a0d480299e48ca825f458e3d6b99c72&o=",
"caption": "a large white building with people walking in front of it at HOTEL DU PRINTEMPS in Paris"
}
],
"amenities": [
{
"title": "Breakfast",
"group": null
},
{
"title": "Pet friendly",
"group": null
}
],
"languagesSpoken": [],
"rooms": [
{
"name": "Standard Double Room",
"description": "The double room provides air conditioning, soundproof walls, as well as a private bathroom featuring a bath and a hairdryer. The double room offers a mini-bar, a wardrobe, heating and a flat-screen TV. The unit offers 1 bed.",
"sizeSquareMeters": 19,
"bedConfiguration": "",
"occupancy": 2,
"photos": [
"https://cf.bstatic.com/xdata/images/hotel/max1024x768/330168497.jpg?k=0e12b098065a20392dca6cc6f2ac7d6b1c1cb2cbd3e780e272cb21291c56b55b&o="
]
}
],
"checkIn": null,
"checkOut": null
}
}