# Google Hotels Scraper: Prices from Every Booking Site (`euroscrape/google-hotels-prices`) Actor

Hotel prices from Google Hotels for any destination and dates: price per night and total, rating, stars, amenities, location, plus the price on every booking site (official site, Booking.com, Expedia, Agoda…). Price calendars, rate parity and price-drop alerts.

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

## Pricing

from $1.40 / 1,000 hotel prices

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 from Every Booking Site

**Get hotel prices from Google Hotels for any destination and any dates, and see the price of each hotel on every booking site** (official website, Booking.com, Expedia, Agoda, Hotels.com, Trip.com and 20+ more), in one clean dataset.

![The price of a hotel on every booking site, night by night](https://raw.githubusercontent.com/EuroScrape/apify-actors/main/assets/demo-google-hotels-prices.gif)

- 🏨 **Search a destination**: hotels with price per night and total for your dates, taxes, deal badge, rating, stars, amenities, GPS position, nearby stations and airports.
- 💶 **Compare booking sites**: for each hotel and date, every site's price, the cheapest site, the official website price and the gap between them (rate parity).
- 📅 **Price calendars**: check up to 90 check-in dates in one run, e.g. every day of next month, and get the cheapest date for each hotel.
- 🔔 **Price-drop alerts**: schedule it with a monitor name and get alerts on Telegram, Discord, Slack or a webhook when a price falls.

### ✨ Why this Actor

| | |
|---|---|
| 🧾 **All booking sites in one row** | One item per hotel and date with an array of all booking sites (often 20–30), instead of one billed row per site. Tracking 5 hotels over 30 dates costs about $0.75 (150 × $0.005), where per-site billing at $0.001 a row would cost about $4 for 25 sites. |
| 🏷️ **Rate parity built in** | `officialSitePricePerNight`, `cheapestSite` and `officialVsCheapestPct` on every item, and a calendar summary with the share of dates where the official website is the cheapest. |
| 📅 **Price calendar** | `numberOfDates` × `daysBetweenDates`: every day, every weekend or the same weekday each week, for destinations and tracked hotels. |
| 🔎 **Rich hotel data** | Rating, number of reviews, star distribution, what guests talk about, 25+ amenities, description, photos, address, phone, website, check-in and check-out times, Google Maps link. |
| 💱 **Any currency, any market** | 20 currencies. Choose the traveller's country to see the booking sites and prices of that market. Families: set children's ages. |
| 🧹 **Clean results** | Hotels only by default (vacation rentals optional), duplicates removed, sold-out dates flagged with `available: false`. |
| 💸 **Fair price** | You pay per hotel price delivered, and booking-site prices only when you ask for them. Summaries are free. |

### 🎯 Use cases

- **Hotels and revenue managers**: follow your own rates and your competitors' rates on every booking site, every day, and check that your official website is the cheapest.
- **Travel agencies, tour operators and deal sites**: the cheapest hotels and dates for a destination, with a deal badge and a best-value list.
- **Travellers and price trackers**: the cheapest night in the next 30 days, with an alert when the price drops.
- **Market research and analysts**: median price per night per star class, occupancy pressure on event dates, booking-site coverage.

### 🚀 Examples

**Hotels in Lisbon for 2 nights, 4-star and up, rated 4.2+, with a pool:**

```json
{
  "locations": ["Lisbon"],
  "checkInDate": "2026-11-06",
  "nights": 2,
  "hotelClasses": ["4", "5"],
  "minRating": 4.2,
  "amenities": ["pool"],
  "sortBy": "lowest_price"
}
```

**Rate shopping: 3 hotels, every night of November, price on every booking site:**

```json
{
  "hotels": ["Hotel Adlon Kempinski Berlin", "Regent Berlin", "Hotel de Rome Berlin"],
  "checkInDate": "2026-11-01",
  "numberOfDates": 30,
  "currency": "EUR",
  "countryCode": "de"
}
```

**Daily price-drop alert for a family trip:**

```json
{
  "hotels": ["https://www.google.com/travel/hotels/entity/…"],
  "checkInDate": "2027-07-10",
  "nights": 7,
  "adults": 2,
  "childrenAges": [6, 9],
  "monitorName": "summer-trip",
  "alertOnPriceDropPct": 5,
  "telegramBotToken": "123456:ABC…",
  "telegramChatId": "123456789"
}
```

### 📦 Output

**A hotel with booking-site prices** (real data, shortened: 16 booking sites):

```json
{
  "type": "hotel",
  "searchType": "location",
  "query": "Amsterdam",
  "name": "DoubleTree by Hilton Amsterdam - NDSM Wharf",
  "hotelId": "ChgIoo6wxpGl69AuGgwvZy8xcHYybDJ6ZHMQAQ",
  "checkIn": "2026-10-14",
  "checkOut": "2026-10-15",
  "nights": 1,
  "adults": 2,
  "currency": "EUR",
  "pricePerNight": 130.93,
  "priceTotal": 130.93,
  "dealLabel": "23% less than usual",
  "bookingSitesCount": 16,
  "cheapestSite": "DoubleTree by Hilton Amsterdam - NDSM Wharf",
  "officialSitePricePerNight": 130.93,
  "officialVsCheapestPct": 0,
  "bookingSites": [
    { "site": "DoubleTree by Hilton Amsterdam - NDSM Wharf", "isOfficialSite": true, "pricePerNight": 130.93, "priceTotal": 130.93, "url": "https://www.hilton.com/…" },
    { "site": "Qantas Hotels", "isOfficialSite": false, "pricePerNight": 134.45, "priceTotal": 134.45, "url": "…" },
    { "site": "KAYAK.fr", "isOfficialSite": false, "pricePerNight": 135.11, "priceTotal": 135.11, "url": "…" },
    "…"
  ],
  "rating": 4.4,
  "reviewsCount": 1702,
  "hotelClass": 3,
  "amenities": ["Free Wi-Fi", "Air conditioning", "Fitness center", "Bar", "Restaurant", "Room service", "Accessible", "Kid-friendly", "…"],
  "address": "NDSM-Plein 28, 1033 WB Amsterdam, Netherlands",
  "latitude": 52.4006129,
  "longitude": 4.8940182,
  "phone": "+31 20 722 0666",
  "checkInTime": "3:00 PM",
  "checkOutTime": "12:00 PM",
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/…"
}
```

**A price calendar** (free, one per tracked hotel; real data, 7 dates):

```json
{
  "type": "hotelPriceCalendar",
  "name": "Hotel Adlon Kempinski Berlin",
  "currency": "EUR",
  "datesChecked": 7,
  "cheapestCheckIn": "2026-11-08",
  "cheapestPricePerNight": 275.64,
  "mostExpensiveCheckIn": "2026-11-05",
  "highestPricePerNight": 2376.13,
  "averagePricePerNight": 882.74,
  "cheapestSiteByDates": [{ "site": "Super.com", "dates": 7 }],
  "officialSiteCheapestPct": 0,
  "calendar": ["…"]
}
```

**A destination summary** (free, one per destination and date):

```json
{
  "type": "destinationSummary",
  "query": "Lisbon",
  "checkIn": "2026-10-20",
  "checkOut": "2026-10-22",
  "hotels": 25,
  "minPricePerNight": 29,
  "medianPricePerNight": 65.67,
  "p75PricePerNight": 77.7,
  "byHotelClass": { "3-star": { "hotels": 9, "medianPricePerNight": 71 }, "4-star": { "hotels": 3, "medianPricePerNight": 107 } },
  "dealsCount": 3,
  "bestValue": ["…"]
}
```

The dataset has three views: **Hotels & prices**, **Prices per booking site** (one row per site) and **Rate parity**.

### 💰 Pricing

Pay per event:

| Event | Price |
|---|---|
| Run start | $0.003 |
| Hotel price (one hotel, one stay date) | $0.002 |
| Booking-site prices for that hotel and date (all sites) | $0.003 |
| Summaries | free |

Destination search: $0.002 per hotel and date, or $0.005 with every booking site's price. Tracked hotels always include booking-site prices: $0.005 per hotel and date.

Apify subscribers pay less: −10% (Starter), −20% (Scale), −30% (Business). Set a **maximum cost per run** in the run options and the Actor stops cleanly when it's reached.

### ❓ FAQ

**How do I track a specific hotel?** Put its name in `hotels` (add the city if the name is common) or paste its Google Hotels URL. The item shows `matchConfidence` when a name was used.

**Why is `available` false?** No booking site offers a room for these dates and guests (sold out or not bookable yet).

**Do prices include taxes?** They are the prices Google shows for the chosen market. `priceBeforeTaxes` and `taxesAndFees` are filled when Google splits them. Choose `countryCode` to see the prices of a given market.

**Why are amenities empty for some tracked hotels?** Amenities come from destination results. When a hotel is given by URL or by an exact name, Google opens its page directly and the amenity list isn't always available.

**How does monitoring work?** Set `monitorName` and schedule the Actor (for example every morning). Each item then shows `changeType`, `previousPricePerNight` and `priceChangePct`, and price drops of at least `alertOnPriceDropPct` % trigger alerts. The first run is the baseline.

**Is it affiliated with Google?** No. The Actor reads the public Google Hotels pages, at a moderate pace, like a visitor would. You are responsible for how you use the data.

### ⭐ Your feedback

If this Actor saves you time, a short review on Apify Store helps other users find it. Missing a field, a country or a filter? Say it in your review: the most requested features are added first.

### 🔗 More from EuroScrape

- [Google Flights Scraper: Cheapest Dates, Prices & Price History](https://apify.com/euroscrape/google-flights-prices): flight prices for any route and dates, cheapest day to fly, typical price range, CO2 and price-drop alerts.
- [App Store Reviews Scraper + Google Play Reviews](https://apify.com/euroscrape/app-reviews): reviews from both stores in 58 countries, rating by version and country, alerts on new negative reviews.
- [EU Second-Hand Marketplaces Scraper: Vinted, OLX & More](https://apify.com/euroscrape/eu-marketplace-deals): one search on the top second-hand marketplace of 18 European countries, prices in €, cheapest country and resale margin.
- [EU Public Tenders Scraper: TED, BOAMP & Awards](https://apify.com/euroscrape/eu-public-tenders): open tenders and contract awards from all of Europe (TED) and France (BOAMP, DECP), with winners per lot, values in € and daily alerts.
- [Website Tech Stack Detector: 280+ Technologies, Leads & Signals](https://apify.com/euroscrape/website-intelligence): 280+ technologies, company identity, contacts and sales signals for any website.
- [Kleinanzeigen Scraper: Deal Finder & Price-Drop Alerts](https://apify.com/euroscrape/kleinanzeigen-scraper): German classifieds with view counts, full seller details and instant alerts.
- [French Companies Scraper (SIRENE)](https://apify.com/euroscrape/france-companies): every French company by activity, area and size, with verified websites and emails.
- [UK Companies House Scraper](https://apify.com/euroscrape/uk-companies): UK companies by SIC code and location, with directors, websites and emails.
- [Impressum & Legal Notice Scraper (EU)](https://apify.com/euroscrape/company-identity): legal identity, registry numbers and VAT IDs from any website, registry-verified.
- [Vinted Scraper: 26 Countries, Deals, Alerts & Seller Data](https://apify.com/euroscrape/vinted-scraper): search Vinted across 26 countries, prices with buyer fees, seller ratings, cheapest-country comparison and instant alerts on new listings.
- [EU VAT Number Validator (VIES): Bulk Check, Proof & Alerts](https://apify.com/euroscrape/vat-validator): validate VAT numbers in bulk against the EU's official registry, with consultation proof for tax audits and alerts when a customer's number becomes invalid.
- [France Real Estate Sold Prices (DVF): €/m², Sales & Trends](https://apify.com/euroscrape/france-property-prices): every property sale registered by the French State — real prices, €/m², addresses, GPS, market trends per city and alerts on new sales.

# Actor input Schema

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

Cities, areas or landmarks to search, e.g. "Paris", "Lisbon Alfama", "hotels near Eiffel Tower". Each destination returns hotels with their price for your dates, rating, class, amenities and location.

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

Hotel names (e.g. "Novotel Paris Est") or Google Hotels URLs. For each hotel and each date you get the price on every booking site (hotel website, Booking.com, Expedia, Agoda…): cheapest site, official price and the gap between them.

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

First check-in date (YYYY-MM-DD). Default: in 14 days.

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

Length of stay.

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

Check prices for several check-in dates in a row, e.g. 30 = every day of the next month. Each date is one search.

## `daysBetweenDates` (type: `integer`):

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

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

Number of adult guests.

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

One age per child, e.g. \[4, 9].

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

Currency of all prices.

## `countryCode` (type: `string`):

Country of the traveller (Google "gl" parameter): it changes which booking sites are shown and sometimes the prices, e.g. "us", "gb", "fr", "de".

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

Language of descriptions and place names, e.g. "en", "fr", "de", "es".

## `maxHotelsPerLocation` (type: `integer`):

Google shows about 18 new hotels per page.

## `includeBookingSites` (type: `boolean`):

For each hotel found, also get the price on every booking site (one extra page per hotel, billed separately). Always on for tracked hotels.

## `includeVacationRentals` (type: `boolean`):

Google Hotels mixes apartments and vacation rentals with hotels. Off = hotels only.

## `onlyAvailable` (type: `boolean`):

Skip hotels for which Google shows no price for your dates (no availability).

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

From 1 to 5, e.g. 4.2.

## `hotelClasses` (type: `array`):

Keep only these star ratings.

## `minPricePerNight` (type: `integer`):

In the chosen currency.

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

In the chosen currency.

## `amenities` (type: `array`):

Keep only hotels with all of these.

## `sortBy` (type: `string`):

Order of the hotels of each destination in the dataset.

## `includeSummary` (type: `boolean`):

Destination: median, cheapest and best-value hotels per date. Tracked hotel: price calendar, cheapest date and how often the official site is cheapest.

## `monitorName` (type: `string`):

Set a name and schedule the Actor (e.g. daily): each item then shows the price change since the previous run, and you can get alerts on price drops.

## `onlyChanges` (type: `boolean`):

Monitoring: skip unchanged prices and price increases.

## `alertOnPriceDropPct` (type: `integer`):

Monitoring: send an alert when a price per night drops by this percentage or more.

## `telegramBotToken` (type: `string`):

Alerts on Telegram: create a bot with @BotFather and paste its token.

## `telegramChatId` (type: `string`):

Your chat ID (send a message to your bot, then open api.telegram.org/bot<token>/getUpdates).

## `discordWebhookUrl` (type: `string`):

Alerts in a Discord channel: Channel settings → Integrations → Webhooks.

## `slackWebhookUrl` (type: `string`):

Alerts in Slack: create an Incoming Webhook for your channel.

## `webhookUrl` (type: `string`):

Receives one POST per run with all price drops (Make, Zapier, n8n…).

## `maxNotifications` (type: `integer`):

Maximum number of alert messages per run.

## Actor input object example

```json
{
  "locations": [
    "Lisbon"
  ],
  "nights": 1,
  "numberOfDates": 1,
  "daysBetweenDates": 1,
  "adults": 2,
  "childrenAges": [],
  "currency": "EUR",
  "countryCode": "us",
  "language": "en",
  "maxHotelsPerLocation": 20,
  "includeBookingSites": false,
  "includeVacationRentals": false,
  "onlyAvailable": true,
  "sortBy": "relevance",
  "includeSummary": true,
  "onlyChanges": false,
  "alertOnPriceDropPct": 10,
  "maxNotifications": 30
}
```

# Actor output Schema

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

One row per hotel and stay date.

## `bookingSites` (type: `string`):

One row per booking site.

## `parity` (type: `string`):

Official website vs. cheapest booking site.

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

Counters for this run (items found, output, errors).

# 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"
    ],
    "maxHotelsPerLocation": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("euroscrape/google-hotels-prices").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"],
    "maxHotelsPerLocation": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("euroscrape/google-hotels-prices").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"
  ],
  "maxHotelsPerLocation": 20
}' |
apify call euroscrape/google-hotels-prices --silent --output-dataset

```

## MCP server setup

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

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/Rnd0bp6LW6c2DXugU/builds/2cWcqnXoQQxvl4zqw/openapi.json
