# Google Hotels Scraper - Prices, Ratings, Booking Sites (`unbrowseai/google-hotels-scraper`) Actor

Scrape Google Hotels for any city and dates: nightly and total price, currency, star class, rating, review count, coordinates, amenities, photos, deals, property type, and optionally every booking site's price plus address and phone. Hotels and vacation rentals. Half the usual price.

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

## Pricing

from $1.50 / 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 and Booking Sites for Any City

Turn Google Hotels search results into clean, structured data. For any city, neighbourhood or landmark and your own travel dates, you get each property's nightly price and total price for the stay (taxes and fees included), the currency, star class, guest rating and review count, the rating histogram, exact coordinates, amenities, photos, the deal badge Google shows ("25% less than usual", "Great price for a 4-star hotel"), check-in and check-out times, the official website and a link back to the property on Google Hotels. Hotels and vacation rentals both come back, labelled by property type.

Switch on **Booking sites and address** to also get every booking site's price for the same stay (the hotel's own site, Booking.com, Expedia, Hotels.com, Agoda, Trip.com and others, with direct links), plus the street address, phone number and full description.

### What people use it for

- **Hotel rate shopping and parity checks** – see what each booking site charges for the same room and dates.
- **Revenue management** – track competitor prices around your property by date, star class and rating.
- **Travel apps and comparison sites** – feed live hotel lists, prices, photos and coordinates into your product.
- **Market research** – average nightly rates, supply and ratings by city or neighbourhood.
- **Price alerts** – run on a schedule and watch prices move ahead of holidays and events.

### How to use it

1. Enter one or more **locations** (for example `Lisbon`, `Manhattan`, `Shinjuku Tokyo`). A full phrase such as `resorts in Maui` is searched as typed.
2. Set **check-in and check-out dates** for the real price of your stay. Leave both empty to use Google's default stay; the dates used are in every result.
3. Choose the number of **adults** and the **currency** (USD, EUR, GBP, JPY, ...).
4. Set **Max properties per location**. Results arrive 18–20 per page and the scraper keeps paging until it reaches your number.
5. Optionally tick **Booking sites and address** (one extra request per property).
6. Run, then download JSON, CSV or Excel, or read the dataset through the API.

### Output example

```json
{
  "name": "Ibis Styles Lisboa Centro Marquês de Pombal",
  "propertyType": "Hotel",
  "isVacationRental": false,
  "hotelClass": "3-star hotel",
  "stars": 3,
  "rating": 4.3,
  "reviewsCount": 1993,
  "ratingBreakdown": { "1": 73, "2": 61, "3": 202, "4": 562, "5": 1095 },
  "price": { "perNight": 99.38, "total": 198.77, "beforeTaxes": 170.41, "taxesAndFees": 28.36, "currency": "USD", "perNightLabel": "$99", "totalLabel": "$199", "nights": 2 },
  "deal": "22% less than usual",
  "checkIn": "2026-11-10",
  "checkOut": "2026-11-12",
  "checkInTime": "3:00 PM",
  "checkOutTime": "12:00 PM",
  "latitude": 38.727995,
  "longitude": -9.148818,
  "address": "Av. Fontes Pereira de Melo 5, 1069-114 Lisboa, Portugal",
  "phone": "+351 21 350 3900",
  "amenities": ["Free breakfast", "Free Wi-Fi", "Paid parking", "Air conditioning", "Bar", "Restaurant"],
  "images": ["https://lh3.googleusercontent.com/..."],
  "website": "https://all.accor.com/...",
  "providers": [
    { "name": "Priceline", "isOfficial": false, "pricePerNight": 95, "totalPrice": 190, "url": "https://..." },
    { "name": "Booking.com", "isOfficial": false, "pricePerNight": 99, "totalPrice": 199, "url": "https://www.booking.com/..." }
  ],
  "url": "https://www.google.com/travel/hotels/entity/...",
  "searchLocation": "Lisbon"
}
```

`address`, `phone` and the full `providers` list are filled when **Booking sites and address** is on. Without it, `providers` is filled only where Google puts the offers in the results list (mostly vacation rentals).

### Pricing

You pay per property in the dataset. Searches that fail are free.

| Apify plan | Price per 1,000 properties |
|---|---|
| Free | $2.50 |
| Starter | $2.16 |
| Scale | $1.83 |
| Business and above | $1.50 |

### FAQ

**How many hotels can I get per city?** Google lists hundreds to thousands of properties for big cities. The scraper pages through them up to your limit (maximum 1,000 per location). For more, split a city into neighbourhoods.

**Are prices for the whole stay?** Yes. `price.total` is the full stay including taxes and fees; `price.perNight` is the nightly average.

**Which currency?** Any three-letter code Google Hotels supports. All prices, including booking sites, use it.

**Why is a rating missing?** New or small properties sometimes have no Google reviews yet.

### Legal

This Actor collects publicly visible information from Google Hotels search pages. You are responsible for using the data in line with applicable laws and the terms of the sites involved. It is not affiliated with or endorsed by Google.

# Actor input Schema

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

Cities, neighbourhoods, landmarks or regions (e.g. Lisbon, Manhattan, Shinjuku Tokyo). Each is searched as 'hotels in <location>'. A full phrase such as 'resorts in Maui' is used as typed.

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

Arrival date (YYYY-MM-DD). Leave both dates empty to get Google's default stay (usually tonight, one night); the dates used are in every result.

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

Departure date (YYYY-MM-DD). Must be after check-in.

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

Number of adult guests. Prices follow the party size.

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

Three-letter currency code for all prices (USD, EUR, GBP, JPY, ...).

## `maxResults` (type: `integer`):

Upper limit per location. Results come 18-20 per page; the Actor pages until it reaches this number or Google has no more.

## `includeProviders` (type: `boolean`):

Also fetch every booking site's nightly and total price for each property (official site, Booking.com, Expedia, and others), plus street address, phone and full description. One extra request per property, so runs take longer.

## `languageCode` (type: `string`):

Interface language (e.g. en, de, fr). Affects labels such as the hotel class text.

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

Two-letter search region (e.g. us, gb, de).

## Actor input object example

```json
{
  "locations": [
    "Lisbon"
  ],
  "adults": 2,
  "currency": "USD",
  "maxResults": 10,
  "includeProviders": false,
  "languageCode": "en",
  "countryCode": "us"
}
```

# Actor output Schema

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

No description

# 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"
    ],
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("unbrowseai/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 = {
    "locations": ["Lisbon"],
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("unbrowseai/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 '{
  "locations": [
    "Lisbon"
  ],
  "maxResults": 10
}' |
apify call unbrowseai/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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