Booking.com has the largest pool of hotel prices and guest reviews on the web, and no public data API to get any of it out. Its partner APIs are for accredited hotels managing their own listings, not for market research. So if you want to shop rates across a city, watch availability over time, or build a guest-sentiment dataset, you have to read the public pages yourself.
This guide covers what you can pull, why the DIY route is harder than it looks, working Python, a no-code shortcut, and a plain comparison. There is a fuller reference on how to scrape Booking.com, plus a step-by-step blog walkthrough.
What you can pull
Give it a city, an exact hotel, or a Booking.com link, and you get four clean, separate outputs:
-
Hotels (one row each): name, star class, guest score and review count, coordinates, address, currency, per-night and total price,
availableRooms, and a scarcity message ("only 2 left"). - Rooms and rates: one row per bookable room, with price per night, meal plan, refundable flag, free-cancellation deadline, max occupancy and room size.
- Reviews (optional): score out of 10, positive and negative text, reviewer country, traveller type, stay date and nights, and the hotel's reply. Rating-only reviews are included and flagged.
- Availability calendar (optional): one row per forward day, with the date, available or sold-out, and the minimum nightly price.
Every hotel and review row also carries a self-contained markdownContent block, ready to drop into a vector DB or an LLM prompt.
Why scraping Booking.com is hard
Three reasons the DIY route eats your week:
- No single page has everything. Discovery, the price breakdown, the room list, reviews and the calendar all come from different places, each with its own parameters. Stitching them into one clean row per hotel is most of the work.
- Prices are personalized and date-bound. The same hotel returns different rates by dates, party size, currency and device. You have to pin all of that or your numbers drift.
- Volume and blocking. A city has hundreds of hotels; a hotel has thousands of reviews. Pulling that reliably, at rate, without getting blocked, is a full-time job on its own.
Three ways to get the data
- DIY in Python - full control, but you own discovery, pagination, the price/room/review/calendar stitching, retries and blocking.
- A no-code actor / API - you send input, it returns clean JSON. No parsing, no infra.
- The official partner API - not an option unless you are an accredited Booking.com partner managing your own inventory.
Option A: DIY in Python
The honest starting point is discovery: find the hotels, then enrich each one. Expect to maintain the request parameters, pagination and retry logic yourself.
import httpx
# You resolve a destination, page through its hotels, then for each hotel
# fetch price + rooms, reviews and the calendar - each a separate call.
resp = httpx.get(
"https://www.booking.com/searchresults.html",
params={"ss": "Rome", "checkin": "2026-09-01", "checkout": "2026-09-02"},
headers={"user-agent": "Mozilla/5.0"},
timeout=30,
)
# ...then parse the results, follow each hotel, and merge prices, rooms,
# reviews and availability into one row. This is where the week goes.
That runs, but you still have to build the whole pipeline around it. When you want reliability at scale, the shortcut wins.
Option B: the no-code / API shortcut
The Booking.com Scraper on Apify takes input and returns clean JSON. Call it from Python with the Apify client:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("factden/booking-com-scraper").call(run_input={
"searchLocation": ["Rome"],
"includePrices": True,
"includeReviews": True,
"maxReviews": 50,
"includeAvailabilityCalendar": True,
"calendarDays": 30,
"currency": "USD",
"maxResults": 25,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["hotelName"], item.get("perNightPrice"), item.get("reviewScore"))
Swap searchLocation for searchTerms (a hotel name) or startUrls (Booking.com links) when you want specific properties. Prices, reviews and the calendar are independent toggles, so you pay only for what you pull.
What comes back
One flat row per hotel, plus separate reviews and calendar datasets. A trimmed hotel row:
{
"hotelName": "The Savoy",
"city": "London",
"stars": 5,
"reviewScore": 9.4,
"reviewCount": 1446,
"currency": "GBP",
"perNightPrice": 733.33,
"availableRooms": 7,
"scarcityMessage": "We have 7 left",
"rooms": [{ "roomName": "Superior Queen Room", "pricePerNight": 733.33, "refundable": false }]
}
Export as JSON, CSV, Excel or HTML, or pull it from the Apify API on a schedule.
Grab a free sample dataset
Want to see the shape before you run anything? Grab a free Booking.com sample as clean CSV.
FAQ
Does Booking.com have a public API? No. Its Connectivity and Demand APIs are for accredited partners managing their own listings, not for market research.
Can I discover every hotel in a city? Yes. Put a city, region or country in searchLocation and you get every hotel there, paginated and de-duplicated.
Does it get rating-only reviews? Yes, and there is no 500-review cap. Rating-only reviews (a score with no text) are included and flagged.
How much does it cost? Pay-per-event, no start fee: hotel $0.003, prices $0.005 per priced hotel, review $0.001, calendar day $0.0005. New Apify accounts get free monthly credit.
Related
Building a travel-data pipeline? Pair this with the Google Hotels Scraper for the OTA rate ladder, or the Expedia Reviews Scraper. Full list at apify.com/factden.
Top comments (0)