# Google Hotels Scraper - Google Travel Hotel Prices & OTAs (`kamerozkan/google-hotels-prices`) Actor

Google Travel hotel prices for any city or hotel list: lowest nightly rate, every OTA offer (Booking.com, Expedia, Agoda, Trip.com, official site), price calendar across many check-in dates, typical price range and hotel details. Fast, no browser.

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

## Pricing

from $3.00 / 1,000 hotel price with all ota offers

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: Google Travel Hotel Prices & OTA Rates

[![Run on Apify](https://apify.com/actor-badge?actor=kamerozkan/google-hotels-prices)](https://apify.com/kamerozkan/google-hotels-prices)
[![Pricing](https://img.shields.io/badge/Pricing-Pay--Per--Event%20\($0.003\)-blue)](https://apify.com/kamerozkan/google-hotels-prices)
[![Memory](https://img.shields.io/badge/Memory-512%20MB-green)](https://apify.com/kamerozkan/google-hotels-prices)
[![Status](https://img.shields.io/badge/Engine-Direct%20RPC%20\(No%20Browser\)-success)](https://apify.com/kamerozkan/google-hotels-prices)

Get **Google Travel hotel prices** for one hotel or a whole city. This Google Hotels scraper extracts real-time **hotel prices, rate parity insights, and OTA booking offers** from Google Hotels (Google Travel) for any city, landmark, or list of properties. Retrieve the lowest nightly rate, all booking site offers (Booking.com, Expedia, Hotels.com, Agoda, Trip.com, Priceline, official hotel sites), multi-date price calendars (up to 365 days), Google's typical price benchmark, tax breakdowns, and full property metadata.

Built for speed and reliability: **browserless direct protocol engine**, no login, no cookies, no heavy headless browser overhead.

***

### Why Google Hotels Scraper?

| Feature | What you get |
| :--- | :--- |
| **Pricing Model** | **$0.003 / hotel with all OTAs** |
| **Execution Speed** | **2 to 4 seconds per search (no browser)** |
| **Memory Footprint** | **512 MB** |
| **All OTA Offers** | **Yes (10+ booking channels in one row)** |
| **Price Benchmark** | **Yes (`low`, `typical`, `high`)** |
| **Multi-Date Calendars** | **Yes (up to 365 check-in dates)** |

***

### Core Use Cases

- **Hotel Revenue Management & Rate Shopping:** Track your hotel's competitive set daily. See which OTA undercuts your official rate and monitor price shifts in real time.
- **Rate Parity Enforcement:** Verify whether Booking.com, Expedia, or Agoda are violating parity agreements for your rooms across upcoming seasons.
- **Price Calendars & Seasonality Analysis:** Scan 30, 90, or 365 check-in dates in a single run to uncover peak demand dates, holiday surges, and low-season troughs.
- **Travel Tech & Deal Sites:** Build high-frequency hotel price comparison engines and deal alert feeds for any city worldwide.
- **AI Agents & Workflows:** Integrate clean JSON directly into n8n, Make, Zapier, LangChain, or LLM-driven travel planners.

***

### Key Features

- **Query-Based Discovery:** Search any destination (`hotels in Paris`, `luxury hotels in Manhattan`, `cheap hotels near Colosseum`) with automatic pagination.
- **Specific Hotel Monitoring:** Track designated hotels by name, Google Hotels entity URL, or `hotelId`.
- **All OTA Offers in One Row:** Receive provider name, nightly price, stay total, and direct booking URL for every booking channel.
- **Google Price Insight:** Instant comparison against historical averages (`priceLevel`: `low`, `typical`, `high`) with low/high threshold values.
- **Stay Total & Tax Breakdown:** Base room total plus estimated taxes and fees.
- **Filters Before Billing:** Minimum stars, minimum guest rating and a nightly price range. Hotels that do not match are skipped and never charged.
- **Relative Dates:** Use dynamic expressions (`+14 days`, `tomorrow`) for automated daily monitoring without updating dates manually.
- **30+ Currencies & Global Point of Sale:** Set currency (USD, EUR, GBP, TRY) and country market code (US, GB, DE, TR).

***

### How to scrape Google Hotels

1. Type one or more searches into **Search queries**, exactly as you would on Google Hotels (`hotels in Rome`, `hotels near Times Square`), or paste hotel names, Google Hotels URLs or hotel IDs into **Specific hotels**.
2. Pick the check-in date, nights and guests. For a price calendar, raise **Number of check-in dates** (30 gives one row per hotel per day for a month).
3. Leave **Include all OTA offers** on to get every booking site's price, or turn it off for a cheaper lowest-price-only run.
4. Click **Start** and download the results as JSON, CSV or Excel, or schedule the run for daily rate tracking.

***

### Input Parameters

| Parameter | Type | Required | Default | Description |
| :--- | :--- | :--- | :--- | :--- |
| `searchQueries` | Array of Strings | No | `[]` | Search destinations or landmarks to discover hotels. If both lists are empty, the example search `hotels in Istanbul` runs. |
| `hotels` | Array of Strings | No | `[]` | Specific hotel names or Google Hotels URLs to track. |
| `checkInDate` | String | No | `"+14 days"` | Check-in date (`YYYY-MM-DD` or relative like `+14 days`, `today+14`, `tomorrow`, `2 weeks`). |
| `numberOfDates` | Integer | No | `1` | Scan multiple consecutive check-in dates (1 to 365). |
| `dateStep` | Integer | No | `1` | Step in days between calendar dates (e.g. 7 for weekly). |
| `nights` | Integer | No | `1` | Length of stay in nights (1 to 30). |
| `adults` | Integer | No | `2` | Number of adult guests (1 to 10). |
| `currency` | String | No | `"USD"` | 3-letter currency code (USD, EUR, GBP, TRY, etc.). |
| `includeOtaOffers`| Boolean | No | `true` | Extract all OTA booking site offers. If false, extracts lowest price only. |
| `maxHotelsPerSearch` | Integer | No | `20` | Maximum properties to collect per search query (up to 500), counted after filters. |
| `minHotelClass` | Integer | No | `0` | Only hotels with at least this many stars (search queries only). |
| `minRating` | String | No | empty | Only hotels with at least this Google guest rating, e.g. `4.5`. |
| `minPricePerNight` / `maxPricePerNight` | Integer | No | `0` | Price range per night in the selected currency (lowest search price). Filtered-out hotels are not charged. |
| `proxyConfiguration` | Object | No | `{ "useApifyProxy": true }` | Apify proxy settings (Datacenter or Residential). |

***

### Example JSON Output

Each record represents one hotel property for a specific check-in date:

```json
{
  "hotelName": "The Marmara Taksim",
  "hotelId": "ChoIv9zm0pCp0vObARoNL2cvMTFkZHd0ZzdmeBAB",
  "checkIn": "2026-11-05",
  "checkOut": "2026-11-07",
  "nights": 2,
  "adults": 2,
  "currency": "EUR",
  "lowestPricePerNight": 145.0,
  "lowestTotalPrice": 290.0,
  "lowestPriceProvider": "Booking.com",
  "offersCount": 8,
  "offers": [
    {
      "provider": "Booking.com",
      "pricePerNight": 145.0,
      "totalPrice": 290.0,
      "bookingUrl": "https://www.google.com/travel/lodging/clk?..."
    },
    {
      "provider": "Official Site",
      "pricePerNight": 150.0,
      "totalPrice": 300.0,
      "bookingUrl": "https://www.google.com/travel/lodging/clk?..."
    },
    {
      "provider": "Expedia",
      "pricePerNight": 152.0,
      "totalPrice": 304.0,
      "bookingUrl": "https://www.google.com/travel/lodging/clk?..."
    }
  ],
  "priceInsight": {
    "currentPrice": 145,
    "typicalLowPrice": 130,
    "typicalHighPrice": 180,
    "priceLevel": "typical"
  },
  "stayTotal": {
    "baseTotal": 260.0,
    "taxesAndFees": 30.0,
    "grandTotal": 290.0
  },
  "rating": 4.5,
  "reviewCount": 4210,
  "address": "Taksim Meydani, Istanbul, Turkey",
  "latitude": 41.0369,
  "longitude": 28.9850,
  "googleHotelsUrl": "https://www.google.com/travel/search?q=...",
  "scrapedAt": "2026-10-06T20:30:00+00:00"
}
```

***

### Code Examples

#### Python (apify-client)

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_API_TOKEN")

run_input = {
    "searchQueries": ["hotels in Istanbul"],
    "checkInDate": "+14 days",
    "nights": 2,
    "adults": 2,
    "currency": "USD",
    "includeOtaOffers": True,
    "maxHotelsPerSearch": 25,
}

## Run the Actor and wait for it to finish
run = client.actor("kamerozkan/google-hotels-prices").call(run_input=run_input)

## Fetch results from default dataset
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['hotelName']}: lowest ${item['lowestPricePerNight']} on {item['lowestPriceProvider']}")
```

#### JavaScript / Node.js (apify-client)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({
    token: 'YOUR_APIFY_API_TOKEN',
});

const runInput = {
    searchQueries: ['hotels in Barcelona'],
    checkInDate: '+7 days',
    nights: 1,
    currency: 'EUR',
    includeOtaOffers: true,
};

const run = await client.actor('kamerozkan/google-hotels-prices').call(runInput);
const { items } = await client.dataset(run.defaultDatasetId).listItems();

console.log(`Extracted ${items.length} hotel rate records:`, items);
```

#### cURL

```bash
curl --request POST \
  --url "https://api.apify.com/v2/acts/kamerozkan~google-hotels-prices/runs?token=YOUR_APIFY_API_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "searchQueries": ["hotels in Rome"],
    "checkInDate": "2026-12-01",
    "nights": 2,
    "currency": "EUR"
  }'
```

***

### Pricing Details

This Actor operates under **Pay-Per-Event (PPE)**:

- **Full Hotel Offer ($0.003):** Charged per hotel per check-in date with complete OTA rates, price insights, and stay total.
- **Listing Only ($0.001):** Charged per hotel when `includeOtaOffers: false` (fastest search mode).

Platform compute usage is fully included in the event price. You can set a spending limit in Apify Console to prevent overruns.

Example: 20 hotels in one city for one check-in date with all OTA offers is 20 x $0.003 = $0.06. A 30-day price calendar for 10 hotels is 300 x $0.003 = $0.90.

***

### FAQ

**Do I need a Google account or an API key?** No. The Actor reads the public Google Hotels pages without login or cookies.

**Why did a hotel return no offers?** Google shows no bookable offers for some hotels on some dates (sold out or not listed). The row still has `isAvailable: false` so you can see the gap.

**Can I get Google Travel hotel prices for one hotel across many dates?** Yes. Put the hotel name, its Google Travel URL or its hotel ID (`Ch...`) into **Specific hotels** and set **Number of check-in dates** (for example 30). You get one row per date with every booking site's price in `offers`, so 30 dates are 30 rows, not one row per site.

**Can I track the same hotels every day?** Yes. Put them in **Specific hotels**, use a relative check-in date such as `+14 days`, and add a schedule in Apify Console.

**Am I charged per booking site?** No. One row holds every OTA offer for one hotel and one check-in date, and that row is one $0.003 charge whether Google lists 3 booking sites or 15.

**Which currencies and countries work?** 30+ currencies in the Currency list and any two-letter country code as the point of sale.

### Support and feedback

- Found a bug or missing a field? Open an issue on the **Issues** tab of this Actor. We reply within
  48 hours and ship most fixes within a few days.
- Have an idea for a feature? Issues are the fastest way to get it built.
- If the Actor saves you time, a short review on this page helps other users find it.

# Actor input Schema

## `searchQueries` (type: `array`):

What you would type into Google Hotels, e.g. 'hotels in Istanbul', 'hotels near Eiffel Tower', '5 star hotels in Dubai Marina'. One row per hotel per check-in date.

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

Track specific hotels (e.g. your competitive set). Accepts a hotel name with city ('Hilton Istanbul Bomonti'), a Google Hotels URL, or a Google hotel ID (starts with 'Ch...', returned in the hotelId output field).

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

How many hotels to collect for each search query and date (Google returns ~20 per page; the Actor paginates automatically).

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

Keep only hotels with at least this many stars, e.g. 4 for 4 and 5 star hotels. 0 = no filter. Applies to search queries; filtered-out hotels are not charged.

## `minRating` (type: `string`):

Keep only hotels rated at least this on Google (1 to 5), e.g. 4.5. Empty = no filter.

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

In the selected currency, based on the lowest price in the search results. 0 = no filter.

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

In the selected currency, based on the lowest price in the search results. 0 = no filter. Hotels without a price are skipped when a price filter is set.

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

First check-in date. Absolute (2026-12-20) or relative (+14 days, 2 weeks, tomorrow). Relative dates are ideal for scheduled runs.

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

Length of stay for every check-in date.

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

Scrape prices for this many check-in dates starting from the check-in date. Example: 30 gives you a 30-day price calendar for every hotel.

## `dateStep` (type: `integer`):

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

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

Number of adult guests. Prices are for one room.

## `includeOtaOffers` (type: `boolean`):

Fetch every booking offer for each hotel (Booking.com, Expedia, Hotels.com, Agoda, Trip.com, official site...) with nightly and total prices, booking links, typical price range and tax breakdown. Turn off for a cheaper, faster run that returns only the lowest price from the search results.

## `includeRoomTypes` (type: `boolean`):

Adds room-level prices (e.g. 'Deluxe Double Room') from featured providers. Requires 'Include all OTA offers'.

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

Currency for all prices.

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

Two-letter country code Google uses as the point of sale (us, gb, de, tr...). Prices and the list of booking sites can differ by country.

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

Language for hotel descriptions and room names, e.g. en-US, de, tr, fr.

## `maxItems` (type: `integer`):

Stop after this many rows. Useful to cap costs.

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

Parallel requests to Google. Higher is faster; lower it if you see many retries.

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

Datacenter proxies work in most cases. Switch to residential if you see many failed requests.

## Actor input object example

```json
{
  "searchQueries": [
    "hotels in Istanbul"
  ],
  "maxHotelsPerSearch": 20,
  "minHotelClass": 0,
  "minPricePerNight": 0,
  "maxPricePerNight": 0,
  "checkInDate": "+14 days",
  "nights": 1,
  "numberOfDates": 1,
  "dateStep": 1,
  "adults": 2,
  "includeOtaOffers": true,
  "includeRoomTypes": false,
  "currency": "USD",
  "country": "us",
  "language": "en-US",
  "maxItems": 0,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

Default dataset containing hotel records and price offers.

# 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 = {
    "searchQueries": [
        "hotels in Istanbul"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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