Booking.com Reviews Scraper avatar

Booking.com Reviews Scraper

Pricing

from $2.00 / 1,000 review scrapeds

Go to Apify Store
Booking.com Reviews Scraper

Booking.com Reviews Scraper

Extract Booking.com guest reviews at scale — 24 structured fields per review (positive/negative text, score, traveler type, room, reviewer profile. MCP/API-ready.

Pricing

from $2.00 / 1,000 review scrapeds

Rating

0.0

(0)

Developer

Khadin Akbar

Khadin Akbar

Maintained by Community

Actor stats

0

Bookmarked

14

Total users

2

Monthly active users

6 days ago

Last modified

Share

What is Booking.com Reviews Scraper?

Booking.com Reviews Scraper is an Apify Actor for hotel teams, travel researchers, and reputation analysts who need public Booking.com guest reviews as structured data. You give it Booking.com hotel URLs or a destination such as Lisbon, and it returns one dataset row per review with the score, the liked and disliked text, traveler type, room type, stay dates, reviewer country, and the property's reply. It is usable through Apify MCP, so an AI agent can pull a hotel's review history and reason over it directly.

Best fit and connected workflows

This Actor fits well when you want to:

  • track guest sentiment for your own property or a competitive set, review by review
  • compare what couples, families, solo travellers, and business guests praise or criticise
  • collect only recent reviews after a date, for a weekly or monthly reputation report
  • isolate low-score reviews to find recurring operational issues
  • feed review text into a spreadsheet, BI dashboard, or an LLM summarisation step

Every row keeps the hotel URL and a review ID, so you can join reviews back to the property and de-duplicate across scheduled runs.

Practical scenario

Inês runs guest experience for a boutique hotel in Lisbon. Every Monday she runs the Actor on her hotel and three nearby competitors with sortReviewsBy set to newest first and cutoffDate set to the previous Monday. The dataset gives her each new review's score, positive and negative text, and traveler type. She groups the negative text by theme, sees that breakfast and check-in timing come up for families at two competitors, and shares a short brief with her front-office manager before the week's planning meeting.

Input fields

FieldUse it for
startUrlsOne or more Booking.com hotel or property page URLs.
searchQueryA city, region, or neighbourhood when you want the Actor to find hotels first.
checkIn / checkOutOptional dates that narrow a destination search to available properties.
maxHotelsFromSearchCaps how many hotels a destination search covers.
maxReviewsPerHotelCaps reviews per property.
sortReviewsByMost relevant, newest, oldest, highest score, or lowest score first.
filterByScoreKeep one score band, such as superb or poor.
filterByTravelerTypeKeep one guest type: couple, solo, family, friends, or business. Booking.com applies the filter. business_traveler keeps reviews from business trips, but each row's traveler_type still shows the guest's party type (for example Family or Couple), because rows carry no trip-purpose field.
filterByLanguageKeep reviews in one language, using a two-letter code such as en or de.
cutoffDateStop at reviews older than this date; works best with newest-first sorting.
proxyConfigurationApify Proxy settings for the first attempt. With the default Apify Proxy settings, a blocked hotel is retried once through residential proxies.

Focused JSON input example

{
"startUrls": [{ "url": "https://www.booking.com/hotel/us/the-plaza.html" }],
"maxReviewsPerHotel": 50,
"sortReviewsBy": "f_recent_desc",
"filterByTravelerType": "family_with_children",
"cutoffDate": "2026-01-01"
}

Output fields

Each dataset row is one review with 24 fields:

FieldMeaning
hotel_name, hotel_url, hotel_id, hotel_ratingThe property the review belongs to and its overall Booking.com rating.
review_idStable identifier for de-duplication.
review_titleThe reviewer's headline.
review_positive, review_negativeWhat the guest liked and disliked, as separate text fields.
review_score, review_score_labelNumeric score and Booking.com label such as "Exceptional".
review_date, date_of_stay, length_of_stayWhen the review was written and the stay it describes.
room_type, traveler_typeRoom booked and the guest's party type, such as Couple, Family, Solo traveller or Group. Trip purpose (business or leisure) is not included.
reviewer_name, reviewer_country, reviewer_review_countPublic reviewer profile details when shown.
review_language, helpful_votesLanguage and helpful-vote count when shown.
owner_response, owner_response_dateThe property's public reply.
scraped_at, source_urlCollection time and the page the review came from.

Illustrative dataset record

{
"hotel_name": "the plaza",
"hotel_url": "https://www.booking.com/hotel/us/the-plaza.html",
"hotel_id": "58958",
"hotel_rating": 8.6,
"review_id": "c32efb04a6f08d7c",
"review_title": "A wonderful family stay",
"review_positive": "Friendly staff, a quiet room, and an excellent in-room breakfast.",
"review_negative": "Check-in opened later than we hoped after an early flight.",
"review_score": 10,
"review_score_label": "Exceptional",
"review_date": "2023-12-14T21:21:47.000Z",
"date_of_stay": "2023-12-08",
"length_of_stay": 3,
"room_type": "Deluxe King Room",
"traveler_type": "Family",
"reviewer_name": "Jordan",
"reviewer_country": "United States",
"reviewer_review_count": null,
"review_language": null,
"helpful_votes": 0,
"owner_response": "Dear Jordan, thank you for staying with us. We are glad you enjoyed breakfast and hope to welcome you again soon.",
"owner_response_date": null,
"scraped_at": "2026-10-01T01:21:40.057Z",
"source_url": "https://www.booking.com/hotel/us/the-plaza.html"
}

The reviewer name and text above are illustrative; real rows contain the public review as published.

How it works

For each hotel, the Actor opens the public Booking.com hotel page in its own browser and reads the review list that the page itself loads, 25 reviews at a time, with your sorting, score, traveler-type and language filters applied by Booking.com. It stops at maxReviewsPerHotel or at cutoffDate. If a hotel page is blocked, the Actor retries that hotel once more through residential proxies. Only when both of its own attempts save no reviews for a hotel does it try a fallback review source for that hotel. A hotel that Booking.com reports with zero matching reviews, or that is no longer listed, is a real empty result and does not trigger the fallback. For destination searches, the Actor first collects up to maxHotelsFromSearch matching properties from Booking.com search results.

The default dataset holds the review rows. The key-value store holds OUTPUT and RUN_SUMMARY records describing the run outcome: COMPLETE, PARTIAL, VALID_EMPTY, INVALID_INPUT, or UPSTREAM_FAILED.

Pricing

This Actor uses Pay per event plus Apify platform usage.

  • review-scraped: charged for each review written to the dataset.
  • apify-default-dataset-item: a small per-row dataset event.

Review charges follow the rows written to the dataset, so a run that returns forty reviews produces forty review events. In the rare case that the fallback review source is used for a hotel, it runs as a separate run in your Apify account with its own charges, capped at about $0.0025 per requested review plus $0.005 per fallback call; the run's RUN_SUMMARY shows providerCalls when that happened. Input that contains no Booking.com hotel page ends with INVALID_INPUT before any review work starts. Check the live Pricing tab for current event prices before scheduling large runs.

Use with AI agents (MCP)

The Actor is available through Apify MCP as khadinakbar/booking-reviews-scraper. A typical agent request:

Get the 30 newest Booking.com reviews for https://www.booking.com/hotel/us/the-plaza.html, then summarise the top three things families praise and the top three complaints. Read the dataset for review rows and the OUTPUT record for the run outcome.

The agent can treat review_positive and review_negative as pre-split sentiment, use traveler_type for segmentation, and cite source_url plus scraped_at as provenance. maxReviewsPerHotel bounds both the result size and the review events charged.

Run with the Apify API

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('khadinakbar/booking-reviews-scraper').call({
startUrls: [{ url: 'https://www.booking.com/hotel/us/the-plaza.html' }],
maxReviewsPerHotel: 25,
sortReviewsBy: 'f_recent_desc',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const review of items) {
console.log(review.review_score, review.traveler_type, review.review_negative);
}
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("khadinakbar/booking-reviews-scraper").call(
run_input={"searchQuery": "Lisbon", "maxHotelsFromSearch": 3, "maxReviewsPerHotel": 20}
)
for review in client.dataset(run["defaultDatasetId"]).iterate_items():
print(review["hotel_name"], review["review_score"], review["review_title"])

Best results and outcome guidance

Start with a few hotel URLs and a modest maxReviewsPerHotel, then raise the cap once the output matches your needs. For recurring reports, combine newest-first sorting with cutoffDate so each run reads only new reviews. Use filterByScore with the poor band to focus on complaints. If a run ends PARTIAL, the rows already written are valid; the RUN_SUMMARY record shows which hotels need a retry.

Continue the workflow

Design note

Booking.com shows liked and disliked comments as two separate blocks, and I designed the Actor to keep them as two fields instead of merging them into one review text. That keeps sentiment analysis simple: the positive and negative halves are already labelled by the guest.

FAQ

Can I scrape every review for a hotel?

Yes. Set maxReviewsPerHotel to a high number such as 9999. Larger hotels take proportionally longer.

Can I start from a city instead of hotel URLs?

Yes. Put the destination in searchQuery and set maxHotelsFromSearch to control how many hotels are covered.

How do I get only new reviews?

Sort newest first and set cutoffDate. The Actor stops when it reaches older reviews.

What does each run outcome mean?

  • COMPLETE: every requested hotel returned reviews.
  • PARTIAL: reviews were saved, and some hotels or pages were unavailable, the run reached its maximum charge, or it stopped shortly before its timeout to keep the saved rows. Raise timeoutSecs or the maximum charge for more.
  • VALID_EMPTY: the hotel and filters matched no public reviews, or Booking.com no longer lists the property.
  • INVALID_INPUT: fix the input, for example use a hotel URL such as https://www.booking.com/hotel/us/the-plaza.html.
  • UPSTREAM_FAILED: Booking.com returned no reviews through any route; the run ends with a non-success status so it never looks like an empty success. Retry later or with fewer hotels.

Where is the run outcome stored?

In the OUTPUT and RUN_SUMMARY records of the run's key-value store.

Responsible use

Use this Actor for publicly visible Booking.com reviews and property pages. Treat reviewer names and countries as personal data: store only what your analysis needs, follow applicable privacy law and site terms, and cite the source URL and collection time when you publish findings.