# Google Hotels Price Tracker (`stayscope/google-hotels-price-tracker`) Actor

Track hotel prices on Google Hotels for every check-in date up to a year ahead. Lowest price per night, taxes and booking-site prices. JSON, CSV, API.

- **URL**: https://apify.com/stayscope/google-hotels-price-tracker.md
- **Developed by:** [kok hui](https://apify.com/stayscope) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 price for one dates

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 Price Tracker

See what any hotel costs on every check-in date, up to a year ahead, with prices from [Google Hotels](https://www.google.com/travel/hotels). One run gives you a price calendar for each hotel: the lowest price per night and for the whole stay, before and after taxes, for the stay length, guests and currency you choose. Turn on one option to also get the price from every booking site for each date, such as Booking.com, Expedia, Agoda and the hotel's own website.

It's fast: a full year of dates for one hotel takes a few seconds. No browser, no login and no Google API key needed. Results download as JSON, CSV or Excel, or arrive in your app through the Apify API.

### What data you get

For every hotel and check-in date:

- **Lowest price**: per night and for the whole stay, before and after taxes, in the currency you choose
- **Availability**: dates when the hotel is sold out or has no price are marked `"available": false`
- **Hotel details**: name, address, phone number, star class, guest rating and review count
- **A Google Hotels link** that opens the hotel for that exact date
- **Booking-site prices** (optional): each site's price per night and for the stay, a link to that site's offer, and the cheapest site

### What people use it for

- **Finding the cheapest dates** to stay at a hotel
- **Rate shopping and revenue management**: check competitors' rates for the next 30, 90 or 365 days every morning
- **Price drop alerts**: schedule a daily run and compare it with the day before
- **Travel apps and AI agents**: price calendars for any hotel without an official API
- **Market research**: seasonality, weekday and weekend prices, and the effect of holidays and events

### How to use it

1. Add your **hotels**, one per line, in any of these forms:
   - its Google Hotels link: open the hotel on [google.com/travel/hotels](https://www.google.com/travel/hotels) and copy the address bar. A link copied after clicking a hotel in the results list works too.
   - its name with the city, for example `Marina Bay Sands Singapore`
2. Pick the **first check-in date** and the **number of check-in dates** (up to 365). A relative date like `1 day` always means tomorrow, which keeps scheduled runs pointed at the future.
3. Set the **nights per stay**, **adults** and **currency**.
4. Turn on **Add prices from every booking site** if you need the per-site comparison for each date.
5. Run it and download the results.

To track prices over time, open **Schedules** in Apify Console and run the tracker daily with a relative start date. Each run adds a fresh dataset that you can compare with earlier ones.

#### Input example

```json
{
    "hotels": [
        "https://www.google.com/travel/hotels/entity/ChUI17vV0u_fprYCGgkvbS8wZGQ5MDMQAQ",
        "Park Hotel Tokyo"
    ],
    "startDate": "1 day",
    "days": 90,
    "nights": 2,
    "adults": 2,
    "currency": "USD",
    "includeProviderPrices": false
}
```

#### Output example

One record per hotel and check-in date:

```json
{
    "hotelName": "Marina Bay Sands Singapore",
    "hotelQuery": "Marina Bay Sands Singapore",
    "checkInDate": "2026-11-12",
    "checkOutDate": "2026-11-14",
    "nights": 2,
    "available": true,
    "currency": "USD",
    "lowestPricePerNight": 686.75,
    "lowestPricePerNightWithTaxes": 823.4,
    "lowestTotalPrice": 1373.5,
    "lowestTotalPriceWithTaxes": 1646.81,
    "priceText": "$687",
    "adults": 2,
    "hotelClass": 5,
    "rating": 4.7,
    "reviewsCount": 64874,
    "address": "10 Bayfront Ave, Singapore 018956",
    "phone": "+65 6688 8868",
    "propertyToken": "ChUI17vV0u_fprYCGgkvbS8wZGQ5MDMQAQ",
    "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChUI17vV0u_fprYCGgkvbS8wZGQ5MDMQAQ?hl=en&gl=us&curr=USD&ts=...",
    "scrapedAt": "2026-10-06T04:37:57+00:00",
    "cheapestProvider": "klook",
    "providerPrices": [
        { "provider": "klook", "isOfficialSite": false, "pricePerNight": 686.75, "pricePerNightWithTaxes": 823.41, "totalPrice": 1373.5, "totalPriceWithTaxes": 1646.81, "url": "https://..." },
        { "provider": "Booking.com", "isOfficialSite": false, "pricePerNight": 795.24, "pricePerNightWithTaxes": 866.8, "totalPrice": 1590.47, "totalPriceWithTaxes": 1733.59, "url": "https://www.booking.com/..." }
    ]
}
```

`cheapestProvider` and `providerPrices` are only filled when **Add prices from every booking site** is on. On a sold-out date, `available` is `false` and the price fields are empty.

### Pricing

You pay per event, and Apify platform usage is included:

- **Hotel tracked**: once per hotel in each run. It covers looking up the hotel.
- **Price for one date**: each check-in date that has a price
- **Price from every booking site for one date**: charged instead of the previous event when booking-site prices are on (this opens the hotel's page once per date)

Dates without a price are free. For example, tracking 2 hotels for the next 30 days costs 2 hotel events plus at most 60 date events. Current prices are on the **Pricing** tab. You can set a maximum cost per run in the run options, and the tracker stops cleanly when it reaches it. If a date's booking-site prices can't be loaded, that date is billed as a regular price.

### Tips and notes

- **About 11 months of prices.** Google usually lists prices about 11 months ahead. Later dates come back without a price, and they're free.
- **Adults only.** Google's price calendar doesn't take children, so prices are for the number of adults you set. For stays with children, use the [Google Hotels Scraper](https://apify.com/stayscope/google-hotels-scraper).
- **Lowest price across sites.** The price for each date is the lowest Google shows for that hotel across all booking sites, the same as on the hotel's Google Hotels page.
- **Taxes depend on the country.** In some countries prices already include taxes, so the prices with and without taxes are the same.
- **Links are the most precise.** For a name, the tracker uses the hotel Google matches. If Google matches none, it uses the listed hotel whose name contains most of your words and logs which one it picked. If no name is close, the hotel is skipped and not billed.
- **Dates in a link are ignored.** The tracker always uses the dates, nights, adults and currency from the input.
- **Booking-site prices are slower.** They load one page per date, so allow about a second per date.
- **Proxies.** Keep the default residential proxy. Google quickly blocks data-center IPs.
- **Input with a simple fix is corrected.** A start date in the past moves to tomorrow, and duplicate hotels are tracked once. The log lists every change made.

### Is it legal to scrape Google Hotels?

This tracker only collects publicly available hotel prices and business details. It doesn't collect personal data or anything behind a login. Check that your use of the data complies with the laws that apply to you and with Google's terms. If you're unsure, ask a lawyer.

### Need a whole city?

To find hotels by city, area or region, with photos, amenities and reviews, use the [Google Hotels Scraper](https://apify.com/stayscope/google-hotels-scraper). Then paste the links of the hotels you want to follow into this tracker.

### Feedback

Found a bug or need a field that's missing? Open an issue on the **Issues** tab.

# Actor input Schema

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

One hotel per line: its Google Hotels link (open the hotel on google.com/travel/hotels and copy the address bar), or its name with the city, for example "Marina Bay Sands Singapore". Links are the most precise.

## `startDate` (type: `string`):

A fixed date (YYYY-MM-DD) or a date relative to the day of the run, such as "1 day" (tomorrow). Relative dates keep scheduled runs pointed at the future.

## `days` (type: `integer`):

How many consecutive check-in dates to track, starting from the first check-in date. Up to 365 (a full year).

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

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

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

Number of adult guests.

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

3-letter currency code for all prices, for example USD, EUR, GBP, SGD or MYR.

## `includeProviderPrices` (type: `boolean`):

Also opens the hotel's Google Hotels page for each priced date to add the price from every booking site (Booking.com, Expedia, Agoda, the hotel's own site and more). Much slower and billed at a higher price per date. Leave off to get the lowest price per date only.

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

How many hotel pages to open at once when booking-site prices are on.

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

Google interface language code, for example en, de, fr or ja.

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

2-letter country code Google uses for the search, for example us, gb or sg.

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

Google blocks data-center IPs quickly, so residential proxies are recommended.

## Actor input object example

```json
{
  "hotels": [
    "Marina Bay Sands Singapore"
  ],
  "startDate": "1 day",
  "days": 30,
  "nights": 1,
  "adults": 2,
  "currency": "USD",
  "includeProviderPrices": false,
  "maxConcurrency": 5,
  "language": "en",
  "country": "us",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

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

All tracked hotel prices from the run's default dataset.

# 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 = {
    "hotels": [
        "Marina Bay Sands Singapore"
    ],
    "startDate": "1 day",
    "days": 30,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("stayscope/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 = {
    "hotels": ["Marina Bay Sands Singapore"],
    "startDate": "1 day",
    "days": 30,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("stayscope/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 '{
  "hotels": [
    "Marina Bay Sands Singapore"
  ],
  "startDate": "1 day",
  "days": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call stayscope/google-hotels-price-tracker --silent --output-dataset

```

## MCP server setup

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