Booking.com Hotel API — One Property, Rooms and Photos
Documentation menu
FetchLayer FetchLayer API

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.

POST /hotel-detail Properties
https://api.fetchlayer.dev/booking/hotel-detail
OpenAPI JSON

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
  }
}