Google Hotels Scraper With Rate Comparison
Pricing
Pay per usage
Google Hotels Scraper With Rate Comparison
This Google Hotels Scraper extracts pricing, ratings, reviews, amenities, photos, and booking links. Ideal for travel platforms, market researchers, and businesses comparing hotel performance across regions.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
4 days ago
Last modified
Categories
Share
Google Hotels Scraper — Multi-OTA Rate Comparison
Google Hotels Scraper With Rate Comparison searches any destination or hotel keyword on Google Hotels and returns each property's details alongside every OTA rate Google surfaces for it — Booking.com, Expedia, Agoda, Trip.com and others found on the page. Each hotel record carries the full price list, a flagged best deal, the price spread across providers, and provider-disclosed taxes and fees where available, all as structured JSON ready for an LLM or a monitoring pipeline. That turns rate-shopping across OTAs into a repeatable, scheduled job instead of manual price-checking.
What is Google Hotels Scraper With Rate Comparison?
Google Hotels Scraper With Rate Comparison is an Apify Actor that runs a Google Hotels search for one or more destinations and returns a structured JSON record per hotel, including a genuine multi-OTA rate comparison: every booking-site price Google's hotel page displays for that property, not a single headline number. It reads Google Hotels' provider markup directly — a structural DOM class first, with a legacy provider-name list kept only as a fallback — so it can surface OTAs beyond a fixed shortlist. No Google account, OTA login, or API key is required to run it. Key capabilities:
- Search by destination, city, or hotel keyword, with support for multiple destinations in a single run
- Harvest every OTA rate Google Hotels displays per property, keyed by provider name
- Flag the cheapest offer (
bestDeal) and compute the price spread across providers, toggleable viaenrichRateBreakdown - Estimate whole-stay totals per offer from arrival/departure dates, and attach provider-disclosed taxes/fees when present in the OTA's own deep link
- Extract hotel profile data: rating, reviews, star rating, address, phone, website, amenities, GPS coordinates, and photos
- Sort the output by relevance, price, rating, or star rating
What data can you get with Google Hotels Scraper With Rate Comparison?
Every run returns hotel listing records, each carrying a nested multi-OTA offer list and a set of rate-comparison metrics computed from it.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Hotel listing | thumbnail, title, url, address, phone, website, rating, reviews, stars, amenities, gps, aboutHotel, healthAndSafety, addressAndContact, photos, searchQuery | Property research, catalog building, competitive sets |
OTA price offers (prices[]) | provider, price, pricePerNight, priceTotalStayEstimate, currency, taxesAndFees, isBestDeal, link | Rate comparison, distribution audits, meta-search feeds |
| Rate comparison metrics | bestDeal, numberOfOffers, priceSpreadAbs, priceSpreadPct, priceRange, nightsCount | Pricing analysis, revenue management, deal alerts |
Multi-OTA Rate Comparison
This is the field set that separates this Actor from a plain Google Hotels listing scraper. For every hotel, prices is an array of every OTA offer the Actor found on that property's Google Hotels page — provider name, per-night price, an estimated whole-stay total (derived from arrivalDate/departureDate), the OTA's own currency label, and taxes/fees read straight from that provider's booking-link query parameters (never guessed — null when a provider doesn't disclose them). On top of that list, bestDeal names the cheapest provider and price, priceSpreadAbs/priceSpreadPct quantify the gap between the cheapest and most expensive offer, and numberOfOffers counts how many OTAs were found. Setting enrichRateBreakdown to false returns the raw prices list without these derived fields.
{"bestDeal": { "provider": "Booking.com", "price": 142, "link": "https://www.google.com/travel/clk?..." },"priceSpreadAbs": 37,"priceSpreadPct": 26.06,"numberOfOffers": 6}
Hotel Profile Data
Alongside pricing, each record carries the property's profile: name, address, phone, website, star rating, guest rating and review count, amenity list, GPS coordinates, up to 15 photo URLs, a short "about" description, and any listed health-and-safety notes. These fields are read from Google's embedded JSON, the hotel's /location and /details sub-pages, and fall back to a geocoding lookup when GPS coordinates aren't present in the markup.
Why not build this yourself?
Google has no public self-serve API for pulling arbitrary third-party hotel rates — Google's own hotel APIs are partner integrations for properties submitting their own rates, not a general search endpoint for comparing OTA prices across the market. Building this in-house means reverse-engineering Google Hotels' search and entity page markup, tracking its DOM class names as they change, parsing each OTA's own deep-link query parameters for tax/fee data, and handling the throttling and blocking that comes with querying Google at volume. Google Hotels Scraper With Rate Comparison already does that parsing and ships with automatic proxy escalation (no proxy → datacenter → residential) when Google starts blocking requests, so you get structured rate-comparison JSON without maintaining a scraper against a moving target.
How to scrape Google Hotels with Google Hotels Scraper With Rate Comparison?
- Open Google Hotels Scraper With Rate Comparison on Apify and click Try for free (or Start) to open the run console — no external signup or credentials needed.
- Enter one or more destinations in
destinations— a city, area, or hotel keyword such as"Prague hotels". There is no required field; leave it blank and the default query runs. - Set your query controls:
arrivalDate/departureDate,adultsCount/childrenCount,currency, andmaxHotels(how many hotels to process per destination). - Start the run.
- Download the results as JSON or CSV from the run's dataset, or read them via the Apify API.
Example input for a single destination:
{"destinations": ["Prague hotels"],"arrivalDate": "2026-12-01","departureDate": "2026-12-05","adultsCount": 2,"maxHotels": 20}
How to run multiple queries in one job
destinations accepts an array, so a single run can process several searches — each destination is queried in turn, and its hotels are tagged with the originating query in the searchQuery output field, letting you filter one dataset by destination afterward. The Actor also accepts the base actor's original key names (searchQuery, checkInDate, checkOutDate, numberOfAdults, numberOfChildren, currencyCode, maxResults) if you already have JSON built in that shape.
⬇️ Input
Google Hotels Scraper With Rate Comparison has no required fields — every parameter below has a working default so a run can start with an empty input object.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
destinations | No | Array | City, area, or hotel keyword to search. Add several for bulk runs. | ["Prague hotels"] |
maxHotels | No | Integer | How many hotels to process per destination (1–5000). | 10 |
arrivalDate | No | String | Check-in date (YYYY-MM-DD) — drives every OTA's live rate. | "2026-12-01" |
departureDate | No | String | Check-out date (YYYY-MM-DD), must be after arrival. | "2026-12-05" |
adultsCount | No | Integer | Adults per room (1–10). | 2 |
childrenCount | No | Integer | Children per room (0–10), optional. | 0 |
currency | No | String | 3-letter currency code (EUR, USD, GBP...) requested from Google. | "EUR" |
sortOrder | No | String | Order the scraped hotels: relevance, price_low_high, price_high_low, rating_high_low, or stars_high_low. | "relevance" |
enrichRateBreakdown | No | Boolean | ON computes bestDeal, price spread, and taxes/fees; OFF returns only the raw price list. | true |
proxyConfiguration | No | Object | Proxy settings for the underlying requests; starts with no proxy. | {"useApifyProxy": false} |
{"destinations": ["Prague hotels", "Times Square New York"],"maxHotels": 15,"arrivalDate": "2026-12-01","departureDate": "2026-12-05","adultsCount": 2,"childrenCount": 0,"currency": "EUR","sortOrder": "price_low_high","enrichRateBreakdown": true,"proxyConfiguration": { "useApifyProxy": false }}
Common pitfall: the currency you request is the code sent to Google, but the OTA that actually renders the offer may still display its own local currency in prices[].currency — always read the per-offer currency field rather than assuming every price is in your requested code. Also confirm departureDate is after arrivalDate; the Actor uses the gap to compute nightsCount and every priceTotalStayEstimate.
⬆️ Output
Results are written to the run's dataset as one JSON object per hotel and can be exported as JSON, CSV, Excel, or XML directly from the Apify platform.
Scraped results
[{"thumbnail": "https://lh3.googleusercontent.com/gps-cs-s/AB3.../w400-h300","url": "https://www.google.com/travel/hotels/entity/CgoIhoi...","title": "Czech Inn","website": "https://czech-inn.com/","address": "Francouzska 76, 101 00 Praha 10, Czechia","phone": "+420 267 267 600","photos": ["https://lh3.googleusercontent.com/p/AF1QipN.../w800-h600","https://lh3.googleusercontent.com/p/AF1QipO.../w800-h600"],"rating": 4.3,"reviews": 1842,"prices": [{ "provider": "Booking.com", "price": 142, "link": "https://www.google.com/travel/clk?...", "pricePerNight": 35.5, "priceTotalStayEstimate": 142.0, "currency": "EUR", "taxesAndFees": { "tax": 4.2, "fees": null, "total": 4.2 }, "isBestDeal": true },{ "provider": "Hostelworld", "price": 156, "link": "https://www.google.com/travel/clk?...", "pricePerNight": 39.0, "priceTotalStayEstimate": 156.0, "currency": "EUR", "taxesAndFees": null, "isBestDeal": false },{ "provider": "Agoda", "price": 179, "link": "https://www.google.com/travel/clk?...", "pricePerNight": 44.75, "priceTotalStayEstimate": 179.0, "currency": "EUR", "taxesAndFees": { "tax": 5.1, "fees": 2.0, "total": 7.1 }, "isBestDeal": false }],"priceRange": "142 - 179","stars": 3,"amenities": ["Free WiFi", "Air conditioning", "24-hour front desk", "Bar"],"gps": { "lat": 50.0755, "lng": 14.4529 },"aboutHotel": "Casual hostel-style rooms and dorms in a converted apartment building, a short walk from Prague's city centre.","healthAndSafety": ["Contactless check-in available", "Staff required to wear masks"],"addressAndContact": { "address": "Francouzska 76, 101 00 Praha 10, Czechia", "phone": "+420 267 267 600" },"bestDeal": { "provider": "Booking.com", "price": 142, "link": "https://www.google.com/travel/clk?..." },"numberOfOffers": 3,"priceSpreadAbs": 37,"priceSpreadPct": 26.06,"nightsCount": 4,"searchQuery": "Prague hotels"},{"thumbnail": "https://lh3.googleusercontent.com/gps-cs-s/AB4.../w400-h300","url": "https://www.google.com/travel/hotels/entity/CgoIzt2...","title": "The Manhattan at Times Square Hotel","website": "https://www.manhattanhoteltimessquare.com/","address": "790 7th Ave, New York, NY 10019","phone": "+1 212-581-3300","photos": ["https://lh3.googleusercontent.com/p/AF1QipP.../w800-h600"],"rating": 3.9,"reviews": 5231,"prices": [{ "provider": "Expedia", "price": 261, "link": "https://www.google.com/travel/clk?...", "pricePerNight": 261.0, "priceTotalStayEstimate": 1044.0, "currency": "USD", "taxesAndFees": null, "isBestDeal": false },{ "provider": "Priceline", "price": 238, "link": "https://www.google.com/travel/clk?...", "pricePerNight": 238.0, "priceTotalStayEstimate": 952.0, "currency": "USD", "taxesAndFees": { "tax": 28.5, "fees": null, "total": 28.5 }, "isBestDeal": true },{ "provider": "Trip.com", "price": 249, "link": "https://www.google.com/travel/clk?...", "pricePerNight": 249.0, "priceTotalStayEstimate": 996.0, "currency": "USD", "taxesAndFees": null, "isBestDeal": false },{ "provider": "Wego", "price": 265, "link": "https://www.google.com/travel/clk?...", "pricePerNight": 265.0, "priceTotalStayEstimate": 1060.0, "currency": "USD", "taxesAndFees": null, "isBestDeal": false }],"priceRange": "238 - 265","stars": 3,"amenities": ["Fitness center", "Restaurant", "Room service", "Pet friendly"],"gps": { "lat": 40.7614, "lng": -73.9847 },"aboutHotel": "Straightforward rooms in a hotel with a restaurant and a fitness center, steps from Times Square.","healthAndSafety": [],"addressAndContact": { "address": "790 7th Ave, New York, NY 10019", "phone": "+1 212-581-3300" },"bestDeal": { "provider": "Priceline", "price": 238, "link": "https://www.google.com/travel/clk?..." },"numberOfOffers": 4,"priceSpreadAbs": 27,"priceSpreadPct": 11.34,"nightsCount": 4,"searchQuery": "Times Square New York"},{"thumbnail": "https://lh3.googleusercontent.com/gps-cs-s/AB5.../w400-h300","url": "https://www.google.com/travel/hotels/entity/CgoIab3...","title": "Hotel Yasmin Prague","website": "https://www.hotel-yasmin.cz/","address": "Politickych veznu 12, 110 00 Praha 1, Czechia","phone": "+420 234 100 100","photos": [],"rating": 4.1,"reviews": 972,"prices": [{ "provider": "Booking.com", "price": 198, "link": "https://www.google.com/travel/clk?...", "pricePerNight": 49.5, "priceTotalStayEstimate": 198.0, "currency": "EUR", "taxesAndFees": null, "isBestDeal": true },{ "provider": "HomeToGo", "price": 214, "link": "https://www.google.com/travel/clk?...", "pricePerNight": 53.5, "priceTotalStayEstimate": 214.0, "currency": "EUR", "taxesAndFees": null, "isBestDeal": false }],"priceRange": "198 - 214","stars": 4,"amenities": ["Sauna", "Non-smoking rooms", "Free WiFi"],"gps": { "lat": 50.0862, "lng": 14.4348 },"aboutHotel": "Modern rooms near Wenceslas Square with a small wellness area.","healthAndSafety": ["Hand sanitizer in guest accommodation and key areas"],"addressAndContact": {},"bestDeal": { "provider": "Booking.com", "price": 198, "link": "https://www.google.com/travel/clk?..." },"numberOfOffers": 2,"priceSpreadAbs": 16,"priceSpreadPct": 8.08,"nightsCount": 4,"searchQuery": "Prague hotels"}]
How can I use the data extracted with Google Hotels Scraper With Rate Comparison?
- Travel and OTA analysts: compare
prices[].providerandpricePerNightacross a set of properties to measure how consistently a given OTA undercuts or overprices against the market for a destination. - Revenue managers and hoteliers: track
bestDealandpriceSpreadPctfor competitor properties in your set to see when a rival's rate parity breaks down across channels. - AI engineers and LLM developers: have an agent issue a destination query, receive the structured hotel and
pricesJSON back, and ground a travel-planning or price-comparison answer in it instead of the model's own training data. - Price trackers and meta-search builders: feed the raw
pricesarray straight into your own comparison UI or alerting logic without re-deriving best-deal or spread math yourself.
How do you monitor hotel rates across OTAs over time?
Rate monitoring means running the same destination and date range on a schedule and diffing the prices array between runs to catch what changed — a provider dropping out, a new one appearing, or the cheapest offer shifting to a different OTA. Because each hotel record carries bestDeal, priceSpreadAbs, priceSpreadPct, and the full per-provider prices list, you can track the specific signals that matter: has bestDeal.provider changed, has bestDeal.price moved up or down, has priceSpreadPct widened (a sign one OTA is drifting out of parity), or has numberOfOffers dropped (a provider may have sold out or been delisted for that property). It's worth diffing at the offer level too — matching each entry in prices[] by provider between two runs of the same hotel and date range shows exactly which OTA moved its price and by how much, rather than just the aggregate spread. A typical workflow: schedule a run across your tracked destinations and dates, store each run's dataset, compare the new prices and bestDeal values against the previous run for each hotel's title, and alert when priceSpreadPct crosses a threshold you set or when a specific provider's price moves outside your tolerance. Apify's built-in Schedules feature can trigger these runs on a recurring cron interval so the comparison stays current without a manual re-run each time, and each run's dataset remains available afterward for the next comparison.
Integrate Google Hotels Scraper With Rate Comparison and automate your workflow
Google Hotels Scraper With Rate Comparison works with any language or tool that can send an HTTP request.
REST API with Python
import requestsTOKEN = "YOUR_APIFY_TOKEN"ACTOR_ID = "scrapier~google-hotels-scraper-with-rate-comparison"url = f"https://api.apify.com/v2/acts/{ACTOR_ID}/run-sync-get-dataset-items"payload = {"destinations": ["Prague hotels"],"arrivalDate": "2026-12-01","departureDate": "2026-12-05","maxHotels": 20,}resp = requests.post(url, params={"token": TOKEN}, json=payload, timeout=300)hotels = resp.json()for hotel in hotels:print(hotel["title"], hotel.get("bestDeal"))
MCP for query-grounded AI agents
Apify actors are reachable through Apify's MCP Server (https://mcp.apify.com), which exposes any actor as a callable tool by its actor ID — add google-hotels-scraper-with-rate-comparison to make this Actor available. An agent then issues a destination query, the tool call returns the hotel and rate-comparison JSON, and the agent grounds its answer in that live data. Compatible with Claude Desktop, Cursor, and other MCP-capable clients.
Scheduled monitoring and delivery
Set up a recurring run from the Actor's Schedules tab in Apify Console to re-run the same destinations on a cron interval, or trigger runs via the API from your own scheduler. Each run's results land in a fresh dataset you can poll via the API or pull with a webhook.
Is it legal to scrape Google Hotels?
Scraping publicly available Google Hotels results is generally lawful — Google Hotels Scraper With Rate Comparison retrieves only what any visitor to Google Hotels can see on the public page, including OTA rates and hotel profile data, which is business and product-listing data rather than personal data. This kind of data is not typically subject to GDPR or CCPA, though it may still be governed by Google's and each OTA's own Terms of Service, so bulk storage or republishing of scraped content should be checked against those terms. Scraping for a one-off comparison and scraping for continuous, large-scale monitoring carry different risk profiles. Consult your legal team for commercial use cases involving bulk data storage.
Frequently asked questions
Does the currency I set actually control the price shown?
Not fully — currency sets the code requested from Google's search page, but the OTA that renders a given offer may still display its own local currency, which is why every entry in prices[] carries its own currency field. Always read the per-offer currency rather than assuming the requested code applies uniformly.
How do I sort the results?
Use sortOrder: relevance (default) keeps Google's own search-result order; price_low_high, price_high_low, rating_high_low, and stars_high_low re-sort the final list by the extracted value, with hotels missing that value always pushed to the end rather than faked.
How does Google Hotels Scraper With Rate Comparison handle anti-bot measures?
It starts every run with no proxy and automatically escalates to a datacenter proxy, then a residential proxy, only if Google responds with a block status (403, 429, or 503) — you don't need to pre-configure a proxy tier for a run to succeed.
How does the rate comparison actually work?
For each hotel page, the Actor reads every OTA's price block using a structural DOM class as the primary signal (falling back to a legacy provider-name list for older markup), so it isn't limited to a fixed set of booking sites. From that list it flags the cheapest offer as bestDeal, computes priceSpreadAbs/priceSpreadPct between the lowest and highest price found, and reads taxes/fees straight out of each OTA's own deep-link parameters — never estimating a tax/fee figure that isn't disclosed in the link.
How many hotels does Google Hotels Scraper With Rate Comparison return per query?
Up to maxHotels per destination (1–5000, default 10) — the actual count returned also depends on how many distinct hotel listings Google's own search results page contains for that destination.
How do I monitor hotel rates over time with this Actor?
Schedule a run across your destination list and date range, store the dataset from each run, and compare bestDeal, priceSpreadPct, and the prices array per hotel title against the previous run to catch rate or provider changes. See "How do you monitor hotel rates across OTAs over time?" above for the full workflow.
Does Google Hotels Scraper With Rate Comparison work with Claude, ChatGPT, and AI agent frameworks?
Yes — it's reachable through Apify's MCP Server for MCP-capable clients like Claude Desktop and Cursor, and callable as a plain HTTP endpoint from any agent framework that can make a REST call, letting an agent retrieve live hotel and rate data before generating an answer.
Can I use Google Hotels Scraper With Rate Comparison without managing proxies or a Google account?
Yes — no Google account, OTA login, or API key is required, and proxy handling is automatic; you only need to supply your own proxyConfiguration if you want to override the default no-proxy start.
What happens if I turn off enrichRateBreakdown?
The Actor still harvests the full prices list for each hotel, but skips computing bestDeal, priceSpreadAbs, priceSpreadPct, and per-offer priceTotalStayEstimate — useful if you only need the raw rate list and want to run your own comparison logic.
Your feedback
Found a bug or a field that doesn't match what's on the Google Hotels page? Let Scrapier know through the Actor's Issues tab on Apify or the support contact on its Store listing — reports help keep the rate-comparison extraction accurate as Google's markup changes.