Booking.com Reviews Scraper avatar

Booking.com Reviews Scraper

Pricing

from $2.99 / 1,000 reviews

Go to Apify Store
Booking.com Reviews Scraper

Booking.com Reviews Scraper

Scrape all guest reviews from Booking.com hotels: reviewer name, country, score, date, stay type, positive/negative text, and host responses. Supports full pagination.

Pricing

from $2.99 / 1,000 reviews

Rating

0.0

(0)

Developer

w3crawler

w3crawler

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

What does Booking.com Reviews Scraper do?

Booking.com Reviews Scraper collects publicly visible guest-review records from Booking.com hotel pages. It uses public browser DOM extraction and bounded public HTML/JSON-LD/reader fallbacks. It does not sign in, use private endpoints, solve CAPTCHAs, evade fingerprints, or bypass a login, paywall, WAF, or other access control.

Why use Booking.com Reviews Scraper?

Use the Actor for travel research, property benchmarking, public guest-sentiment analysis, accommodation recommendations, and review-change monitoring. It preserves only fields actually exposed by the public response and adds optional public hotel-summary context. Operational diagnostics are written to logs and the OUTPUT key-value record, never to the dataset.

What data can Booking.com Reviews Scraper extract?

FieldTypeMeaning
url / hotelUrlstringThe public Booking.com hotel URL used for the row.
searchUrlstringPublic reader or review source URL when that fallback exposes one.
hotelNamestringPublic hotel name when available.
reviewPositionintegerPosition within the requested hotel's emitted review set.
requestedSort / requestedLanguagestringSort and language values supplied for the run.
reviewerName / reviewerCountrystringPublic reviewer display details when shown.
overallScorenumberIndividual review score when shown.
title / positiveText / negativeTextstringPublic review title and text sections.
date / stayDate / stayType / roomType / nightsTextstringPublic timing and stay context when shown.
hostResponse / hasHostResponsestring / booleanPublic property response and whether one was present.
propertyTypestringPublic property type from the hotel page or structured data.
hotelReviewScore / hotelReviewCountnumber / integerPublic aggregate hotel score and review count.
qualityRating / hotelReviewLabelnumber / stringPublic quality rating and qualitative label when shown.
scrapedAtstringUTC timestamp for the emitted row.

Missing optional fields are omitted. The Actor does not infer a score, date, reviewer identity, or text from surrounding content.

Input parameters

InputTypeRequiredDefault and limitsDescription
hotelUrlsarray of stringsyes1–25 URLsHTTPS Booking.com hotel-page URLs. Other hosts, non-HTTPS URLs, and non-hotel paths are rejected.
maxReviewsintegerno50; 0–5000Maximum successful review rows per hotel. 0 means all public reviews within the finite safety budget.
sortByenumnof_recent_descf_relevance_desc, f_recent_desc, f_recent_asc, f_score_asc, or f_score_desc.
languagestringnoemptyTwo-letter language code such as en or fr, optionally followed by a region such as en-US. Empty means the public default/all available languages.
proxyConfigurationobjectnoDirect requestStandard Apify Proxy configuration; direct public requests are used unless a proxy is explicitly enabled.

The input schema is authoritative. The Actor does not accept startUrls; hotelUrls is the only URL source. Explicit values override defaults. There are no separate keyword filters, property filters, or custom page-size inputs.

Minimal input

{
"hotelUrls": ["https://www.booking.com/hotel/fr/mirific.en-gb.html"]
}

Bounded review run

{
"hotelUrls": [
"https://www.booking.com/hotel/fr/mirific.en-gb.html",
"https://www.booking.com/hotel/fr/example-riverside-hotel.en-gb.html"
],
"maxReviews": 25,
"sortBy": "f_recent_desc",
"language": "en",
"proxyConfiguration": {
"useApifyProxy": false
}
}

How to run the Actor in Apify Console

  1. Open this Actor and select Input.
  2. Add one or more HTTPS Booking.com hotel-page URLs to Hotel URLs.
  3. Set Max Reviews Per Hotel, a supported public sort, and an optional language code. Configure standard Apify Proxy only if needed for your lawful use case.
  4. Select Save input if you want to reuse the configuration.
  5. Click Start and open the Dataset after the run finishes.
  6. Use the API tab for programmatic access, inspect OUTPUT in the default key-value store, or download the dataset.

How pagination, limits, and deduplication work

The browser opens each hotel page, uses the public reviews control when available, and follows the public next-page control. The review page size is fixed by the public interface at 10 records. maxReviews is applied independently to each hotel. With maxReviews: 0, the Actor continues until public pagination ends, three consecutive empty/duplicate pages occur, or an internal finite safety budget of 500 pages is reached. With a positive limit, the internal page budget is ceil(maxReviews / 10) + 2 pages.

Reviews are deduplicated within each hotel using the public reviewer, date, score, title, positive text, and negative text fields. The summary uniqueItems count also prevents identical successful rows from being counted twice across the run. Input URL order is preserved. The Actor does not invent offsets when a public next-page control is absent.

sortBy and language are passed to the public review interface when supported. They are not private API parameters. There are no additional filters or user-selectable sorts beyond sortBy, and the Actor does not visit private or authenticated detail pages.

What happens when the source is blocked or empty?

The browser checks the hotel page and review area for public access boundaries before extracting. If it sees a CAPTCHA, WAF page, login prompt, paywall, geofence, device check, rate limit, or access denial, it logs the outcome and stops that hotel's browser route. When the browser produces no successful review rows without an explicit access boundary, the Actor makes bounded public HTML/JSON-LD and reader fallback requests. It never tries to defeat the boundary.

The dataset contains only public review records with source-backed review content. A successful response with no reviews completes with status: "SUCCEEDED", runStatus: "SUCCEEDED", and dataStatus: "NO_RESULTS", leaving the dataset empty. If every target is blocked or collection fails before a review is saved, the Actor fails the run and leaves the dataset empty. Blocked responses use stable codes such as CAPTCHA_OR_CHALLENGE, WAF_BLOCKED, ACCESS_DENIED, LOGIN_REQUIRED, RATE_LIMITED, or GEOFENCE_RESTRICTED in the run log. When some reviews were saved before another target failed or was blocked, the run succeeds with status: "SUCCEEDED" and dataStatus: "PARTIAL", retaining the usable rows.

Output examples

Rich successful review row

{
"url": "https://www.booking.com/hotel/fr/example-riverside-hotel.en-gb.html",
"hotelUrl": "https://www.booking.com/hotel/fr/example-riverside-hotel.en-gb.html",
"hotelName": "Example Riverside Hotel",
"reviewPosition": 1,
"requestedSort": "f_recent_desc",
"requestedLanguage": "en",
"reviewerName": "Example Guest",
"reviewerCountry": "France",
"overallScore": 8.4,
"title": "A comfortable stay",
"positiveText": "The room was clean and quiet.",
"hotelReviewScore": 8.4,
"hotelReviewCount": 1250,
"scrapedAt": "2026-09-08T00:00:00.000Z"
}

Reader fallback row

{
"url": "https://www.booking.com/hotel/fr/example-riverside-hotel.en-gb.html",
"hotelUrl": "https://www.booking.com/hotel/fr/example-riverside-hotel.en-gb.html",
"hotelName": "Example Riverside Hotel",
"reviewPosition": 1,
"requestedSort": "f_recent_desc",
"requestedLanguage": "en",
"reviewerName": "Lorena",
"reviewerCountry": "Colombia",
"positiveText": "The breakfast and location were convenient.",
"searchUrl": "https://r.jina.ai/http://www.booking.com/hotel/fr/example-riverside-hotel.en-gb.html",
"scrapedAt": "2026-09-08T00:00:00.000Z"
}

Per-review score and date are intentionally absent from reader highlights when the public page does not expose them.

Run summary in key-value store

{
"status": "SUCCEEDED",
"runStatus": "SUCCEEDED",
"dataStatus": "PARTIAL",
"datasetItems": 25,
"diagnosticItems": 0,
"diagnosticCount": 1,
"requestErrorCount": 1,
"blockedCount": 1,
"noResultsCount": 0,
"uniqueItems": 25
}

OUTPUT contains canonical status and runStatus values (SUCCEEDED or FAILED), a dataStatus value (COMPLETE, PARTIAL, NO_RESULTS, or FAILED), source-backed dataset counts, and operational diagnostic and failure counts. diagnosticItems is always 0; diagnostics are not dataset rows.

How much will it cost?

Apify charges for compute time and any proxy resources used by the run. Cost depends on the number of hotel URLs, review pages, browser time, and proxy type. Start with a small maxReviews value and verify public access before scheduling larger runs.

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

Advanced usage and troubleshooting

Use the API tab or an Apify client to start a run with the JSON shape shown above and read the default dataset. For blocked, failed, or empty runs, inspect the run log and OUTPUT counts. If the public site changes its markup, include the run ID and relevant log details in an Issues report. A repeated challenge is an access limitation, not a signal to increase retries or attempt a bypass.

The Actor omits fields that are not present in the public response. An absent score is not zero, an absent review date is not a fabricated date, and an absent reviewer country is not inferred from a flag or URL. Proxy configuration is standard Apify Proxy only; there is no stealth, fingerprint-evasion, CAPTCHA-solving, login, or private API mode.

API and Issues

For programmatic runs, use the API tab on the Actor page or the dataset URL shown in run details. For support and feature requests, use the Issues tab and include the run ID, sanitized input, and relevant run-log details. Do not include credentials, session cookies, or private account information.

This Actor reads public Booking.com pages and does not request credentials or private account data. Public reviews may still contain personal data. Use the Actor only for a lawful, legitimate purpose and follow Booking.com's terms, robots rules, applicable contracts, privacy laws, and rate limits. If you are unsure whether your use is lawful, consult qualified counsel.

This is an independent, unofficial Actor and is not affiliated with, endorsed by, or sponsored by Booking.com. Booking.com is a trademark of its respective owner.