# Google Hotels Scraper: Prices, Ratings & Reviews (`fguiraud/google-hotels-scraper`) Actor

Scrape Google Hotels for any city and dates: price per night and total with taxes, star class, rating, reviews, amenities, review topics, nearby places, photos and website. Up to 150 hotels per location, price monitoring for daily alerts. No login. Pay per hotel.

- **URL**: https://apify.com/fguiraud/google-hotels-scraper.md
- **Developed by:** [Fernando Guiraud](https://apify.com/fguiraud) (community)
- **Categories:** Travel, E-commerce, AI
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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.

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

Get hotel prices for any city and dates from Google Hotels: price per night and total stay with taxes, star class, guest rating and reviews, amenities, what guests praise or complain about, nearby places, photos and the hotel's website. Up to 150 hotels per location, and a built-in **price monitor** that tells you which hotels got cheaper or more expensive since the last run. No login, no API key. Pay per hotel.

#### What you get

- **Prices for your dates and guests**: price per night, total for the stay, taxes and fees, in the currency you choose (USD, EUR, MXN...).
- **Quality signals**: official star class, Google rating, number of reviews and the 1-5 star breakdown.
- **Review topics**: what guests mention (breakfast, cleanliness, service, Wi-Fi...) with positive and negative counts.
- **Amenities**: free Wi-Fi, breakfast, parking, pool, spa, air conditioning...
- **Location**: coordinates, nearby attractions, transit, airport and restaurants with travel times.
- **Links**: the hotel's own website and its Google Hotels page (prices by booking site).
- **More than one page**: Google shows about 20 hotels per search. Above 20, the Actor combines searches by star class and sort order and removes duplicates, so you get up to ~100-150 hotels per location.
- **Price monitor**: schedule a daily run and get `priceChange`, `priceChangePercent` and `priceStatus` (up, down, unchanged, new) per hotel, or only the hotels whose price moved.

#### How to use it

1. Add one or more **locations**: a city ("Panama City, Panama"), a neighborhood ("Paris 7th arrondissement"), a landmark ("hotels near Times Square") or any search ("resorts in Cancun").
2. Set the **check-in date** and **nights** (or a check-out date), **adults** and **children ages**.
3. Optional: currency, star class, minimum rating, sort order and how many hotels per location.
4. Press **Start**. Export the results to JSON, CSV or Excel, or use the API.

#### Input example

```json
{
  "locations": ["Panama City, Panama"],
  "checkIn": "2026-12-20",
  "nights": 3,
  "adults": 2,
  "currency": "USD",
  "maxHotelsPerLocation": 20
}
```

#### Output

One row per hotel. Real result from a run on 2026-10-07 (photos, review topics and nearby places shortened):

```json
{
  "name": "Hotel Riu Plaza Panama",
  "hotelId": "0x10515a254989c261:0x3f48a8db00ae587b",
  "hotelClass": 5,
  "type": "5-star hotel",
  "rating": 4.6,
  "reviewCount": 11238,
  "pricePerNight": 118.84,
  "pricePerNightText": "$119",
  "pricePerNightWithTaxesText": "$131",
  "totalPrice": 392.16,
  "taxesAndFees": 35.64,
  "currency": "USD",
  "checkIn": "2026-12-20",
  "checkOut": "2026-12-23",
  "nights": 3,
  "address": null,
  "phone": null,
  "website": "https://www.riu.com/en/hotel/panama/panama-city/hotel-riu-plaza-panama?utm_source=google&utm_medium=organic&utm_campaign=my_business&utm_content=ZPY",
  "latitude": 8.9814458,
  "longitude": -79.5212564,
  "checkInTime": "3:00 PM",
  "checkOutTime": "12:00 PM",
  "amenities": [
    "Free breakfast",
    "Free Wi-Fi",
    "Parking ($)",
    "Outdoor pool",
    "Air conditioning",
    "Fitness center",
    "Spa",
    "Bar"
  ],
  "ratingDistribution": {
    "1": 277,
    "2": 189,
    "3": 549,
    "4": 2213,
    "5": 8010
  },
  "reviewHighlights": [
    {
      "aspect": "Breakfast",
      "mentions": 284,
      "positive": 250,
      "negative": 13
    },
    {
      "aspect": "Service",
      "mentions": 344,
      "positive": 241,
      "negative": 94
    },
    {
      "aspect": "Property",
      "mentions": 398,
      "positive": 299,
      "negative": 71
    }
  ],
  "nearbyPlaces": [
    {
      "name": "Poin Panamá",
      "kind": "attraction",
      "travelTime": "9 min"
    },
    {
      "name": "McDonalds Marbella",
      "kind": "transit",
      "travelTime": "2 min"
    },
    {
      "name": "Tocumen International Airport Panama",
      "kind": "airport",
      "travelTime": "31 min"
    }
  ],
  "photos": [
    "https://lh3.googleusercontent.com/grass-cs/ACvplmPZTeHkpS8J13AJATM0o6pa0gJ-ICxBzIDoxpQWAaKAwT0o9Fhkl13EhdfXM8Diz8KCTciXx3D1K7c0kDUD1crLno__Yf_gbULGsYvLZyIEe9Hq497tZgpQqvlFaFhG1wsmMp6JFHN0BFw=s287-w287-h192-n-k-no-v1"
  ],
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChkI-7C5hbCbqqQ_Gg0vZy8xMWI2X3Bra3RjEAE",
  "searchedLocation": "Panama City, Panama",
  "adults": 2,
  "status": "ok"
}
```

Fields that Google does not show for a hotel are `null` (for example vacation rentals have no star class).

#### Price monitoring

Turn on **Monitor price changes** and schedule the run (for example every morning). Each run compares every hotel's price per night with the previous run of the same search (same location, dates, guests, currency and filters) and adds:

- `previousPricePerNight`, `priceChange`, `priceChangePercent`;
- `priceStatus`: `down`, `up`, `unchanged`, `new` (not seen in the previous run) or `first-check`.

With **Only hotels whose price changed**, unchanged hotels are skipped and not charged. Google rotates part of the list between searches, so some hotels appear as `new` even if they existed before.

#### Pricing

Pay per hotel returned (see the Pricing tab). Locations that fail are not charged, and with price monitoring you can skip (and not pay for) hotels whose price did not change.

#### Use with AI agents (MCP)

Available as an MCP tool at `https://mcp.apify.com/?tools=fguiraud/google-hotels-scraper` for Claude, ChatGPT, Cursor and other MCP clients.

Agent-friendly input: common field names such as `location`, `destination`, `city` or `query` are accepted, and an empty input runs a small sample.

#### FAQ

- **Which dates can I search?** From today up to about 11 months ahead (what Google Hotels shows), stays of 1 to 30 nights.
- **Why is a price missing?** Google shows no price when a hotel is sold out or has no offers for your dates; the row still has the hotel's other data.
- **Is the price the cheapest one?** It is the lowest price Google shows for the hotel across booking sites, per night before taxes; `totalPrice` includes taxes and fees.
- **Is it legal?** The Actor reads public information shown on Google Hotels. It does not log in and collects no personal data.
- Found a problem or need a feature? Open an issue on the **Issues** tab. Replies within 48 hours.
- **Did it save you time?** A short review on the **Reviews** tab helps other people find this Actor.

# Changelog

This Actor's version history is a separate document: https://apify.com/fguiraud/google-hotels-scraper/changelog.md

# Actor input Schema

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

Cities, neighborhoods, landmarks or full searches, one per line: 'Panama City, Panama', 'Paris 7th arrondissement', 'hotels near Times Square', 'resorts in Cancun'. Plain place names become 'hotels in <place>'.

## `checkIn` (type: `string`):

YYYY-MM-DD. Empty = 14 days from today. Google shows prices up to about 11 months ahead.

## `checkOut` (type: `string`):

YYYY-MM-DD. Empty = check-in plus 'Nights'.

## `nights` (type: `integer`):

Length of stay when no check-out date is given.

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

Number of adult guests. Prices change with the number of guests.

## `childrenAges` (type: `array`):

One age (0-17) per child, e.g. 5 and 9. Empty = no children.

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

3-letter currency code for prices: USD, EUR, GBP, MXN, BRL, INR...

## `maxHotelsPerLocation` (type: `integer`):

Google shows about 20 hotels per search. Above 20, extra searches by hotel class and sort order are combined (duplicates removed) to reach up to about 100-150 hotels per location.

## `hotelClass` (type: `array`):

Only these star ratings. Empty = all.

## `minRating` (type: `string`):

Only hotels with at least this Google rating.

## `sortBy` (type: `string`):

Order Google uses for the results.

## `monitorPrices` (type: `boolean`):

Remember each hotel's price (in a key-value store named 'google-hotels-price-monitor' in your account) and add previousPricePerNight, priceChange, priceChangePercent and priceStatus (up, down, unchanged, new) compared with the previous run of the same search. Schedule the run daily to track prices.

## `onlyPriceChanges` (type: `boolean`):

With price monitoring: return (and charge) only hotels that are new or whose price moved since the previous run.

## `language` (type: `string`):

Google interface language (en, es, de, fr, pt...). Affects texts such as amenities and the hotel type.

## `country` (type: `string`):

2-letter country of the Google edition (us, gb, mx, es...). Some prices and taxes depend on it.

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

How many locations are searched at the same time.

## `failOnError` (type: `boolean`):

Mark the run as failed when an item fails or nothing is found. Useful for scheduled monitoring (Apify emails you on failed runs).

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

Apify Proxy is used by default.

## Actor input object example

```json
{
  "locations": [
    "Panama City, Panama"
  ],
  "nights": 1,
  "adults": 2,
  "currency": "USD",
  "maxHotelsPerLocation": 20,
  "minRating": "any",
  "sortBy": "relevance",
  "monitorPrices": false,
  "onlyPriceChanges": false,
  "language": "en",
  "country": "us",
  "maxConcurrency": 3,
  "failOnError": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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": [
        "Panama City, Panama"
    ],
    "maxHotelsPerLocation": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("fguiraud/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": ["Panama City, Panama"],
    "maxHotelsPerLocation": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("fguiraud/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": [
    "Panama City, Panama"
  ],
  "maxHotelsPerLocation": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call fguiraud/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fguiraud/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/qh5LlwyBkHpcqFhWO/builds/BRIQS9pWogQyfZcSq/openapi.json
