# Google Hotels Scraper: Prices, Reviews & Amenities (`luzivanlt/google-hotels-scraper`) Actor

Google Hotels prices for your places and dates: hundreds of hotels and rentals per search, with ratings. $1 per 1,000 hotels. Taxes, deals, amenities, review topics, location scores and photos.

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

## Pricing

from $0.70 / 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, Reviews & Amenities

Search Google Hotels for your places and dates and get the hotels and
vacation rentals it lists, hundreds per search, one row each: nightly and total prices
with taxes, deals, star class, rating and reviews, review topics, location
scores, amenities, nearby places and photos. No account, login or cookies
needed.

Tested daily. Latest checks: 30 hotels in Lisbon in 8 seconds; and 6 searches
(three cities, two dates each, up to 1,000 hotels a search) saved 4,812
hotels in 6 minutes.

### What does this Actor do?

You give it searches and check-in dates. Each search and date is run as
Google Hotels runs it for your nights, guests, currency, country and
language. The Actor saves one row per hotel or vacation rental Google lists,
in Google's order, page after page, until your limit or the end of the list.

Each row comes with:

- the name, whether it is a hotel or a vacation rental, its star class and
  description, and Google's highlight lines
- the price per night and for the whole stay, taxes and fees, the total with
  them, the currency, and the deal Google shows ("20% less than usual")
- the rating, the number of reviews, the share and count of each star, and
  the topics guests mention (service, location, breakfast…) with how many
  mentions are positive and negative
- location scores (overall, things to do, restaurants, transit, airport
  access) and nearby places with the time to reach them on foot, by taxi or
  by public transport
- the amenities (free Wi-Fi, pool, parking…), check-in and check-out times,
  the website, coordinates and country
- for a vacation rental: how many it sleeps, bedrooms, bathrooms, its
  essential info, the amenities it has and lacks, and the sites it is listed
  on with their prices
- the photos, and links to the property on Google Hotels and Google Maps
- the search itself (search words, the place Google matched, dates, nights,
  guests)

### Why use it?

- **Hundreds of hotels per search.** The Actor keeps reading Google's pages
  until your limit (up to 1,000 a search), not just the first page.
- **Many dates in one run.** List check-in dates, or write "30 days" to search
  30 days from the run's day: built for daily schedules and price tracking.
- **Prices you can compare.** Every row has the nightly price, the total for
  the stay, the taxes and fees and the total with them, as numbers.
- **More than prices.** Ratings, the star breakdown, review topics, location
  scores, amenities and nearby places come in the same row, at no extra cost.
- **Use the data anywhere.** Download as JSON, CSV or Excel, or send it to
  your own tools through Apify's API and integrations.

### How to use it

1. Type one or more **Searches**, as you would on Google Hotels
   ("hotels in Lisbon").
2. Add one or more **Check-in dates** and the number of **Nights**.
3. Optionally set the guests, currency, country, language or
   **Max hotels per search**.
4. Click **Start**. When the run ends, open the **Output** tab to view the
   hotels or download them.

Run it with no input to see a sample: up to 30 hotels in Lisbon, 30 days
from today, charged as usual.

### Input

| Field                                            | What it does                                              | Default |
| ------------------------------------------------ | --------------------------------------------------------- | ------- |
| **Searches** (`queries`)                         | What to search, e.g. "hotels in Lisbon", or a search link | —       |
| **Check-in dates** (`checkInDates`)              | `YYYY-MM-DD` or days from the run's day (`"30 days"`)     | —       |
| **Nights** (`nights`)                            | Length of each stay, 1 to 30                              | 1       |
| **Adults** (`adults`)                            | 1 to 6                                                    | 2       |
| **Children's ages** (`childrenAges`)             | One age (0 to 17) per child, up to 6                      | none    |
| **Currency** (`currency`)                        | 3-letter code                                             | USD     |
| **Country** (`country`)                          | 2-letter code of the country searched from                | us      |
| **Language** (`language`)                        | Language of names, descriptions and review topics         | en      |
| **Max hotels per search** (`maxHotelsPerSearch`) | Stop each search after this many hotels, 1 to 1,000       | 100     |

Every search is run on every check-in date, up to 100 searches in one run.

Example input:

```json
{
  "queries": ["hotels in Lisbon", "resorts in Cancun"],
  "checkInDates": ["2026-12-04", "2026-12-11"],
  "nights": 3,
  "adults": 2,
  "childrenAges": ["8"],
  "currency": "EUR",
  "maxHotelsPerSearch": 200
}
```

### Output

One row per hotel or vacation rental Google lists for a search and stay. An
example, with made-up values:

```json
{
  "hotel_key": "ChkIexample…|hotels in lisbon|2026-12-04|2026-12-07|2a|USD|en|us",
  "rank": 1,
  "name": "Example Riverside Hotel",
  "property_type": "hotel",
  "hotel_class": 4,
  "hotel_class_text": "4-star hotel",
  "description": "Modern hotel with a rooftop bar, a pool and free Wi-Fi.",
  "highlights": ["... in a historic neighborhood ..."],
  "price_per_night": 142.35,
  "price_per_night_text": "$142",
  "price_per_night_with_taxes_text": "$163",
  "total_price": 427.05,
  "total_taxes_and_fees": 63.9,
  "total_price_with_taxes": 490.95,
  "total_price_text": "$427",
  "total_price_with_taxes_text": "$491",
  "currency": "USD",
  "deal": "18% less than usual",
  "rental_offers": [],
  "rating": 4.5,
  "reviews_count": 1830,
  "rating_histogram": [
    { "stars": 5, "percent": 64, "count": 1171 },
    { "stars": 4, "percent": 22, "count": 403 },
    { "stars": 3, "percent": 8, "count": 146 },
    { "stars": 2, "percent": 3, "count": 55 },
    { "stars": 1, "percent": 3, "count": 55 }
  ],
  "review_topics": [
    {
      "topic": "Service",
      "score": 0.82,
      "mentions": 210,
      "positive_mentions": 196,
      "negative_mentions": 9
    }
  ],
  "location_scores": {
    "overall": 4.4,
    "things_to_do": 4.7,
    "restaurants": 4.1,
    "transit": 4.9,
    "airport_access": 4.2
  },
  "amenities": ["Free Wi-Fi", "Air conditioning", "Outdoor pool", "Bar", "Restaurant"],
  "amenities_not_available": [],
  "other_amenity_codes": [],
  "essential_info": [],
  "sleeps": null,
  "bedrooms": null,
  "bathrooms": null,
  "listed_on": [],
  "check_in_time": "15:00",
  "check_out_time": "12:00",
  "latitude": 38.7106,
  "longitude": -9.1394,
  "address": null,
  "phone": null,
  "website": "https://example-riverside.example/",
  "country_code": "PT",
  "nearby_places": [
    {
      "category": "airport",
      "name": "Example International Airport",
      "travel": [
        { "mode": "taxi", "duration": "23 min" },
        { "mode": "public_transport", "duration": "38 min" }
      ],
      "transit_type": null
    }
  ],
  "thumbnail": "https://lh3.googleusercontent.com/…",
  "photos": ["https://lh3.googleusercontent.com/…"],
  "property_token": "ChkIexample…",
  "google_maps_feature_id": "0x1:0x2",
  "google_maps_url": "https://www.google.com/maps?cid=2",
  "google_hotels_url": "https://www.google.com/travel/hotels/entity/ChkIexample…?hl=en&gl=us&curr=USD",
  "search_query": "hotels in Lisbon",
  "search_place": "Lisbon",
  "check_in_date": "2026-12-04",
  "check_out_date": "2026-12-07",
  "nights": 3,
  "adults": 2,
  "children_ages": [],
  "language": "en",
  "country": "us"
}
```

A field Google does not show is `null` (or an empty list). A vacation rental
also fills `sleeps`, `bedrooms`, `bathrooms`, `essential_info`,
`amenities_not_available`, `listed_on` and `rental_offers`.

### How much does it cost?

No surcharges and no paid options; an item that fails is not charged.

This Actor is priced per hotel saved:

- **$1 per 1,000 hotels** ($0.001 a hotel). A hotel is one hotel or vacation
  rental for one search and stay. Each is charged once per search in a run.
- No start fee, and nothing per search.

So 1,000 hotels cost $1. If you set a maximum cost for a run, the Actor stops
when it reaches it and keeps every hotel saved so far.

### How long does a run take?

About 10 seconds for one search of 30 hotels. A deep search takes longer: 6
searches of up to 1,000 hotels each saved 4,812 hotels in 6 minutes 22
seconds, four searches read at a time.

### Good to know

- **Prices are for the guests you set**, in your currency, as Google Hotels
  shows them. They change often; a price can differ
  by the time you book. `price_per_night` and the totals are numbers; the
  `_text` fields are the prices exactly as Google shows them, rounded.
- **Some properties have no price** for your dates (sold out, or no site
  offers them): their price fields are empty.
- **Google's order moves between pages.** Google reorders its list as it is
  read, so a hotel can show up on two pages and another can be missed; each
  hotel is saved once per search and stay, and a hotel two of your searches
  both list is saved in each. `rank` is the hotel's place when it was read.
- **The list is Google's list.** A city usually lists hundreds of properties;
  the Actor stops when your limit is reached or when three pages in a row
  bring no hotel it has not seen.
- **Hotel amenity names are in English**, whatever the language; a vacation
  rental's amenities and essential info come in the language you pick. A
  hotel amenity Google shows only as an unnamed code is kept in
  `other_amenity_codes`.
- **Check-in and check-out times are 24-hour** (`15:00`).
- **The Google Hotels link opens the hotel's page**, where you can pick the
  dates again; it does not carry your dates. A Google Hotels search link in
  **Searches** gives its search words only: the dates, guests and currency
  come from the other fields.
- **Dates are counted in UTC.** "30 days" is 30 days from the run's day in
  UTC, and a check-in date that is already over in UTC is refused.
- **One search that cannot be read does not stop the run.** The others carry
  on, and the run's status lists the searches that could not be read. A
  search with no hotels is not an error: it saves nothing.
- **Not supported yet:** each hotel's prices on every booking site (Booking,
  Expedia and the others), its reviews' text, rooms, and filters by price,
  class, rating or amenity.

### More Actors from us

- [Google Ads Transparency Scraper: Every Ad by Site](https://apify.com/luzivanlt/google-ads-transparency-scraper): Google Ads Transparency Center ads by website, advertiser or name, to the last page, in 216 regions.
- [Google Flights Scraper: Fares, Dates & Returns](https://apify.com/luzivanlt/google-flights-scraper): Google Flights fares for many routes and dates in one run: every flight listed, with legs, stops and CO2.
- [Google Maps Places Scraper: Phones, Hours, Owners](https://apify.com/luzivanlt/google-maps-places-scraper): Every place a Google Maps search lists, read to the end, with phone, website, hours and owner.
- [Google News Scraper: By Date](https://apify.com/luzivanlt/google-news-scraper): Google News read day by day past the usual 100 per search: 4,440 articles from two keywords over 30 days.
- [Google Play Reviews Scraper: Device, Star Filter & Replies](https://apify.com/luzivanlt/google-play-reviews-scraper): Google Play reviews with the device each was written on, a star filter and the developer's reply.
- [Google Trends Scraper: Trending Now & Compare](https://apify.com/luzivanlt/google-trends-scraper): Google Trends over time, by region and related queries for up to 5 compared terms, plus Trending Now.
- [Airbnb Scraper: Every Stay, Past the 15-Page Limit](https://apify.com/luzivanlt/airbnb-listings-scraper): Every stay of an Airbnb search, past the 15 pages Airbnb shows, checked against its count.
- [Alibaba Products Scraper: Price Tiers & Suppliers](https://apify.com/luzivanlt/alibaba-products-scraper): Alibaba.com products by keyword or link, with price tiers in US dollars on every row.
- [AliExpress Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/aliexpress-products-scraper): Every product of an AliExpress search to its last page, with exact sold counts and ratings.
- [Amazon Product Scraper: Search Results & Prices](https://apify.com/luzivanlt/amazon-products-scraper): Every product on Amazon's search pages to the last page, sponsored marked, with monthly sales.
- [App Store Reviews Scraper: All Reviews, Not 500](https://apify.com/luzivanlt/app-store-reviews-scraper): Every written App Store review of an app, not just the newest 500.
- [Woolworths Coles ALDI Scraper: AU Grocery Prices](https://apify.com/luzivanlt/au-supermarkets-scraper): Woolworths, Coles and ALDI products for any search in one run, every results page to the end.

### Use it from an AI agent or the API

One call starts a run and returns its items (Apify waits up to 300 seconds; for a
longer run, start it with `POST /v2/acts/…/runs` and read its dataset):

```text
POST https://api.apify.com/v2/acts/luzivanlt~google-hotels-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>
```

With the sample input as its JSON body:

```json
{
  "queries": ["hotels in Lisbon"],
  "checkInDates": ["30 days"],
  "nights": 1,
  "adults": 2,
  "currency": "USD",
  "country": "us",
  "language": "en",
  "maxHotelsPerSearch": 30
}
```

Its inputs, in the order of the input form:

| Input                                        | What it takes                                                                                                                                              | Default |
| -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
| `queries` (Searches)                         | What to search on Google Hotels, one per line, as you would type it there: a place ("hotels in Lisbon", "resorts in Cancun"), an area or a hotel name.     | —       |
| `checkInDates` (Check-in dates)              | The days to check in, one per line: a date as YYYY-MM-DD, or a number of days from the day the run starts, such as "30 days" (handy for a daily schedule). | —       |
| `nights` (Nights)                            | How many nights each stay lasts, from 1 to 30; check-out is check-in plus this many nights.                                                                | `1`     |
| `adults` (Adults)                            | Adult guests, from 1 to 6 (2 by default).                                                                                                                  | `2`     |
| `childrenAges` (Children's ages)             | One line per child travelling, with the child's age from 0 to 17, at most 6 children.                                                                      | —       |
| `currency` (Currency)                        | The currency every price is shown in, as a 3-letter code such as USD, EUR, GBP or JPY.                                                                     | `"USD"` |
| `country` (Country)                          | The country Google Hotels is used from, as a 2-letter code such as us, gb, de or jp, as for a traveller searching from that country. us by default.        | `"us"`  |
| `language` (Language)                        | The language of names, descriptions, deals, review topics and a rental's amenities, as a language code such as en, de, fr or ja.                           | `"en"`  |
| `maxHotelsPerSearch` (Max hotels per search) | Stop each search after this many hotels and vacation rentals, in Google's order, from 1 to 1,000 (100 by default).                                         | `100`   |

Apify's MCP server, `https://mcp.apify.com`, lists it as `luzivanlt/google-hotels-scraper`. To give an
AI agent this Actor as a tool, add the server to the agent's MCP config:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=luzivanlt/google-hotels-scraper"
    }
  }
}
```

The client signs in with OAuth, or add `"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }`.

Charged per hotel delivered; the sample input above costs at most $0.06.

### FAQ

**Do I need an account or cookies?**
No. The Actor reads what anyone can see on Google Hotels.

**Can I track hotel prices over time?**
Yes. Write check-in dates as days from the run's day ("30 days") and run the
Actor on a schedule: each run prices the same stay ahead.

**Can I run it from my own code, on a schedule, or with other apps?**
Yes. Like any Apify Actor, you can start it through the Apify API, run it on a
schedule, and connect it to other apps with Apify's integrations and webhooks.

### Is it legal to scrape Google Hotels?

This Actor reads only what anyone can see on Google Hotels without logging
in. Check Google's terms and the laws that apply to you before you use the
data. If you are unsure, ask a lawyer.

### Support

Found a problem or missing a feature? Open an issue on the **Issues** tab and
include the run's link.

***

This Actor is not affiliated with, endorsed by or sponsored by Google.

# Changelog

This Actor's version history is a separate document: https://apify.com/luzivanlt/google-hotels-scraper/changelog.md

# Actor input Schema

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

What to search on Google Hotels, one per line, as you would type it there: a place ("hotels in Lisbon", "resorts in Cancun"), an area or a hotel name. A Google Hotels search link works too (its search words only). Every search is run for every check-in date, up to 100 searches in one run. Example: hotels in Lisbon

## `checkInDates` (type: `array`):

The days to check in, one per line: a date as YYYY-MM-DD, or a number of days from the day the run starts, such as "30 days" (handy for a daily schedule). Each date is its own search, so 14 dates price two weeks of stays. Up to 330 days ahead, never in the past. Example: 2026-12-04

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

How many nights each stay lasts, from 1 to 30; check-out is check-in plus this many nights. Prices are given per night and for the whole stay. Example: 3

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

Adult guests, from 1 to 6 (2 by default). Prices are for the guests you set, as Google Hotels shows them for the party, per night and for the whole stay. Example: 2

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

One line per child travelling, with the child's age from 0 to 17, at most 6 children. Children are priced with the adults, as Google Hotels does. Leave empty for adults only. Example: 8

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

The currency every price is shown in, as a 3-letter code such as USD, EUR, GBP or JPY. Google converts the prices itself. USD by default. Example: EUR

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

The country Google Hotels is used from, as a 2-letter code such as us, gb, de or jp, as for a traveller searching from that country. us by default. Example: gb

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

The language of names, descriptions, deals, review topics and a rental's amenities, as a language code such as en, de, fr or ja. Hotel amenity names are always in English. en by default. Example: de

## `maxHotelsPerSearch` (type: `integer`):

Stop each search after this many hotels and vacation rentals, in Google's order, from 1 to 1,000 (100 by default). A city usually lists hundreds. You pay per hotel saved ($1 per 1,000), so this caps what each search costs. Example: 200

## Actor input object example

```json
{
  "queries": [
    "hotels in Lisbon"
  ],
  "checkInDates": [
    "30 days"
  ],
  "nights": 1,
  "adults": 2,
  "currency": "USD",
  "country": "us",
  "language": "en",
  "maxHotelsPerSearch": 30
}
```

# Actor output Schema

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

Every hotel and vacation rental the run saved, one row per property for each search and stay.

## `allFields` (type: `string`):

The same rows with every field.

## `runReport` (type: `string`):

What happened to each input: items saved, nothing found, refused by the site, stopped at your limit, or the error.

# 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": [
        "hotels in Lisbon"
    ],
    "checkInDates": [
        "30 days"
    ],
    "maxHotelsPerSearch": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("luzivanlt/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": ["hotels in Lisbon"],
    "checkInDates": ["30 days"],
    "maxHotelsPerSearch": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("luzivanlt/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": [
    "hotels in Lisbon"
  ],
  "checkInDates": [
    "30 days"
  ],
  "maxHotelsPerSearch": 30
}' |
apify call luzivanlt/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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