Hotel Reviews Scraper: Tripadvisor, Booking.com, Google
Pricing
from $0.80 / 1,000 reviews
Hotel Reviews Scraper: Tripadvisor, Booking.com, Google
Hotel reviews from Tripadvisor, Booking.com, Google Hotels, Agoda and Trip.com in one dataset, ratings on one 1-5 scale; $4.50 per 1,000 reviews. Free per-hotel summary row comparing every site with the city. Only-new mode, free error rows, no reviewer names.
Pricing
from $0.80 / 1,000 reviews
Rating
0.0
(0)
Developer
Arcadium Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Hotel Reputation: Tripadvisor and Booking.com Reviews
Give it a hotel name, or its Tripadvisor, Booking.com, Google Hotels, Agoda and Trip.com links, and get what guests say on every site in one dataset (a name alone is looked up on Tripadvisor, and on Google Hotels when searchGoogleByName is on; Booking, Agoda and Trip.com need their link or id): one row per review, plus a free summary row per hotel with each site's rating, review counts and category scores compared with the city. You only pay for the reviews you get back.
It is for hotel groups benchmarking against competitors, revenue and reputation teams, and travel analysts.
Use with AI agents
Returns Tripadvisor, Booking.com, Google Hotels, Agoda and Trip.com reviews of the same hotel in one dataset with ratings on a common 1-5 scale. Agents can call it through the Apify MCP server (https://mcp.apify.com, open source as apify/actors-mcp-server) as arcadium/hotel-reputation: the input schema is read from the actor, the result is a dataset of JSON rows.
Input example (minimal):
{"hotels": [{"name": "The Savoy London","bookingUrl": "https://www.booking.com/hotel/gb/the-savoy.html"}],"maxReviewsPerSource": 20}
What comes back: one review row per review (charged), a free hotel-summary row per hotel with both ratings, free coverage rows (stated total vs delivered) and a free error row for an input that could not be read. Filter on the rowType field. An input that fails is reported, not hidden (includeErrorRows, on by default): the error row carries rowType: "error", a code (invalid_input, not_found, blocked, unavailable, filter_unsupported or no_match), a message and the input it is about. Retry on blocked and unavailable later; do not retry the other codes with the same input.
Cost of the call above: at most 40 reviews at $4.50 per 1,000 plus the $0.001 start fee is about $0.18 on the free plan; paid plans pay less. Free rows are never charged.
What you get
| Field | What it holds |
|---|---|
platform | tripadvisor, booking, googlehotels, agoda or tripcom. |
reviewId, date | The site's own ID and the review date. |
title, text | Tripadvisor text; Booking gives pros and cons as well, and text joins them. |
ratingOverall | Normalized to 1 to 5. |
extras.rawRating, extras.rawScale | The original rating and its scale (5 for Tripadvisor and Google, 10 for Booking, Agoda and Trip.com). Booking's raw score is also in extras.score10. |
extras.tripType / extras.travelerType | Traveler type as each site names it. |
vendorResponse, language, helpfulVotes | When the site provides them. |
country | Booking, Agoda and Trip.com rows: the reviewer's country as a two-letter code. |
Output example (a Booking review, shortened):
{"platform": "booking","reviewId": "Booking___c6397d1e2a854aa3","productName": "The Savoy","date": "2026-09-30","title": "Wonderful stay","pros": "Staff and location.","cons": "Breakfast queue.","ratingOverall": 4.5,"language": "en","country": "US","extras": { "rawRating": 9, "rawScale": 10, "score10": 9, "travelerType": "COUPLES" }}
Rating scales
Tripadvisor rates 1 to 5 and is kept as is. Booking scores 1 to 10, and ratingOverall is the score divided by two. The raw score always stays in extras. The star filter treats a Booking review as its score divided by two, rounded half up.
Summary row
rowType: "hotel-summary" per hotel (not charged):
tripadvisor: rating 1 to 5, review count, reviews per star, how the hotel was matched.booking:score10,rating(score / 2), review count, stars, city, andcategoryScores(staff, cleanliness and so on) each with the city range andvsCity(above,within,below).combined: both ratings weighted by review count, when both sites were read.
Input
{"hotels": ["Hyatt Grand Central New York",{ "name": "The Savoy London", "bookingUrl": "https://www.booking.com/hotel/gb/the-savoy.html" }],"maxReviewsPerSource": 100}
| Field | What it does |
|---|---|
hotels | Names, or objects with name, tripadvisorUrl, bookingUrl, bookingId, googleUrl, agodaUrl, agodaId, tripcomUrl, tripcomId that tie one hotel's pages together. |
startUrls | Tripadvisor, Booking, Agoda, Trip.com or Google Hotels links, routed by host. Each counts as its own hotel. |
searchGoogleByName | Also look names up on Google Hotels and read Google's own reviews (off by default: one more source per hotel). |
bookingHotelIds | Booking hotel ids (no hotel name or Booking rating in the output, so prefer links). |
ratings, languages | Star and language filters on both sites. |
travelerTypes | BUSINESS, COUPLES, FAMILY, FRIENDS, SOLO, mapped to each site's own names. Several types are read as separate passes: the date filter cannot stop early and only-new runs read every pass, so prefer one type for scheduled runs. |
dateFrom | Only reviews from this date on. Reviews are always read newest first. |
onlyNewReviews, stateKey | Only reviews not delivered by earlier runs with the same key. |
includeCoverageRows | On by default. One free row per hotel and source with "rowType": "coverage": the total the site states, how many were delivered, why the run stopped and whether anything is missing. |
markEdited | With only-new runs, also deliver reviews seen before whose text changed, marked extras.changeType: "edited". |
maxReviewsPerSource | Cap per site and hotel. |
includeSummary | The summary row (a few extra small requests per hotel). |
Names and Booking
Booking.com has no name search we can use. A hotel name is therefore looked up on Tripadvisor only. To read Booking for the same hotel, give its Booking link or id in the object form of hotels. Links in startUrls are read as separate hotels. A Tripadvisor name is accepted only when the hotel found has a matching name; otherwise you get a free no_match row.
Google Hotels
Give a Google Hotels link (googleUrl in the object form, or in startUrls), or set searchGoogleByName to look names up on Google too. Google's own reviews are read (newest first) with the same review shape (platform: "googlehotels"); the summary row gets a google block with the Google rating, review count, reviews per star and Google's topic breakdown. Google shows review dates as "3 months ago", so Google review dates are approximate (extras.datePrecision). Traveler types are filtered from the review's trip tags; the language filter does not apply to Google. For every Google option (partner-site reviews, topics, translations) use the Google Hotel Reviews actor.
Agoda and Trip.com
Give an Agoda or Trip.com link or id (agodaUrl / agodaId, tripcomUrl / tripcomId in the object form, or a link in startUrls). Agoda's own reviews (not the Booking.com ones Agoda also shows) and Trip.com's reviews (with Ctrip's) are read newest first in the same review shape (platform: "agoda" or "tripcom", 1-10 score halved into ratingOverall, original text with the site's English translation in extras.textTranslated). The summary row gets an agoda block (Agoda score, rating count, stars, category scores against the city average) and a tripcom block (score, review count, sub-scores, positive and negative counts, advertised from-price). Rating, language and traveler-type filters are applied after download for both. For every option of these two sites use the Agoda and Trip.com Hotel Reviews actor.
Use it from an AI assistant
Use the Apify actor "hotel-reputation" to collect reviews.Input: {"hotels":[{"name":"The Savoy London","bookingUrl":"https://www.booking.com/hotel/gb/the-savoy.html"}],"maxReviewsPerSource":100}Rows with rowType "review" are reviews; "hotel-summary" has both ratings and Booking category scores.Run it, then compare the two sites and name the categories where the hotel is below the city range.
Use it from code
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("arcadium/hotel-reputation").call(run_input={"hotels": ["Hyatt Grand Central New York"]})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item.get("rowType"), item.get("platform"), item.get("ratingOverall"))
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('arcadium/hotel-reputation').call({ hotels: ['Hyatt Grand Central New York'] });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.length, 'rows');
Pricing
You pay per review delivered, at the price of your Apify plan. Hotel summary rows, coverage rows, error rows and repeats in only-new mode are free.
| Apify plan | Per 1,000 reviews |
|---|---|
| Free | $4.50 |
| Starter (Bronze) | $1.75 |
| Scale (Silver) | $1.35 |
| Business (Gold) | $0.80 |
| Platinum | $0.45 |
| Diamond | $0.27 |
Plus a one-off $0.001 per GB of memory when a run starts.
Set a maximum cost per run in the Apify run options and the actor stops before it goes over.
Limitations
- Public reviews only, no login.
- Booking shows about the last three years of reviews.
- With several traveler types or rating bands, Booking is read one pass after another. The review limit is shared by all passes, so the first pass can use it up; run them separately if you need a fixed number per type.
- Star filtering on Booking happens after download; rare ratings can mean reading many pages.
- A hotel with the same name in several cities needs its link, not its name.
- Google Hotels review dates are approximate (Google shows "3 months ago"), and Google reviews without a trip tag are dropped when a traveler type is asked for.
- Agoda and Trip.com have no name search here: give their link or id. A full Agoda read returns about 98% of the stated total (Agoda's pages overlap).
Privacy
Reviewer names and profile photos are never collected. Booking, Agoda and Trip.com rows carry the reviewer's country as a two-letter code and nothing else about the person; Tripadvisor rows carry no reviewer location.
FAQ
Can I get only new reviews since my last run?
Yes. Turn on onlyNewReviews and keep the same stateKey.
Why did my hotel get no Booking, Agoda or Trip.com reviews?
These sites are read only when you give their link or id for that hotel (no name search). Google Hotels needs a link or searchGoogleByName.
Something looks wrong in the output. Who do I tell? Open an issue on the actor page with the run link.