# Google Hotels Scraper · Prices, Reviews & Booking-Site Rates (`memo23/google-hotels-scraper`) Actor

Scrape Google Hotels for any city and dates: nightly and total price, deals, rating, stars and amenities, plus the price at every booking site. Track the price of specific hotels across up to 330 check-in dates, and get guest reviews from Google, Tripadvisor and more. Any currency.

- **URL**: https://apify.com/memo23/google-hotels-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Travel, Automation, Agents
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 hotels

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Hotels Scraper

Search Google Hotels for any city, neighbourhood or landmark and get every hotel with its price for your dates: nightly and total price, deal flag, guest rating and review count, rating breakdown, star class, amenities, what guests mention most, and photos. Turn on **hotel details** to add address, coordinates, phone, website, check-in and check-out times, Google Place ID, review topics, and **the price at every booking site** that lists the hotel.

**Track the price of specific hotels across dates**: paste their Google Hotels links, pick a first check-in date and a number of dates, and get one row per hotel per date with the lowest price, the hotel's own price and the price at every booking site.

Turn on **guest reviews** to get one row per review for every hotel found, or paste the Google Hotels links of specific hotels to read their reviews directly: text, score, date, reviewer, the site the review was posted on (Google, Tripadvisor, Trip.com, the hotel chain's own site and others), trip type, room, service and location scores, the owner's reply and photos.

Any currency, any dates up to 30 nights, up to 1,000 hotels per location.

### Why use it

- **Prices for your exact stay.** Check-in, check-out, number of adults and currency go straight into Google's search, so the nightly and total prices are the ones a traveller would see for those dates.
- **Deep results.** Google shows 20 hotels per page; the actor keeps paging, up to 1,000 hotels per location.
- **Booking-site comparison.** With hotel details on, each hotel carries the nightly and total price at Booking.com, Expedia, Hotels.com, Agoda, Trip.com, the hotel's own site and every other site Google lists, cheapest first, with a free-cancellation flag and a link to each offer.
- **A rate calendar for any hotel.** Price tracking prices one hotel, or a list of them, for up to 330 consecutive check-in dates in one run. Each date carries every booking site's nightly price, price with taxes and fees, stay total, free-cancellation flag and a link to the offer, plus the lowest price and the hotel's own price at the top level for charting.
- **Reviews from every source Google shows.** Google Hotels lists its own reviews next to those from Tripadvisor, Trip.com, Priceline, the hotel chain's own site and others. The actor returns them all, or one source, one topic ("Breakfast", "Cleanliness") or a keyword, in the order you pick. There is no cap below what the hotel has: a hotel with 3,000 reviews returns 3,000.
- **Typos do not cost you.** When Google cannot find a place it quietly shows hotels somewhere else. The actor checks for that and returns a free row that says the location was not found, instead of billing you for the wrong city.
- **Reliable.** Requests go through residential proxies with retries, and an empty page is retried from a fresh connection before the actor gives up.

### Use cases

- Hotel price monitoring for a destination and date range
- A daily rate calendar for your hotel and its competitors: lowest price and own-site price for each of the next 30, 90 or 330 days
- Rate parity checks: how the hotel's own price compares with OTAs
- Revenue management and competitive set analysis for hotels
- Travel apps and comparison tools that need hotel lists with prices and coordinates
- Market research on hotel supply, star mix and guest sentiment by city
- Reputation monitoring: the newest reviews of your hotel and its competitors, across review sites
- Review analysis by topic, trip type or score, for a hotel or a whole destination

### Input

| Field | What it does |
| --- | --- |
| **Locations** | `Paris`, `Shibuya, Tokyo`, `near Times Square`. Searched as "hotels in …"; write `hostels in Lisbon` or `resorts in Cancun` for other stay types. |
| **Check-in / check-out date** | YYYY-MM-DD. Defaults to a 2-night stay starting two weeks from today. |
| **Adults** | Guests per room, default 2. |
| **Currency** | USD, EUR, GBP, JPY and 27 more. |
| **Max hotels per location** | Default 20, up to 1,000. |
| **Hotel details** | Adds address, coordinates, phone, website, booking-site prices and review topics. Billed as an extra event per hotel. |
| **Minimum guest rating / star class, maximum price per night** | Optional filters. |
| **Hotels to track** | Google Hotels links (or entity IDs) of hotels to price across dates, with no city search. |
| **First check-in date / number of check-in dates / nights per stay** | The sweep for tracked hotels: default tomorrow, 30 dates, 1 night. Google prices check-ins up to 330 days ahead. Adults and currency apply too. |
| **Price rows** | How tracked prices are written: one row per hotel per date with the booking sites inside it (default), or one flat row per booking site per date for CSV, Excel and BI tools. Billing is the same either way. |
| **Guest reviews for every hotel found** | Adds one row per review for each hotel in the results. Billed per review. |
| **Reviews for specific hotels** | Google Hotels links (or entity IDs) of hotels to read reviews for, with no city search. Leave Locations empty to get reviews only. |
| **Max reviews per hotel** | Default 50. A hotel with fewer returns all it has. |
| **Sort reviews by** | Most recent (default), most helpful, highest score or lowest score. |
| **Review source / topic / search** | Optional filters: one source such as `Google` or `Tripadvisor`, one of the topics Google lists for the hotel such as `Breakfast`, or a keyword such as `parking`. |

#### Example input

```json
{
    "locations": ["Paris", "Shibuya, Tokyo"],
    "checkInDate": "2026-11-20",
    "checkOutDate": "2026-11-23",
    "adults": 2,
    "currency": "EUR",
    "maxResults": 100,
    "includeDetails": true,
    "minRating": 4
}
```

Prices of two hotels for every check-in date of the next 60 days:

```json
{
    "priceHotelUrls": [
        "https://www.google.com/travel/hotels/entity/ChcI6cDSjb3e-ItCGgsvZy8xdGh0MDdyaxAB",
        "ChoI_uTZsvz1i6-bARoNL2cvMTFmZHB6eDEwMxAB"
    ],
    "priceDays": 60,
    "priceNights": 1,
    "currency": "USD"
}
```

Reviews of two specific hotels, newest first:

```json
{
    "hotelUrls": [
        "https://www.google.com/travel/hotels/entity/ChcI6cDSjb3e-ItCGgsvZy8xdGh0MDdyaxAB/reviews",
        "ChoI_uTZsvz1i6-bARoNL2cvMTFmZHB6eDEwMxAB"
    ],
    "maxReviewsPerHotel": 200,
    "reviewsSort": "most_recent"
}
```

Hotels in a city with their 20 lowest-scored Tripadvisor reviews each:

```json
{
    "locations": ["Vienna"],
    "maxResults": 30,
    "includeReviews": true,
    "maxReviewsPerHotel": 20,
    "reviewsSort": "lowest_score",
    "reviewsSource": "Tripadvisor"
}
```

### Output

One row per hotel:

```json
{
    "type": "hotel",
    "location": "Paris",
    "resolvedLocation": "Paris",
    "totalResultsForLocation": 15000,
    "position": 1,
    "name": "The Originals Boutique, Hôtel Maison Montmartre, Paris",
    "entityId": "ChoI_uTZsvz1i6-bARoNL2cvMTFmZHB6eDEwMxAB",
    "pricePerNight": 60,
    "pricePerNightDisplay": "€60",
    "totalPrice": 143,
    "totalPriceDisplay": "€143",
    "nights": 2,
    "currency": "EUR",
    "checkIn": "2026-11-10",
    "checkOut": "2026-11-12",
    "adults": 2,
    "dealLabel": "GREAT DEAL",
    "percentBelowUsual": 36,
    "rating": 4,
    "reviewCount": 2127,
    "ratingDistribution": { "1": 10, "2": 5, "3": 8, "4": 23, "5": 54 },
    "mentions": ["Bar", "Dining", "Service"],
    "hotelClass": 4,
    "propertyType": "tourist hotel",
    "amenities": ["Breakfast ($)", "Free Wi-Fi", "Parking ($)", "Air conditioning", "Pet-friendly", "Bar", "Restaurant", "Airport shuttle"],
    "ecoCertified": true,
    "imageUrls": ["https://lh3.googleusercontent.com/gps-cs-s/..."],
    "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChoI_uTZsvz1i6-bARoNL2cvMTFmZHB6eDEwMxAB?hl=en&ts=..."
}
```

With **hotel details** on, each row also has:

```json
{
    "address": "10 Pl. de la République, 75011 Paris, France",
    "latitude": 48.867437,
    "longitude": 2.365367,
    "phone": "+33 1 43 14 43 50",
    "website": "https://www.ihg.com/crowneplaza/hotels/gb/en/paris/pardl/hoteldetail",
    "neighborhood": "Folie-Méricourt",
    "checkInTime": "3:00 PM",
    "checkOutTime": "12:00 PM",
    "googlePlaceId": "ChIJNeGz9Qhu5kcRZqDtykV9vb0",
    "reviewSources": [{ "source": "Tripadvisor", "reviewCount": 330 }],
    "reviewTopics": [{ "topic": "Breakfast", "mentions": 166, "positive": 129, "negative": 21 }],
    "vendorPrices": [
        {
            "vendor": "Crowne Plaza Paris - Republique by IHG",
            "isOfficialSite": true,
            "pricePerNight": 182.43,
            "pricePerNightWithFees": 219.57,
            "totalPrice": 439.15,
            "totalPriceDisplay": "$439",
            "freeCancellation": false,
            "freeCancellationUntil": null,
            "offer": "Get a lower price plus free Wi-Fi with free enrollment",
            "bookingUrl": null,
            "features": ["Get a lower price plus free Wi-Fi with free enrollment"]
        },
        {
            "vendor": "Booking.com",
            "isOfficialSite": false,
            "pricePerNight": 186.15,
            "pricePerNightWithFees": 223.67,
            "totalPrice": 447.35,
            "totalPriceDisplay": "$447",
            "freeCancellation": false,
            "freeCancellationUntil": null,
            "offer": null,
            "bookingUrl": "https://www.booking.com/hotel/fr/...",
            "features": []
        }
    ]
}
```

For **hotels to track** there is one row per hotel per check-in date (`type: "price"`):

```json
{
    "type": "price",
    "hotelName": "Holiday Inn Vienna City by IHG",
    "entityId": "ChcI6cDSjb3e-ItCGgsvZy8xdGh0MDdyaxAB",
    "checkIn": "2026-10-12",
    "checkOut": "2026-10-13",
    "nights": 1,
    "adults": 2,
    "currency": "USD",
    "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChcI6cDSjb3e-ItCGgsvZy8xdGh0MDdyaxAB/prices?hl=en&ts=...",
    "available": true,
    "lowestPricePerNight": 131.52,
    "lowestPricePerNightWithFees": 151.22,
    "lowestTotalPrice": 151.22,
    "lowestPriceVendor": "Vio.com",
    "officialSitePricePerNight": 166.92,
    "officialSiteTotalPrice": 175.27,
    "vendorCount": 36,
    "note": null,
    "vendorPrices": [
        {
            "vendor": "Vio.com",
            "isOfficialSite": false,
            "pricePerNight": 131.52,
            "pricePerNightWithFees": 151.22,
            "totalPrice": 151.22,
            "totalPriceDisplay": "$151",
            "freeCancellation": null,
            "freeCancellationUntil": null,
            "offer": null,
            "bookingUrl": "https://deals.vio.com/?sig=..."
        }
    ]
}
```

With **Price rows** set to per booking site (`"priceRows": "per_site"`), the same data comes as one flat row per booking site per date (`type: "rate"`), cheapest first within each date:

```json
{
    "type": "rate",
    "hotelName": "Holiday Inn Vienna City by IHG",
    "entityId": "ChcI6cDSjb3e-ItCGgsvZy8xdGh0MDdyaxAB",
    "checkIn": "2026-10-12",
    "checkOut": "2026-10-13",
    "nights": 1,
    "adults": 2,
    "currency": "USD",
    "available": true,
    "vendor": "Vio.com",
    "isOfficialSite": false,
    "rank": 1,
    "pricePerNight": 131.52,
    "pricePerNightWithFees": 151.22,
    "totalPrice": 151.22,
    "totalPriceDisplay": "$151",
    "freeCancellation": null,
    "freeCancellationUntil": null,
    "offer": null,
    "bookingUrl": "https://deals.vio.com/?sig=...",
    "lowestTotalPrice": 151.22,
    "vendorCount": 33,
    "note": null,
    "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChcI6cDSjb3e-ItCGgsvZy8xdGh0MDdyaxAB/prices?hl=en&ts=..."
}
```

With **guest reviews** on, or for hotels given by link, there is one row per review (`type: "review"`):

```json
{
    "type": "review",
    "hotelName": "Holiday Inn Vienna City by IHG",
    "entityId": "ChcI6cDSjb3e-ItCGgsvZy8xdGh0MDdyaxAB",
    "location": "Vienna",
    "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChcI6cDSjb3e-ItCGgsvZy8xdGh0MDdyaxAB/reviews?hl=en",
    "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT25wd1l6WmFjRmQzWjFWcWJEUmxVV2s0UzJaNFZHYxAB",
    "source": "Google",
    "rating": 4,
    "ratingScale": 5,
    "date": "a week ago",
    "dateEstimate": "2026-10-04",
    "isEdited": false,
    "text": "Great hotel, in the centre and near all the famous attractions",
    "originalText": null,
    "isTranslated": false,
    "authorName": "Jane D.",
    "authorUrl": "https://www.google.com/maps/contrib/100000000000000000000?hl=en",
    "authorImageUrl": "https://lh3.googleusercontent.com/a-/...",
    "reviewUrl": null,
    "tripType": "Business",
    "travelGroup": "Family",
    "subRatings": { "rooms": 4, "service": 4, "location": 5 },
    "highlights": ["Quiet"],
    "aspects": [{ "aspect": "Rooms", "rating": 4, "note": null }],
    "ownerResponse": { "text": "Hi Jane, we're delighted to hear you enjoyed our central location...", "originalText": null, "date": "a week ago" },
    "photos": ["https://lh3.googleusercontent.com/grass-cs/..."]
}
```

#### Key fields

| Field | Meaning |
| --- | --- |
| `pricePerNight` / `totalPrice` | Lowest nightly price and the stay total with taxes and fees, in `currency`. `null` when Google shows no price for your dates (sold out or no partner offer). |
| `dealLabel`, `percentBelowUsual` | Google's own deal flag, e.g. "GREAT DEAL", 36% below the usual price. |
| `ratingDistribution` | Share of 5- to 1-star reviews, in percent. |
| `hotelClass` | Official star class. |
| `entityId` | Google's hotel id, stable across runs. Use it to de-duplicate or to re-check prices later. |
| `vendorPrices` | One entry per booking site, cheapest first: nightly price, nightly price with taxes and fees, and stay total, to the cent. Also `freeCancellation` (and until when), the hotel's member `offer`, and `bookingUrl`, the site's own link to the offer. A site Google lists only as a sponsored offer has no `bookingUrl`. `features` repeats the free-cancellation and offer text. |
| `resolvedLocation` | The place Google actually searched. |
| `available`, `note` | Price tracking: `false` when no booking site has a price for that date (sold out, or not on sale yet); `note` says why. Those rows are free. |
| `lowestPricePerNight`, `lowestPricePerNightWithFees`, `lowestTotalPrice`, `lowestPriceVendor` | Price tracking: the cheapest offer for that date. Per-night price before taxes and fees, per-night price with them, and the stay total with them. Where Google shows one all-in price, the first two are equal. |
| `officialSitePricePerNight`, `officialSiteTotalPrice` | Price tracking: the hotel's own site, when Google lists it for that date. |
| `vendorPrices` (price rows) | Every booking site for that date, in the same shape as on hotel rows, without `features`. |
| `rank`, `lowestTotalPrice`, `vendorCount` (rate rows) | Flat price rows: the site's position for that date with 1 the cheapest, the cheapest stay total that date, and how many sites had a price. A date with no price is a single row with `available: false` and no `vendor`. |
| `source`, `reviewUrl` | Where the review was posted. Reviews from partner sites link to the review or the hotel's review page there; Google reviews have `authorUrl`, the reviewer's Google Maps profile. |
| `rating`, `ratingScale` | The score and what it is out of. Most sources use 5, a few use 10. |
| `date`, `dateEstimate` | Google shows review dates as "2 months ago", not as a calendar date. `date` is that text; `dateEstimate` is the day it points to, counted back from the run. |
| `text`, `originalText` | When the review was written in another language, `text` is Google's English translation, `originalText` the reviewer's own words, and `isTranslated` is `true`. |
| `tripType`, `travelGroup` | "Business" or "Vacation", and "Family", "Couple", "Friends" or "Solo", when the reviewer said so. |
| `subRatings` | The reviewer's scores for rooms, service and location, when given. |
| `aspects` | Extra points the reviewer rated or commented on, such as "Walkability" or "Food & drinks". |

### Limits to know

- Prices follow Google's own listing for the dates and guests you send; some hotels show no price for some dates.
- The order of results can shift slightly between pages; the actor removes duplicates by `entityId`.
- Hotel details make one extra request per hotel, so a run with details takes longer.
- Review dates are relative ("3 weeks ago") because that is all Google publishes on this page. Sort by most recent when the order matters more than the exact day.
- Some reviews are a score with no text; `text` is `null` for those.
- Price tracking covers check-ins up to 330 days ahead; Google has no prices beyond that. A sweep that runs past it is cut there.
- The booking sites listed, and their prices, depend on the country the request comes from. Runs on a paid Apify plan price from the United States; free-plan runs follow the proxy country in the input.
- Hotels given under **Reviews for specific hotels** return review rows only; put a hotel under **Hotels to track** for its prices.

### FAQ

**How do I track prices over time?** For specific hotels, put their links under **Hotels to track**, leave the first check-in date empty so each run starts from tomorrow, and schedule the actor daily; join runs on `entityId` and `checkIn`. For a whole destination, schedule a search with the same locations and dates and join runs on `entityId`.

**Can I get tracked prices as a flat table?** Set **Price rows** to one row per booking site per date. Every row then has the same columns, one booking site each, which suits CSV, Excel and BI tools. The cost does not change: a hotel priced for one date is one billed event however many booking sites it has.

**Where do I find a hotel's link or ID?** Open the hotel on google.com/travel and copy the address. The part after `/entity/` is the ID, and every hotel row from a search carries it as `entityId`.

**Which currency do prices use?** The one you pick. It is sent to Google with the search, so it does not depend on where the request comes from.

**What if a location is misspelled?** You get one free row with `error: "location_not_found"` and a message naming what Google showed instead.

**How do I get the reviews of one hotel?** Open the hotel on google.com/travel, copy the address into **Reviews for specific hotels**, and leave Locations empty. Set **Max reviews per hotel** to the number you want.

**How do I follow new reviews?** Schedule the actor with **Sort reviews by** set to most recent and a small **Max reviews per hotel**, and de-duplicate on `reviewId`.

**A hotel returned no reviews. Why?** With a source, topic or search filter, a hotel that has nothing matching returns nothing. A hotel given by link gets one free row that says so and lists the sources or topics its page does have.

**What am I billed for?** Hotel rows, a details event for each hotel when details are on, one event per hotel per priced date in price tracking, and one event per review when reviews are collected. Error rows and dates with no price are free.

### Support

Open an issue on the actor's Issues tab with the input and the run link if a location or field comes back wrong.

### For AI agents and LLM apps

Call with `locations` (array of place names) and optional `checkInDate`, `checkOutDate`, `currency`. Read the default dataset; rows with `type: "hotel"` are results, rows with `error` explain a location that returned nothing. Turn on `includeDetails` when you need coordinates or booking-site prices. To price specific hotels across dates, pass `priceHotelUrls` (Google Hotels links or entity ids) with `priceStartDate` (default tomorrow), `priceDays` (default 30) and `priceNights` (default 1); rows with `type: "price"` carry `lowestTotalPrice`, `officialSiteTotalPrice` and `vendorPrices`, and `available: false` marks a date with no price. Add `"priceRows": "per_site"` for flat rows instead, `type: "rate"`, one booking site per row with `vendor`, `rank` and `totalPrice`. For reviews, pass `hotelUrls` (Google Hotels links or entity ids, e.g. the `entityId` of a hotel row) or set `includeReviews`, with `maxReviewsPerHotel`, `reviewsSort` (`most_recent`, `most_helpful`, `highest_score`, `lowest_score`) and optionally `reviewsSource`, `reviewsTopic`, `reviewsSearch`; rows with `type: "review"` are reviews.

### Disclaimer

This actor reads publicly visible Google Hotels search results, prices and reviews. You are responsible for using the data in line with Google's terms and the laws that apply to you.

### Keywords

google hotels scraper, google hotels api, hotel price scraper, hotel prices, google travel hotels, hotel rate shopping, hotel price comparison, booking.com prices, expedia prices, hotel data, hotel price monitoring, rate parity, travel data scraper, hotel price tracker, hotel rate calendar, google hotels price history, competitor rate shopping, google hotels reviews scraper, hotel reviews scraper, hotel guest reviews, tripadvisor reviews on google, hotel reputation monitoring, hotel review api

# Actor input Schema

## `locations` (type: `array`):

Cities, neighbourhoods or landmarks, for example "Paris", "Shibuya, Tokyo" or "near Times Square". Each is searched as "hotels in <location>"; write "hostels in Lisbon" or "resorts in Cancun" to search for another type of stay. Leave empty when you only want price tracking or reviews for the hotel links below.

## `checkInDate` (type: `string`):

YYYY-MM-DD. Leave empty for two weeks from today.

## `checkOutDate` (type: `string`):

YYYY-MM-DD, after check-in, at most 30 nights later. Leave empty for a 2-night stay.

## `adults` (type: `integer`):

Guests per room.

## `currency` (type: `string`):

Prices are returned in this currency.

## `maxResults` (type: `integer`):

Google lists 20 hotels per page; the actor keeps paging until it has this many. Up to 1,000.

## `includeDetails` (type: `boolean`):

Opens each hotel's page for address, coordinates, phone, website, neighbourhood, check-in and check-out times, Google Place ID, review topics, and the nightly and total price at every booking site that lists it (Booking.com, Expedia, the hotel's own site and more). Billed as an extra event per hotel.

## `minRating` (type: `number`):

Keep only hotels rated at least this (1 to 5). Hotels without a rating are dropped when this is set.

## `minHotelClass` (type: `integer`):

Keep only hotels of at least this many stars (2 to 5).

## `maxPricePerNight` (type: `number`):

In the chosen currency. Hotels above it, or without a price for your dates, are dropped.

## `priceHotelUrls` (type: `array`):

Google Hotels links of the hotels whose prices you want across dates, or their entity IDs. Open the hotel on google.com/travel and copy the address; it contains /entity/ followed by the ID. Each hotel returns one row per check-in date with the nightly and total price at every booking site. Adults and Currency above apply; the search dates above do not.

## `priceStartDate` (type: `string`):

YYYY-MM-DD. Leave empty for tomorrow. Google Hotels prices check-ins up to 330 days ahead.

## `priceDays` (type: `integer`):

How many consecutive check-in dates to price, starting at the first check-in date. 30 covers a month. Billed per hotel per date that has a price.

## `priceNights` (type: `integer`):

Length of the stay priced for each check-in date.

## `priceRows` (type: `string`):

How tracked prices are written. Per date: one row per hotel per check-in date, with the lowest price, the hotel's own price and the list of booking sites inside the row. Per booking site: one flat row per booking site per date, which is easier in CSV, Excel and BI tools. Billing is the same either way: per hotel per priced date.

## `includeReviews` (type: `boolean`):

Adds one row per guest review for each hotel in the results: text, score, date, reviewer, where the review was posted (Google, Tripadvisor, Trip.com, the hotel chain's own site and others), trip type, room, service and location scores, the owner's reply and photos. Billed per review.

## `hotelUrls` (type: `array`):

Google Hotels links of the hotels whose reviews you want, or their entity IDs. Open the hotel on google.com/travel and copy the address; it contains /entity/ followed by the ID. These hotels are read directly, with no city search, and return review rows only.

## `maxReviewsPerHotel` (type: `integer`):

Reviews to collect for each hotel, in the order chosen below. A hotel with fewer returns all it has.

## `reviewsSort` (type: `string`):

The same orders as the reviews tab on Google Hotels.

## `reviewsSource` (type: `string`):

Leave empty for every source. Write "Google", or a partner site as the hotel's page names it, for example "Tripadvisor", "Trip.com" or "Priceline". A hotel that has no reviews from that source returns none.

## `reviewsTopic` (type: `string`):

Only reviews about one of the topics Google lists for the hotel, for example "Breakfast", "Service", "Location" or "Cleanliness". Leave empty for all reviews.

## `reviewsSearch` (type: `string`):

Only reviews that contain this text, for example "parking" or "airport shuttle".

## `maxConcurrency` (type: `integer`):

How many locations to search at once.

## `proxyConfiguration` (type: `object`):

Google Hotels answers reliably through residential proxies.

## Actor input object example

```json
{
  "locations": [
    "Paris"
  ],
  "adults": 2,
  "currency": "USD",
  "maxResults": 20,
  "includeDetails": false,
  "priceDays": 30,
  "priceNights": 1,
  "priceRows": "per_date",
  "includeReviews": false,
  "maxReviewsPerHotel": 50,
  "reviewsSort": "most_recent",
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `hotels` (type: `string`):

Hotels with prices for your dates, ratings, class, amenities, photos and optional booking-site prices.

## `prices` (type: `string`):

Tracked hotels, when price tracking is used: one row per hotel per check-in date with the price at every booking site.

## `rates` (type: `string`):

Tracked hotels when price rows are set to per booking site: one flat row per booking site per check-in date.

## `reviews` (type: `string`):

Guest reviews, when reviews are collected: one row per review with the hotel it belongs to.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Paris"
    ],
    "maxResults": 20,
    "priceDays": 30,
    "maxReviewsPerHotel": 50,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/google-hotels-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": ["Paris"],
    "maxResults": 20,
    "priceDays": 30,
    "maxReviewsPerHotel": 50,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/google-hotels-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Paris"
  ],
  "maxResults": 20,
  "priceDays": 30,
  "maxReviewsPerHotel": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call memo23/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/google-hotels-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/aWrlY8VO6ry6TfQSQ/builds/ERQYSXh5GYVmQJPQ3/openapi.json
