Booking.com Reviews Scraper — Ratings & Guest Text
Pricing
$1.50 / 1,000 successful guest reviews
Booking.com Reviews Scraper — Ratings & Guest Text
Get guest reviews from any Booking.com property. Only guests who really stayed can write one. So each review shows the stay dates. Rows have the score, title, reviewer name, country and room type. You also get what the guest liked and disliked. 10 properties per run. $1.50 per 1,000 reviews.
Pricing
$1.50 / 1,000 successful guest reviews
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
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
- Open Booking.com Reviews Scraper and click Try for free.
- Paste your property URLs into Booking.com property review URLs, one per line, up to ten.
- Set Maximum reviews per property. Start small, then raise it once you have seen the shape.
- Pick a Review order. Newest first for monitoring, most relevant for a general read.
- 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
reviewLanguageset 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.