# Google Hotels Scraper & API: Hotel Prices, OTA Rates & Alerts (`wireless_tiramisu/google-hotels-price-monitor`) Actor

\[$3/1K hotels] Google Hotels scraper & hotel price API: prices for any city and dates plus every booking site's rate per hotel (Booking.com, Expedia, Agoda, official site). Price calendars, rate parity and price-drop alerts. Hotel price tracker & rate shopper. No browser.

- **URL**: https://apify.com/wireless_tiramisu/google-hotels-price-monitor.md
- **Developed by:** [Alexis Quiroga](https://apify.com/wireless_tiramisu) (community)
- **Categories:** Travel, E-commerce, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 92.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 hotel results

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 & API: Hotel Prices, OTA Rates & Alerts

**Google Hotels scraper and hotel price API.** Give it any city or area and your dates. You get **hotel prices** from Google Hotels and, for each hotel, **the price on every booking site** Google lists: Booking.com, Expedia, Hotels.com, Agoda, Trip.com, the hotel's own website and more. It can also scan whole date ranges to build a **hotel price calendar**, track **price drops between runs** and measure **rate parity** between the official site and the OTAs.

It works as a **hotel price tracker**, a **hotel rate shopping tool** for revenue managers, or a cheap **Google Hotels API** alternative for travel apps. No browser, no API key and no start fee: you pay per hotel result.

### What it does

- 🏨 **Hotel search results:** name, star class, Google rating, review count and star distribution, review aspects (location, service, breakfast…), coordinates, check-in time, website, photo and nearby places.
- 💲 **Prices for your exact dates:** lowest nightly price and total stay price, in any currency, for any number of adults and children.
- 🔎 **Every booking site's price per hotel** (with *Include booking-site offers*, or by passing hotel links in `hotels`). Offers are sorted cheapest first, with the cheapest provider and the **official site** flagged when Google lists it. The number of sites depends on the hotel and dates: from 1 to 25+ in our tests.
- ⚖️ **Rate parity:** `officialVsCheapestPct` shows how much more or less the hotel's own site costs than the cheapest OTA. `priceSpreadPct` shows the spread across all sites.
- 📅 **Hotel price calendar:** scan up to 120 check-in dates (e.g. 18 Dec → 6 Jan). The `PRICE_CALENDAR` record holds the cheapest and most expensive dates per hotel.
- 🔔 **Hotel price monitor:** with monitoring on, each result gets `previousPricePerNight`, `priceChange`, `priceChangePct` and `changeType` (`NEW`, `UP`, `DOWN`, `SAME`, `NOW_AVAILABLE`, `NOW_UNAVAILABLE`). The run summary lists every price drop.
- 🛡️ **Reliable:** HTTP requests with no headless browser, automatic proxy session rotation and retries, EU cookie consent handled. One failing search never kills the run.

### Use cases

#### Black Friday and Christmas hotel deal tracking

Scan the holiday period for a city, schedule the actor daily and turn on **Detect price changes**. Each run flags which hotels and dates got cheaper. Good for deal sites, newsletters and anyone hunting a holiday hotel deal.

#### Hotels and revenue managers: rate shopping and parity

Put your own hotel and your competitors in `hotels`, scan the next 30–90 days, and get every OTA's rate per night plus your official-vs-OTA parity gap. Schedule it daily to react to competitor price moves.

#### Travel agencies and tour operators

Compare hotel prices across booking sites and dates and find the cheapest stay windows for packages and groups. `googleHotelsUrl` opens the exact search on Google Hotels.

#### Deal sites, travel bloggers and analysts

Build city hotel price indices, measure the impact of events and holidays, and publish "cheapest time to visit" content with real data.

#### Apps and AI agents

Clean JSON through the Apify API for travel apps, dashboards, spreadsheets and AI agents.

### Quick start

1. Click **Try for free**. The example input searches **Madrid** for 10 hotels, 1 night, checking in 14 days from today, for 2 adults.
2. Press **Start**. A run like this usually finishes in well under a minute.
3. Open the **Prices** or **Rate shopping** views, or download JSON, CSV or Excel.

### Example input

**Christmas hotel prices with every booking site:**

```json
{
  "locations": ["New York"],
  "checkIn": "2026-12-24",
  "checkOut": "2026-12-27",
  "adults": 2,
  "currency": "USD",
  "includeOffers": true,
  "maxHotelsPerSearch": 10
}
```

**Holiday price calendar (cheapest check-in dates, 3-night stays):**

```json
{
  "locations": ["Tenerife"],
  "dateRangeStart": "2026-12-18",
  "dateRangeEnd": "2027-01-06",
  "nights": 3,
  "currency": "EUR",
  "maxHotelsPerSearch": 20
}
```

**Rate shopper and parity monitor for your hotel and competitors (schedule daily):**

```json
{
  "hotels": [
    "https://www.google.com/travel/hotels/entity/ChcI3O7IrPLdx7UGGgsvZy8xdGtmMjhuMxAB"
  ],
  "dateRangeStart": "2026-11-01",
  "dateRangeEnd": "2026-11-30",
  "nights": 1,
  "monitorChanges": true,
  "monitorId": "my-hotel-november"
}
```

Tip: every result contains a `propertyToken`. Paste it into `hotels` to monitor that hotel.

### Example output

Real rows captured on 6 Oct 2026. Prices change constantly.

**Search results (example input: Madrid, 1 night from 20 Oct 2026, 2 adults, USD):**

| name | hotelClass | rating | reviewsCount | pricePerNight | currency |
|---|---|---|---|---|---|
| The Hat Madrid | 2 | 4.3 | 4,816 | 74.16 | USD |
| B\&B Hotel Madrid Centro Plaza Mayor | 2 | 4.5 | 2,072 | 205.62 | USD |
| Petit Palace Alcalá | 4 | 4.3 | 1,555 | 223.93 | USD |
| Hyatt Centric Gran Via Madrid | 5 | 4.5 | 2,452 | 282.05 | USD |

**Booking-site offers (New York, 24–27 Dec 2026, `includeOffers: true`):**

| name | offersCount | cheapestProvider | cheapestPricePerNight | totalPrice (3 nights) | priceSpreadPct |
|---|---|---|---|---|---|
| The One Boutique Hotel | 25 | Super.com | 126.21 | 378.63 | 65.6 |
| 31 Street Broadway Hotel | 10 | Clicktrip.com | 101.45 | 304.35 | 444 |

Each offer row has `provider`, `isOfficialSite`, `pricePerNight` and `totalPrice`. With monitoring on, results also get `previousPricePerNight`, `priceChange`, `priceChangePct` and `changeType`.

**Key-value store records:** `PRICE_CALENDAR` (cheapest and most expensive dates per hotel, for date-range runs) and `RUN_SUMMARY` (counts, failures and price changes).

### Pricing: cost per 1,000 results

Pay per event. There's no start fee and no monthly rental. Platform usage is included.

| Event | What you get | Price per result | Per 1,000 results |
|---|---|---|---|
| `hotel-result` | One hotel for one set of dates (search-result data and price) | $0.003 | **$3** |
| `hotel-offers` | One hotel for one set of dates **plus every booking site's price** and parity metrics | $0.008 | **$8** |

**Example costs:**

- The example input (10 hotels) costs ≈ **$0.03**.
- 10 hotels with all booking-site offers cost ≈ **$0.08**.
- A daily rate-shopping check of 5 hotels × 30 dates (150 results with offers) costs ≈ **$1.20** per run.

Set **Maximum cost per run** in the run options and the actor stops cleanly when it reaches the limit. You can try it with the monthly free credit of the Apify Free plan.

### FAQ

**Is this the official Google Hotels API?** No. Google doesn't offer a public Google Hotels API. This actor reads the publicly visible prices on Google Hotels and returns them as structured data through the Apify API.

**Do I need a Google account, API key or browser?** No.

**How many hotels per search?** Google shows up to ~20 hotels per search page. Use several locations (e.g. neighbourhoods) or the `hotels` input for full control.

**Are prices per night?** Yes. `pricePerNight` is the lowest nightly price shown, and `totalPrice` covers the whole stay. Whether taxes and fees are included follows Google's display for the chosen country.

**Why do prices differ by country?** Google and booking sites show different prices and sites depending on the searcher's country. Set `country` and `currency` to match your market.

**Why does a hotel have only one or two booking-site offers?** That's all Google lists for that hotel and those dates. The actor returns every offer Google shows.

**Is it legal?** The actor reads publicly available price information and collects no personal data. You're responsible for complying with applicable laws and the website's terms.

### Support

Missing a field or found a bug? Open an issue in the **Issues** tab.

# Actor input Schema

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

Cities, areas or free-text searches, e.g. 'Madrid', 'Tenerife', 'hotels near Times Square'.

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

Optional. Google Hotels URLs (https://www.google.com/travel/hotels/entity/...) or property tokens. Returns the price of every booking site for these hotels – ideal to monitor your own hotel and competitors.

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

YYYY-MM-DD. Defaults to 14 days from today. Ignored when a date range is set.

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

YYYY-MM-DD. Defaults to check-in + 'Nights'.

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

Length of stay used with date ranges or when no check-out is given.

## `dateRangeStart` (type: `string`):

Optional. Scan many check-in dates (e.g. the whole Christmas period) to find the cheapest dates. Produces a PRICE_CALENDAR record.

## `dateRangeEnd` (type: `string`):

Last check-in date of the scan (max 120 dates).

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

1 = every day, 7 = same weekday every week.

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

Number of adult guests.

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

Ages of children, e.g. \[5, 9].

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

ISO currency code: USD, EUR, GBP…

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

Google country of the searcher; affects prices and booking sites shown.

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

Interface language.

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

For each hotel found by location, also fetch all booking-site offers (Booking.com, Expedia, Agoda, official site…), cheapest site and official-vs-cheapest parity gap. Charged as 'hotel with offers'.

## `includeBookingLinks` (type: `boolean`):

Add the (long) Google redirect link to each booking-site offer.

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

Google returns up to ~20 hotels per search page.

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

0 = any.

## `maxPricePerNight` (type: `integer`):

Optional filter in the selected currency.

## `monitorChanges` (type: `boolean`):

Stores prices in a named key-value store and adds previousPricePerNight, priceChange, priceChangePct and changeType (NEW, UP, DOWN, SAME, NOW_UNAVAILABLE…) to each result. Use with a schedule for price-drop alerts.

## `monitorId` (type: `string`):

Optional name for the price history (lets several schedules share or separate history). Defaults to a hash of the input.

## `maxRetries` (type: `integer`):

On block/captcha the actor rotates proxy session and retries with backoff.

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

Apify Proxy recommended.

## Actor input object example

```json
{
  "locations": [
    "Madrid"
  ],
  "hotels": [],
  "nights": 1,
  "dateStepDays": 1,
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "country": "us",
  "language": "en",
  "includeOffers": false,
  "includeBookingLinks": false,
  "maxHotelsPerSearch": 10,
  "minHotelClass": 0,
  "monitorChanges": false,
  "maxRetries": 6,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All hotel results; opens the Prices view.

## `rateShopping` (type: `string`):

Same results in the rate-shopping view (cheapest site, official site, parity gap).

## `priceCalendar` (type: `string`):

Cheapest and most expensive check-in date per hotel (date-range runs only).

## `runSummary` (type: `string`):

Counts, failures and price changes (UP/DOWN/NEW…) vs the previous run.

# 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": [
        "Madrid"
    ],
    "maxHotelsPerSearch": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("wireless_tiramisu/google-hotels-price-monitor").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": ["Madrid"],
    "maxHotelsPerSearch": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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

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/Q6sN8ALMBvgkMLr4n/builds/BK39cLaIbtuOXafOT/openapi.json
