# Google Hotels Scraper: Prices from All Booking Sites (`s_actors/google-hotels-scraper`) Actor

Scrape Google Hotels for any city or hotel. Get prices for many dates in one run and compare every booking site: official website, Booking.com, Expedia, Agoda, Hotels.com. Ratings, reviews, stars, amenities, location. Hotel price monitoring & rate parity API. No login. Export CSV, Excel, JSON.

- **URL**: https://apify.com/s\_actors/google-hotels-scraper.md
- **Developed by:** [Superior Actors](https://apify.com/s_actors) (community)
- **Categories:** Travel, E-commerce, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

Scrape [Google Hotels](https://www.google.com/travel/hotels) for any city or hotel and get **prices from all booking sites in one place**: the official hotel website, Booking.com, Expedia, Agoda, Hotels.com, Trip.com and 20+ more. Scrape **up to 365 check-in dates in one run** for price calendars and daily rate monitoring.

Export results as **JSON, CSV, Excel or HTML**, or use it as a **Google Hotels API**.

#### How it works

1. Enter a city or place, e.g. `hotels in Rome`, or paste the hotels you want to track
2. Pick the check-in date, nights and guests
3. Switch on **Prices from all booking sites** if you need the full price comparison
4. Run it: 20 hotels take about 10 seconds

No browser, no Google account, no API key.

#### Why this scraper

| | |
|---|---|
| 🏨 **Whole city** | Pages through all results, not just the first 20 (500+ hotels in big cities) |
| 📅 **Many dates per run** | Every day or every week, up to a year ahead, in a single run |
| 💶 **All booking sites** | 20+ prices per hotel with direct booking links |
| 🔎 **Price comparison built in** | Cheapest site, official website price and the difference (rate parity) |
| 🎯 **Filters** | Hotels or vacation rentals, stars, guest rating, price range |
| 🔁 **Made for monitoring** | Relative dates like `+1 day` keep scheduled runs moving forward |

#### Use cases

- **Hotel revenue management**: track competitor rates for every night ahead
- **Rate parity checks**: see when an online travel agency sells your rooms cheaper than your website
- **Travel apps and price comparison sites**: hotel lists and prices ready for integration
- **Market research**: prices by city, season, star class and location
- **AI agents**: give your assistant live hotel prices through MCP

#### Output

One row per hotel and check-in date.

| Field | Description |
|---|---|
| `name` | Hotel name |
| `type` | `hotel` or `vacation_rental` |
| `stars`, `hotelClass` | Star rating, e.g. `4`, `4-star hotel` |
| `rating`, `reviewsCount` | Google guest rating (0–5) and number of reviews |
| `ratingDistribution` | Number of 1–5 star reviews |
| `pricePerNight`, `priceText` | Lowest price per night, e.g. `184.8`, `€185` |
| `currency` | Price currency |
| `checkInDate`, `checkOutDate`, `nights`, `adults` | The stay the price is for |
| `amenities` | e.g. `Free Wi-Fi`, `Pool`, `Spa`, `Free breakfast` |
| `latitude`, `longitude` | GPS coordinates |
| `checkInTime`, `checkOutTime` | e.g. `3:00 PM`, `12:00 PM` |
| `description`, `thumbnail` | Short description and photo |
| `googleHotelsUrl` | Link to the hotel on Google Hotels for these dates |
| `googlePlaceId`, `googleCid`, `entityId` | IDs to match with Google Maps data |
| `query`, `position` | Your search and the hotel's position in the results |

With **Prices from all booking sites** on, each row also has:

| Field | Description |
|---|---|
| `offers` | Every site: `source`, `isOfficial`, `pricePerNight`, `totalPrice`, `bookingUrl` |
| `cheapestSource`, `cheapestPricePerNight` | The cheapest site and its price |
| `officialPricePerNight` | Price on the hotel's own website |
| `officialVsCheapestDiff` | How much more the official website costs than the cheapest site |
| `priceSpreadPerNight`, `offersCount` | Price range across sites and number of sites |
| `address`, `phone` | Hotel address and phone number |

Example of the price comparison for one hotel:

| Site | Per night | Total (2 nights) |
|---|---|---|
| Bookhotel.direct | €185 | €370 |
| trivago DEALS | €192 | €384 |
| Grand Palace Hotel (official) | €200 | €400 |

#### Pricing

| Event | Price |
|---|---|
| Run start | $0.01 per run |
| Hotel | $0.002 per hotel and date |
| Prices from all booking sites | $0.003 per hotel and date (optional) |

**100 hotels = $0.21** | **100 hotels with all prices = $0.51** | **10 hotels × 30 dates with all prices = $1.51**

Only hotels that pass your filters are charged. Set a maximum cost per run in the run options and the scraper stops there.

#### Input options

| Field | Default | Description |
|---|---|---|
| `queries` | | Searches like `hotels in Paris`, `hotels near Eiffel Tower` |
| `hotels` | | Specific hotels: Google Hotels links or names |
| `checkInDate` | in 7 days | `2026-11-01` or relative, e.g. `+7 days`, `today` |
| `nights` | 1 | Length of stay |
| `numberOfDates` | 1 | How many check-in dates to scrape (up to 365) |
| `dateStepDays` | 1 | Days between dates: 1 = every day, 7 = every week |
| `adults` | 2 | Guests per room |
| `includePrices` | false | Prices from all booking sites |
| `maxHotelsPerSearch` | 100 | Hotels per search and date, 0 = all |
| `propertyType` | hotels | `all`, `hotels` or `vacation_rentals` |
| `minStars`, `minRating` | 0 | Minimum stars and guest rating |
| `minPrice`, `maxPrice` | | Price per night range |
| `onlyWithPrice` | false | Skip properties without a price for the dates |
| `currency`, `language`, `country` | USD, en, us | Prices can differ by country |

#### Daily price monitoring

1. Add your competitors to **Specific hotels**
2. Set **Check-in date** to `+1 day` and **Number of check-in dates** to `60`
3. Switch on **Prices from all booking sites**
4. **Save as a new task** and **Schedule** it every morning
5. Send results to Google Sheets, Slack, email, Make, Zapier or n8n from the **Integrations** tab

#### Send prices to Google Sheets

Keep one sheet with the latest rate for every hotel and date, updated in place after each run (no duplicate rows):

1. Share your Google Sheet with the e-mail shown on [Google Sheets Import & Export](https://apify.com/s_actors/google-sheets-import-export) as Editor
2. In this scraper's task: **Integrations** → **Connect Actor or Task** → choose **Google Sheets Import & Export**
3. Use this input:

```json
{
  "spreadsheetId": "https://docs.google.com/spreadsheets/d/YOUR_SHEET_ID/edit",
  "mode": "update",
  "sheetName": "Hotel rates",
  "datasetId": "{{resource.defaultDatasetId}}",
  "deduplicateByField": "entityId,checkInDate",
  "columnsOrder": ["name", "checkInDate", "pricePerNight", "cheapestSource", "officialPricePerNight"],
  "excludeColumns": ["offers"],
  "addTimestamp": true
}
```

Rows with the same hotel and check-in date are updated, new dates are added. For a price history instead, use `"mode": "append"` with `"sheetName": "Rates {date}"`.

#### Use with AI agents (MCP)

Connect the scraper to Claude, ChatGPT, Cursor or any MCP client:

```
https://mcp.apify.com?tools=s_actors/google-hotels-scraper
```

Example prompts:

> "Find 4-star hotels in Barcelona for next weekend under €150 a night and show which booking site is cheapest."

> "Compare prices of Hotel Adlon Kempinski Berlin on all booking sites for every Friday in November."

#### Examples

**All 4-star+ hotels in Barcelona**

```json
{ "queries": ["hotels in Barcelona"], "checkInDate": "+14 days", "nights": 2, "maxHotelsPerSearch": 0, "minStars": 4, "currency": "EUR" }
```

**Competitor prices for the next 60 nights**

```json
{ "hotels": ["Hotel Adlon Kempinski Berlin", "The Ritz London"], "checkInDate": "+1 day", "numberOfDates": 60, "includePrices": true }
```

**Every Friday for 3 months**

```json
{ "queries": ["hotels in Prague"], "checkInDate": "2026-11-06", "numberOfDates": 13, "dateStepDays": 7, "maxHotelsPerSearch": 50 }
```

#### Ready-made tasks

Open one, change the inputs, and run or schedule it:

- [Hotel Competitor Price Monitoring on All Booking Sites](https://apify.com/s_actors/google-hotels-scraper/examples/hotel-competitor-price-monitoring)
- [Hotel Rate Parity Checker: Official Site vs Booking.com & OTAs](https://apify.com/s_actors/google-hotels-scraper/examples/hotel-rate-parity-checker)
- [All Hotels in a City with Prices, Ratings and Amenities](https://apify.com/s_actors/google-hotels-scraper/examples/all-hotels-in-a-city)
- [Hotel Price Calendar: Nightly Rates for the Next 90 Days](https://apify.com/s_actors/google-hotels-scraper/examples/hotel-price-calendar)
- [Vacation Rental Prices: Apartments & Holiday Homes Data](https://apify.com/s_actors/google-hotels-scraper/examples/vacation-rental-prices)
- [Cheapest Booking Site for Every Hotel: Compare 20+ Sites](https://apify.com/s_actors/google-hotels-scraper/examples/cheapest-hotel-booking-site)
- [Hotel Rate Shopper: Competitor Rates, Same Weekday for 12 Weeks](https://apify.com/s_actors/google-hotels-scraper/examples/hotel-rate-shopper-weekly)
- [Hotels Near a Landmark: Cheapest Booking Site for Each](https://apify.com/s_actors/google-hotels-scraper/examples/hotels-near-landmark)
- [5-Star Hotel Rates: Official Website vs Booking.com and OTAs](https://apify.com/s_actors/google-hotels-scraper/examples/luxury-5-star-hotels)
- [Cheap Hotels Under $100 a Night and Where to Book Them](https://apify.com/s_actors/google-hotels-scraper/examples/cheap-hotels-under-budget)

#### FAQ

**Is there an official Google Hotels API?** No. This scraper is the easiest way to get Google Hotels data via API.

**Why is a price missing for some hotels?** The property is sold out or no site offers a rate for those dates. Use `onlyWithPrice` to skip them.

**Is it legal?** It collects only publicly visible data, without login and without personal data. Check that your use complies with the laws and terms that apply to you.

#### Issues & feedback

Something missing or not working? Open an issue on the **Issues** tab with your run link. We respond quickly.

# Actor input Schema

## `queries` (type: `array`):

Type it like in Google Hotels: a city, district or landmark, e.g. "hotels in Paris", "hotels near Eiffel Tower", "spa hotels in Budapest". Each query is scraped for every check-in date.

## `hotels` (type: `array`):

Track exact hotels, e.g. your competitors. Paste Google Hotels links (google.com/travel/hotels/entity/...) or just hotel names with the city, e.g. "Hotel Adlon Kempinski Berlin".

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

First check-in date. Pick a fixed date, or a relative one like "+7 days" so scheduled runs always look ahead from the day they run (recommended for daily monitoring). Leave empty for 7 days from today.

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

Length of stay.

## `numberOfDates` (type: `integer`):

Scrape many dates in one run: 1 = only the check-in date above, 30 = the next 30 check-in dates. Perfect for price calendars and rate monitoring.

## `dateStepDays` (type: `integer`):

Used with several dates: 1 = every day, 7 = same weekday every week.

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

Number of adult guests per room.

## `includePrices` (type: `boolean`):

Adds every booking site's price for each hotel: the official website, Booking.com, Expedia, Agoda, Hotels.com, Trip.com and more, with booking links. Also shows the cheapest site and how much the official website differs. Charged as an extra event per hotel.

## `maxHotelsPerSearch` (type: `integer`):

How many hotels to return for each query and date. 0 = all hotels Google shows (big cities have 500+). Start small to test.

## `propertyType` (type: `string`):

Google mixes hotels with apartments and holiday homes. Choose what you need.

## `minStars` (type: `integer`):

Only hotels with at least this many stars. 0 = any.

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

Google guest rating from 0 to 5, e.g. 4.2.

## `minPrice` (type: `integer`):

In the selected currency.

## `maxPrice` (type: `integer`):

In the selected currency.

## `onlyWithPrice` (type: `boolean`):

Skip properties that show no price for the selected dates (often sold out).

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

ISO code, e.g. USD, EUR, GBP.

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

Google interface language (hl), e.g. en, de, fr.

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

Google country (gl), e.g. us, gb, de. Prices can differ by country.

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

How many requests run at the same time. Keep the default unless you know you need more.

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

Requests go direct first. If Google blocks them, the scraper retries through this proxy.

## `alwaysUseProxy` (type: `boolean`):

Skip direct requests and send everything through the proxy above.

## Actor input object example

```json
{
  "queries": [
    "hotels in Paris"
  ],
  "nights": 1,
  "numberOfDates": 1,
  "dateStepDays": 1,
  "adults": 2,
  "includePrices": false,
  "maxHotelsPerSearch": 20,
  "propertyType": "hotels",
  "minStars": 0,
  "minRating": 0,
  "onlyWithPrice": false,
  "currency": "USD",
  "language": "en",
  "country": "us",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "alwaysUseProxy": false
}
```

# Actor output Schema

## `overview` (type: `string`):

Table with the main fields: hotel, stars, rating, price per night, cheapest booking site, official website price.

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

Every field, including the full list of booking site offers, amenities and coordinates.

# 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 = {
    "queries": [
        "hotels in Paris"
    ],
    "maxHotelsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/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 = {
    "queries": ["hotels in Paris"],
    "maxHotelsPerSearch": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

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

```

## MCP server setup

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