Booking.com Reviews Scraper — Ratings & Guest Text avatar

Booking.com Reviews Scraper — Ratings & Guest Text

Pricing

$1.50 / 1,000 successful guest reviews

Go to Apify Store
Booking.com Reviews Scraper — Ratings & Guest Text

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

a day ago

Last modified

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.

InputBooking.com property URLs
OutputOne row per guest review
Ceiling10 properties per run, up to 1,000 reviews each
Account neededNone
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"
}
FieldDefaultWhat it is
propertyUrlsemptyBooking.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.
maxReviewsPerProperty10Reviews per property, 1 to 1,000. Every review returned is one charged row, so ask for what you need.
reviewSortMOST_RELEVANTMOST_RELEVANT, NEWEST_FIRST, OLDEST_FIRST, SCORE_DESC or SCORE_ASC.
enableResidentialFallbackfalseThe name is a leftover. It allows one extra attempt by another route when a page comes back refused.
proxyConfigurationApify defaultOnly 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"
}
FieldWhat it is
ratingThat 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, propertyReviewCountThe property's average and its published review total, repeated on every row.
reviewTitleNull when the guest didn't write one.
positiveText, negativeTextBooking's two boxes, kept apart. Either can be null.
checkinDate, checkoutDate, nightsThe actual stay. publishedAt is when the review went up, usually later.
partnerReplyThe property's public answer, on the same row as the review it answers. Null when there isn't one.
reviewUrlThe property page. Booking publishes no per-review permalink, so there is nothing more precise to point at.
reviewerNameNull when the guest posted anonymously.
transportWhich 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.

RowHow to spot itCharged
A guest reviewreviewKind is guest_review, and reviewId is setyes
A page highlight, when the full list never openedreviewKind is featured_public_reviewyes, same rate
The sample row_sample is trueno
A diagnosticok is false, _diagnostic is true, and status names the reasonno
statusWhat it means
BAD_INPUTNot a Booking.com property URL, or nothing usable in the list.
NOT_FOUNDNo property page at that address.
NO_RESULTSThe page opened and had no published reviews on it.
BLOCKEDThe 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_LIMITEDToo much traffic just now. Try again shortly.
NETWORKBooking.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. negativeText is 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 reviewUrl points 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 wantUse
Guest reviews for a propertyThis one
Hotel listings, prices and availability on Booking.comBooking.com Hotels Scraper
Reviews from Tripadvisor insteadTripadvisor Reviews Scraper
Live hotel prices across sitesGoogle 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.