Booking.com Reviews Scraper - Hotel Guest Reviews avatar

Booking.com Reviews Scraper - Hotel Guest Reviews

Pricing

from $2.00 / 1,000 results

Go to Apify Store
Booking.com Reviews Scraper - Hotel Guest Reviews

Booking.com Reviews Scraper - Hotel Guest Reviews

Extract public Booking.com hotel reviews by property name, URL, slug, or numeric ID, including review text, guest and stay details, replies, photos, and hotel sub-scores.

Pricing

from $2.00 / 1,000 results

Rating

0.0

(0)

Developer

Thirdwatch

Thirdwatch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Categories

Share

Booking.com Reviews Scraper

Extract public guest reviews for Booking.com hotels, apartments, hostels, and resorts. Supply a property name, Booking.com hotel or review URL, URL slug, or numeric property ID. The Actor returns one structured dataset row per unique review and bills that row atomically when it is written.

The scraper uses plain HTTP on Python 3.14 in a 256 MB container. It resolves names and slugs through Booking.com's autocomplete JSON endpoint and reads reviews through the site's ReviewList GraphQL operation. No browser, login, cookie pool, or private account is used.

Input

FieldDefaultDescription
queriesrequiredProperty names, Booking.com URLs, slugs, or numeric hotel IDs.
maxResults50Maximum unique reviews per property, from 1 to 20,000.
sortBynewestNewest, oldest, most relevant, score high-to-low, or score low-to-high.
travelerTypeallOptional traveller-segment filter.
reviewLanguages[]Optional two-letter review-language codes.
onlyWithTextfalseExclude score-only ratings while continuing pagination.
keywordemptyBooking.com's review-text relevance filter.
proxyConfigurationApify Residential, IndiaBooking's CloudFront edge challenges direct cloud egress. The proven default combines a residential route with the Actor's Chrome-shaped ReviewList transport; custom proxies are supported, and explicitly disabling proxying can fail closed with HTTP 202.
{
"queries": [
"Atlantis The Palm Dubai",
"https://www.booking.com/hotel/gb/the-savoy-london.html",
"280149"
],
"maxResults": 100,
"sortBy": "newest",
"reviewLanguages": ["en"],
"onlyWithText": true
}

Output

Each review can include:

  • Stable review reference and public review/property URLs.
  • Hotel ID, name, city, region, country, country code, coordinates, total review count, filtered review count, and category sub-scores for staff, facilities, cleanliness, comfort, value, location, and Wi-Fi.
  • Review title, 1–10 score, positive text, negative text, combined text, original language, published timestamp, helpful votes, translation availability, and approval flag.
  • Public reviewer display name, country, country code, avatar URL, and anonymity flag.
  • Traveller type, room name and ID, check-in/out dates, nights, and stay status.
  • Public property reply plus the largest available guest-photo URLs.
  • Original input query and scrape timestamp.

Empty strings are normalized to null; numeric values are emitted as numbers. Duplicate review references are removed within pagination and again across duplicate input properties.

Empty and failure behavior

A successful ReviewList response with reviewsCount: 0 is a legitimate empty result. The run log records whether the property has no reviews or no reviews match the selected filters. When onlyWithText excludes every score-only card, the log records no_reviews_with_written_text after the feed is exhausted.

Network errors, non-JSON challenge pages, GraphQL errors, malformed payloads, stalled pagination, and deadline exhaustion are not treated as successful empty datasets. Requests use bounded exponential backoff and a shared run deadline. When a proxy is enabled, the Apify SDK supplies its credentials and a fresh proxy session for every retry; proxy URLs and passwords are never written to the Actor log. If every requested property fails upstream, the Actor fails the run instead of silently returning zero rows. A property name that validly returns no autocomplete match is logged separately as no_property_match.

Limitations

  • Booking.com controls two undocumented public endpoints used by its own website. Request shapes, filter tokens, fields, or access rules can change without notice.
  • Review pages contain at most 25 cards per request. Large histories need many sequential, rate-limited requests and may finish partially if the run deadline is reached.
  • Name lookup returns the first hotel match supplied by Booking.com. For ambiguous names, use a full Booking.com property URL or numeric ID.
  • Bare numeric IDs can fetch reviews but do not reliably provide hotel name, city, country, coordinates, or a canonical slug because autocomplete is name-to-ID, not ID-to-name.
  • The keyword option is Booking.com's relevance search, not a guaranteed literal substring filter.
  • Review text stays in its original language. The feed indicates translatability but does not provide Booking.com's rendered machine translation.
  • Reviewer names are limited to the public display name Booking.com exposes, often a first name. No contact details are collected.
  • Guest photos and property replies are optional and absent from many reviews.
  • This Actor covers reviews only. It does not return room rates, availability, inventory, or bookings.
  • Proxy-free access is currently sufficient for moderate jobs, but Booking.com may rate-limit shared networks. A proxy can help with transport failures but does not guarantee access.

Responsible use

Only publicly visible review data is collected. The Actor does not authenticate, access bookings, or bypass a paywall. Review display names and countries can still be personal data; use, retain, and share them in accordance with Booking.com's terms and applicable privacy law.