# Google Hotels Scraper – Prices, Providers, Ratings & Amenities (`openharvest/google-hotels-scraper`) Actor

Google Hotels scraper for any destination and dates: hotel list with nightly and total prices, price per booking provider (Booking.com, Expedia, hotel website...), star class, guest rating, reviews, amenities, location and photos. No login, no API key.

- **URL**: https://apify.com/openharvest/google-hotels-scraper.md
- **Developed by:** [Enes Bulanık](https://apify.com/openharvest) (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.00 / 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.

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, Providers, Ratings & Amenities

Google Hotels scraper for any destination and dates: the hotel list from google.com/travel/hotels with nightly and total prices, **the price of every booking provider** (Booking.com, Expedia, Agoda, Hotels.com, the hotel's own website…), star class, guest rating, reviews, amenities, address and coordinates. Use it instead of a general web crawler when you need structured Google Hotels price comparisons for specific check-in and check-out dates. No login, no API key, no browser.

**Price: $1.00 per 1,000 hotels, or $2.50 per 1,000 hotels with full provider price comparison.** Errors and empty searches are free.

### What data do you get?

For every hotel in the Google Hotels results:

- 🏨 **Hotel** – name, star class (1–5), guest rating, number of reviews and reviews per star
- 💲 **Price** – lowest nightly price and total stay price (taxes and fees included) in the currency you choose, for your exact dates and number of adults
- 🔁 **Provider prices** – one entry per booking site with nightly price, total price, room types, an "official site" flag, a "sponsored" flag and the booking link, sorted from cheapest
- ✅ **Amenities** – Free Wi-Fi, Free breakfast, Pool, Spa, Parking, Pet-friendly, Air conditioning, Fitness center and more
- 📍 **Location** – address, latitude/longitude, Google Maps link, check-in and check-out times
- 🖼 **Content** – short description, thumbnail, photo URLs, hotel website
- 🔗 **IDs and links** – Google Hotels entity id and a link to the hotel on Google Hotels with your dates
- 📊 **Rank** – the position of the hotel in Google's results (for your sort order and filters)

The Actor pages through Google's results, so you can get the first 10 hotels or several hundred per destination.

### Use cases

- **Hotel price monitoring and rate parity** – compare your hotel's price on Booking.com, Expedia, Agoda and your own website for the same dates, every day.
- **Revenue management and competitor pricing** – track competing hotels' prices for upcoming dates and weekends.
- **Travel apps and AI travel agents** – find the cheapest available hotels for a trip and the site that sells them cheapest.
- **Market research** – average price, rating and supply by city, star class or season.
- **Lead lists for hospitality vendors** – hotel names, star class, websites and locations by city.
- **Price alerts** – run on a schedule and alert when a hotel drops below a target price.

### How to scrape Google Hotels

1. Click **Try for free** / **Start**.
2. Enter one or more **Destinations** (`Paris`, `Manhattan, New York`, `Times Square, New York`, `resorts in Bali`).
3. Set **Check-in** and **Check-out** dates and the number of **Adults** (empty dates = a 2-night stay starting in 14 days).
4. Optionally choose currency, sort order, star class, minimum rating or free cancellation.
5. Click **Start** and download the data as JSON, CSV, Excel or HTML, or connect it to Google Sheets, Make, Zapier, n8n, webhooks or the Apify API.

### Input

| Field | Type | Description |
|---|---|---|
| `destinations` | array of strings | Cities, areas or free-text hotel searches. Default `["Paris"]`. |
| `checkInDate` | string | `YYYY-MM-DD`. Default: 14 days from today. |
| `checkOutDate` | string | `YYYY-MM-DD`. Default: 2 nights after check-in. Max 30 nights. |
| `adults` | integer | Adults per room (1–12). Default `2`. |
| `maxHotelsPerDestination` | integer | Hotels per destination. Default `20`. |
| `includeProviderPrices` | boolean | Full price comparison per booking site. Default `true`. |
| `currency` | string | `USD`, `EUR`, `GBP`, `JPY`, `TRY`, … Default `USD`. |
| `sortBy` | string | `relevance`, `lowest_price`, `highest_rating`, `most_reviewed`. |
| `hotelClass` | array | Star classes to keep, e.g. `["4","5"]`. |
| `minRating` | string | `any`, `3.5`, `4.0`, `4.5`. |
| `freeCancellation` | boolean | Only hotels with a free-cancellation rate. |
| `language` / `country` | string | Google language (`en`, `de`, `fr`…) and market (`us`, `gb`, `de`…). |
| `proxyConfiguration` | object | Optional. Not needed in normal use. |

Example input:

```json
{
    "destinations": ["New York", "Barcelona"],
    "checkInDate": "2026-12-04",
    "checkOutDate": "2026-12-07",
    "adults": 2,
    "maxHotelsPerDestination": 40,
    "currency": "EUR",
    "sortBy": "highest_rating",
    "hotelClass": ["4", "5"],
    "minRating": "4.0",
    "includeProviderPrices": true
}
```

### Output

Real sample from a run (shortened: 3 of 25 providers, 2 photos):

```json
{
    "type": "hotel",
    "position": 1,
    "name": "Pestana Park Avenue",
    "hotelClass": 4,
    "hotelClassText": "4-star hotel",
    "rating": 4.8,
    "reviewsCount": 1315,
    "ratingBreakdown": { "5star": 1172, "4star": 89, "3star": 28, "2star": 12, "1star": 14 },
    "isAvailable": true,
    "pricePerNight": 466.86,
    "totalPrice": 1616.58,
    "priceText": "€467",
    "currency": "EUR",
    "checkInDate": "2026-12-04",
    "checkOutDate": "2026-12-07",
    "nights": 3,
    "cheapestProvider": "Super.com",
    "cheapestProviderPrice": 467,
    "providersCount": 25,
    "providers": [
        { "provider": "Super.com", "pricePerNight": 467, "totalPrice": 1401, "priceText": "€467", "sponsored": false, "officialSite": false, "roomTypes": [], "bookingUrl": "https://www.super.com/travel/transition/?data=..." },
        { "provider": "Vio.com", "pricePerNight": 473, "totalPrice": 1419, "priceText": "€473", "sponsored": false, "officialSite": false, "roomTypes": [], "bookingUrl": "https://deals.vio.com/?sig=..." },
        { "provider": "Etrip.net", "pricePerNight": 473, "totalPrice": 1419, "priceText": "€473", "sponsored": false, "officialSite": false, "roomTypes": [], "bookingUrl": "https://deals.etrip.net/?sig=..." }
    ],
    "amenities": ["Free Wi-Fi", "Parking", "Air conditioning", "Pet-friendly", "Kid-friendly", "Smoke-free property"],
    "description": "Cozy, warmly decorated rooms in a laid-back hotel offering Wi-Fi & parking.",
    "address": "Class B, 23 E 39th St, New York, NY 10016",
    "latitude": 40.7509197,
    "longitude": -73.9800468,
    "checkInTime": "3:00 PM",
    "checkOutTime": "11:00 AM",
    "website": "https://www.pestana.com/en/hotel/pestana-park-avenue?utm_source=google-my-business&...",
    "thumbnailUrl": "https://lh3.googleusercontent.com/gps-cs-s/ANWiy9SbRec5...=s150-w92-h150-n-k-no",
    "imageUrls": ["https://lh3.googleusercontent.com/grass-cs/ACvplmOIaPGa...", "https://lh3.googleusercontent.com/grass-cs/ACvplmMb0RQi..."],
    "hotelId": "ChkI_ZeWj9L1zPBnGg0vZy8xMWg3MW5mN3ZxEAE",
    "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChkI_ZeWj9L1zPBnGg0vZy8xMWg3MW5mN3ZxEAE?hl=en&gl=us&curr=EUR&ts=...",
    "googleMapsUrl": "https://maps.google.com/maps?...&q=Pestana+Park+Avenue",
    "destination": "New York",
    "searchQuery": "hotels in New York",
    "resolvedLocation": "New York",
    "adults": 2,
    "duplicateOfEarlierDestination": false,
    "scrapedAt": "2026-10-08T16:11:57.788Z"
}
```

When `includeProviderPrices` is `false`, the `providers`, `providersCount`, `cheapestProvider` and `cheapestProviderPrice` fields are left out, and `address` and `description` are usually `null` (they come from the hotel detail that the provider option loads). `googleMapsUrl` is then built from the coordinates.

A destination without results produces a free row like `{ "type": "error", "destination": "...", "errorCode": "NO_RESULTS", "error": "..." }`.

The dataset has ready-made views in Apify Console: **Overview**, **Provider prices** (one row per hotel and booking site), **Details & amenities** and **Errors**.

### Pricing

This Actor uses **pay-per-event** pricing. You pay only for hotels you get. Platform usage is included.

| Event | Price | When it is charged |
|---|---|---|
| `hotel` | **$0.001** per hotel ($1.00 / 1,000) | Each hotel saved without provider prices (option off, or Google lists no provider for that hotel and date) |
| `hotel-with-provider-prices` | **$0.0025** per hotel ($2.50 / 1,000) | Each hotel saved with its booking-provider price comparison |
| Errors, empty searches | **Free** | |

Examples:

| Job | Cost |
|---|---|
| 20 hotels in Paris with provider prices | 20 × $0.0025 = **$0.05** |
| 500 hotels in 10 cities, list only | 500 × $0.001 = **$0.50** |
| Daily price check of 50 hotels for 30 days | 1,500 × $0.0025 = **$3.75** |

Tip: set **Max cost per run** in the run options. The Actor stops cleanly when your budget is reached.

### Use with AI agents (MCP)

Add the Actor to the Apify MCP server (`https://mcp.apify.com?tools=openharvest/google-hotels-scraper`) or let an agent find it with `search-actors` ("google hotels"). Every field has a default, so an agent can call it with only a destination and dates.

Example `call-actor` input for "Find the 10 cheapest 4-star hotels in Lisbon for 12–15 March and tell me which site sells each one cheapest":

```json
{
    "destinations": ["Lisbon"],
    "checkInDate": "2027-03-12",
    "checkOutDate": "2027-03-15",
    "hotelClass": ["4"],
    "sortBy": "lowest_price",
    "maxHotelsPerDestination": 10,
    "currency": "EUR"
}
```

### FAQ

**Do I need a Google account or API key?**
No. The Actor reads the same public hotel search that google.com/travel/hotels shows to any visitor, without logging in.

**Why do some hotels have no price?**
Google shows no price when no partner has a room for your dates (sold out) or the property is not bookable through Google. These rows have `isAvailable: false` and `pricePerNight: null`. Use `sortBy: "lowest_price"` to get only priced hotels first.

**Why is `totalPrice` higher than nights × `pricePerNight`?**
`totalPrice` is the stay total Google shows with all taxes and fees. Some destinations add fees (for example city taxes) that are not in the nightly price.

**Are the provider prices the same as on Google?**
Yes, they are the prices Google Hotels shows for your dates, currency and market (`country`) at the time of the run. Booking sites can show different prices to logged-in members or in other countries.

**Are ads included?**
Sponsored offers are marked with `sponsored: true`. The Actor never outputs Google ad-click links, so `bookingUrl` is `null` for some sponsored offers.

**How should I write destinations?**
Use a city, district or area (`Paris`, `Shibuya`, `Manhattan, New York`) or `<type> in <place>` (`resorts in Bali`). `hotels near X` is rewritten to `hotels in X`, because Google otherwise matches it to a whole country. Each row has `resolvedLocation` with the place Google matched, so you can check it. Google always returns hotels, even for a misspelled destination (it then falls back to a whole country), so the log shows a warning when the matched place does not look like your destination. Test a new destination with a small `maxHotelsPerDestination` first.

**How many hotels can I get per destination?**
Google returns about 18–20 hotels per page. The Actor pages through the results up to `maxHotelsPerDestination` (max 500).

**Can I use different currencies and languages?**
Yes. Set `currency` (e.g. `EUR`, `GBP`, `JPY`), `language` for texts and `country` for the market.

**Can I run it on a schedule?**
Yes. Use Apify Schedules to track prices daily. Leave the dates empty to always check "14 days from today", or set fixed dates.

### Is it legal to scrape Google Hotels?

The Actor collects only **publicly available** hotel information and prices that Google shows to every visitor, without login. It does not collect personal data about individuals (no emails, no phone numbers, no reviewer profiles). Google's Terms of Service restrict automated access, and hotel descriptions and photos may be protected by copyright, so use the data for analysis, monitoring and research, keep request volumes reasonable, and check the terms and your local law before republishing content. If you are unsure, consult a lawyer.

### Related actors by the same developer

- Google Trends Scraper – Interest Over Time & Related Queries
- Google News Scraper – Full Article Text & Real Publisher URLs
- Eventbrite Scraper – Events, Tickets & Organizers by City
- Luma Events Scraper – lu.ma Events, Hosts & Tickets by City

### Support & feedback

Found a bug or a missing field? Open an issue in the **Issues** tab. We usually reply within a day.

# Actor input Schema

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

Cities, areas or free-text hotel searches, exactly as you would type them into Google Hotels. Plain place names get "hotels in" added automatically. Examples: <code>Paris</code>, <code>Manhattan, New York</code>, <code>Times Square, New York</code>, <code>resorts in Bali</code>.

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

Arrival date (YYYY-MM-DD). Leave empty for 14 days from today. Must be in the future.

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

Departure date (YYYY-MM-DD). Leave empty for a 2-night stay. Maximum 30 nights.

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

Number of adult guests. Prices are for one room for this many adults.

## `maxHotelsPerDestination` (type: `integer`):

How many hotels to return for each destination (Google shows about 18-20 per page; the Actor pages through the results). You pay per hotel, so this also caps your cost.

## `includeProviderPrices` (type: `boolean`):

For each hotel, also return the full price comparison (Booking.com, Expedia, Agoda, Hotels.com, the hotel's own website, ...) with nightly and total price, room types and booking link. Needs one extra request per hotel and is charged as a separate, slightly higher event. Turn off for a faster, cheaper hotel list with Google's lowest price only.

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

Currency for all prices (3-letter ISO code).

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

Order of the results, same as the Google Hotels sort menu.

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

Only hotels with these star ratings. Leave empty for all.

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

Only hotels with at least this guest rating (out of 5).

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

Only hotels that offer a rate with free cancellation.

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

Google interface language code for texts such as descriptions and room names, e.g. <code>en</code>, <code>de</code>, <code>fr</code>, <code>es</code>, <code>ja</code>.

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

2-letter country code of the market you search from, e.g. <code>us</code>, <code>gb</code>, <code>de</code>. Booking providers and prices can differ by market.

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

Usually not needed. Enable Apify Proxy only if you run very large jobs and see repeated HTTP 429 warnings.

## Actor input object example

```json
{
  "destinations": [
    "Paris",
    "Barcelona",
    "Shibuya, Tokyo"
  ],
  "checkInDate": "2026-11-20",
  "checkOutDate": "2026-11-22",
  "adults": 2,
  "maxHotelsPerDestination": 50,
  "includeProviderPrices": true,
  "currency": "EUR",
  "sortBy": "lowest_price",
  "hotelClass": [
    "4",
    "5"
  ],
  "minRating": "4.0",
  "freeCancellation": false,
  "language": "en",
  "country": "us",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped items in the default dataset (JSON, CSV, Excel and more via the dataset export).

## `files` (type: `string`):

Records saved in the default key-value store, e.g. the run summary.

# 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": [
        "Paris"
    ],
    "maxHotelsPerDestination": 10,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("openharvest/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": ["Paris"],
    "maxHotelsPerDestination": 10,
    "proxyConfiguration": { "useApifyProxy": False },
}

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

```

## MCP server setup

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