# Google Hotels Scraper | Prices, Offers and Ratings (`silentflow/google-hotels-scraper`) Actor

Google Hotels scraper that turns any destination into a hotel price table: rates for your dates, star class, guest ratings, taxes and fees, plus the offers of Booking.com, Expedia, Agoda and the hotel's own site with booking links. Address, phone, coordinates, amenities, photos. No account needed.

- **URL**: https://apify.com/silentflow/google-hotels-scraper.md
- **Developed by:** [SilentFlow](https://apify.com/silentflow) (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.55 / 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

**Turn Google Hotels into a table: every hotel of a destination, priced for your dates, with the rate of every booking site Google compares on the same row.** 20 hotels with their offers in about ten seconds, a whole city in a few minutes.

### How it works

![How it works](https://api.apify.com/v2/key-value-stores/YXm81xySHg6uRkewS/records/google-hotels-scraper-how-it-works-v1.png)

1. **You type destinations, hotel names or hotel links, and your dates.** `hotels in Paris`, `resorts in Bali`, `Ritz Paris`, or the link of a hotel page on Google Hotels. Pick the check-in and check-out, the number of adults and the currency. Leave the dates empty to price one night starting tomorrow.
2. **One row comes back per hotel.** 34 fields: name, star class, guest rating and review histogram, price per night and total with taxes and fees, the offers of Booking.com, Expedia, Agoda, Trip.com, the hotel's own site and every other seller Google lists, each with its per-night price, total and booking link, plus address, phone, coordinates, amenities, photos and description. Ready for a spreadsheet, a warehouse, a rate parity dashboard or an AI pipeline.

### ✨ Why teams choose this over other Google Hotels scrapers

Checking hotel rates city by city in a browser? Copying prices into a sheet the night before a pricing meeting? Running a scraper that returns 20 hotels and stops, or prices for dates you did not ask for?

- 💵 **Prices for your stay, not for a random night.** Check-in, check-out, party size and currency are part of the request, so every price per night, every total and every offer is the one Google shows a traveler with your dates. The taxes and fees are broken out on the row.
- 🏷️ **The whole offers ladder on every hotel.** Up to 24 sellers per hotel on our Paris test: the hotel's own site flagged as official, Booking.com, Expedia, Hotels.com, Agoda, Trip.com, Vio.com, Priceline, Super.com and the others, each with its per-night rate, its total and its booking link. Rate parity in one column instead of one tab per site.
- 📄 **Hundreds of hotels per destination.** The walk follows Google's own pagination, 20 hotels per page, page after page, until your cap. Duplicates across pages are removed on the hotel's stable id.
- ⭐ **Ratings you can compare.** Guest rating, review count and the 1 to 5 star histogram as numbers, the star class as an integer, never "4.5/5 (1,2K)" strings.
- 🗺️ **Where it is and how to reach it.** Street address, phone, latitude and longitude, country code, check-in and check-out times, the hotel's website and its Google Maps link.
- 🌐 **Any market, any currency.** 24 currencies and 14 languages: price Tokyo in yen with Japanese descriptions, London in pounds, Dubai in dirhams.
- 🔓 **No account, no API key.** Click Start on the prefilled form and the first 50 hotels of Paris arrive with their offers in about half a minute.

### 🎯 What you can do with Google Hotels data

| Team | What they build |
|---|---|
| Revenue management | A nightly rate shop of the 30 competitors of each property, with the rate of every OTA next to the hotel's own, to spot parity breaks before guests do |
| OTAs and metasearch | A price index of a destination for a given stay, refreshed every morning, to check their own placement and undercut where it matters |
| Travel agencies and TMCs | A quote of every hotel of a city for the client's exact dates, party size and currency, exported to a proposal in minutes |
| Market analysts | The average price per night by star class and neighborhood across 500 hotels of a city, for a report or an investor deck |
| Hotel groups | The guest rating and review histogram of every property of a brand and its competitors, tracked week by week |
| Data and AI teams | A structured hotel dataset with prices, coordinates, amenities and descriptions to feed a travel assistant or a recommendation model |
| Growth and SEO | Destination pages with live prices from, ratings and hotel counts, regenerated from the dataset on a schedule |

### 📥 Input parameters

Type a destination like `hotels in Paris`, pick your dates and hit Start. Each hotel becomes one row of the dataset, priced for your stay.

| Field | Type | Default | What it does |
|---|---|---|---|
| `searchQueries` | array | `["hotels in Paris"]` | What to search, one per line: a destination (`hotels in Paris`, `resorts in Bali`, `hotels near Times Square`), a hotel name (`Ritz Paris`) or the link of a hotel page (`https://www.google.com/travel/hotels/entity/...`). A destination returns hotels in Google's order, 20 per page; a hotel name or link returns that hotel alone. |
| `checkInDate` | string | empty | First night of the stay, `YYYY-MM-DD`. Empty with an empty check-out: one night starting tomorrow, computed when the run starts. |
| `checkOutDate` | string | empty | Departure day, `YYYY-MM-DD`, after the check-in. Empty: one night. Stays of up to 30 nights are priced. |
| `maxItems` | integer | `50` | How many hotels to save in all, across every search. |

#### 👥 Guests and prices

| Field | Type | Default | What it does |
|---|---|---|---|
| `adults` | integer | `2` | Adults in the room, 1 to 8. Prices change with the party size. |
| `currency` | string | `USD` | Currency of every price in the output, as Google converts it. 24 codes available: USD, EUR, GBP, CHF, CAD, AUD, JPY, CNY, INR, AED, BRL, MXN and more. |
| `language` | string | `en` | Language of the descriptions and of the hotel pages Google returns: en, fr, de, es, it, pt, nl, ja, ko, zh-CN, ar, ru, tr, pl. Amenity names are always in English. |

#### 📄 Output

| Field | Type | Default | What it does |
|---|---|---|---|
| `includeDetails` | boolean | `true` | On: every row also carries the street address, the phone, the price breakdown of the stay (base, taxes and fees, total) and the offers of every booking site with their links. One extra read per hotel, about ten seconds per page of 20. Off: the search columns only, for the fastest list. |

#### ⚙️ Advanced

| Field | Type | Default | What it does |
|---|---|---|---|
| `debugMode` | boolean | `false` | Adds detailed lines to the run log. Only useful when you report a problem. |

### 📊 Output data

One row per hotel. A resort of "resorts in Bali", three adults, 20 to 23 December, prices in AUD, with the details on:

```json
{
  "id": "ChoI3LHO6tXtkviSARoNL2cvMTFieGY2ZmRiahAB",
  "url": "https://www.google.com/travel/hotels/entity/ChoI3LHO6tXtkviSARoNL2cvMTFieGY2ZmRiahAB",
  "name": "Sumberkima Hill Retreat",
  "hotelClass": 4,
  "propertyType": "resort hotel",
  "description": "Refined rooms & posh villas with infinity pools in an elegant resort offering sea & mountain views.\nOn a remote hilltop overlooking the Bali Sea, this elegant resort is 21 km from mountainous Barat National Park and 27 km from the Gilimanuk ferry port.\nAccommodations range from refined rooms with verandahs, suspended lounge beds and a shared outdoor infinity pool, to posh 5-bedroom villas that sleep up to 11, and feature private terraces and pools, kitchens, indoor/outdoor bathrooms, and flat-screen TVs. All have sea and/or mountain views, Wi-Fi access, safes and mosquito nets.\nThere's an open-air restaurant offering Asian and western cuisines, plus scenic views. Yoga, spa services and bike rentals are also available.",
  "amenities": ["Spa", "Pool", "Wi-Fi", "Parking", "Restaurant", "Airport shuttle", "Fitness center"],
  "checkInTime": "3:00 PM",
  "checkOutTime": "12:00 PM",
  "pricePerNight": 149.96,
  "totalPrice": 449.87,
  "basePrice": 408.96,
  "taxesAndFees": 40.91,
  "currency": "AUD",
  "rating": 4.7,
  "reviewsCount": 1544,
  "ratingHistogram": { "1": 33, "2": 36, "3": 42, "4": 144, "5": 1289 },
  "offers": [
    {
      "provider": "Booking.com",
      "pricePerNight": 150,
      "totalPrice": 450,
      "currency": "AUD",
      "url": "https://www.google.com/travel/lodging/clk?pc=AA80OszyrJffUy4CV0Qi...&ap=1",
      "isOfficial": false
    }
  ],
  "offersCount": 1,
  "address": "Sumberkima, Gerokgak, Buleleng Regency, Bali 81155, Indonesia",
  "phone": "+62 812-8212-9211",
  "latitude": -8.1513898,
  "longitude": 114.60883679999998,
  "countryCode": "ID",
  "checkInDate": "2026-12-20",
  "checkOutDate": "2026-12-23",
  "nights": 3,
  "adults": 3,
  "imageUrl": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWl58c-dLCokHgTL9vVG5XK3YbrqhmEDU1bAi_JmCIPAqkTZ...=s150-w92-h150-n-k-no",
  "images": [
    "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWl58c-dLCokHgTL9vVG5XK3YbrqhmEDU1bAi_JmCIPAqkTZ...=s287-w287-h192-n-k-no-v1",
    "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkBdU3ZhP4yf2CEGOZjglqK8ckCbG8T_iAraM-kZlGy26hC...=s287-w287-h192-n-k-no-v1"
  ],
  "website": "https://sumberkimahill.com/",
  "mapsUrl": "https://www.google.com/maps?cid=10588045657037314268",
  "searchQuery": "resorts in Bali",
  "scrapedAt": "2026-09-20T15:58:39Z"
}
```

The same shape with the details off, from a French search (`hôtels à Lyon`, `language: fr`, one adult, two nights in EUR). The search page already carries the price breakdown and the address for many hotels; the offers ladder needs the details:

```json
{
  "id": "ChkI-PHLhdCU3o0dGg0vZy8xMXRiZmhreHNkEAE",
  "url": "https://www.google.com/travel/hotels/entity/ChkI-PHLhdCU3o0dGg0vZy8xMXRiZmhreHNkEAE",
  "name": "The People Lyon",
  "hotelClass": null,
  "propertyType": "hostel",
  "description": "Dortoirs modernes et chambres privées dans une auberge de jeunesse décontractée proposant un restaurant et une cuisine commune.",
  "amenities": [],
  "checkInTime": "15:00",
  "checkOutTime": "11:00",
  "pricePerNight": 23.08,
  "totalPrice": 46.17,
  "basePrice": 44.51,
  "taxesAndFees": 1.66,
  "currency": "EUR",
  "rating": 4.3,
  "reviewsCount": 1175,
  "ratingHistogram": { "1": 102, "2": 43, "3": 71, "4": 168, "5": 791 },
  "offers": [],
  "offersCount": 0,
  "address": "10 Mnt des Carmélites",
  "phone": "04 28 01 86 00",
  "latitude": 45.7717096,
  "longitude": 4.8273408,
  "countryCode": "FR",
  "checkInDate": "2026-11-06",
  "checkOutDate": "2026-11-08",
  "nights": 2,
  "adults": 1,
  "imageUrl": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWn7z2Erg-gYovaG20ZowU0VZTlnV9DNOTrXBG-4b1WVr8Df...=s150-w92-h150-n-k-no",
  "images": ["https://lh3.googleusercontent.com/gps-cs-s/AHRPTWn7z2Erg-gYovaG20ZowU0VZTlnV9DNOTrXBG-4b1WVr8Df...=s287-w287-h192-n-k-no-v1"],
  "website": "https://www.thepeoplehostel.com/fr/destinations/lyon/",
  "mapsUrl": "https://www.google.com/maps?cid=2097402701547763960",
  "searchQuery": "hôtels à Lyon",
  "scrapedAt": "2026-09-20T16:00:27Z"
}
```

### 🗂️ Data fields

34 fields per hotel, plus 6 per offer. A value Google does not show is `null` (or an empty list), never an empty string or a zero.

**Identity**

| Field | Type | Description |
|---|---|---|
| `id` | string | Google's stable token of the hotel. Paste it, or the `url`, back into `searchQueries` to read that hotel again |
| `url` | string | Permanent link of the hotel page on Google Hotels |
| `name` | string | Hotel name as Google displays it |

**Content**

| Field | Type | Description |
|---|---|---|
| `hotelClass` | integer | Star class, 1 to 5; `null` for hostels and unclassified properties |
| `propertyType` | string | Google's category: `hotel`, `hostel`, `resort hotel`, `bed and breakfast`, `motel`... |
| `description` | string | Google's summary, with the full paragraphs when the details are on. In the language you picked |
| `amenities` | array | The amenities Google highlights, in English: Wi-Fi, Air conditioning, Pool, Spa, Parking, Breakfast, Restaurant, Fitness center, Pet-friendly, Beach access, Beach front, Hot tub, Airport shuttle. Empty when the hotel highlights none of them |
| `checkInTime`, `checkOutTime` | string | As displayed, in the format of the language picked (`3:00 PM`, `15:00`) |

**Measures**

| Field | Type | Description |
|---|---|---|
| `pricePerNight` | number | Lowest price per night Google shows for your stay, taxes included where Google includes them |
| `totalPrice` | number | Total of the stay, taxes and fees included |
| `basePrice`, `taxesAndFees` | number | The breakdown of `totalPrice` |
| `currency` | string | ISO 4217 code of every price on the row, the one you asked for |
| `rating` | number | Guest rating, 0 to 5 |
| `reviewsCount` | integer | Number of reviews behind the rating |
| `ratingHistogram` | object | Reviews per star, `{"1": n, ..., "5": n}` |
| `offers` | array | One entry per seller Google compares for your stay: `provider`, `pricePerNight`, `totalPrice`, `currency`, `url` (the booking link through Google, which opens the seller's page for these dates), `isOfficial` (true for the hotel's own site) |
| `offersCount` | integer | Length of `offers` |

**Place and time**

| Field | Type | Description |
|---|---|---|
| `address` | string | Street address as Google displays it |
| `phone` | string | Phone number as displayed |
| `latitude`, `longitude` | number | Coordinates of the property |
| `countryCode` | string | ISO 3166-1 alpha-2 |
| `checkInDate`, `checkOutDate` | string | The stay every price refers to, `YYYY-MM-DD` |
| `nights`, `adults` | integer | Length of the stay and party size the prices are for |

**Media and links**

| Field | Type | Description |
|---|---|---|
| `imageUrl` | string | Thumbnail of the hotel. Google image links stay valid for months |
| `images` | array | The first photos of the hotel, larger variants |
| `website` | string | The hotel's own website when Google shows one |
| `mapsUrl` | string | Link to the property on Google Maps |

**Meta**

| Field | Type | Description |
|---|---|---|
| `searchQuery` | string | The entry of `searchQueries` that produced the row |
| `scrapedAt` | string | Time of the read, RFC 3339 UTC |

### 🚀 Examples

#### Get the hotels of Paris with their offers for next weekend

```json
{
  "searchQueries": ["hotels in Paris"],
  "checkInDate": "2026-10-10",
  "checkOutDate": "2026-10-12",
  "maxItems": 50
}
```

#### Price a whole city in euros for a family of four

```json
{
  "searchQueries": ["hotels in Barcelona"],
  "checkInDate": "2026-12-27",
  "checkOutDate": "2026-12-30",
  "adults": 4,
  "currency": "EUR",
  "maxItems": 300
}
```

#### Run a rate parity check on the hotels you track

Paste hotel links or exact names. Each one comes back as a row with the rate of every seller next to the hotel's own (`isOfficial: true`).

```json
{
  "searchQueries": [
    "https://www.google.com/travel/hotels/entity/ChUImcGKtLfWgL9OGgkvbS8wNTZuODEQAQ",
    "Hotel Saint Paul Rive Gauche Paris",
    "The Plaza New York"
  ],
  "checkInDate": "2026-11-06",
  "checkOutDate": "2026-11-08",
  "currency": "USD"
}
```

#### List Tokyo hotels in Japanese, priced in yen, without the offers

The fastest list: 20 hotels every couple of seconds, with rating, class, lead price and coordinates.

```json
{
  "searchQueries": ["東京 ホテル"],
  "language": "ja",
  "currency": "JPY",
  "includeDetails": false,
  "maxItems": 200
}
```

#### Compare resorts around a landmark for a long stay

```json
{
  "searchQueries": ["resorts near Nusa Dua Bali", "resorts in Seminyak"],
  "checkInDate": "2027-01-10",
  "checkOutDate": "2027-01-24",
  "adults": 2,
  "currency": "AUD",
  "maxItems": 80
}
```

#### Get tonight's prices for a last-minute deal page

No dates: one night starting tomorrow, computed at run time. Schedule the run daily and the dates move with it.

```json
{
  "searchQueries": ["hotels in Miami Beach"],
  "maxItems": 100
}
```

### 🤖 Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it full context about this scraper:

```
You have access to the Google Hotels Scraper on Apify: silentflow/google-hotels-scraper

Input schema:
- searchQueries (array of strings, prefill ["hotels in Paris"]): destinations, hotel names, or Google Hotels hotel links (https://www.google.com/travel/hotels/entity/...)
- checkInDate (string YYYY-MM-DD, optional): first night; empty with an empty checkOutDate = one night starting tomorrow
- checkOutDate (string YYYY-MM-DD, optional): departure day, after checkInDate; up to 30 nights
- maxItems (integer, default 50): hotels to save in all
- adults (integer, default 2, 1 to 8)
- currency (string, default "USD"): USD, EUR, GBP, CHF, CAD, AUD, NZD, JPY, CNY, HKD, SGD, INR, AED, BRL, MXN, SEK, NOK, DKK, PLN, CZK, TRY, ZAR, THB, KRW
- language (string, default "en"): en, fr, de, es, it, pt, nl, ja, ko, zh-CN, ar, ru, tr, pl
- includeDetails (boolean, default true): add address, phone, price breakdown and the offers of every booking site
- debugMode (boolean, default false)

Output per hotel (34 fields):
- id, url, name (string)
- hotelClass (integer or null), propertyType (string), description (string), amenities (string[]), checkInTime, checkOutTime (string)
- pricePerNight, totalPrice, basePrice, taxesAndFees (number), currency (string), rating (number), reviewsCount (integer), ratingHistogram ({"1".."5": integer})
- offers (array of {provider, pricePerNight, totalPrice, currency, url, isOfficial}), offersCount (integer)
- address, phone (string), latitude, longitude (number), countryCode (string), checkInDate, checkOutDate (string), nights, adults (integer)
- imageUrl (string), images (string[]), website, mapsUrl (string)
- searchQuery, scrapedAt (string, RFC 3339)

Pay per result. No account or API key needed. Use apify-client for Python or JavaScript.
```

### 💻 Integrations

#### Build a nightly rate shop of your competitors (Python)

```python
from apify_client import ApifyClient
import pandas as pd

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("silentflow/google-hotels-scraper").call(run_input={
    "searchQueries": [
        "Hotel Saint Paul Rive Gauche Paris",
        "Hôtel Le Six Paris",
        "Hotel Le Littré Paris",
    ],
    "checkInDate": "2026-11-06",
    "checkOutDate": "2026-11-08",
    "currency": "EUR",
})
rows = []
for hotel in client.dataset(run["defaultDatasetId"]).iterate_items():
    own = next((o for o in hotel["offers"] if o["isOfficial"]), None)
    for offer in hotel["offers"]:
        rows.append({
            "hotel": hotel["name"],
            "seller": offer["provider"],
            "per_night": offer["pricePerNight"],
            "vs_official": (offer["pricePerNight"] or 0) - (own["pricePerNight"] if own else 0),
        })
report = pd.DataFrame(rows).sort_values(["hotel", "per_night"])
undercuts = report[report["vs_official"] < 0]
print(undercuts)  # sellers cheaper than the hotel's own site
```

#### Feed a destination price index into a dashboard (JavaScript)

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('silentflow/google-hotels-scraper').call({
    searchQueries: ['hotels in Lisbon'],
    checkInDate: '2026-11-20',
    checkOutDate: '2026-11-22',
    currency: 'EUR',
    maxItems: 200,
    includeDetails: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

const byClass = {};
for (const h of items) {
    if (!h.pricePerNight || !h.hotelClass) continue;
    (byClass[h.hotelClass] ??= []).push(h.pricePerNight);
}
for (const [stars, prices] of Object.entries(byClass)) {
    const median = prices.sort((a, b) => a - b)[Math.floor(prices.length / 2)];
    console.log(`${stars} stars: median ${median} EUR per night over ${prices.length} hotels`);
}
```

#### Export a city to CSV for a spreadsheet (Apify CLI)

```bash
apify call silentflow/google-hotels-scraper --input '{"searchQueries": ["hotels in Rome"], "checkInDate": "2026-10-03", "checkOutDate": "2026-10-05", "currency": "EUR", "maxItems": 100}'
## then download the dataset of the run as CSV
curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&token=YOUR_TOKEN" -o rome-hotels.csv
```

### 📈 Performance

Measured on 20 September 2026, without any option beyond the ones shown.

| Run | Rows | Duration |
|---|---|---|
| `hotels in Paris`, details on (default form) | 50 hotels, 49 with offers | 1 min 25 s |
| `resorts in Bali`, 3 adults, 3 nights in AUD, details on | 30 hotels | 55 s |
| A hotel link, a hotel name and `hôtels à Lyon` in French, details off | 14 hotels | 5 s |

A search page returns 20 hotels in about two seconds. The details add about eight seconds per page of 20, so 50 hotels with their offers take about half a minute. A destination yields several hundred hotels before Google stops paging; there is no fixed limit per run beyond `maxItems`.

### 💾 Data export

The dataset is available from the run page in JSON, CSV, Excel, XML, HTML and RSS, or through the API:

```
https://api.apify.com/v2/datasets/DATASET_ID/items?format=csv&token=YOUR_TOKEN
```

Nested fields (`offers`, `ratingHistogram`, `images`) are flattened as `offers/0/provider` columns in CSV and Excel.

### 💡 Tips for best results

1. **Name the city in the query.** `hotels in Lyon` reads as a destination. A bare `Lyon` can be read as a hotel name and return one property.
2. **Set the dates you will actually sell.** Prices and offers change with the stay and the party size; a run without dates prices tomorrow night, which is a last-minute price.
3. **Use the offers for parity, the lead price for ranking.** `pricePerNight` is the lowest rate Google found; `offers` holds every seller, with the hotel's own site flagged.
4. **Turn the details off for a quick market scan.** Class, rating, reviews and lead price are on the search page; 200 hotels take under a minute.
5. **Paste `url` values back in to track the same hotels every day.** A hotel link returns exactly that hotel, whatever Google ranks around it.

### ❓ FAQ

**What does the scraper extract exactly?**
The hotels Google Hotels lists for a destination, a hotel name or a hotel link, priced for the stay you set: name, star class, rating and review histogram, price per night, total with taxes and fees, the offers of every booking site Google compares, address, phone, coordinates, amenities, photos, description and links.

**Do I need a Google account or an API key?**
No. Everything comes from the public Google Hotels pages. No login, no API key, nothing to paste from your browser.

**Are the prices the ones a traveler would see?**
Yes, for the dates, party size and currency of the run. The lead price is the lowest rate Google shows on the hotel card; each offer is the rate of one seller for that stay. Prices move during the day, so re-run before you act on them.

**How many hotels can one search return?**
Google pages 20 hotels at a time and keeps paging for several hundred hotels on a large destination. Set `maxItems` to what you need; a search stops earlier when Google has nothing new.

**Why does a hotel have no offers, or only one?**
Google lists the sellers that have availability for the stay. A sold-out night, a small party or a distant date can leave one seller or none. The row is still delivered with everything else.

**Can I search in another language or currency?**
Yes: `language` sets the descriptions and the hotel pages, `currency` converts every price. Amenity names are always in English.

**Can I scrape several destinations in one run?**
Yes. Each entry of `searchQueries` is searched in turn, in the same stay; `maxItems` caps the total. A hotel found by two searches is delivered once.

**Which fields can be missing?**
`hotelClass` is `null` for hostels and unclassified properties. `address`, `phone`, the price breakdown and `offers` need the details on for most hotels. `amenities` is empty when Google highlights none of the ones it names. Nothing is ever an empty string.

**Are the links permanent?**
`url` and `mapsUrl` are permanent. Offer links open the seller's page for the run's dates and stay valid for days. Image links stay valid for months.

**How fresh is the data?**
Live: every run reads Google Hotels at that moment, nothing is cached. Schedule the run to track prices over time.

**Does it handle children?**
Prices are computed for the adults you set, in one room. Add children's ages later if you need them; tell us in a feature request.

### ⚖️ Legal

This Actor extracts publicly available data from Google Hotels. It does not bypass any login, paywall or CAPTCHA. Users are responsible for complying with Google's terms of service and applicable data protection laws (GDPR, CCPA and PIPL where relevant). The output describes businesses, not private individuals; hotel phone numbers and addresses are the public contact details of those businesses. Prices are informational and change often; verify them before a booking or a regulated use.

### 🔗 Related scrapers

- [Booking.com Scraper](https://apify.com/silentflow/booking-scraper-ppr): hotels, prices and reviews from Booking.com.
- [Airbnb Pro Host Scraper](https://apify.com/silentflow/airbnb-professional-host-scraper-ppe): listings and hosts from Airbnb.
- More travel and local data actors: [silentflow on Apify](https://apify.com/silentflow).

### 📬 Support

Need something this scraper doesn't do yet? We ship features fast.

- Feature requests go straight to our backlog
- Enterprise needs? We do custom integrations and high-volume plans
- Pricing questions? Check the Monetization tab on the actor page

Response time: usually under 24 hours.

Check out our other scrapers: [silentflow on Apify](https://apify.com/silentflow)

# Actor input Schema

## `searchQueries` (type: `array`):

What to search on Google Hotels, one per line. A destination (<code>hotels in Paris</code>, <code>resorts in Bali</code>, <code>hotels near Times Square</code>), a hotel name (<code>Ritz Paris</code>) or the link of a hotel page (<code>https://www.google.com/travel/hotels/entity/...</code>). A destination returns hotels in Google's order, 20 per page, up to several hundred; a hotel name or link returns that hotel alone.

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

First night of the stay, as <code>YYYY-MM-DD</code>. Prices, offers and availability are those of this stay. Leave both dates empty to price one night starting tomorrow, computed when the run starts.

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

Departure day, as <code>YYYY-MM-DD</code>, after the check-in. Leave it empty for a one-night stay. Stays of up to 30 nights are priced.

## `maxItems` (type: `integer`):

How many hotels to save in all, across every search. <code>20</code> is one page and takes about ten seconds with the details; <code>200</code> covers a whole city.

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

Number of adult guests in the room, 1 to 8. Prices change with the party size.

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

Currency of every price in the output, as Google converts it.

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

Language of the descriptions and of the hotel pages Google returns. Amenity names are always in English.

## `includeDetails` (type: `boolean`):

On: every row also carries the street address, the phone, the price breakdown of the stay (base, taxes and fees, total) and the offers of every booking site Google compares (Booking.com, Expedia, Agoda, the hotel's own site...), with their per-night price, total and booking link. One extra read per hotel, about ten seconds per page of 20. Off: the search columns only (name, class, rating, lead price per night, coordinates, photos).

## `debugMode` (type: `boolean`):

Adds detailed lines to the run log. Leave it off for normal runs.

## Actor input object example

```json
{
  "searchQueries": [
    "hotels in Paris"
  ],
  "maxItems": 50,
  "adults": 2,
  "currency": "USD",
  "language": "en",
  "includeDetails": true,
  "debugMode": false
}
```

# Actor output Schema

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

Every row with id, url, name, hotelClass, propertyType, description, amenities, checkInTime, checkOutTime, pricePerNight, totalPrice, basePrice, taxesAndFees, currency, rating, reviewsCount, ratingHistogram, offers, offersCount, address, phone, latitude, longitude, countryCode, checkInDate, checkOutDate, nights, adults, imageUrl, images, website, mapsUrl, searchQuery and scrapedAt.

# 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 = {
    "searchQueries": [
        "hotels in Paris"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("silentflow/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 = { "searchQueries": ["hotels in Paris"] }

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

```

## MCP server setup

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