Booking.com Reviews Scraper avatar

Booking.com Reviews Scraper

Pricing

Pay per event

Go to Apify Store
Booking.com Reviews Scraper

Booking.com Reviews Scraper

Scrape guest reviews of any Booking.com hotel: score, title, positive and negative text, reviewer country and traveler type, room type, stay dates, hotel response. Sort and filter by language, traveler type and keyword. No login. Pay-per-result.

Pricing

Pay per event

Rating

0.0

(0)

Developer

NanoScrape

NanoScrape

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

Share

Scrape guest reviews of any hotel on Booking.com. Give it hotel URLs and get one row per review: score, title, positive and negative text, reviewer country, traveler type, room type, stay dates and the hotel's reply. No login required.

What data can you extract?

  • Review id, score (1-10), title, positive text, negative text and the review language
  • Review date (ISO 8601)
  • Reviewer name, country and country code, and traveler type (couple, solo, family, group)
  • Room type, number of nights, check-in and check-out date, stay status
  • Hotel response and helpful votes
  • Hotel id, name and URL

About 50% of Booking.com reviews are score-only: the guest left a rating but no text, so title, positive and negative text are empty for them (roughly half have a positive or negative text, a quarter have a title). Set onlyWithText to skip those.

Use with AI Agents (MCP)

Connect this actor to any MCP-compatible AI client, including Claude Desktop, Claude.ai, Cursor, VS Code, LangChain and LlamaIndex.

{
"mcpServers": {
"apify": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.apify.com?tools=santamaria-automations/booking-reviews-scraper",
"--header",
"Authorization: Bearer <APIFY_TOKEN>"
]
}
}
}

Example prompt: "Use booking-reviews-scraper to get the 200 newest reviews of https://www.booking.com/hotel/ch/motel-one-zurich.html and summarise the main complaints."

How to use

{
"startUrls": ["https://www.booking.com/hotel/ch/motel-one-zurich.html"],
"maxReviewsPerHotel": 200,
"sortBy": "newest",
"languages": ["en", "de"],
"travelerTypes": ["COUPLES"]
}

An empty input {} also works: it scrapes 50 reviews of one example hotel.

Input parameters

ParameterTypeDefaultDescription
startUrlsarrayexample hotelBooking.com hotel URLs (/hotel/<country>/<name>.html, any language suffix or query)
hotelIdsarraynoneNumeric hotel ids, for hotels whose URL cannot be resolved
maxReviewsPerHotelinteger1001-100,000 reviews per hotel (an empty input runs a 50-review demo on the example hotel)
sortBystringnewestnewest, oldest, highest or lowest
languagesarrayallLanguage codes such as en, de, fr
travelerTypesarrayallCOUPLES, SOLO_TRAVELLERS, FAMILIES, GROUP_OF_FRIENDS, BUSINESS_TRAVELLERS
keywordstringnoneOnly reviews containing this text
onlyWithTextbooleanfalseSkip score-only reviews (no title and no text). Skipped reviews are neither saved nor charged; maxReviewsPerHotel then counts saved reviews. A hotel scan stops after 5 x maxReviewsPerHotel raw reviews or at the end of its list

What you get

One row per review:

FieldTypeDescription
review_idstringBooking.com review id
hotel_idintegerBooking.com hotel id
hotel_urlstringHotel page URL (null when only a hotel id was given)
hotel_namestringHotel name (null when only a hotel id was given)
reviewer_namestringReviewer first name or alias
reviewer_countrystringReviewer country
reviewer_country_codestringReviewer country code
traveler_typestringCouple, Solo traveler, Family or Group
room_typestringBooked room type
nightsintegerNumber of nights stayed
checkin_datestringCheck-in date
checkout_datestringCheck-out date
stay_statusstringStay status
review_datestringReview date, ISO 8601 UTC
scorenumberReview score, 1 to 10
titlestringReview title (only some guests write one)
positive_textstringWhat the guest liked
negative_textstringWhat the guest disliked
languagestringLanguage code of the review text
hotel_responsestringReply from the hotel
helpful_votesintegerHelpful votes
review_urlstringReviews page of the hotel on Booking.com
scraped_atstringScrape time, ISO 8601 UTC
source_platformstringAlways booking.com

Output example

{
"review_id": "e1d2eedc5e49225f",
"hotel_id": 1388383,
"hotel_url": "https://www.booking.com/hotel/fr/hotelf1-paris-porte-de-montmartre.html",
"hotel_name": "HotelF1 Paris Saint Ouen Marché Aux Puces",
"reviewer_name": "Maria",
"reviewer_country": "Spain",
"reviewer_country_code": "es",
"traveler_type": "Couple",
"room_type": "Cabrio Room with Private Bathroom",
"nights": 4,
"checkin_date": "2026-10-11",
"checkout_date": "2026-10-15",
"stay_status": "stayed",
"review_date": "2026-10-20T22:20:47Z",
"score": 8,
"title": null,
"positive_text": "Hotel on the outskirts of Paris, small but cosy rooms, fair value for money",
"negative_text": "The receptionist was on a video call and ignored us at check-in",
"language": "es",
"hotel_response": null,
"helpful_votes": 0,
"review_url": "https://www.booking.com/reviews/fr/hotel/hotelf1-paris-porte-de-montmartre.html",
"scraped_at": "2026-10-21T12:00:00Z",
"source_platform": "booking.com"
}

Fields Booking.com does not publish for a review are null.

Pricing

Pay per result: one result event for every review saved, plus a one-time start event per run. Prices: review-start $0.001 per run, review-result $0.0003 per review ($0.30 per 1,000 reviews).

EventWhen
review-startOnce per run, right before the first review is saved
review-resultPer review saved to the dataset

Billing follows what is saved: only rows pushed to the dataset are charged, so score-only reviews dropped by onlyWithText cost nothing. Duplicates are never saved or charged twice, runs that find no reviews are not charged, and a restarted run does not charge reviews it already saved.

Performance

  • Speed: 25 reviews per request, about 1 second per page, so 1,000 reviews take roughly a minute
  • Traffic: about 0.8 MB per 1,000 reviews

Tips

  • Hotel URLs are matched to Booking hotel ids by name. If a URL cannot be resolved the run says so; add the numeric id to hotelIds instead.
  • The languages filter matches the language of the review text; reviews with a score only may have an unknown language code.
  • sortBy: newest is the best choice for scheduled monitoring runs.

Data protection

This actor returns only data that is publicly visible on the source pages. Results can include personal data, such as names, phone numbers, email addresses and addresses of private persons, sole traders or contact persons. Where the source labels an entry type, it is included so you can filter the results yourself.

You are responsible for using the data lawfully, including the GDPR/DSGVO, national data-protection laws and unfair-competition rules (e.g. UWG) for marketing and outreach.