# Google Hotels Scraper (`harbourdata/google-hotels-scraper`) Actor

Hotel prices for any dates, plus ratings, star class, location and the full list of booking-site prices (Booking.com, Expedia, the hotel's own site and more) from Google Hotels.

- **URL**: https://apify.com/harbourdata/google-hotels-scraper.md
- **Developed by:** [Harbour Data](https://apify.com/harbourdata) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.90 / 1,000 property results

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: prices, booking sites and price calendars

Get hotel prices from Google Hotels for **any dates**, plus ratings, star class, address, location and the **price from every booking site** (Booking.com, Expedia, Trip.com, Agoda, the hotel's own website and more). Track one hotel's price across **up to 180 check-in dates** in a single run.

No Google account, API key or login needed. You only pay for results.

### What you can do with it

- **Search a destination:** "Paris", "Shoreditch London" or "5 star hotels in Rome" returns every listed property with its nightly price, total price, taxes, rating, star class and location.
- **Compare booking sites:** for each hotel, see what Booking.com, Expedia, Trip.com, Agoda, the official site and others charge for your exact dates, with booking links.
- **Build a price calendar:** paste a hotel link and set *Price calendar* to 60. You get the price for every check-in date over the next two months, so you can spot the cheapest and most expensive nights.
- **Filter:** hotels only or holiday rentals only, or a minimum guest rating. Filtered-out properties are free.

### Who uses it

- **Hotels and revenue managers:** check your rates against competitors and against each booking site, for the dates that matter.
- **Travel startups and analysts:** build price indexes, track seasonality and events, and compare cities.
- **Agencies and researchers:** build lists of properties in an area, with ratings, star class, address and phone.

### Quick start

1. Type a destination under **Destinations or searches**, for example `Paris`.
2. Pick your **check-in and check-out dates**, **adults** and **currency**.
3. Click **Start**. Results appear in the Output tab, and you can export them to Excel, CSV or JSON, or use them through the API.

**Price calendar example:**

```json
{
  "hotelUrls": ["https://www.google.com/travel/hotels/entity/ChkIseK87saGv4e2ARoML2cvMTF4dngxM2t3EAE"],
  "checkInDate": "2026-12-01",
  "checkOutDate": "2026-12-02",
  "priceCalendarDays": 60,
  "currency": "GBP"
}
```

This returns 60 rows, one per check-in date, each for a 1-night stay. To find a hotel's link, open it on Google Hotels and copy the address bar.

### Output (one row per property, or per property and date)

```json
{
  "name": "InterContinental Barcelona by IHG",
  "propertyType": "hotel",
  "starClass": 5,
  "rating": 4.6,
  "reviewCount": 5210,
  "address": "Av. de Rius i Taulet, 1-3, Sants-Montjuïc, Barcelona",
  "phone": "+34 ...",
  "latitude": 41.37, "longitude": 2.15,
  "checkInDate": "2026-12-18", "checkOutDate": "2026-12-20", "nights": 2,
  "currency": "GBP",
  "pricePerNight": 162.16, "totalPrice": 324.32, "taxesAndFees": 29.47,
  "offers": [
    { "source": "Trip.com", "pricePerNight": 175.01, "totalPrice": 350.02, "bookingUrl": "https://www.google.com/travel/lodging/clk?..." },
    { "source": "Agoda", "pricePerNight": 203.78, "totalPrice": 407.56, "bookingUrl": "https://www.google.com/travel/lodging/clk?..." }
  ],
  "ratingHistogram": { "5": 3400, "4": 1100, "3": 400, "2": 150, "1": 160 },
  "reviewTopics": [{ "topic": "Breakfast", "mentions": 262, "positive": 201, "negative": 38 }],
  "hotelUrl": "https://www.google.com/travel/hotels/entity/...",
  "searchQuery": "5 star hotels in Barcelona",
  "position": 1
}
```

Each row also includes the description, check-in and check-out times, website, images and a Google Maps ID. The values above are illustrative.

### Pricing

Pay per result, with **no start fee**. You're charged for each property saved, and booking-site prices are an optional small extra. Properties removed by your filters, and failed requests, are never charged. You can cap the cost of any run in the run options.

### Reliability

- Every run either returns data or **fails with a clear reason**. It never shows an empty run as a success.
- Blocked requests are retried automatically with a fresh connection.
- Each run saves a `RUN_SUMMARY` (requests, retries, failures) in its key-value store.

### Use it from code, AI agents and automations

Call it from Python or JavaScript with the official Apify client (`pip install apify-client` or `npm i apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("harbourdata/google-hotels-scraper").call(run_input={
    "queries": ["Lisbon"],
    "checkInDate": "2027-03-12",
    "checkOutDate": "2027-03-14",
    "currency": "EUR",
    "maxResultsPerQuery": 100,
})
for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(hotel["name"], hotel["pricePerNight"], hotel["rating"])
```

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('harbourdata/google-hotels-scraper').call({
    hotelUrls: ['https://www.google.com/travel/hotels/entity/ChkIseK87saGv4e2ARoML2cvMTF4dngxM2t3EAE'],
    checkInDate: '2027-01-05', checkOutDate: '2027-01-06',
    priceCalendarDays: 60,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.table(items.map((r) => ({ date: r.checkInDate, price: r.pricePerNight })));
```

It also works without code in **Make, Zapier, n8n and Google Sheets** through Apify's integrations, and AI assistants such as ChatGPT and Claude can call it through the Apify MCP server.

### FAQ

**How fresh are the prices?** They're fetched live when you run it. Hotel prices change constantly, so schedule runs (daily or weekly) to track them.

**Why is the address empty for some holiday rentals?** Google hides the exact address of private rentals until you book, so only the map location (`latitude`, `longitude`) is available for them. Hotels always have their full address.

**Why does a hotel have no price for some dates?** Google shows no price when the hotel is sold out or not bookable for those dates. Those rows are marked `"availability": "no_price_for_these_dates"`.

**Which booking sites appear?** The ones Google shows for that hotel, those dates and that market. Set **Google country** (for example `gb` or `us`) to see a market's sites.

**Do booking links last?** They are Google redirect links and expire after a while, so use them soon after the run.

**Something broke, or you need a feature?** Open an issue on the Issues tab. Fixes are usually quick.

### More from Harbour Data

- [Workday Jobs Scraper](https://apify.com/harbourdata/workday-jobs-scraper): every open job from any company's Workday careers site, with stated salaries and a daily new-jobs mode.

Data source: [Google Hotels](https://www.google.com/travel/hotels).

*Independent tool, not affiliated with or endorsed by Google.*

# Actor input Schema

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

A city, area or landmark ("Paris", "Shoreditch London") or a full search ("5 star hotels in Rome"). Plain places are searched as "hotels in <place>".

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

Google Hotels links (…/travel/hotels/entity/…) or hotel tokens. Each returns that hotel's full details and booking-site prices for your dates.

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

YYYY-MM-DD. Leave empty for tomorrow.

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

YYYY-MM-DD, 1–30 nights after check-in. Leave empty for a one-night stay.

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

Number of adult guests per room.

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

3-letter code, e.g. USD, EUR, GBP.

## `maxResultsPerQuery` (type: `integer`):

Stops after this many properties for each search. 0 = as many as Google lists (can be thousands).

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

Keep everything Google lists, only hotels, or only holiday rentals. Skipped properties are not charged.

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

0–5. Properties rated below this are skipped (and not charged).

## `includeOffers` (type: `boolean`):

Adds the full list of booking sites (Booking.com, Expedia, official site…) with per-night and total prices. Charged as an extra event per hotel.

## `priceCalendarDays` (type: `integer`):

For the hotels under "Specific hotels": repeat the same-length stay for this many consecutive check-in dates, starting at your check-in date (e.g. 60 = the next two months). One row per hotel per date, so you can see the cheapest and priciest nights. 0 = off.

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

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

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

Two-letter Google region (gl), e.g. us, gb, fr. Affects which booking sites are shown.

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

How many pages to load at once. Lower it if you see many retries.

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

Google blocks heavy traffic from a single address. Apify Proxy is recommended.

## Actor input object example

```json
{
  "queries": [
    "Paris"
  ],
  "adults": 2,
  "currency": "USD",
  "maxResultsPerQuery": 50,
  "propertyType": "all",
  "minRating": 0,
  "includeOffers": false,
  "priceCalendarDays": 0,
  "language": "en",
  "country": "us",
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

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

No description

## `summary` (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 = {
    "queries": [
        "Paris"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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