# Google Travel Hotels Scraper: Hotel Rates & Prices by Date (`data-done-right/google-hotels-scraper`) Actor

Scrape hotel prices from Google Hotels (Google Travel hotels) for any city or hotel and your dates: nightly and total hotel rates, provider offers (Booking.com, Expedia, direct), stars, rating, reviews, amenities. Date-range mode works as a hotel price tracker. A Google Hotels API.

- **URL**: https://apify.com/data-done-right/google-hotels-scraper.md
- **Developed by:** [Data Done Right](https://apify.com/data-done-right) (community)
- **Categories:** Travel, E-commerce, Automation
- **Stats:** 2 total users, 1 monthly users, 83.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.68 / 1,000 hotels

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 Travel Hotels Scraper: Hotel Rates & Prices by Date

This Google Hotels scraper gets hotel prices from **Google Hotels** (google.com/travel/hotels) for any city, area or specific hotel and **your exact dates, guests and currency**: lowest price per night and for the whole stay (before and after taxes), every provider offer Google lists (Booking.com, Expedia, Hotels.com, the hotel's own site...), deal flags ("24% less than usual"), star class, guest rating, review count and breakdown, amenities, coordinates and Google IDs.

Built for reliability: plain HTTP requests to Google's server-rendered data (no browser), residential proxy by default, automatic new-IP retry when Google blocks, and a check that **every price is for the dates you asked for**. If Google priced other dates, the row is dropped and the reason is written to `NOTES`. You never get silently wrong prices.

### Google Hotels scraper features

- **Destination search**: "Lisbon", "Paris 11th arrondissement", "hotels near Times Square". Up to 20 properties per destination and date.
- **Hotel-name lookup**: "Avenida Palace Lisbon" returns that hotel with **all provider offers** for your dates.
- **Provider offers** for the top N hotels of a destination search (optional): provider, nightly and total price with and without taxes, free cancellation, official-site flag, room-level rates where Google shows them, and the booking link.
- **Price calendar mode**: the same searches for every check-in date in a range (daily or every N days, up to 31 dates). Good for "cheapest night to go" charts.
- **Comparable output**: numbers as numbers, ISO dates, currency code on every row, and the requested vs actual stay on every row.
- Any currency (USD, EUR, GBP, JPY...), language (`hl`) and country (`gl`). Adults 1 to 10.

### Input example

```json
{
  "destinations": ["Lisbon"],
  "hotelNames": ["Avenida Palace Lisbon"],
  "checkIn": "2026-11-12",
  "checkOut": "2026-11-14",
  "adults": 2,
  "currency": "USD",
  "maxHotelsPerSearch": 20,
  "offersForTopHotels": 3
}
```

Price calendar: add `"dateRangeEnd": "2026-12-12", "dateStepDays": 7, "nights": 2` (check-ins every week, 2-night stays).

### Output example (one row per hotel; shortened)

```json
{
  "inputType": "destination",
  "input": "Lisbon",
  "requestedCheckIn": "2026-11-12",
  "requestedCheckOut": "2026-11-14",
  "adults": 2,
  "position": 1,
  "name": "Pestana Rua Augusta",
  "propertyType": "hotel",
  "hotelClass": 4,
  "rating": 4.8,
  "reviewCount": 516,
  "ratingDistribution": {"5": 451, "4": 36, "3": 13, "2": 3, "1": 13},
  "reviewAspects": [{"aspect": "Service", "mentions": 132, "positive": 125, "negative": 5}],
  "latitude": 38.708989,
  "longitude": -9.136685,
  "checkInTime": "3:00 PM",
  "checkOutTime": "12:00 PM",
  "website": "https://www.pestana.com/en/hotel/pestana-rua-augusta-lisboa",
  "countryCode": "PT",
  "amenities": ["Breakfast", "Free Wi-Fi", "Air conditioning", "Pet-friendly", "Parking", "Restaurant"],
  "currency": "USD",
  "checkIn": "2026-11-12",
  "checkOut": "2026-11-14",
  "nights": 2,
  "pricePerNight": 195,
  "pricePerNightWithTaxes": 205,
  "priceTotal": 391,
  "priceTotalWithTaxes": 410,
  "taxesAndFees": 18.95,
  "dealLabel": "20% less than usual",
  "discountPercent": 20,
  "priceAvailable": true,
  "offersCount": 25,
  "cheapestProvider": "Super.com",
  "offers": [
    {"provider": "Super.com", "pricePerNight": 195, "pricePerNightWithTaxes": 205, "priceTotal": 391, "priceTotalWithTaxes": 410,
     "freeCancellation": null, "isOfficialSite": false, "url": "https://www.google.com/travel/lodging/clk?..."},
    {"provider": "Pestana Rua Augusta Lisboa", "pricePerNight": 223, "priceTotalWithTaxes": 491, "freeCancellation": true,
     "isOfficialSite": true, "rooms": [{"room": "Comfort Interior, Interior view - Standard rate Room only", "pricePerNight": 223,
                "priceTotalWithTaxes": 491, "freeCancellationUntil": "Oct 29"}]},
    {"provider": "Booking.com", "pricePerNight": 248, "priceTotalWithTaxes": 544, "freeCancellation": true}
  ],
  "googleHotelId": "16884105940497923569",
  "entityToken": "ChkIkNXS-8Ke94AGGg0vZy8xMXY1Ynl0NDM3EAE",
  "knowledgeGraphId": "/g/11v5byt437",
  "mapsCid": "432869980530584208",
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChkI.../prices?...",
  "scrapedAt": "2026-10-19T04:43:10Z"
}
```

`pricePerNight` and `priceTotal` are before taxes and fees, and the `...WithTaxes` fields include them, as Google shows them. Hotels Google shows without a price for your dates (sold out) have `priceAvailable: false`.

### How to track Google Hotels prices by date

Set `destinations` or `hotelNames`, your `checkIn` and `checkOut` dates, `adults` and `currency`. For a price calendar add `dateRangeEnd` and `dateStepDays`, and schedule the run with Apify Schedules to build a price history.

### Google Hotels API and hotel price API

Call this Actor from the Apify API, Python, JavaScript, Make, Zapier or n8n and get hotel prices by date as JSON, or export them to CSV, Excel or Google Sheets. There's no partner contract and no API key.

### Use it in Claude, ChatGPT and Cursor

Connect Apify's MCP server (mcp.apify.com) and your AI assistant can check hotel prices itself. For example: "what do 4-star hotels in Lisbon cost for 2 adults from Dec 12 to 15, and which site is cheapest?" Give it a destination or hotel name. The dates default to 30 days from today.

### Use cases

- Revenue management: track your hotel's and competitors' rates by date and channel (OTA vs direct).
- Price calendars: find the cheapest dates for a trip or an event.
- Travel content and comparison sites: clean hotel lists with ratings, coordinates and live prices.
- Parity monitoring: is the official site cheaper than Booking.com and Expedia?

### Limits (honest)

- **Up to 20 properties per destination and date** (Google's first results page). For more, split a city into areas ("Lisbon Alfama", "Lisbon Baixa") or run several destinations.
- One room. Adults only (children ages are not supported yet). The adult count is sent to Google with every search and checked on hotel pages (offers). Results-list cards do not echo it, so it cannot be checked there.
- Amenities are filled for destination results. Hotel-name lookups return details, rating and offers, but amenities are empty.
- Vacation rentals that Google mixes into some results are skipped unless you turn on `includeVacationRentals`.
- Prices are what Google shows to a visitor from the chosen country (`gl`) and proxy country. They can differ from the provider's own site at booking time.
- Room-level rates and free-cancellation dates appear only where Google shows them (usually the featured providers).
- Google can change its page format. The actor checks dates and data on every page and reports problems in `NOTES` rather than returning wrong data.
- When Google blocks an IP, the actor retries with up to 4 fresh residential IPs, then reports the search as failed in `NOTES`. It never solves CAPTCHAs.

### How much does it cost

Pay per event: **$0.004 per destination search page** (`search`, one per destination and date), **$0.00085 per hotel row** (`hotel`), and **$0.006 per hotel with full provider offers** (`hotel-offers`, one extra Google page per hotel). A hotel-name lookup is charged as `hotel` + `hotel-offers`. Example: 20 hotels for one city and date cost about $0.02.

### FAQ

#### Is there a Google Hotels API?

Google's hotel APIs (Hotel Center and the Travel Partner API) are for hotels and booking sites that send their own prices to Google. They don't let you read prices. This Actor reads the public Google Hotels results instead, so it works as a Google Hotels API for any city or hotel.

#### Is there a free hotel price API?

Apify's free plan includes $5 of platform credit every month. At about $0.02 for 20 hotels for one city and date, that covers a few hundred searches.

#### How do I get Google Hotels prices for specific dates?

Set `checkIn`, `checkOut`, `adults` and `currency`, and add a city or a hotel name. Every row carries the requested and actual stay dates, and rows priced for other dates are dropped.

#### Are Google Hotels prices per night or for the whole stay?

Both. Each row has `pricePerNight` and `priceTotal` before taxes, and `pricePerNightWithTaxes` and `priceTotalWithTaxes` including taxes and fees, as Google shows them.

#### Can I compare Booking.com, Expedia and the hotel's own site?

Yes. Turn on provider offers (`offersForTopHotels`) or look up a hotel by name. You get each provider's price, a free-cancellation flag where Google shows it, and an official-site flag.

#### Can I track hotel prices over time or build a price calendar?

Yes. Price calendar mode runs the same search for every check-in date in a range (up to 31 dates). Schedule it to build a price history.

#### Why can Google Hotels prices differ from the booking site?

Prices are what Google shows a visitor from the chosen country and proxy location. They can differ from the provider's own site at booking time.

#### Is it legal to scrape Google Hotels?

The data is public and needs no login. Follow Google's terms and the laws that apply to you.

### Related tools

- **[Google Trends Scraper](https://apify.com/data-done-right/google-trends-scraper)** shows search interest by region and time, useful for travel demand.
- **[Google News Scraper](https://apify.com/data-done-right/google-news-scraper)** tracks news about destinations and events that move hotel prices.

# Actor input Schema

## `destinations` (type: `array`):

Cities, areas or full searches, e.g. 'Lisbon', 'Paris 11th arrondissement', 'hotels near Times Square'. 'hotels in' is added when the text doesn't mention hotels. Each destination returns up to 20 properties (Google's first results page).

## `hotelNames` (type: `array`):

Specific hotels, ideally with the city, e.g. 'Avenida Palace Lisbon'. Each returns the best matching hotel with all provider offers (Booking.com, Expedia, hotel direct...).

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

YYYY-MM-DD. Empty = 30 days from today.

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

YYYY-MM-DD. Empty = check-in plus 'Nights'.

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

Length of stay when no check-out date is given (also used by the date-range mode).

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

Price-calendar mode. When set, the same searches run for every check-in date from 'Check-in date' to this date (step below, max 31 dates). Each date is a separate Google page.

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

Days between check-in dates in the date range (1 = every day, 7 = same weekday each week).

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

Number of adult guests (one room).

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

ISO currency code for prices, e.g. USD, EUR, GBP, JPY.

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

Google interface language (hl), e.g. en, de, fr, es. Affects names, descriptions and deal labels.

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

Google country (gl), e.g. us, gb, de. Prices and providers can differ by country.

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

Up to 20 (Google's first results page) per destination and date.

## `offersForTopHotels` (type: `integer`):

For destination searches: also open the hotel page of the first N hotels to get every provider offer (Booking.com, Expedia, hotel direct...). One extra page per hotel, charged as 'hotel-offers'. 0 = lowest price only. Hotel-name lookups always include offers.

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

Keep apartments and houses Google mixes into some results (they have no star class or hotel amenity codes).

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

Residential proxy is recommended for Google (default). On a block the actor switches to a new IP automatically.

## `debugSaveHtml` (type: `boolean`):

Save the first 10 Google pages to the key-value store (HTML-0, HTML-1, ...) for troubleshooting.

## Actor input object example

```json
{
  "destinations": [
    "Lisbon"
  ],
  "nights": 1,
  "dateStepDays": 1,
  "adults": 2,
  "currency": "USD",
  "language": "en",
  "country": "us",
  "maxHotelsPerSearch": 20,
  "offersForTopHotels": 0,
  "includeVacationRentals": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "debugSaveHtml": false
}
```

# Actor output Schema

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

All result items of this run (the default dataset), as JSON, CSV, Excel and more.

## `records` (type: `string`):

Key-value store records: the run summary, notes on any problems, and any files.

# 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 = {
    "destinations": [
        "Lisbon"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data-done-right/google-hotels-scraper").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 = {
    "destinations": ["Lisbon"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("data-done-right/google-hotels-scraper").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 '{
  "destinations": [
    "Lisbon"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call data-done-right/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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

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/mJnIQ4Eys6IYOxigu/builds/xm8gn5XncrfynNQAp/openapi.json
