Google Hotels Scraper With Review Insights avatar

Google Hotels Scraper With Review Insights

Pricing

Pay per usage

Go to Apify Store
Google Hotels Scraper With Review Insights

Google Hotels Scraper With Review Insights

Monitor hotel data at scale with automated scraping. Pull prices, offers, review stats, amenities, and geographic info from Google Hotels. Perfect for travel analytics, competitor monitoring, and pricing optimization.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

6 days ago

Last modified

Share

Google Hotels Scraper — Extract Hotels and Review Insights as JSON

Google Hotels Scraper With Review Insights pulls structured hotel data — name, address, phone, prices, amenities, GPS, photos — directly from Google Travel/Google Hotels, then makes a second request per hotel to Google's own /reviews sub-page to add an aspect-sentiment breakdown, a star-rating histogram, a distinct location score, and real guest review excerpts. Every response is typed, normalized JSON — no HTML, no selectors, no parsing. After reading this page you'll know exactly which fields you get, how the review-insight data is actually produced, and how to run it.

What is Google Hotels Scraper With Review Insights?

Google Hotels Scraper With Review Insights is an Apify Actor that searches Google Hotels for one or more locations and returns each hotel's core listing data plus a review-insights layer scraped from that hotel's /reviews page — a fetch a plain hotel-search scraper never makes. It runs on the Apify platform; no Google account or login is required, since it reads Google's publicly accessible hotel search and review pages. An optional, off-by-default step can send the scraped review excerpts to an AI model of your choice for sentiment/topic tagging.

  • Scrape hotel listings — name, address, phone, website, prices per OTA, amenities, GPS, photos
  • Scrape review insights — 21-category aspect-sentiment breakdown, star-rating histogram, location score
  • Scrape real guest review excerpts, mirrored to their own dataset for separate export
  • Optional AI sentiment/topic summarization using your own API key (Anthropic, OpenAI, Google, xAI, DeepSeek, Perplexity, or Mistral)
  • Export as JSON, CSV, or Excel — no proxy management required by default

What data does Google Hotels Scraper With Review Insights collect?

The Actor returns three kinds of data for every hotel it processes: the base listing, the review-insights breakdown, and the individual review excerpts.

Data TypeKey FieldsJSON Field Names
Hotel listingname, address, phone, website, prices per OTA, star rating, amenities, GPS, photostitle, address, phone, website, prices, priceRange, rating, stars, amenities, gps, photos
Review insightsaspect-sentiment breakdown (up to 21 categories), star-rating histogram, qualitative rating label, distinct location scorereviewInsights.aspectSentiment, reviewInsights.ratingHistogram, reviewInsights.ratingLabel, reviewInsights.locationScore
Guest review excerptsreal guest quotes, review theme, topic tag, optional AI sentiment/topicsreviewExcerpts[].text, reviewExcerpts[].theme, reviewExcerpts[].topic, reviewExcerpts[].aiSentiment, reviewExcerpts[].aiTopics

Need more Google Hotels data?

This is the only Google Hotels Actor currently published under the API-Empire account, so there's no sibling scraper to cross-sell here. If your workflow also touches short-term rentals, API-Empire's Airbnb Occupancy Scraper covers that adjacent travel-data need.

Why not build this yourself?

Google does not publish a general-purpose public API for third parties to pull Google Hotels pricing, listing, or review data, so any DIY approach means reverse-engineering Google's own page markup yourself. That markup changes without notice, review-insight data lives behind a separate /reviews sub-page fetch that isn't part of a normal search scrape, and Google can silently return a soft-blocked 200 response that looks valid but omits the review-excerpt carousel — this Actor already detects that case and retries with proxy escalation. Building and maintaining your own scraper means owning proxy rotation, retry logic, and markup-change monitoring indefinitely, on top of the actual data-parsing logic. Using a maintained Actor shifts that maintenance burden off your team and gives you a stable JSON schema to build against instead.

Why do developers and teams scrape Google Hotels?

For revenue managers and rate analysts

Hotel revenue teams and rate-shopping tools use prices (per OTA, with priceRange) alongside rating, stars, and reviewInsights.aspectSentiment to track how a property's pricing lines up against its actual guest-sentiment strengths and weaknesses — for example, comparing whether a property charging a premium also scores well on the "Cleanliness" or "Service" aspect categories. Running the same searchTargets on a schedule turns this into ongoing competitive rate and reputation monitoring for a defined set of properties or destinations.

For travel-deal aggregators and OTA product teams

Travel-tech products building their own hotel listings or deal-comparison pages use the prices array (provider, price, link) plus amenities, photos, and gps to enrich a hotel record beyond a single star average. Adding reviewInsights.ratingHistogram and real reviewExcerpts lets a product show a rating breakdown and genuine guest quotes instead of just an aggregate score, which is the kind of detail users compare across booking sites before choosing a property.

For hospitality researchers and market analysts

Academic and market researchers studying guest experience at scale use reviewInsights.aspectSentiment across many hotels in a destination to see which service dimensions (breakfast, Wi-Fi, noise, staff) drive complaints or praise in a given market, using only publicly accessible Google Hotels pages as the data source. Combining sortOrder: "rating_high_low" with a large searchTargets list makes it straightforward to build a destination-level guest-experience dataset for a report or paper.

For AI engineers and agent builders

Because every field is typed JSON rather than HTML, reviewExcerpts[].text can be indexed directly into a RAG pipeline or vector store for a hotel-review question-answering agent, and reviewInsights.aspectSentiment gives an agent a structured signal to reason over without needing its own sentiment model. The optional aiEnhancement step goes further and calls an LLM directly inside the Actor run to attach a per-excerpt sentiment/topic tag and an overall summary, so downstream agent code can skip that step entirely.

How to scrape Google Hotels (step by step)

  1. Open the Actor's Input tab on its Apify Store listing (an Apify account is required to run it).
  2. Add one or more cities, areas, or keywords to searchTargets (e.g. "Prague hotels", "Paris center").
  3. Set checkIn, checkOut, guestAdults, guestChildren, currency, and maxHotels for the search, and choose sortOrder if you want the results re-ranked by price, rating, or stars instead of Google's default relevance order.
  4. Leave includeReviewInsights on (its default) to get the aspect-sentiment breakdown and review excerpts, or turn it off for a faster, base-only run; optionally enable aiEnhancement with your own AI API key for sentiment/topic tags.
  5. Start the run and export the dataset as JSON, CSV, or Excel.

What to do when Google Hotels changes its structure

The Actor is maintained, and its output schema is designed to stay stable — field names and types don't change on your end even when Google's underlying page markup does. No specific update turnaround time is published.

⬇️ Input

All 14 input parameters are optional — the Actor runs with defaults if you provide nothing.

ParameterRequiredTypeDescriptionExample Value
searchTargetsNoarrayCities, areas, or keywords to search — e.g. 'Prague hotels', 'Paris center'. Add multiple for bulk scraping.["Prague hotels"]
maxHotelsNointegerHow many hotels to scrape per search query, 1-5000.10
checkInNostringArrival date (YYYY-MM-DD). Affects prices."2026-12-01"
checkOutNostringDeparture date (YYYY-MM-DD), must be after check-in."2026-12-05"
guestAdultsNointegerNumber of adults, 1-10. Affects room options and pricing.2
guestChildrenNointegerNumber of children, 0-10.0
currencyNostring3-letter currency code: EUR, USD, GBP, etc."EUR"
sortOrderNostringOrder the scraped hotels in the dataset. 'Relevance' keeps Google's own search-result ranking; the other options re-sort the final list by the extracted price/rating/stars (hotels missing that value are placed last, never faked). Default "relevance"."price_low_high"
includeReviewInsightsNobooleanWhen ON, fetches each hotel's /reviews sub-page and adds reviewInsights and reviewExcerpts to the output. Turn OFF for faster, base-only runs. Default true.true
maxReviewExcerptsNointegerCap on how many real guest review excerpts to keep per hotel (0-20). Only applies when review insights are enabled. Default 6.6
aiEnhancementNobooleanWhen ON, sends each hotel's real review excerpts to an AI model to produce a per-excerpt sentiment/topic tag and an overall guest-sentiment summary. Never fabricates. Default false.false
aiModelNostringAI provider/model for sentiment summarization; provider is auto-detected from the model name. Default "claude-haiku-4-5"."claude-haiku-4-5"
aiApiKeyNostring (secret)API key for the selected AI provider. Falls back to the matching env var if left blank. Only used when AI summarization is enabled.""
proxySettingsNoobjectProxy configuration for all requests, including the /reviews fetch.{ "useApifyProxy": false }

Example JSON input:

{
"searchTargets": ["Prague hotels", "Paris city center accommodation"],
"maxHotels": 10,
"checkIn": "2026-12-01",
"checkOut": "2026-12-05",
"guestAdults": 2,
"guestChildren": 0,
"currency": "EUR",
"sortOrder": "relevance",
"includeReviewInsights": true,
"maxReviewExcerpts": 6,
"aiEnhancement": false,
"aiModel": "claude-haiku-4-5",
"aiApiKey": "",
"proxySettings": { "useApifyProxy": false }
}

The most common mistake is turning on aiEnhancement without setting aiApiKey or its matching provider environment variable — the run still succeeds, but every aiSentiment, aiTopics, aiOverallSentiment, and aiTopThemes field stays null instead of erroring.

⬆️ Output

Results are pushed as typed, normalized JSON to the Actor's dataset, exportable as JSON, CSV, or Excel. There are two distinct row shapes: the main hotel record, and — only when review insights find real excerpts — a mirrored review-excerpt record in a separate per-run dataset.

Scraped Hotel

Each charged hotel_result row in the default dataset looks like this:

{
"type": "hotel",
"isChild": false,
"thumbnail": "https://lh3.googleusercontent.com/gps-cs-s/...",
"url": "https://www.google.com/travel/hotels/entity/...",
"title": "Czech Inn",
"website": "https://www.czechinn.com",
"address": "Francouzska 240/76, Prague, Czechia",
"phone": "+420 267 267 612",
"photos": ["https://lh3.googleusercontent.com/..."],
"rating": 4.4,
"reviews": 2279,
"prices": [
{ "provider": "Booking.com", "price": 45, "link": "https://www.google.com/travel/clk?..." },
{ "provider": "Hostelworld", "price": 43, "link": "https://www.google.com/travel/clk?..." }
],
"priceRange": "43 - 45",
"stars": 4.4,
"amenities": ["Free Wi-Fi", "Bar", "24-hour front desk"],
"gps": { "lat": 50.0755, "lng": 14.4378 },
"aboutHotel": "Laid-back hostel with a bar...",
"healthAndSafety": ["Daily cleaning"],
"addressAndContact": { "checkIn": "2:00 PM", "checkOut": "11:00 AM" },
"reviewInsights": {
"ratingLabel": "Very good",
"locationScore": 3.6,
"aspectSentiment": [
{ "aspect": "Cleanliness", "positive": 181, "negative": 20, "count": 212, "sentimentScore": 0.9 },
{ "aspect": "Service", "positive": 285, "negative": 35, "count": 329, "sentimentScore": 0.891 }
],
"ratingHistogram": { "5star": 67, "4star": 22, "3star": 6, "2star": 2, "1star": 3 },
"aiOverallSentiment": "Guests are largely positive about location and nightlife but flag inconsistent front-desk service.",
"aiTopThemes": ["front desk", "breakfast", "air conditioning"]
},
"reviewExcerptsCount": 5,
"reviewExcerpts": [
{
"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT25...",
"theme": "One of the few hotels in the area with a 24-hr front desk",
"topic": null,
"text": "The lady at the front desk was incredibly rude, I tried to stay here but everything was incredibly booked up.",
"aiSentiment": "negative",
"aiTopics": ["staff"]
}
],
"searchQuery": "Prague hotels",
"scrapedAt": "2026-07-16T12:00:00Z"
}

Scraped Review Excerpt

When a hotel has real review excerpts, each one is also mirrored — uncharged — to a separate per-run dataset named review-excerpts-<runId>, so excerpts can be exported independently of the parent hotel rows:

{
"type": "reviewExcerpt",
"isChild": true,
"parentHotelTitle": "Czech Inn",
"parentHotelUrl": "https://www.google.com/travel/hotels/entity/...",
"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT25...",
"theme": "One of the few hotels in the area with a 24-hr front desk",
"topic": null,
"text": "The lady at the front desk was incredibly rude, I tried to stay here but everything was incredibly booked up.",
"aiSentiment": "negative",
"aiTopics": ["staff"],
"scrapedAt": "2026-07-16T12:00:00Z"
}

Only hotel_result rows in the default dataset are billed events — the mirrored review-excerpt dataset is a separate, unbilled dataset, so no field-level filter is needed to exclude it from your charge count.

How many results can you scrape with Google Hotels Scraper With Review Insights?

maxHotels caps results at up to 5,000 hotels per search query, with a default of 10; add multiple entries to searchTargets to run several searches — each capped at maxHotels — in a single run. There is no additional hard result cap enforced by the Actor beyond that input value. Actual hotel counts per query are also bounded by how many distinct hotels Google's own search results page surfaces for that query. Hotels are fetched in batches, and review-insight fetches (when enabled) add one extra request per hotel, so runs with review insights and AI enhancement enabled take longer per hotel than a base-only run.

Integrate Google Hotels Scraper With Review Insights and automate your workflow

Google Hotels Scraper With Review Insights works with any language or tool that can send an HTTP request.

REST API integration

import requests
TOKEN = "YOUR_APIFY_TOKEN"
ACTOR_ID = "API-Empire~google-hotels-scraper-with-review-insights"
run = requests.post(
f"https://api.apify.com/v2/acts/{ACTOR_ID}/run-sync-get-dataset-items",
params={"token": TOKEN},
json={
"searchTargets": ["Prague hotels"],
"maxHotels": 10,
"includeReviewInsights": True,
},
)
hotels = run.json()
for hotel in hotels:
print(hotel["title"], hotel["rating"], hotel["reviewInsights"]["locationScore"])

Works in Python, Node.js, Go, Ruby, cURL.

Automation platforms (n8n, Make)

In n8n, the official Apify community node can run this Actor by ID and pass the dataset items downstream to any other node in your workflow. In Make, the Apify app's "Run Actor and Get Dataset Items" module works the same way — configure it with this Actor's ID and your input JSON, and route the hotel and review-insight fields into the rest of your scenario.

Yes — scraping publicly available Google Hotels pages is generally permitted, and this Actor only returns data that is already visible to anyone browsing Google Hotels without logging in. The output is business and product data — hotel listings, prices, amenities, and aggregated review statistics — so the applicable framework is Google's own Terms of Service and database-rights considerations, not GDPR, since the Actor does not extract reviewer names or reviewer profile data. Consult legal counsel for commercial use cases involving bulk personal data.

Frequently asked questions

Does Google Hotels Scraper With Review Insights work without a Google account?

Yes. It reads Google Hotels' publicly accessible search and /reviews pages directly; no Google account or login is required.

How often is the scraped data updated?

Every run performs a live fetch of Google's search results and, when enabled, each hotel's /reviews page — the Actor does not serve cached data between runs.

What happens if a search returns no hotels, or a hotel has no reviews?

If Google's search page yields no hotel links for a query, that query simply produces zero rows for it. If a hotel has no aspect-sentiment data or review excerpts on its /reviews page, the corresponding fields (aspectSentiment, ratingHistogram, reviewExcerpts) come back empty rather than fabricated.

Can I scrape login-gated or private Google Hotels content?

No. Only publicly accessible hotel listing and review pages are scraped; the Actor does not access any login-gated Google account data.

Is review insights a real sentiment analysis, or just raw reviews?

Both, depending on settings. The aspect-sentiment counts, star-rating histogram, qualitative rating label, and location score are parsed directly from Google's own /reviews page markup — they are Google's own pre-computed figures, not generated by the Actor, aside from a simple sentimentScore ratio the Actor derives from the positive/negative counts. The review excerpts themselves are raw, verbatim guest text. Genuine AI-generated sentiment/topic analysis (aiSentiment, aiTopics, aiOverallSentiment, aiTopThemes) only happens if you enable aiEnhancement and supply an AI API key — it is off by default, and those fields stay null otherwise.

Does it work for AI agent workflows and LLM pipelines?

Yes. The Actor is callable as an HTTP endpoint by any agent framework, and every response is typed JSON — hotel and review-insight fields can be passed directly into an LLM context window or agent tool without a parsing step.

How does it handle Google's anti-bot measures?

It escalates through no proxy, then datacenter proxy, then residential proxy, retrying on 403/429/503 responses and on a soft-block pattern where Google returns a full HTTP 200 page that omits the review-excerpt carousel. Proxy configuration is set via proxySettings, defaulting to no proxy.

Does it return data in a format LLMs can use directly?

Yes. Every field is typed, normalized JSON with stable field names — no HTML and no selectors to parse before passing hotel or review data to an LLM or vector store.

Can I use it without managing proxies?

Yes. By default proxySettings is { "useApifyProxy": false } and the Actor only escalates to Apify's own datacenter or residential proxy tiers automatically if Google blocks a request; you don't have to configure or rotate proxies yourself.

What happens when Google Hotels changes its structure or blocks the scraper?

The Actor is maintained, and its output schema is designed to stay stable so integrations built against it keep working — field names and types don't change on your end. No specific update turnaround time is published.

Your feedback

Found a bug, or a field that doesn't match what Google Hotels actually shows? We want to know. Use the Issues tab on this Actor's Apify Console page to report it — that's how we track and prioritize fixes.