Google Hotels Scraper With Review Insights
Pricing
from $4.99 / 1,000 results
Google Hotels Scraper With Review Insights
Google Hotels Scraper: Collect hotel prices, ratings, reviews, amenities, locations, availability, and property details. Analyze guest feedback, review trends, pricing, and hotel performance to uncover travel market insights and support competitor and hospitality research.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
5 days ago
Last modified
Categories
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. 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 Type | Key Fields | JSON Field Names |
|---|---|---|
| Hotel listing | name, address, phone, website, live OTA prices, hotel class, amenities (grouped), GPS, photos, check-in/out times | title, address, phone, website, prices, priceRange, currency, rating, reviews, stars, amenities, amenityGroups, gps, photos, addressAndContact |
| Review insights | aspect-sentiment breakdown (up to ~29 categories), star-rating histogram in both percent and absolute counts, qualitative rating label, distinct location score, partner-site ratings | reviewInsights.aspectSentiment, reviewInsights.ratingHistogram, reviewInsights.ratingHistogramCounts, reviewInsights.ratingLabel, reviewInsights.locationScore, reviewInsights.reviewSources |
| Guest review excerpts | real verbatim guest quotes, the theme Google grouped them under, the matched topic keyword, optional AI sentiment/topics | reviewExcerpts[].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. The values you actually want are not in the visible markup at all: they live inside the base64/nested-array AF_initDataCallback payload Google embeds in the page, and the check-in date, occupancy and currency are not query parameters but a base64url protobuf ts parameter you have to encode yourself — pass checkin=/currency= on the URL and Google silently ignores them and prices a different, default stay. On top of that Google can answer HTTP 200 with a consent wall instead of the hotel page. This Actor already encodes ts, reads the embedded payload, and detects and retries consent/CAPTCHA responses 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)
- Open the Actor's Input tab on its Apify Store listing (an Apify account is required to run it).
- Add one or more cities, areas, or keywords to
searchTargets(e.g. "Prague hotels", "Paris center"). - Set
checkIn,checkOut,guestAdults,guestChildren,currency, andmaxHotelsfor the search, and choosesortOrderif you want the results re-ranked by price, rating, or stars instead of Google's default relevance order. - Leave
includeReviewInsightson (its default) to get the aspect-sentiment breakdown and review excerpts, or turn it off for a faster, base-only run; optionally enableaiEnhancementwith your own AI API key for sentiment/topic tags. - 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.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
searchTargets | No | array | Cities, areas, or keywords to search — e.g. 'Prague hotels', 'Paris center'. Add multiple for bulk scraping. | ["Prague hotels"] |
maxHotels | No | integer | How many hotels to scrape per search query, 1-5000. | 10 |
checkIn | No | string | Arrival date (YYYY-MM-DD). Affects prices. | "2026-12-01" |
checkOut | No | string | Departure date (YYYY-MM-DD), must be after check-in. | "2026-12-05" |
guestAdults | No | integer | Number of adults, 1-10. Affects room options and pricing. | 2 |
guestChildren | No | integer | Number of children, 0-10. | 0 |
currency | No | string | 3-letter currency code: EUR, USD, GBP, etc. Encoded into Google's own ts search-state parameter, so returned prices really are in this currency. | "EUR" |
sortOrder | No | string | Order 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" |
includeReviewInsights | No | boolean | When ON, fetches each hotel's /reviews sub-page and adds reviewExcerpts (verbatim guest quotes). Turn OFF to skip the excerpts; the aggregate reviewInsights are returned either way. Default true. | true |
maxReviewExcerpts | No | integer | Cap on how many real guest review excerpts to keep per hotel (0-20). Only applies when review insights are enabled. Default 6. | 6 |
aiEnhancement | No | boolean | When 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 |
aiModel | No | string | AI provider/model for sentiment summarization; provider is auto-detected from the model name. Default "claude-haiku-4-5". | "claude-haiku-4-5" |
aiApiKey | No | string (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. | "" |
proxySettings | No | object | Proxy 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 row in the default dataset is one hotel. This is a real, unedited row from a live run (photo/price/aspect/excerpt/amenity arrays trimmed for length):
{"type": "hotel","isChild": false,"thumbnail": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWlycdgUV4W4wHUe2PYJlBxyPJaImByIdd2MbBWJRdDgS618bTUCGrYZ07K6ly63_VSKIhDgM6YprXJKGq5_fDVSacRZ1Qq9os_D5Tyk9vyeT876m0k5JML0-wakbX18fvZ5FzQ=s150-w92-h150-n-k-no","url": "https://www.google.com/travel/hotels/entity/ChkIjNfZ69iY1NFPGg0vZy8xMXJzY2YxY2dwEAE","title": "The Julius Prague","website": "https://www.thejulius.eu/","address": "Senovážné nám. 3, 110 00 Nové Město, Czechia","phone": "+420 233 111 222","photos": ["https://lh3.googleusercontent.com/gps-cs-s/AHRPTWlycdgUV4W4wHUe2PYJlBxyPJaImByIdd2MbBWJRdDgS618bTUCGrYZ07K6ly63_VSKIhDgM6YprXJKGq5_fDVSacRZ1Qq9os_D5Tyk9vyeT876m0k5JML0-wakbX18fvZ5FzQ=s287-w287-h192-n-k-no-v1","https://lh3.googleusercontent.com/gps-cs-s/AHRPTWlHWnX3nTpor35czSXE5nmU1IJfqtCn9Kleuno9Z5f5dHEndO6lmBMVZJ65Q5xMQKLe7YHNeShIOBeDzKMGC3Qqjkgc5jaBVIrXMi-ZhRP7L3ICWYLVpu2Nzdr3ZJM2nSGk81Ra=s287-w287-h192-n-k-no-v1"],"rating": 4.8,"reviews": 1427,"reviewInsights": {"ratingLabel": "Excellent","locationScore": 4.8,"aspectSentiment": [{"aspect": "Service","label": "Service","positive": 322,"negative": 24,"count": 358,"sentimentScore": 0.931,"googleSentimentScore": 0.7457},{"aspect": "Property","label": "Property","positive": 314,"negative": 8,"count": 331,"sentimentScore": 0.975,"googleSentimentScore": 0.8131}],"ratingHistogram": {"5star": 93,"4star": 6,"3star": 1,"2star": 0,"1star": 0},"ratingHistogramCounts": {"5star": 1282,"4star": 91,"3star": 26,"2star": 14,"1star": 14},"reviewSources": [{"source": "Tripadvisor","rating": 4.9,"reviews": 289},{"source": "Trip.com","rating": 4.8,"reviews": 282}],"aiOverallSentiment": null,"aiTopThemes": null},"reviewExcerptsCount": 6,"reviewExcerpts": [{"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2s1c2RGZHpTM3ByYzJKS2FVVkxNVGhQTm1aMlJsRRAB","theme": "Exceptional breakfast buffet offers a wide variety of food including locally sourced organics","topic": "rich and personalized breakfast","text": "A spacious room, a rich and personalized breakfast (I informed the staff in advance that I am vegan,","aiSentiment": null,"aiTopics": null},{"reviewId": "ChdDSUhNMG9nS0VJQ0FnTUNnX3A2N21nRRAB","theme": "Features luxe, generously sized modern rooms with USB sockets","topic": "modernly equipped room","text": "The room was spacious, modernly equipped, and exceptionally clean.","aiSentiment": null,"aiTopics": null}],"prices": [{"provider": "Super.com","price": 186,"priceDisplay": "€186","totalPrice": 559,"totalPriceDisplay": "€559","link": "https://www.google.com/travel/lodging/clk?pc=AA80OswU5Ifzm4FazY2Z-tNnhugqPAB76ToIYW2ly9wTatcyfb0Mvcu1HDJBU-ZMeZP09fYO363iGYR2Hr-KxwWCtKKo5MJDnw5EjWp-GAGj1zwNNhAQgFhlKMvvwYmdl1yRzVmcTqlkpkrckT6chMIK4HR7yp9_JtcuIUqparv7_ObCz-9_vGp4uSun0A&pcurl=https://www.super.com/travel/transition/?data%3Dprice%3D2360.43%2526total_price%3D2643.66%2526retail_price%3D4089.21%2526retail_total_price%3D4579.87%2526surcharge%3D52.63%2526request_id%3D12487396546482982912%2526ps%3D1671434612%2526pb%3D0-slAkZlDjP06IhVxwa_7NwMdHDEh5lUTsyUMvXSulumoJFWXdqH1SBetg98pr_NC2zKwMYpBOGovK-_PN58RvAanVZYLkmdoJhyznZqYdS3pnL04GlC-9lUlttsmgGrthx0BaTLtdTy387ynTvfOHSyGq6Vm70ot0QQfDPcEt4%25253D%2526gha_pull_request%3DTrue%2526alwd_rand%3Dfalse%2526gt%3D1787464004%2526sg%3Drr5Fz%2526sid%3DGHA_MD8%2526cmab_id%3D33%2526xb%3Dc%2526ib%3Dfalse%2526hga%3Dmd2%2526hgs%3D5%2526all_inclusive%3Dfalse%26utm_source%3Dgha%26utm_content%3Dlocaluniversal%26currency%3DPLN%26user_country%3DUS%26verification%3Dfalse%26rate_rule_ids%3D%26date_type%3Dselected%26rate_rule_id%3Dsignedout_desktop%26display_currency%3DEUR%26display_all_inclusive_price%3D624.93%26checkin_at%3D2026-09-20%26checkout_at%3D2026-09-23%26provider_hotel_id%3D10015630294%26provider%3Dean%26num_adults%3D2%26children%3D%5B%5D%26hotel_campaign%3D%26utm_campaign%3D%26user_locale%3Den-US%26user_list_id%3D%26utm_medium%3Dorganic%26utm_id%3Dgha_organic&s=AD1XQnmTFDfEd4D-GA7Go0RHboDM&ap=1"},{"provider": "Agoda","price": 202,"priceDisplay": "€202","totalPrice": 606,"totalPriceDisplay": "€606","link": "https://www.google.com/travel/lodging/clk?pc=AA80Osz3SsZDnQ61NK8DVrHA2vC6-Q_szFtFMhVTpbkLc98sEuO-Y8AyIizb74oulsRKVYKjVZmo13RBcxfz1B1elM3wPLYpD9IHpN7NbReYHMShzpqff2buMpVPl_QhpMh4dvStZ_Wkz3k-BBHMQOq7mB9LJaj6upVYesNCkmyXNIdQafyEP3KQytZp3mj_lA&pcurl=https://www.agoda.com/partners/partnersearch.aspx?site_id%3D1917614%26CkInDay%3D20%26CkInMonth%3D09%26CkInYear%3D2026%26CkOutDay%3D23%26campaignid%3D%26CkOutMonth%3D09%26CkOutYear%3D2026%26SearchDateType%3Dselected%26NumberOfAdults%3D2%26LT%3D28%26NumberOfChildren%3D0%26childages%3D%26NumberOfRooms%3D1%26gsite%3Dlocaluniversal%26los%3D3%26PartnerCurrency%3DEUR%26hid%3D47329725%26RoomID%3D%26masterRoomId%3D450434534%26PriceTotal%3D678.41%26PriceTax%3D72.69%26PriceFee%3D0.00%26RatePlan%3D%26UserCountry%3DUS%26Currency%3DEUR%26UserDevice%3Ddesktop%26Verif%3Dfalse%26rr%3DUS_pull%26audience_list%3D%26mcid%3D28033%26booking_source%3Dcpc%26adType%3D0%26mpt%3DZUlyV3FDSk9OeGtuNE1CMlZjbjVrSS8wZkFCRkpTZFlpOGVhN2ZYRm96VlRtKzh0WlhJQ05SRC9lOXZiemlnelU3OC94ZlJrY1RDT2lRPT0%26original_rr%3DUS_pull%26gaClickSrc%3D%26clickType%3Dhotel%26lang%3Den%26pkgId%3D&s=AD1XQnlEB8_ig7ne9v6Gi_jCECMX&ap=1"}],"priceRange": "186 - 271","currency": "EUR","stars": 5,"amenities": ["Wi-Fi","Wi-Fi in public areas","Smoke-free property","Credit cards","Debit cards","Cash"],"amenityGroups": {"Internet": ["Wi-Fi","Wi-Fi in public areas"],"Policies & payments": ["Smoke-free property","Credit cards","Debit cards","Cash"]},"gps": {"lat": 50.085925499999995,"lng": 14.4303774},"aboutHotel": null,"healthAndSafety": [],"addressAndContact": {"address": "Senovážné nám. 3, 110 00 Nové Město, Czechia","phone": "+420 233 111 222","checkIn": "3:00 PM","checkOut": "11:00 AM"},"searchQuery": "Prague hotels","scrapedAt": "2026-08-23T07:41:27Z"}
Every value above is read out of Google's own embedded search payload for that hotel. Fields Google does not publish for a given property come back null or empty — they are never guessed or filled from another hotel. In practice the two you will see empty most often are:
stars— Google's official hotel-class chip ("5-star hotel"). Google publishes it for only a subset of listings; it is markedly more common in some markets (most Barcelona hotels have it, most Prague hotels do not). It is not the guest rating — that israting.healthAndSafety— Google retired the per-property health & safety panel it introduced in 2020. The Actor still reads that section when a listing carries one, but for current listings it is normally empty. The nearest live equivalent is theEco certifications/ sustainability group insideamenityGroups.
aboutHotel is Google's editorial description; a minority of properties have none.
Hotels vs vacation rentals
Google mixes short-let apartments and vacation rentals into its hotel search results, and it publishes far less structured data for them: no street address, no phone number, no hotel class and no guest-aspect sentiment. The Actor labels every row with Google's own category in type ("hotel" or "vacation_rental") so you can filter, and for rentals it falls back to the sources Google does provide — the partner-supplied description, the amenity chip list, and verbatim partner reviews (Booking.com, Tripadvisor, Trip.com) as reviewExcerpts. Expect address, phone, stars and reviewInsights.aspectSentiment to be empty on vacation_rental rows: that is the source, not the scraper.
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 how many hotels are scraped per search query. The real ceiling per query is set by Google: its hotel search page server-renders roughly 18-20 distinct properties for a query, and there is no server-rendered "next page" to follow, so a single query yields up to about 20 hotels no matter how high you set maxHotels. The Actor logs the number Google actually returned and scrapes all of them rather than padding the result set. To cover more properties, add more entries to searchTargets (for example several neighbourhoods of the same city) — each query is scraped independently and capped at maxHotels.
Each hotel costs exactly one extra HTTP request, so runs stay fast: 16 hotels across 2 queries completes in well under a minute.
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 requestsTOKEN = "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.
Is it legal to scrape Google Hotels?
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 (percent and absolute counts), qualitative rating label, and location score all come from the hotel's own /reviews page — the counts and histogram out of Google's embedded data payload, the label and location score out of that page's 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 sends a pre-accepted Google consent cookie (without one, an EU exit IP is redirected to consent.google.com and no hotel payload renders), pins Apify proxy exits to the US for the same reason, and escalates through no proxy → datacenter → residential, retrying on 403/429/503 and on soft blocks where Google answers HTTP 200 with a consent or CAPTCHA page. If you supply your own proxySettings, escalation only ever moves to a stronger tier — a residential setup is never downgraded to datacenter. Apify's GOOGLE_SERP group is deliberately not used: it only accepts /search URLs and rejects /travel/* with HTTP 400.
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.