# Google Hotels Scraper: Prices, Ratings & Deals (`kuezi/google-hotels-scraper`) Actor

Scrape Google Hotels for any city and dates: price per night and total stay, deals vs usual price, star class, rating, review counts, address, phone, website, coordinates and photos. Pagination, guests, currency and filters included.

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

## Pricing

from $1.10 / 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 Hotels Scraper: prices, ratings & deals for any dates

Scrape **Google Hotels** for any city, area or landmark, with **your exact check-in and check-out dates, guests and currency**.

Each hotel comes back with:

- price per night and **total price for the stay**
- deals compared with the usual price ("38% less than usual")
- star class, guest rating, review count and the full 1–5★ rating breakdown
- address, phone, website, coordinates, photos and nearby places
- Google Hotels and Google Maps links
- optionally, **prices from every booking site** (Booking.com, Expedia, Agoda, Hotels.com, the official site…), each with nightly and total price and a booking link

The Actor pages through the results automatically. When Google returns an empty or blocked page, it retries on a fresh IP, so your runs don't come back empty.

### Why this Google Hotels scraper?

- **Reliable.** Google often serves an empty results page to scrapers. This Actor detects that and retries with a new residential IP. If a phrasing such as "hotels near X" doesn't resolve, it also retries with alternative phrasings.
- **Real stay prices.** Prices are for your dates and number of adults, in your currency. You get both the nightly and the total price, not "from" prices for random dates.
- **Every booking site's price, if you want it.** Turn on `includeVendorPrices` to get the full price list Google shows for each hotel, plus `cheapestVendor`. Rate shoppers need exactly this.
- **Fast and cheap.** Plain HTTP and no headless browser. Hundreds of hotels take a few minutes.
- **Fair billing.** You pay per hotel saved. Hotels removed by your filters, and failed searches, are free.
- **Ready to use.** Clean, flat records work straight in Excel, Google Sheets, BI tools, the Apify API, Make, Zapier, n8n, and AI agents through Apify MCP.

### Use cases

- **Hotel revenue management:** track competitors' prices for upcoming dates. Schedule daily runs to build a rate-shopping history.
- **Travel agencies & tour operators:** shortlist hotels by price, stars and rating for client itineraries, in any currency.
- **Market research:** compare average prices, star mix and ratings by city and season.
- **Lead generation:** collect hotel names, websites, phone numbers and addresses for B2B outreach. Respect anti-spam laws.
- **Travel apps & AI assistants:** give an agent live hotel options for a destination and dates.

### Input

```json
{
  "queries": ["Lisbon", "hotels near Times Square", "resorts in Bali"],
  "checkInDate": "2026-11-12",
  "checkOutDate": "2026-11-15",
  "adults": 2,
  "currency": "USD",
  "maxResultsPerQuery": 100,
  "minRating": 4,
  "maxPricePerNight": 250,
  "includeVendorPrices": true
}
```

- A plain place name ("Lisbon") is searched as "hotels in Lisbon". Full phrasings such as hostels, resorts, or "near a landmark" also work.
- If you leave the dates empty, the stay starts 14 days from today and lasts 2 nights. The maximum is 30 nights.
- Filters (`minRating`, `maxPricePerNight`, `minHotelClass`) are applied before saving, so you don't pay for hotels you filtered out.

### Output

One record per hotel. The example below is a real result from 2 Oct 2026, shortened:

```json
{
  "query": "hotels in Paris",
  "effectiveQuery": "hotels in Paris",
  "searchedPlace": "Paris",
  "position": 1,
  "hotelId": "ChkIy5q-tZ-KsLYZGg0vZy8xMWd5MXR3Y2d6EAE",
  "name": "JO&JOE Paris Gentilly",
  "type": "hotel",
  "rating": 4.4,
  "reviewCount": 5115,
  "ratingHistogram": { "1": 301, "2": 164, "3": 254, "4": 709, "5": 3687 },
  "pricePerNight": 76,
  "pricePerNightText": "US$76",
  "totalPrice": 227,
  "totalPriceText": "US$227",
  "currency": "USD",
  "deal": "42% less than usual",
  "checkIn": "2026-10-20",
  "checkOut": "2026-10-23",
  "nights": 3,
  "address": "Gentilly, France",
  "latitude": 48.8163491,
  "longitude": 2.3382857,
  "phone": "+33 1 84 23 37 60",
  "website": "https://all.accor.com/…",
  "description": "Colorful rooms & dorms in a trendy hostel offering a bar, a warm restaurant & a shared kitchen.",
  "thumbnail": "https://lh3.googleusercontent.com/…",
  "images": ["https://lh3.googleusercontent.com/…"],
  "nearbyPlaces": [{ "name": "…", "travelTime": "9 min" }],
  "googleHotelUrl": "https://www.google.com/travel/hotels/entity/ChkIy5q-tZ-KsLYZGg0vZy8xMWd5MXR3Y2d6EAE",
  "googleMapsUrl": "https://www.google.com/maps?cid=5699907350968254543",
  "adults": 2,
  "scrapedAt": "2026-10-02T…"
}
```

The key-value store's `SUMMARY` record lists, for each search, Google's total hotel count, how many hotels were scanned and how many were saved. `FAILED` lists any searches that failed after all retries. You are not charged for those.

### Pricing

The current prices (per saved hotel, plus the optional per-hotel booking-site price list) are on the **Pricing** tab. Hotels removed by your filters, and failed searches, are never charged. To cap your spend, set *Max cost per run* in the run options.

### FAQ

**Is it legal to scrape Google Hotels?** The Actor collects publicly visible listing information. It needs no login and collects no personal data about individuals. You are responsible for using the data lawfully and in line with the rules that apply to you.

**Are prices exact?** They are the prices Google shows for your dates, guests and currency at the moment of the run. Hotel prices change constantly, so schedule runs if you need history.

**How many hotels can I get per city?** Google pages through results 18–20 at a time, and the Actor paginates until `maxResultsPerQuery` is reached. Big cities have thousands of listings.

**Why do some hotels have no star class?** Google only shows an official star class for some properties. Guesthouses, hostels and rentals often have none.

**Do I get prices from individual booking sites (Booking.com, Expedia…)?** Yes. Turn on `includeVendorPrices` and each hotel gets a `vendorPrices` list: site, nightly price, total price and booking link, cheapest first. It is billed as a separate event, and only when Google lists at least one site.

### More Google data tools from the same developer

- 📈 [Google Trends Scraper](https://apify.com/kuezi/google-trends-scraper): interest over time, regions, rising and breakout queries, unlimited keyword comparison, Trending Now.
- ✈️ [Google Flights Scraper](https://apify.com/kuezi/google-flights-scraper): prices, cheapest-day scan, price insights, full itineraries.

***

*Independent tool, not affiliated with or endorsed by Google.*

# Actor input Schema

## `queries` (type: `array`):

Cities, areas or full Google Hotels searches, one per line: "Lisbon", "hotels near Times Square", "resorts in Bali", "hostels in Berlin". A plain place name is searched as "hotels in <place>".

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

YYYY-MM-DD. Leave empty for 14 days from today.

## `checkOutDate` (type: `string`):

YYYY-MM-DD. Leave empty for 2 nights after check-in. Maximum 30 nights.

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

Number of adult guests (prices depend on it).

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

3-letter currency code for prices: USD, EUR, GBP, INR, JPY, AUD, CAD...

## `maxResultsPerQuery` (type: `integer`):

Stop after this many hotels per search (Google returns ~18-20 per page; we paginate automatically).

## `includeVendorPrices` (type: `boolean`):

Adds every booking site Google lists for the hotel (Booking.com, Expedia, Agoda, Hotels.com, the official site...) with nightly and total price and a booking link. One extra page per hotel, billed as a separate 'vendor prices' event only when sites are found.

## `maxVendorsPerHotel` (type: `integer`):

Keep the N cheapest booking sites per hotel.

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

Only save hotels rated at least this (0-5). 0 = no filter. Filtered-out hotels are not charged.

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

In the chosen currency. 0 = no limit. Filtered-out hotels are not charged.

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

1-5 stars. 0 = no filter. Note: many guesthouses and rentals have no official star class and are excluded when this is set.

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

Interface language code (hl), e.g. en, de, fr, es.

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

Google region code (gl), e.g. us, gb, de. Affects which booking sites and prices Google shows.

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

How many searches run at the same time.

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

Google sometimes returns an empty or blocked page; each retry uses a fresh IP.

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

Residential US proxies are the reliable default for Google.

## Actor input object example

```json
{
  "queries": [
    "Lisbon",
    "hotels near Times Square"
  ],
  "adults": 2,
  "currency": "USD",
  "maxResultsPerQuery": 50,
  "includeVendorPrices": false,
  "maxVendorsPerHotel": 20,
  "minRating": 0,
  "maxPricePerNight": 0,
  "minHotelClass": 0,
  "language": "en",
  "country": "us",
  "maxConcurrency": 3,
  "maxRetries": 6,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `hotels` (type: `string`):

One row per hotel: name, stars, rating, reviews, price per night and total, deal, dates, address, phone, website, Google links.

## `fullResults` (type: `string`):

Complete records including coordinates, rating histogram, photos, nearby places and description.

## `summary` (type: `string`):

Per search: Google's total count, hotels scanned and saved; dates, guests and currency used.

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

// Run the Actor and wait for it to finish
const run = await client.actor("kuezi/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 = {
    "queries": [
        "Lisbon",
        "hotels near Times Square",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

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

```

## MCP server setup

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