# Google Hotels Scraper: Prices, Price Calendar & Deals (`registryfeeds/google-hotels-price-tracker`) Actor

Google Hotels prices for any city and dates: every hotel and rental with nightly price, rating, class, location and deals, plus a price calendar of the cheapest check-in dates, price-drop tracking between runs and a visual report.

- **URL**: https://apify.com/registryfeeds/google-hotels-price-tracker.md
- **Developed by:** [Zach Wallace](https://apify.com/registryfeeds) (community)
- **Categories:** Travel, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 properties

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

<img src="https://api.apify.com/v2/key-value-stores/FhYqkFe80tgK1UZLV/records/google-hotels-shot-search.png" alt="Google Hotels report for Lisbon: price vs rating chart, price distribution and best-value hotels" width="100%">

### What does Google Hotels Scraper do?

**Google Hotels Scraper** collects [Google Hotels](https://www.google.com/travel/hotels) results for any city, neighbourhood or area and your exact dates and guests: **every hotel and vacation rental with its nightly price, price with taxes, whole-stay price, guest rating, star class, location, deals and links**.

It also answers the question travellers and revenue managers actually ask:

- **When is it cheapest to go?** The **price calendar** checks every check-in date over the next weeks and shows the cheapest days on a colour-coded calendar, for a whole city or for **one specific hotel** (its cheapest booking-site price for each check-in date, and the hotel's own price beside it).
- **Did prices drop?** Run it on a schedule and every property shows its **price change since the last run** for the same stay.
- **Which hotel is the best deal?** A **value score** ranks high ratings at low prices, and Google's own **"X% less than usual"** deal labels come through.
- **Where is it cheapest to book?** Turn on booking-site prices to get each hotel's **price at every booking site** (Booking.com, Expedia, Hotels.com, the hotel's own site and more), the cheapest one, and how much it undercuts the hotel's own price.
- **Does it have a pool?** The same option adds each property's **full amenity list** and simple yes/no flags (free Wi-Fi, free breakfast, pool, spa, gym, parking, pets, airport shuttle...), and you can keep only hotels with the amenities you need.
- **How is my hotel priced today?** **Specific hotels** mode tracks the hotels you name, by link or by name, with every booking site's price, on a schedule.

Every run also saves a **visual report**: price vs rating chart, price distribution, best value, deals, cheapest options and the price calendar.

It runs on the Apify platform, so you get API access, scheduling, webhooks, integrations (Make, Zapier, n8n, Google Sheets) and monitoring with no setup. No proxy is needed: it reads Google Hotels directly.

### How is it different from other Google Hotels scrapers?

| | Typical Google Hotels scraper | **This Actor** |
|---|---|---|
| Hotels and rentals for your dates and guests | Yes | **Yes, with children's ages** |
| Price before taxes, with taxes, and for the whole stay | Sometimes one price | **All three** |
| Price calendar: cheapest check-in dates | No | **Yes, up to 120 days, for a city or a specific hotel** |
| Price change since the last run | No | **Yes, per property** |
| "X% less than usual" deals | Rarely | **Yes, with the percentage** |
| Price at every booking site, cheapest site, hotel's own price | Rarely | **Yes** |
| Amenity list and filters (pool, free breakfast, pets...) | Rarely | **Yes** |
| Track specific hotels by name or link | Rarely | **Yes** |
| Value score (rating per price, review-weighted) | No | **Yes** |
| Visual report | No | **Yes** |
| Needs a proxy | Often | **No** |
| Daily self-test against live Google | Not stated | **Yes** |

### Live example reports

Real reports from real runs, exactly as the Actor saves them:

| Example | What it shows | Report |
|---|---|---|
| **Lisbon, a weekend for two** | 80 hotels and rentals: price vs rating, best value, deals, and where to book the top 20 | [Open report](https://api.apify.com/v2/key-value-stores/FhYqkFe80tgK1UZLV/records/google-hotels-example-lisbon.html) |
| **Rome price calendar, 60 days** | The cheapest and dearest check-in dates on a calendar | [Open report](https://api.apify.com/v2/key-value-stores/FhYqkFe80tgK1UZLV/records/google-hotels-example-rome-calendar.html) |
| **Manhattan, 4- and 5-star rated 4.5+ with a gym** | Luxury hotels filtered by class, rating and amenity | [Open report](https://api.apify.com/v2/key-value-stores/FhYqkFe80tgK1UZLV/records/google-hotels-example-new-york.html) |
| **Four Lisbon hotels, tracked** | Specific hotels by name or link: price at every booking site | [Open report](https://api.apify.com/v2/key-value-stores/FhYqkFe80tgK1UZLV/records/google-hotels-example-tracked-hotels.html) |

<img src="https://api.apify.com/v2/key-value-stores/FhYqkFe80tgK1UZLV/records/google-hotels-shot-booking.png" alt="Where to book in Lisbon: the cheapest booking site for each hotel against the hotel's own price, with amenities" width="100%">

<img src="https://api.apify.com/v2/key-value-stores/FhYqkFe80tgK1UZLV/records/google-hotels-shot-calendar.png" alt="Price calendar for Rome: the median nightly price for every check-in date, cheapest days in green" width="100%">

### Why use this Google Hotels scraper?

- **Travel planning and deal alerts:** schedule a daily run for your trip and get told when a hotel drops its price.
- **Hotel revenue management:** see where your property sits against the local median every day, and how competitors move.
- **Travel content and SEO:** "best value hotels in Lisbon" or "cheapest week to visit Rome" lists from live data.
- **Market research:** compare price levels across cities, seasons and star classes; spot vacation-rental vs hotel pricing.
- **Agencies and apps:** a clean, structured feed of hotel prices and ratings through the API.

### How to scrape Google Hotels

1. Click **Try for free**.
2. Enter one or more **locations**, such as `Lisbon`, `Shibuya, Tokyo` or `Times Square, New York`.
3. Pick your **check-in and check-out dates** (or "days from today" for scheduled runs), **adults** and **children's ages**.
4. Choose **Hotels and prices for my dates**, **Specific hotels** (list hotels by Google Hotels link or name and city), or **Price calendar** to find the cheapest check-in dates.
   Optionally turn on **Booking-site prices and amenities**, or pick **Must have these amenities**.
5. Click **Start**. Open **Visual report** in the Output tab, or download the dataset.

### Input

| Field | What it does |
|---|---|
| `mode` | `search` for hotels and prices, `calendar` for the cheapest check-in dates |
| `locations` | Cities, neighbourhoods or areas, as you would type them on Google |
| `checkIn`, `checkOut` | Your dates. Leave empty to use `checkInDaysFromToday` and `nights` |
| `adults`, `childrenAges` | Guests; prices depend on them |
| `currency` | USD, EUR, GBP, JPY, AUD, CAD and 24 more (every currency the European Central Bank publishes a rate for) |
| `maxResultsPerLocation` | How many properties per location (default 50, up to 500) |
| `propertyType` | Hotels and rentals, hotels only, or vacation rentals only |
| `minRating`, `minHotelClass`, `maxPricePerNight` | Filters |
| `calendarDays` | Price calendar: how many check-in dates to check |
| `trackPriceChanges` | Remember prices so the next run shows changes (on by default) |

Example: 4-star-plus hotels in Lisbon for a long weekend, in euros.

```json
{
    "locations": ["Lisbon"],
    "checkIn": "2026-12-04",
    "checkOut": "2026-12-07",
    "adults": 2,
    "currency": "EUR",
    "propertyType": "hotels",
    "minHotelClass": 4
}
```

Example: the cheapest time to spend two nights in Rome over the next 60 days.

```json
{
    "mode": "calendar",
    "locations": ["Rome"],
    "checkInDaysFromToday": 1,
    "nights": 2,
    "calendarDays": 60
}
```

### Output

One row per property (search mode) or per check-in date (calendar mode), plus the visual report in the key-value store. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

A real result (Lisbon, 4 to 6 December, 2 adults):

```json
{
    "location": "Lisbon",
    "name": "Brown's | Avenue Hotel",
    "propertyType": "hotel",
    "hotelClass": 5,
    "rating": 4.6,
    "reviewCount": 283,
    "pricePerNight": 149.23,
    "pricePerNightWithTaxes": 167,
    "totalStayPrice": 334,
    "currency": "USD",
    "dealLabel": "19% less than usual",
    "discountVsUsualPct": 19,
    "priceVsMedianPct": 27.2,
    "valueScore": 40,
    "latitude": 38.7220236,
    "longitude": -9.1456424,
    "description": "Polished adults-only hotel offering a lounge & a restaurant, plus a rooftop pool with city views.",
    "nearby": [{ "name": "Avenida", "kind": "Subway", "travelTime": "5 min" }],
    "website": "https://www.brownshotelgroup.com/browns-avenue/",
    "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChkIhLCQwvjO2IYWGg0vZy8xMXE0bTZieDkyEAE?hl=en-US&gl=us&curr=USD&checkin=2026-12-04&checkout=2026-12-06",
    "priceChangePct": null
}
```

With **booking-site prices and amenities** on (and always in specific hotels mode), each property also gets:

```json
{
    "cheapestProvider": "Super.com",
    "cheapestProviderPricePerNight": 68.59,
    "officialSitePricePerNight": 77.64,
    "savingVsOfficialSitePct": 11.7,
    "providerCount": 20,
    "priceProviders": [
        { "provider": "Super.com", "isOfficialSite": false, "pricePerNight": 67.43, "pricePerNightWithTaxes": 68.59 },
        { "provider": "Booking.com", "isOfficialSite": false, "pricePerNight": 68.21, "pricePerNightWithTaxes": 81.26 },
        { "provider": "ibis Styles Lisboa Centro Liberdade NE", "isOfficialSite": true, "pricePerNight": 68.69, "pricePerNightWithTaxes": 77.64 }
    ],
    "address": "Av. Duque de Loulé 73, 1050-088 Lisboa, Portugal",
    "phone": "+351 21 319 4000",
    "amenities": ["Wi-Fi (free)", "Air conditioning", "Breakfast (extra charge)", "Restaurant", "Bar", "Pet-friendly (extra charge)"],
    "amenitiesNotAvailable": ["Pools", "Hot tub", "Fitness center", "Spa"],
    "amenityFlags": { "freeWifi": true, "freeBreakfast": false, "pool": false, "spa": false, "petFriendly": true, "airportShuttle": false }
}
```

#### Data fields

| Field | Meaning |
|---|---|
| `pricePerNight`, `pricePerNightWithTaxes`, `totalStayPrice` | Nightly price before and with taxes, and the whole stay with taxes |
| `rating`, `reviewCount`, `ratingBreakdown` | Google guest rating, number of reviews, and reviews per star |
| `hotelClass`, `propertyType` | Star class (hotels) and hotel or vacation rental |
| `dealLabel`, `discountVsUsualPct` | Google's deal badge, such as "19% less than usual" |
| `priceVsMedianPct`, `priceRank` | Price against the median of the same search, and price rank (1 = cheapest) |
| `valueScore` | 0-100: 60% guest rating (weighted by number of reviews), 40% low price, within the search |
| `priceChangePct`, `previousPricePerNight`, `seenInLastRun` | Change since the last run for the same location, dates and guests |
| `latitude`, `longitude`, `nearby`, `countryCode` | Location, nearby transit and landmarks with travel times |
| `description`, `website`, `photo`, `checkInTime`, `checkOutTime` | Property details |
| `googleHotelsUrl`, `propertyId`, `placeId` | Links and stable ids |
| `priceProviders`, `cheapestProvider`, `cheapestProviderPricePerNight`, `officialSitePricePerNight`, `savingVsOfficialSitePct`, `providerCount` | Price at each booking site for the stay, cheapest first (booking-site prices option) |
| `amenities`, `amenitiesNotAvailable`, `amenityGroups`, `amenityFlags` | The property's amenity list by group, what it lacks, and yes/no flags for filtering |
| `address`, `phone` | From the property's own Google Hotels page |
| `requested`, `nameMatchScore` | Specific hotels mode: what you asked for, and how closely the found name matches (1 = exact) |

Calendar rows have `checkIn`, `weekday`, `medianPricePerNight`, `lowPricePerNight`, `cheapestPricePerNight`, `cheapestProperty`, `vsTypicalPct` and `cheapnessRank`. A specific hotel's calendar rows have `hotel`, `checkIn`, `weekday`, `available`, `bestPricePerNight` (cheapest booking site, taxes in), `cheapestProvider`, `officialSitePricePerNight`, `savingVsOfficialSitePct`, `providerCount`, `vsTypicalPct` and `cheapnessRank`.

### How much does it cost to scrape Google Hotels?

You pay per property returned, and per date checked in the price calendar. The platform's free monthly credit covers plenty of test runs. Runs are fast because no browser or proxy is used: 40 properties take about 20 seconds, and a 30-day price calendar about a minute.

### Tips

- **Track a trip:** set your exact dates, schedule the Actor daily, and add a webhook or Google Sheets integration. Each run shows `priceChangePct` for every property.
- **Scheduled market tracking:** leave the dates empty and use `checkInDaysFromToday`, so every run looks the same distance ahead.
- **Cheapest week:** run the price calendar for 60-90 days, then search the cheapest date for the full list.
- **Cheapest dates at one hotel:** choose **Price calendar**, clear **Locations** and list the hotel under **Hotels**. Each date reads that hotel's own page, so you get its real price at the cheapest booking site, and sold-out dates show as sold out.
- **Specific neighbourhoods** give more relevant results than a whole country: `Shibuya, Tokyo` rather than `Japan`.
- **Track your own hotel and competitors:** use **Specific hotels** mode with their Google Hotels links, schedule it daily, and watch `priceChangePct`, the cheapest booking site and your saving against it.
- **Booking-site prices take one extra page per property.** Keep **Max properties with details per location** at 20 for a quick run; raise it when you need every property.
- **Hotel names:** write the name and the city, as on Google ("Hotel Tivoli Avenida Liberdade, Lisbon"). A link always works best. If no listed property matches the name closely, the run says so rather than guess.

### FAQ, disclaimers, and support

**Are these the prices I would pay?** They are the prices Google Hotels showed at run time for your dates and guests, before and with taxes. Hotel prices change often, and the final price is set by the booking site.

**How are prices in other currencies calculated?** Google Hotels shows prices in the currency of the visitor's region and ignores currency settings in the address, so the Actor reads US dollar prices and converts them with the European Central Bank's daily reference rate. Each row includes `pricePerNightUsd`, `exchangeRate` and `exchangeRateDate`, so the conversion is transparent.

**Why do some hotels have no price when I add children?** Many booking sites do not quote child rates through Google, so Google shows no price for those hotels. They are still listed, with `pricePerNight` empty. In a Tokyo test, 7 of 20 hotels had a price with a child in the party against 17 of 18 without.

**Why does a hotel show no booking-site prices?** It is sold out for those dates, or Google lists no booking site for it. Vacation rentals often have only one or two sites.

**Why do results vary a little between runs?** Google rotates which properties it lists for a search, so two runs can list slightly different properties. `seenInLastRun` tells you whether a property was in the previous run's results.

**How is the price calendar calculated?** For each check-in date, it takes the properties Google lists first for that date and uses their median nightly price, so dates are compared on the same basis.

**Is scraping Google Hotels legal?** The Actor reads publicly available Google Hotels pages. You are responsible for using the results in line with Google's terms and the laws that apply to you.

**Something not working?** Open an issue on the **Issues** tab with the run link. Need a custom version? Get in touch through the Issues tab.

# Actor input Schema

## `mode` (type: `string`):

Hotels and prices: every property for the stay below. Specific hotels: the hotels you list, each with its price at every booking site (Booking.com, Expedia, the hotel itself, ...) and its amenities; schedule it to track them. Price calendar: the typical nightly price for each check-in date over the coming days, to find the cheapest time to go; list hotels below to get a calendar for each of those hotels instead of a whole place.

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

Cities, neighbourhoods or areas, written as you would on Google, for example "Lisbon", "Shibuya, Tokyo" or "Times Square, New York".

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

Each hotel as its Google Hotels link (https://www.google.com/travel/hotels/entity/...) or its name and city, for example "Hotel Tivoli Avenida Liberdade, Lisbon". Specific hotels mode: up to 100. Price calendar mode: up to 20, each gets its own calendar of the cheapest booking-site price per check-in date (billed per date).

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

Leave empty to use "Days from today" below, which is handy for scheduled runs.

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

Leave empty to stay the number of nights below.

## `checkInDaysFromToday` (type: `integer`):

Check in this many days after the run date. A daily schedule then always looks the same distance ahead.

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

Length of stay when no check-out date is given, and for every date in the price calendar.

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

Guests aged 18 or over.

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

One entry per child: their age (0 to 17). Prices depend on the number of guests.

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

Three-letter code such as USD, EUR, GBP or JPY.

## `maxResultsPerLocation` (type: `integer`):

How many hotels and rentals to collect for each location (hotels and prices mode).

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

Google mixes hotels and vacation rentals in its results.

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

For example 4 keeps properties rated 4.0 and above.

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

For example 4 keeps 4- and 5-star hotels. Vacation rentals have no class.

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

In the chosen currency, before taxes.

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

Also open each property's own Google Hotels page to add its price at every booking site (cheapest site, the hotel's own price, saving), its full amenity list and its address and phone. One extra page per property, so a run takes longer. Always on in specific hotels mode.

## `maxDetailsPerLocation` (type: `integer`):

How many properties per location get booking-site prices and amenities, in Google's order.

## `requiredAmenities` (type: `array`):

Keep only properties whose own page lists all of these. Switches on booking-site prices and amenities and checks every result of each location (up to Max properties per location), so a run takes longer.

## `calendarDays` (type: `integer`):

Price calendar mode: how many check-in dates to check, starting from the check-in date (or days from today).

## `trackPriceChanges` (type: `boolean`):

Remembers prices for the same location, dates and guests, so the next run shows how each property moved since the last run. Ideal with a daily schedule.

## `generateReport` (type: `boolean`):

Saves an HTML report (charts, best value, deals, price calendar) in the key-value store as REPORT.

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

Not needed for normal runs: the Actor connects directly and only switches to a proxy if Google starts refusing requests.

## `selfTest` (type: `boolean`):

Used by the daily health check.

## Actor input object example

```json
{
  "mode": "search",
  "locations": [
    "Lisbon"
  ],
  "hotels": [
    "Hotel Tivoli Avenida Liberdade, Lisbon"
  ],
  "checkInDaysFromToday": 14,
  "nights": 2,
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "maxResultsPerLocation": 50,
  "propertyType": "all",
  "includeDetails": false,
  "maxDetailsPerLocation": 20,
  "calendarDays": 30,
  "trackPriceChanges": true,
  "generateReport": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "selfTest": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `report` (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": [
        "Lisbon"
    ],
    "hotels": [
        "Hotel Tivoli Avenida Liberdade, Lisbon"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("registryfeeds/google-hotels-price-tracker").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": ["Lisbon"],
    "hotels": ["Hotel Tivoli Avenida Liberdade, Lisbon"],
}

# Run the Actor and wait for it to finish
run = client.actor("registryfeeds/google-hotels-price-tracker").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": [
    "Lisbon"
  ],
  "hotels": [
    "Hotel Tivoli Avenida Liberdade, Lisbon"
  ]
}' |
apify call registryfeeds/google-hotels-price-tracker --silent --output-dataset

```

## MCP server setup

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

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/U5qtKPxAZLm40NgZN/builds/7RTGbvOScCWcNH03d/openapi.json
