Booking.com Reviews Scraper
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
2 days ago
Last modified
Categories
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
| Parameter | Type | Default | Description |
|---|---|---|---|
startUrls | array | example hotel | Booking.com hotel URLs (/hotel/<country>/<name>.html, any language suffix or query) |
hotelIds | array | none | Numeric hotel ids, for hotels whose URL cannot be resolved |
maxReviewsPerHotel | integer | 100 | 1-100,000 reviews per hotel (an empty input runs a 50-review demo on the example hotel) |
sortBy | string | newest | newest, oldest, highest or lowest |
languages | array | all | Language codes such as en, de, fr |
travelerTypes | array | all | COUPLES, SOLO_TRAVELLERS, FAMILIES, GROUP_OF_FRIENDS, BUSINESS_TRAVELLERS |
keyword | string | none | Only reviews containing this text |
onlyWithText | boolean | false | Skip 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:
| Field | Type | Description |
|---|---|---|
review_id | string | Booking.com review id |
hotel_id | integer | Booking.com hotel id |
hotel_url | string | Hotel page URL (null when only a hotel id was given) |
hotel_name | string | Hotel name (null when only a hotel id was given) |
reviewer_name | string | Reviewer first name or alias |
reviewer_country | string | Reviewer country |
reviewer_country_code | string | Reviewer country code |
traveler_type | string | Couple, Solo traveler, Family or Group |
room_type | string | Booked room type |
nights | integer | Number of nights stayed |
checkin_date | string | Check-in date |
checkout_date | string | Check-out date |
stay_status | string | Stay status |
review_date | string | Review date, ISO 8601 UTC |
score | number | Review score, 1 to 10 |
title | string | Review title (only some guests write one) |
positive_text | string | What the guest liked |
negative_text | string | What the guest disliked |
language | string | Language code of the review text |
hotel_response | string | Reply from the hotel |
helpful_votes | integer | Helpful votes |
review_url | string | Reviews page of the hotel on Booking.com |
scraped_at | string | Scrape time, ISO 8601 UTC |
source_platform | string | Always 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).
| Event | When |
|---|---|
review-start | Once per run, right before the first review is saved |
review-result | Per 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
hotelIdsinstead. - The
languagesfilter matches the language of the review text; reviews with a score only may have an unknown language code. sortBy: newestis the best choice for scheduled monitoring runs.
Related actors
- Booking.com Scraper - hotel listings with prices, ratings and availability for a destination.
- TripAdvisor Scraper - hotel and restaurant reviews from TripAdvisor.
- Google Maps Scraper - hotel listings and reviews from Google Maps.
- Trustpilot Scraper - company reviews from Trustpilot.
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.