# Google Hotels Scraper – Prices, Booking Sites, Reviews (`brii3343/google-hotels-scraper`) Actor

Scrape Google Hotels: price per night with and without taxes, every booking site's price and link (Booking.com, Expedia, official site), stars, ratings, reviews, amenities, photos and vacation rentals. All filters, any currency, dates relative to today so scheduled runs never break.

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

## Pricing

from $2.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 — hotel prices, booking sites, reviews and vacation rentals

Type a city, an area or any Google Hotels search and get every hotel Google shows: **price per night with and without taxes, total price, stars, rating, reviews, amenities, coordinates, photos, nearby places** and, if you want, **the price of every booking site** (Booking.com, Expedia, Hotels.com, Agoda, the hotel's own site…) with links and free-cancellation deadlines. Vacation rentals too, with guests, bedrooms and bathrooms. One row per property, ready for spreadsheets, dashboards, n8n, Make or your own code.

#### Why this Actor

- **Scheduled runs never break.** Dates can be a number of days from today (`30` = in 30 days), and empty dates mean "14 days from today". Your daily or weekly price tracking keeps working without editing the input.
- **Every booking site's price, not just one.** Turn on *Include prices from every booking site* and each hotel comes with all the offers Google lists (about 20 per hotel in our tests), the cheapest site, address, phone and Google Place ID.
- **Readable data.** Amenities by name (`Free Wi-Fi`, `Pools`, `Pet-friendly`), stars as a number, taxes and fees as separate fields, review topics with positive and negative mentions, walking and driving times to nearby places.
- **All of Google's filters.** Stars, guest rating, price range, amenities, free cancellation, special offers, eco-certified, sort by price, rating or number of reviews, currency, language and country.
- **Pay only for results.** Unknown places, searches without results and invalid dates come back with a clear status and **are not charged**.
- **Fast.** In our tests: 500 hotels from 10 cities in 40 seconds; 200 hotels with every booking site's price in 53 seconds.

#### Use cases

- **Price monitoring and revenue management**: track your hotel and your competitors every day, for the dates that matter.
- **Travel sites and apps**: fill your pages with prices, ratings, photos and booking links.
- **Market research**: average prices, star mix and ratings of any city or neighbourhood.
- **Rate parity checks**: compare the official site with Booking.com, Expedia and the others for the same room and dates.
- **Lead generation**: hotel names, websites, phone numbers and addresses by area.
- **AI agents and LLM pipelines**: give your assistant live hotel prices in clean JSON.

#### Input

| Field | Description |
|---|---|
| Locations | One per line: `Rome`, `Manhattan, New York`, `hotels near Eiffel Tower`, `beach resorts in Cancun`… |
| Check-in / check-out date | `YYYY-MM-DD` or a number of days from today. Empty = in 14 days, for the number of nights below. |
| Nights, adults, children ages | Length of the stay and guests (prices are for one room or rental). |
| Currency, language, country | `USD`, `EUR`, `GBP`…; Google language (`en`, `it`, `de`…) and the country of the user. |
| Max results per location | Default 50, up to 1,000. Google shows 20 per page; duplicates between pages are removed. |
| Include prices from every booking site | Adds every site's price and link, cheapest site, address, phone and Place ID (one extra event per hotel). |
| Property type | Hotels as on Google, hotels only (skip vacation rentals), or vacation rentals. |
| Filters and sorting | Sort by, min/max price per night, stars, guest rating, amenities, free cancellation, special offers, eco-certified. |

Example input:

```json
{
  "locations": ["Barcelona", "hotels near Times Square"],
  "checkInDate": "30",
  "nights": 3,
  "adults": 2,
  "currency": "EUR",
  "maxHotelsPerLocation": 100,
  "hotelClass": ["4", "5"],
  "includeVendorPrices": true
}
```

#### Output

One item per hotel or rental. Real output (shortened: lists cut, one booking site of 27 shown):

```json
{
  "location": "Barcelona",
  "query": "hotels in Barcelona",
  "position": 1,
  "status": "ok",
  "name": "The One Barcelona",
  "category": "hotel",
  "type": "5-star hotel",
  "hotelClass": 5,
  "rating": 4.6,
  "reviewCount": 1262,
  "ratingDistribution": { "1": 40, "2": 15, "3": 56, "4": 167, "5": 984 },
  "displayedPrice": "$390",
  "pricePerNight": 390.17,
  "pricePerNightWithTaxes": 459.22,
  "totalPrice": 780.33,
  "taxes": 138.1,
  "fees": 0,
  "totalPriceWithTaxes": 918.43,
  "currency": "USD",
  "checkIn": "2026-10-12",
  "checkOut": "2026-10-14",
  "nights": 2,
  "latitude": 41.396113,
  "longitude": 2.163037,
  "checkInTime": "3:00 PM",
  "checkOutTime": "12:00 PM",
  "website": "https://www.hotelstheone.com/en/barcelona-hotels/the-one-barcelona",
  "description": "Elegant quarters in an upmarket hotel offering posh dining, a luxe spa & a rooftop terrace.",
  "amenities": ["Breakfast ($)", "Free Wi-Fi", "Parking ($)", "Pools", "Air conditioning", "Pet-friendly"],
  "reviewTopics": [
    { "name": "Spa", "score": 0.83, "mentions": 32, "positive": 29, "negative": 1 }
  ],
  "nearbyPlaces": [
    { "name": "La Pedrera - Casa Milà", "category": "attraction", "travelTimes": [{ "mode": "walking", "duration": "2 min" }] }
  ],
  "images": ["https://lh3.googleusercontent.com/gps-cs-s/…"],
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChoIqO7bqci1k92vARoNL2cvMTFjNTd5YjVyNRAB?hl=en&gl=us&curr=USD&ts=…",
  "googleMapsUrl": "https://maps.google.com/?cid=12662518705670256424",
  "propertyToken": "ChoIqO7bqci1k92vARoNL2cvMTFjNTd5YjVyNRAB",
  "address": "Carrer de Provença, 277, Eixample, 08037 Barcelona, Spain",
  "phone": "+34 932 14 20 70",
  "googlePlaceId": "ChIJAweFnpSipBIRKPc2haxNuq8",
  "priceInsight": "17% less than usual",
  "vendorCount": 27,
  "cheapestVendor": "The One Barcelona",
  "cheapestPricePerNight": 390.17,
  "cheapestPricePerNightWithTaxes": 459.21,
  "vendorPrices": [
    {
      "vendor": "Priceline",
      "isOfficialSite": false,
      "pricePerNight": 444.68,
      "pricePerNightWithTaxes": 514.24,
      "totalPrice": 889.35,
      "totalPriceWithTaxes": 1028.48,
      "freeCancellation": false,
      "freeCancellationUntil": null,
      "vendorUrl": "https://www.priceline.com/r/?channel=meta&product=hotel&hotelid=50903603&checkin=20261012&checkout=20261014…",
      "bookingUrl": "https://www.google.com/travel/lodging/clk?pc=…"
    }
  ],
  "adults": 2,
  "childrenAges": [],
  "scrapedAt": "2026-09-28T22:54:18.262Z"
}
```

Vacation rentals add these fields (real values, Lisbon):

```json
{
  "name": "Lx villa,15m to downtown,14 ppl,,private heatable pool and lift",
  "category": "vacation_rental",
  "type": "Vacation rental",
  "maxGuests": 14,
  "bedrooms": 6,
  "bathrooms": 3,
  "listedOn": [{ "site": "Vrbo.com", "url": "https://www.vrbo.com/pdp/lo/19069243?…" }]
}
```

`googleHotelsUrl` opens the same property on Google Hotels with your dates, guests and currency.

`status` is one of:

| Status | Meaning | Charged |
|---|---|---|
| `ok` | Hotel or rental returned | yes |
| `no_results` | Google found nothing with these dates and filters | no |
| `location_not_found` | Google did not recognize the place and fell back to random hotels: add a city (`Marriott in Chicago`) | no |
| `invalid_input` | Date in the past, check-out before check-in, or more than 30 nights | no |
| `error` | Google refused every retry (rare); try again later | no |

#### Honest limits

- **Prices are Google's prices** at the moment of the run, for one room or rental and the guests you set. Children count as guests for the booking sites' prices, as on Google.
- **The cheapest booking site can be below the list price**: official hotel sites often offer member or direct rates. In our tests the cheapest site was within 5% of the list price for 84% of hotels.
- **Amenity names are always in English**, whatever the language; descriptions and review topics follow the language you choose.
- **Hotel searches include some vacation rentals**, as on Google (they have `category: "vacation_rental"`). Choose *Hotels only* to skip them.
- **In vacation-rental searches Google also lists apartments sold like hotels** (through Booking.com or Expedia, for example): they come with `category: "hotel"` and without guests, bedrooms and bathrooms. Vacation rentals have no street address or Place ID.
- **The number of beds and the floor area** are not in Google's results and are not returned.
- A search like `hotels near me` uses the location of the server, not yours: name the place.
- `priceInsight` ("17% less than usual") is shown by Google only for some hotels (about 1 in 3 in our tests).

#### Pricing

**$3.50 per 1,000 hotels** on the Starter plan, down to **$2.50** on Business (pay per event: one `hotel` event per result; the Pricing tab shows the price for your plan). With *Include prices from every booking site*, the same again per hotel (`hotel-details` event, charged only when the prices were loaded). Rows with a status other than `ok` are free.

# Actor input Schema

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

Where to search, one per line: a city, an area, a landmark or any Google Hotels search, for example <code>Rome</code>, <code>Manhattan, New York</code>, <code>hotels near Eiffel Tower</code>, <code>beach resorts in Cancun</code>.

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

<code>YYYY-MM-DD</code>, or a number of days from today (for example <code>30</code>), so scheduled runs never use a date in the past. Leave empty for 14 days from today.

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

<code>YYYY-MM-DD</code> or a number of days from today. Leave empty to use the number of nights below.

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

Length of the stay when the check-out date is empty (1 to 30).

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

Prices are for this many guests in one room or rental.

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

One age (0 to 17) per child, for example <code>8</code> and <code>12</code> for two children.

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

Three-letter currency code for all prices: <code>USD</code>, <code>EUR</code>, <code>GBP</code>, <code>JPY</code>...

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

How many hotels (or rentals) to return for each location, in Google's order. Google shows 20 per page; duplicates between pages are removed.

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

For each hotel, also get the price offered by every booking site Google lists (Booking.com, Expedia, Hotels.com, Agoda, the official site...) with links, free-cancellation deadlines, the cheapest site, address, phone and Google Place ID. One extra request per hotel, charged as a separate event.

## `propertyType` (type: `string`):

Hotels as Google shows them (Google mixes in some vacation rentals, marked <code>vacation\_rental</code>), hotels only, or vacation rentals (apartments, houses, villas) with guests, bedrooms, bathrooms and cleaning fees.

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

Order of the results. Relevance is the order Google shows by default.

## `minPrice` (type: `integer`):

In the chosen currency.

## `maxPrice` (type: `integer`):

In the chosen currency.

## `hotelClass` (type: `array`):

Only hotels with these star ratings. Empty = all.

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

Only properties with at least this average guest rating.

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

Only properties that have all of these.

## `freeCancellation` (type: `boolean`):

Only hotels that offer free cancellation for these dates.

## `specialOffers` (type: `boolean`):

Only hotels with a special offer or deal for these dates.

## `ecoCertified` (type: `boolean`):

Only hotels with an eco certification.

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

Google interface language code (<code>en</code>, <code>es</code>, <code>de</code>...). Changes descriptions and review topics; amenity names stay in English.

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

Two-letter country code of the user Google should assume (<code>us</code>, <code>gb</code>, <code>de</code>...). Booking sites and prices can change by country.

## Actor input object example

```json
{
  "locations": [
    "Rome",
    "New York"
  ],
  "checkInDate": "",
  "checkOutDate": "",
  "nights": 2,
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "maxHotelsPerLocation": 50,
  "includeVendorPrices": false,
  "propertyType": "hotels",
  "sortBy": "relevance",
  "hotelClass": [],
  "minRating": "any",
  "amenities": [],
  "freeCancellation": false,
  "specialOffers": false,
  "ecoCertified": false,
  "language": "en",
  "country": "us"
}
```

# Actor output Schema

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

One item per hotel or rental: prices with and without taxes, rating, reviews, amenities, location, photos and, optionally, the price on every booking site.

# 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": [
        "Rome",
        "New York"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("brii3343/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": [
        "Rome",
        "New York",
    ] }

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

```

## MCP server setup

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