Booking.com Reviews Scraper
Scrape Booking.com guest reviews. Get the score, title, liked and disliked text, reviewer name, country and stay dates. $1.50 per 1,000 reviews.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
propertyUrls,maxReviewsPerProperty,reviewSort(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0015 per successful guest review = $1.5 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Successful guest review | One public Booking.com guest review row returned to the dataset. | $0.0015 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-07-28, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
propertyUrls | Booking.com hotel, apartment, or property URLs, e.g. https://www.booking.com/hotel/gb/the-savoy.html. The actor opens each property and reads its published guest reviews. Empty input returns one uncharged sample row. | array |
maxReviewsPerProperty | How many published guest reviews to return for each property. The actor pages through the property's public review list until it reaches this number or runs out of reviews, so ask only for what you need, every returned review is one charged result. | integer |
reviewSort | The order Booking.com serves the reviews in. "Most relevant" is Booking's own default ranking; "Newest first" is what you want for monitoring. | string |
enableResidentialFallback | When direct Booking.com traffic is blocked or rate-limited, retry that page once through the built-in connection, or through your own proxy servers if you supply them. Metered options are not used. | boolean |
What you get
A structured dataset — each result includes fields like:
propertyNameratingreviewTitlepositiveTextnegativeTextreviewerNamereviewerCountryroomTypecheckinDatepublishedAtreviewUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Reviews & Reputation Data
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Google Play Reviews Scraper
Google Play reviews by app ID or URL: score, text, reviewer, date, developer reply. Any country. Up to 5,000 per app. $0.09 per 1,000.
2GIS Reviews Scraper
Scrape 2GIS reviews by place URL or city: rating, text, author, date, photos, owner replies. No API key. $0.50 per 1,000.
Yelp Scraper
Scrape Yelp businesses and reviews through Yelp's official Fusion API. Get rating, review count, price, phone, address, GPS and text. Bring your own key.
Glassdoor Company Reviews Scraper
Scrape Glassdoor reviews: pros, cons, six sub-ratings, recommend rate and CEO approval. First page per company without login. $2.50 per 1,000.
Google Reviews Monitor — Multi-Location Alerts & Reports
Watch Google reviews for every location on a schedule. Get only the new ones, rating-drop alerts in Slack and AI reply drafts. $1.00 per 1,000 reviews.
App Review Triage Monitor — App Store & Google Play Alerts
Sort new App Store and Google Play reviews into bugs, billing and feature requests. Get alerts on rating drops in Slack. $0.40 per 1,000 reviews.
Where this tool sits
- Categories
- Reviews & Reputation Data Travel, Hotels & Events
- Platforms
- Booking.com
Booking.com Reviews Scraper: guest reviews, scores and stay dates for any property
Give it Booking.com property URLs and it returns the published guest reviews as rows. The score out of 10, the title, what the guest liked, what they didn't, their name and country, the room they booked, the check-in and check-out dates, and the property's public reply when there is one.
Only a guest who booked through Booking.com can leave a review there, which is why every row carries a real room and a real pair of dates.
Now the part worth knowing before your first run. A few properties never open their full review list, and for those you get the handful of highlights the property page prints instead. Those rows carry no title, no dislikes text and no stay dates, and their rating is the property's overall score rather than one guest's. They are charged the same as a full review, so read reviewKind before you count anything.
| Input | Booking.com property URLs |
| Output | One row per guest review |
| Ceiling | 10 properties per run, up to 1,000 reviews each |
| Account needed | None |
| Price | $1.50 per 1,000 reviews, which is $0.0015 each, flat on every plan |
🏨 What Booking.com Reviews Scraper does
It opens each property you list, reads the same review list the page itself loads, and keeps paging until it has the number you asked for or the property runs out of reviews. It does not stop at the few reviews printed on the property page.
You pick the order: Booking's own relevance ranking, newest first, oldest first, or by score either way. Newest first is the one you want if you are watching a property week to week.
Booking collects praise and complaint in two separate boxes, and they arrive that way: positiveText and negativeText. Either can be null, because plenty of guests fill in only one.
📥 What you give it
{
"propertyUrls": ["https://www.booking.com/hotel/gb/the-savoy.html"],
"maxReviewsPerProperty": 100,
"reviewSort": "NEWEST_FIRST"
}
| Field | Default | What it is |
|---|---|---|
propertyUrls | empty | Booking.com property pages: hotels, apartments, anything with its own page. Up to 10 per run. The box arrives with one example URL in it, which you replace. |
maxReviewsPerProperty | 10 | Reviews per property, 1 to 1,000. Every review returned is one charged row, so ask for what you need. |
reviewSort | MOST_RELEVANT | MOST_RELEVANT, NEWEST_FIRST, OLDEST_FIRST, SCORE_DESC or SCORE_ASC. |
enableResidentialFallback | false | The name is a leftover. It allows one extra attempt by another route when a page comes back refused. |
proxyConfiguration | Apify default | Only used for that one extra attempt. Your own servers are used exactly as you give them. |
Leave propertyUrls empty and the run returns a single sample row showing the shape of the output, with nothing fetched and no rows charged.
📤 What you get back
A real row from a real run. The long complaint is cut short here so the block stays readable:
{
"ok": true,
"propertyName": "The Savoy",
"propertyUrl": "https://www.booking.com/hotel/gb/the-savoy.html",
"reviewId": "effe0db533ff9e1c",
"rating": 9,
"reviewTitle": "Booking Error",
"positiveText": "The staff in every part of the hotel, who were unfailingly cheerful, personable and helpful.",
"negativeText": "Our advance booking of a celebratory afternoon tea was mistakenly in for the previous day...",
"reviewerName": "Mccourt",
"reviewerCountry": "United Kingdom",
"reviewerCountryCode": "gb",
"guestType": "Solo traveler",
"roomType": "Superior Queen Room",
"stayDate": "Stayed 2026-09-10",
"checkinDate": "2026-09-10",
"checkoutDate": "2026-09-12",
"nights": 2,
"publishedAt": "2026-09-13T08:59:46.000Z",
"reviewLanguage": "en",
"helpfulVotes": 0,
"partnerReply": null,
"photoCount": 0,
"propertyScore": 9.4,
"propertyReviewCount": 1447,
"reviewKind": "guest_review",
"reviewSort": "MOST_RELEVANT",
"scrapedAt": "2026-09-14T05:42:40.594Z",
"transport": "direct_browser"
}
| Field | What it is |
|---|---|
rating | That guest's score out of 10 on a guest_review row. On a featured_public_review row it is the property's overall score instead. |
propertyScore, propertyReviewCount | The property's average and its published review total, repeated on every row. |
reviewTitle | Null when the guest didn't write one. |
positiveText, negativeText | Booking's two boxes, kept apart. Either can be null. |
checkinDate, checkoutDate, nights | The actual stay. publishedAt is when the review went up, usually later. |
partnerReply | The property's public answer, on the same row as the review it answers. Null when there isn't one. |
reviewUrl | The property page. Booking publishes no per-review permalink, so there is nothing more precise to point at. |
reviewerName | Null when the guest posted anonymously. |
transport | Which route produced the row. Useful when you are comparing two runs. |
🧾 Reading the output
Filter on reviewKind, not on ok. Three kinds of row land in the dataset, and the default table view does not show you which is which.
| Row | How to spot it | Charged |
|---|---|---|
| A guest review | reviewKind is guest_review, and reviewId is set | yes |
| A page highlight, when the full list never opened | reviewKind is featured_public_review | yes, same rate |
| The sample row | _sample is true | no |
| A diagnostic | ok is false, _diagnostic is true, and status names the reason | no |
status | What it means |
|---|---|
BAD_INPUT | Not a Booking.com property URL, or nothing usable in the list. |
NOT_FOUND | No property page at that address. |
NO_RESULTS | The page opened and had no published reviews on it. |
BLOCKED | The page never came through. A wrong property slug looks the same from outside, so the row says both and leaves a hint. Open the URL in your own browser first. |
RATE_LIMITED | Too much traffic just now. Try again shortly. |
NETWORK | Booking.com was unreachable or answered badly. Re-run it. |
One property failing writes one diagnostic row. The run carries on with the next property.
▶️ How to run it
1. Open Booking.com Reviews Scraper and click Try for free. 2. Paste your property URLs into Booking.com property review URLs, one per line, up to ten. 3. Set Maximum reviews per property. Start small, then raise it once you have seen the shape. 4. Pick a Review order. Newest first for monitoring, most relevant for a general read. 5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the API.
💰 How much does it cost?
$1.50 per 1,000 reviews, which is $0.0015 each. Flat on every Apify plan, no volume tiers.
You pay per review row. The sample row and diagnostics are not billed, so a property that comes back blocked or has no reviews leaves you a row explaining it and nothing on the bill. Page highlights are charged at the review rate, which is the one case where a thinner row costs the same as a full one.
Ten properties at 100 reviews each is 1,000 rows, so $1.50.
💡 What people use it for
- Watching what guests say about one hotel, sorted newest first, on a schedule.
- Reading the complaint field on its own.
negativeTextis where the operational problems are. - Comparing a handful of properties in the same city before a booking decision.
- Pulling stay dates, room types and guest countries to see who a property actually attracts.
- Checking whether management replies to bad reviews, and how fast.
🚧 What it does not do
- Ten properties per run. Split a longer list across runs, or schedule it.
- No per-review link. Booking does not publish one, so
reviewUrlpoints at the property. - Published reviews only. Nothing private, nothing behind a sign-in, no guest contact details.
- Some properties only give highlights. At most about ten of them, with no title, no dislikes
text and no dates, and the property's score in rating.
- No property data beyond the score and the review count. For rooms, prices and availability use
the hotels scraper linked below.
- Scores and counts are a snapshot at the moment of the run, not a running total.
- No translation. A review written in Portuguese arrives in Portuguese, with
reviewLanguage set so you can route it.
🧭 Which travel scraper do you need?
| If you want | Use |
|---|---|
| Guest reviews for a property | This one |
| Hotel listings, prices and availability on Booking.com | Booking.com Hotels Scraper |
| Reviews from Tripadvisor instead | Tripadvisor Reviews Scraper |
| Live hotel prices across sites | Google Hotels Scraper |
❓ Questions people ask
Do I need a Booking.com account? No. Nothing to paste, nothing that expires.
Can I get every review a hotel has? Up to 1,000 per property per run, in the order you choose. The Savoy row above comes from a property with 1,447 published reviews, so a big hotel takes two runs.
Why is rating higher than I expected? Check reviewKind. On a highlight row that field is the property's overall score, not one guest's.
Can I run it every morning? Yes. Use NEWEST_FIRST, and keep reviewId as your dedupe key so you only store what is new.
Is negativeText really the guest's words? Yes, exactly as Booking published it, with no editing and no summarising.
Is scraping reviews legal? These are public pages. Reviews are personal data under GDPR and similar laws, so have a reason for holding them and be careful about republishing. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the property URL and the run ID. If there is a diagnostic row on the run, its status and hint usually name the reason already.