Hotel Review Insights: Guest Topics, Sentiment & Ratings
Pricing
from $2.50 / 1,000 hotels
Hotel Review Insights: Guest Topics, Sentiment & Ratings
Guest opinion of hotels from Google Hotels: the topics guests write about (service, rooms, breakfast, cleanliness) with positive and negative counts, ratings on Tripadvisor and other sites, quoted reviews, and a benchmark of a whole city. Not affiliated with Google.
Pricing
from $2.50 / 1,000 hotels
Rating
0.0
(0)
Developer
Aleksandr Kobtsev
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
5 days ago
Last modified
Share
Search a city or name your hotels and get what guests think of each one, as Google Hotels summarises it: the topics guests write about (service, rooms, breakfast, cleanliness, air conditioning) with how many mentions are positive and negative, what is praised and what is criticised, the ratings the hotel has on Tripadvisor, Trip.com and other travel sites, and the reviews Google quotes. One dataset row per hotel, and one benchmark of the whole market the run saw.
There is no login, no browser and no partner API. The Actor reads the pages Google Hotels serves to anyone, over plain HTTP, and takes the aggregates Google has already computed from hundreds or thousands of reviews: a hotel page costs one request, not one request per review. It reads only the pages Google's robots.txt leaves open to crawlers (see the last section).
Who is this hotel review scraper for?
| You are | What you run | What you get |
|---|---|---|
| A hotel owner or a revenue manager | your hotel and its competitive set, by name | topic by topic, where guests prefer a competitor: your air conditioning at -0.60 against theirs at +0.40 |
| A hospitality agency or a software vendor | a city or a region | hotels with a specific complaint (bathroom, noise, check-in) to open a conversation with, and the sites where their rating is weaker |
| A reputation or market analyst | a market, a star range | the spread of every topic across the market and the hotels at both ends, in one record |
| An investor or a travel brand | a destination | which hotels have inflated Google ratings next to Tripadvisor, and what guests complain about in the destination |
What makes this different from other review scrapers?
- Aggregates, not a pile of reviews. Google groups what guests wrote into topics and counts the positive and the negative mentions of each. A row carries 10 to 30 topics with
mentions,positive,negative, ascorefrom -1 to 1 and Google's own sentiment flag. A hotel with 4,000 reviews is one request. - Other sites in the same row. Google shows the hotel's rating and number of reviews on Tripadvisor, Trip.com, Priceline and others. The row has each with the rating on a five-point scale, the review-weighted mean of the others and the gap to Google's rating.
- What is praised and criticised, in one list each. Topics with enough mentions (you choose how many) and a clearly positive or negative score, the best and the worst first.
- A market benchmark. At the end of a run the
TOPIC_BENCHMARKrecord gives, for every topic, how many hotels have it, the mean, the median and the quartiles of their scores, the share of positive mentions, and the three best and three worst hotels. - It stays inside robots.txt. Only
/travel/hotels/addresses are requested; the Actor reads Google's robots.txt at the start of every run and refuses any address it closes. - Honest about what it could not read. A hotel name that matches nothing well enough is listed in FAILED_HOTELS with what Google offered instead, and is not charged. A hotel with no topics and no ratings elsewhere is delivered and not charged either.
What data does it return?
One row per hotel.
| Field | What it is |
|---|---|
| name, propertyType, hotelClass | The hotel, Google's wording for it ("3-star hotel") and its stars (null for properties Google does not class). |
| address, city, region, district, countryCode, latitude, longitude, phone, website | Where it is and how to reach it, from the hotel's Google page. |
| googleUrl, googleMid, entityToken | The hotel's Google Hotels page and Google's own identifiers (googleMid is null for vacation rentals). Stable, so they are the keys to join runs on. |
| rating, reviewsCount, ratingDistribution | Google's guest rating of 5, the number of reviews and the count per star. |
| otherSites | The hotel's rating on each other travel site Google shows (below). |
| otherSitesAverage, otherSitesReviews, ratingGap | The mean of the other sites' ratings on a five-point scale, weighted by their number of reviews; how many reviews that is; and Google's rating minus that mean (positive when Google guests are kinder). null when no other site is shown. |
| topics, topicsCount | Every topic Google lists, and how many (below). |
| praised, criticised | Topics with at least Minimum mentions and a score of 0.2 or more, best first (three of them), and of -0.2 or less, worst first. Each with topic, score, mentions, positive, negative. |
| highlights | The lines Google writes about the hotel ("Guests praised the service", "Guests mentioned beaches 17 times", "Featured in ..."), with text, topic and mentions where it has them. |
| topicSummaries | The sentence Google writes for a topic ("Features a beautiful rooftop garden and terrace with great views") and its number of mentions. |
| reviewSamples | Up to twelve reviews Google quotes on the page, its own first (below). Empty when Include quoted reviews is off. |
| dealLabel | Google's words for the price against the usual one ("19% less than usual"), when it has them. |
| topicsFrom, googlePageRead | Where the topics came from: hotel_page (all of them) or search_card (the first six, when Read each hotel's Google page is off or the page could not be read); and whether the hotel's page was read. |
| query, source, scrapedAt | The search text or name the row came from, whether it was a search, a name or a link, and when it was collected (ISO-8601, UTC). |
| customData | Your own JSON from the input, copied onto every row. Present only when you give it. |
Each entry of topics:
| Field | What it is |
|---|---|
| name, chip | Google's name of the topic as it writes it in sentences ("Bathroom and toiletries") and the short name on the chip ("Bathroom"). |
| mentions, positive, negative, neutral | How many reviews mention it, how many of those are positive and negative, and what is left. |
| net | Positive minus negative mentions over all mentions, -1 to 1. It is the plain count behind score, which Google leaves at 0 for a topic that guests are split on (97 positive and 53 negative mentions can sit at a score of 0). |
| score, sentiment | Google's sentiment score of the topic, -1 to 1, and its flag: positive, negative, or neutral for a topic it leaves unflagged. |
| shown | Whether Google puts the topic first, as a chip, and not under "more". |
Each entry of otherSites: site, rating, scale (5 for stars, 10 for some sites), ratingOutOf5 (the rating on a five-point scale), reviewsCount and url. A site can appear twice when Google links two pages of it.
Each entry of reviewSamples: source (Google or the other site), author (the display name the site shows), rating and scale, postedAt (ISO, for Google's own) or postedAgo ("2 weeks ago", for other sites), language, text, topic (the topic Google quotes it for) and url.
An example row, as a run returned it on 11 October 2026: a hotel in Lisbon. The lists are shortened to three topics and two quoted reviews; a run returns all of them.
{"name": "Secret Patio Lisbon","propertyType": "3-star hotel","hotelClass": 3,"address": "BC do Carrasco 1, 1200-096 Lisboa, Portugal","city": "Lisbon","region": "Lisbon","district": "Lisbon","countryCode": "PT","latitude": 38.710096199999995,"longitude": -9.1508241,"phone": "+351 937 532 538","website": "https://www.secretpatiolisbon.com/","googleUrl": "https://www.google.com/travel/hotels/entity/ChoI89vpl_i-4PjMARoNL2cvMTFneTd5Z3Z6eBAB/prices?hl=en&gl=us&ts=CAESCgoCCAMKAggDEAAaGBIWEhQKBwjqDxALGAoSBwjqDxALGAsYASoHCgU6A1VTRA","googleMid": "0xd193571e34950e7:0xccf181f782fa6df3","entityToken": "ChoI89vpl_i-4PjMARoNL2cvMTFneTd5Z3Z6eBAB","rating": 4,"reviewsCount": 1205,"ratingDistribution": [{ "stars": 5, "count": 675 }, { "stars": 4, "count": 204 }, { "stars": 3, "count": 111 }, { "stars": 2, "count": 78 }, { "stars": 1, "count": 137 }],"otherSites": [{ "site": "Tripadvisor", "rating": 2.8, "scale": 5, "ratingOutOf5": 2.8, "reviewsCount": 102, "url": "https://www.tripadvisor.com/Hotel_Review-g189158-d17464255-r1066350257?m=68573&staydates=2026_10_25_2026_10_26" },{ "site": "Trip.com", "rating": 4.1, "scale": 5, "ratingOutOf5": 4.1, "reviewsCount": 48, "url": "https://www.trip.com/hotels/detail?hotelid=10183478&Allianceid=810504&Sid=1394411" }],"otherSitesAverage": 3.22,"otherSitesReviews": 150,"ratingGap": 0.78,"topics": [{ "name": "Bathroom and toiletries", "chip": "Bathroom", "mentions": 84, "positive": 17, "negative": 61, "neutral": 6, "net": -0.524, "score": -0.417, "sentiment": "negative", "shown": true },{ "name": "Service", "chip": "Service", "mentions": 159, "positive": 97, "negative": 53, "neutral": 9, "net": 0.277, "score": 0, "sentiment": "neutral", "shown": true },{ "name": "Atmosphere", "chip": "Atmosphere", "mentions": 64, "positive": 56, "negative": 3, "neutral": 5, "net": 0.828, "score": 0.772, "sentiment": "positive", "shown": false }],"topicsCount": 27,"praised": [{ "topic": "Atmosphere", "score": 0.772, "mentions": 64, "positive": 56, "negative": 3 },{ "topic": "Pool", "score": 0.711, "mentions": 44, "positive": 38, "negative": 4 },{ "topic": "Fitness", "score": 0.576, "mentions": 77, "positive": 62, "negative": 8 }],"criticised": [{ "topic": "Air Conditioning", "score": -0.565, "mentions": 21, "positive": 2, "negative": 17 },{ "topic": "Bathroom", "score": -0.417, "mentions": 84, "positive": 17, "negative": 61 },{ "topic": "Safety", "score": -0.349, "mentions": 12, "positive": 2, "negative": 8 }],"highlights": [{ "text": "Featured in Digital Nomad Lisbon Guide 2020", "topic": null, "mentions": null }],"topicSummaries": [{ "summary": "Offers robust coworking space with free Wi-Fi, offices, and snacks", "mentions": 66 },{ "summary": "Features a beautiful rooftop garden and terrace with great views", "mentions": 64 }],"reviewSamples": [{ "source": "Google", "author": "Ciara", "rating": 5, "scale": 5, "postedAt": "2023-05-12T21:20:58.459Z", "postedAgo": null, "language": null, "text": "Staff were very friendly and welcoming and reception is open 24 hours for all queries.", "topic": null, "url": null }],"dealLabel": null,"topicsFrom": "hotel_page","googlePageRead": true,"query": "hotels in Lisbon","source": "search","scrapedAt": "2026-10-11T20:20:42.565Z"}
The example shows what the data says, not a verdict: a hotel rated 4.0 on Google and 2.8 on Tripadvisor, with 17 of 84 mentions of its bathroom positive.
The market benchmark
The TOPIC_BENCHMARK record of the run (key-value store) has one entry for each topic that at least two hotels have Minimum mentions or more of, most common first:
| Field | What it is |
|---|---|
| topic, hotels, mentions | The topic, how many hotels of the run have it with enough mentions, and the mentions in all. |
| averageScore, weightedScore, medianScore, p25, p75 | The mean of the hotels' scores (each hotel once), the mean weighted by mentions, the median and the quartiles. |
| positiveShare | Positive mentions over positive and negative ones together. |
| best, worst | The three hotels with the highest and the lowest score of the topic: name, entityToken, score, mentions. |
A hotel is placed in the market by comparing its score to p25, medianScore and p75 of the same topic: air conditioning at -0.60 is far below a market median of -0.05.
How do I use it?
- Under Searches type what you would type into Google Hotels:
hotels in Batumi,boutique hotels in Lisbon. Or under Hotels put hotel names with the city (Hilton Batumi), or paste a Google Hotels link of a hotel. - Set Hotels per run and the filters you want: reviews, stars, the minimum mentions that make a topic count.
- Press Start. 60 hotels of three cities took under a minute.
From the API:
{"searchQueries": ["hotels in Batumi"],"hotels": ["Hilton Batumi"],"maxHotelsPerSearch": 40,"maxHotels": 60,"minMentions": 15,"language": "en"}
What can I set?
| Setting | What it does |
|---|---|
| Searches | Texts to search on Google Hotels. Each returns up to Hotels per search hotels. |
| Hotels | Hotels by name with the city, or by Google Hotels link. |
| Hotels per search | How many hotels to collect per search text, 1 to 200. |
| Hotels per run | The most hotels the run delivers and charges for, 1 to 2,000. |
| Minimum reviews | Leave out hotels with fewer Google reviews than this (10 by default): they have no topics. |
| Minimum stars | Leave out hotels with fewer stars, and hotels with no star class. |
| Leave out vacation rentals | On by default: listings of rental marketplaces have a few reviews and no topics. |
| Read each hotel's Google page | On by default: every topic, the ratings on other sites and the quoted reviews, one request per hotel. Off: the first six topics from the search card, twenty hotels per request, nothing from other sites. |
| Minimum mentions | A topic needs this many mentions (10 by default) to count as praised or criticised and to enter the benchmark. |
| Include quoted reviews | On by default: up to twelve quoted reviews with author, rating, date and text. |
| Language, Country of sale | The language of Google's texts, which includes the names of the topics (keep one across runs you compare), and the country code Google answers for. |
| Requests in parallel | 1 to 10, five by default. |
| Custom data | JSON copied onto every row. |
| Proxy | Apify datacenter proxies by default; your own proxies if you choose Custom proxies. |
How many hotels does a search return?
Google lists about twenty hotels per page and fills a page from the sixty or so it has for a text, in an order that changes from one request to the next. The Actor asks again a few times and keeps what is new. A big city gives fifty to sixty hotels per text at most; to go further use several texts (hotels in Lisbon, boutique hotels in Lisbon, 5 star hotels in Lisbon). The Actor reads each hotel once however many searches name it.
What does it cost?
Pay per event: one hotel event for every hotel delivered with something to report, $0.004 on the free plan, $0.0035 Bronze, $0.003 Silver, $0.0025 Gold and above. A hotel with no topics and no ratings elsewhere is delivered and not charged. The platform's own events are the start of the run ($0.00005) and the dataset item ($0.00001).
Measured on the platform on 11 October 2026: 60 hotels of Lisbon, Istanbul and Prague took 55 seconds and used $0.0023 of platform usage. All 60 had topics (11 to 29 each), 59 had a rating on another site, and the benchmark had 30 topics. Google answered 68 requests without a failed attempt.
Limits
- The topics, the mentions and the scores are Google's own. The Actor does not read the reviews behind them and cannot say which review a mention is. The count of mentions of a topic is the count of reviews that mention it, not of reviews in all.
- Ratings on other sites are the ones Google shows for the hotel on the day; not every hotel has them (a small hotel often has none), and a site can appear twice when Google links two of its pages.
- Google writes the topic names in the language of the run. Compare hotels within one language.
- A search card carries the first six topics; with Read each hotel's Google page off, the benchmark is made of six topics a hotel at most.
- A quoted review is one Google chose to show, not a sample of all of them. Its
authoris the display name the site publishes. - Google changes the layout of its pages from time to time. The Actor finds hotels by their shape and checks that every page answers for the stay it asked, so a change shows as a clear error rather than as wrong rows; if it ever does, open an issue with the run link.
Is it legal to scrape Google Hotels?
This is an unofficial tool, not affiliated with, endorsed by or connected to Google LLC. It reads publicly visible pages and collects no private data; the author names in quoted reviews are the display names the sites show publicly, and you can switch the quoted reviews off. Google's terms restrict automated access, and you are responsible for making sure your use complies with those terms and with the law in your jurisdiction. See Apify's stance on web scraping legality.
What the Actor does about robots.txt: Google's robots.txt closes /travel/search, /travel/entity and /travel/lodging/clk to crawlers and leaves /travel/hotels/ open. The Actor requests only /travel/hotels/ pages (the search page and the hotel page), reads Google's robots.txt at the start of each run and refuses any address it closes. That does not change what the terms say; it means the Actor does not go where robots.txt asks crawlers not to.
Found a problem?
Open an issue on the Issues tab with the run link and the hotel. Breakages in Google's pages are the expected failure mode of any scraper, and this one is built to say so rather than to deliver wrong data. Reports get read.