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

Scrape Google Hotels for any city and dates: nightly and total prices with taxes, deal insights, star class, ratings, review topics, nearby places and photos. Fast, reliable, verified dates, any currency.

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

## Pricing

from $3.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, Ratings & Reviews

Get **hotel prices for any destination and dates from Google Hotels**: nightly and total price with taxes and fees, Google's deal insight ("32% less than usual"), star class, guest rating with the full 1–5 star breakdown, what reviews say about breakfast, service and location, nearby airports and attractions with travel times, photos and more.

Enter cities or landmarks, pick your dates, guests and currency, and get clean, structured data in seconds.

### Why this scraper

- **Reliable.** Reads Google's own structured data instead of fragile page layouts, recovers automatically from temporary blocks, and stops cleanly at your cost limit.
- **Verified dates.** Every hotel includes `datesVerified`, which confirms Google priced *exactly* your dates. No silent fallbacks to "tomorrow".
- **Wrong-place protection.** If Google doesn't recognize a location, the scraper tells you instead of returning hotels from somewhere else. Each hotel also shows `resolvedLocation`, the place Google actually searched.
- **Full price breakdown.** Nightly average, stay total, base price, taxes and fees, in any of 19 currencies.
- **Rich hotel data:** star class, rating breakdown, review topics, nearby places with travel times, check-in/out times, website, coordinates, Google Maps link, photos.
- **Filters that save you money.** Minimum rating, star classes, max price, hotels-only and available-only are applied *before* charging, so you pay only for hotels you want.
- **Every booking site's price (optional):** Booking.com, Expedia, Agoda, Hotels.com, Trip.com, Vio.com, the hotel's own website and more, each with its price, perks like free cancellation, a booking link and individual room offers (room type, beds, breakfast, cancellation).
- **Families supported:** adults plus children with their ages.
- **Fast.** About 300 hotels per minute (about 100 per minute with booking-site offers).

### Use cases

- **Hotel revenue management:** track competitors' prices, and your own price on each booking site (rate parity), every day.
- **Travel agencies & OTAs:** build hotel lists and price comparisons for any city.
- **Price monitoring & deal alerts:** schedule daily runs and spot drops with Google's "less than usual" insight.
- **Market research:** compare hotel supply, star classes, ratings and prices across cities.
- **Travel apps & AI agents:** feed real, current hotel data into your product.

### Input

```json
{
    "locations": ["Barcelona", "hotels near Eiffel Tower", "Shibuya, Tokyo"],
    "checkInDate": "2026-12-10",
    "checkOutDate": "2026-12-13",
    "adults": 2,
    "childrenAges": [5, 12],
    "currency": "USD",
    "includeOffers": true,
    "maxHotelsPerLocation": 100,
    "minRating": 4,
    "hotelClasses": ["4", "5"],
    "onlyHotels": true,
    "onlyAvailable": true
}
```

Only `locations` is required. Dates default to two weeks from today for one night.

### Output

A real record (some lists shortened):

```json
{
    "hotelId": "ChgIi9aJndG2oI3FARoLL2cvMXRkMW0wazIQAQ",
    "name": "Four Points by Sheraton Barcelona Diagonal",
    "url": "https://www.google.com/travel/hotels/entity/ChgIi9aJndG2oI3FARoLL2cvMXRkMW0wazIQAQ",
    "googleMapsUrl": "https://www.google.com/maps?ftid=0x12a4a33b81ecade7:0xc51a81b513a26b0b",
    "propertyType": "hotel",
    "hotelClass": 4,
    "hotelClassText": "4-star hotel",
    "rating": 4.4,
    "reviewCount": 2582,
    "ratingBreakdown": [
        { "stars": 5, "percent": 63, "count": 1560 },
        { "stars": 4, "percent": 26, "count": 685 },
        { "stars": 3, "percent": 7, "count": 188 },
        { "stars": 2, "percent": 1, "count": 50 },
        { "stars": 1, "percent": 3, "count": 99 }
    ],
    "reviewTopics": [
        { "topic": "Breakfast", "label": "Breakfast", "mentions": 183, "positive": 143, "negative": 22 },
        { "topic": "Service", "label": "Service", "mentions": 386, "positive": 330, "negative": 51 }
    ],
    "description": "Straightforward hotel featuring a Mediterranean restaurant, a gym with city views & a terrace bar.",
    "location": { "latitude": 41.405281599999995, "longitude": 2.1963537, "countryCode": "ES" },
    "checkInTime": "3:00 PM",
    "checkOutTime": "12:00 PM",
    "website": "https://www.marriott.com/en-us/hotels/bcnfp-four-points-barcelona-diagonal/overview/",
    "nearbyPlaces": [
        { "name": "Basilica of the Sagrada Familia", "placeType": "attraction", "travelTimes": [{ "mode": "driving", "duration": "9 min" }] },
        { "name": "Josep Tarradellas Barcelona-El Prat Airport", "placeType": "airport", "travelTimes": [{ "mode": "driving", "duration": "27 min" }, { "mode": "transit", "duration": "1 hr" }] }
    ],
    "images": ["https://lh3.googleusercontent.com/grass-cs/AABkmLd6rno..."],
    "price": {
        "currency": "USD",
        "nightly": 126.49,
        "nightlyText": "$126",
        "total": 379.48,
        "totalBeforeTaxes": 288.53,
        "taxes": 28.86,
        "fees": 62.09,
        "insight": "32% less than usual"
    },
    "search": {
        "location": "Barcelona",
        "resolvedLocation": "Barcelona",
        "query": "hotels in Barcelona",
        "checkIn": "2026-12-10",
        "checkOut": "2026-12-13",
        "nights": 3,
        "adults": 2,
        "currency": "USD",
        "position": 2
    },
    "datesVerified": true,
    "scrapedAt": "2026-10-17T10:48:40.310Z"
}
```

Download results as JSON, CSV, Excel or HTML, or use the API. A run summary (`SUMMARY` in the key-value store) shows each location's resolved place, how many results Google has, pages scraped and hotels output.

### Booking-site offers

Turn on **Include prices from each booking site** to add an `offers` list to every hotel, cheapest first. In our tests, 79 of 80 hotels had offers (about 4 sites each), and for 7 of them a booking site was cheaper than Google's headline price.

```json
"offers": [
    {
        "source": "Agoda",
        "nightly": 68,
        "nightlyText": "$68",
        "total": 136,
        "totalText": "$136",
        "features": ["Free Wi-Fi"],
        "note": null,
        "bookingUrl": "https://www.google.com/aclk?...",
        "rooms": [
            { "name": "Standard", "features": ["1 double bed", "Free cancellation until Dec 4", "2 guests"], "nightly": 68, "total": 136, "bookingUrl": "https://www.google.com/aclk?..." }
        ]
    },
    {
        "source": "Booking.com",
        "nightly": 118,
        "nightlyText": "$118",
        "total": 236,
        "totalText": "$236",
        "features": ["Free cancellation until Jun 15", "Free Wi-Fi"],
        "note": "Member discount available",
        "bookingUrl": "https://www.google.com/aclk?...",
        "rooms": [ { "name": "Standard Queen Room", "features": ["1 queen bed", "Free cancellation until Dec 9", "Balcony"], "nightly": 118, "total": 236 } ]
    }
]
```

### Good to know

- **Prices** are the lowest price Google shows for your dates and number of adults. `nightly` is the average per night including taxes and fees; `total` is the whole stay. `totalBeforeTaxes + taxes + fees = total`.
- **`price` is null** when a hotel is sold out or has no price for your dates. Use *Only hotels with a price* to skip those.
- **Ambiguous places:** "Springfield" picks one Springfield. Write "Springfield, Illinois" to be sure, and check `search.resolvedLocation`.
- **How many hotels:** Google returns them in its own ranking, about 15–20 per page. Big cities have thousands.
- **Children:** add their ages (e.g. 5 and 12) and prices include them. Families usually see fewer booking options, just like on Google.
- **Booking-site offers** are the sites Google lists for that hotel, typically 3–5, plus individual room offers. Links go through Google's booking redirect, as on google.com.

### Price monitoring

Save your input as a task and add a schedule (e.g. daily at 9:00). Each run gives today's prices for your dates. Use `hotelId` to follow the same hotel across runs, and connect Google Sheets, Slack, email or a webhook to get the results automatically.

### FAQ

**Do I need a proxy?** Usually not. If Google ever blocks runs, the log says so clearly; then enable Apify Proxy in the *Advanced* section.

**Which currencies?** USD, EUR, GBP, CAD, AUD, JPY, CNY, INR, AED, SAR, EGP, TRY, BRL, MXN, CHF, SGD, THB, KRW and ZAR.

**Is it legal?** The scraper reads publicly available hotel listings shown by Google Hotels to anyone. It doesn't log in or collect personal data. Make sure your use of the data complies with applicable laws and terms.

**Found a bug or need a field?** Open an issue in the Issues tab.

### More from the same developer

- **[Career Site Jobs Scraper](https://apify.com/senshiesr/career-site-jobs-scraper)**: every open job from company career pages on Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable and Recruitee, with a monitor mode for new jobs.
- **[Bilibili Scraper](https://apify.com/senshiesr/bilibili-scraper)**: videos, creators, trending lists, comments and danmaku from Bilibili (哔哩哔哩), with clean English fields.

# Actor input Schema

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

Cities, areas or landmarks, one per line, e.g. "Paris", "Shibuya, Tokyo", "hotels near Eiffel Tower". Be specific for ambiguous names ("Springfield, Illinois").

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

YYYY-MM-DD. Defaults to 14 days from today.

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

YYYY-MM-DD. Defaults to the day after check-in. Stays of up to 30 nights.

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

Number of adult guests (prices are for this many guests).

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

One age (0-17) per child, e.g. 5 and 12. Prices then include the children. Up to 6 children.

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

Currency for all prices.

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

Google shows hotels in the order it ranks them; about 15-20 per page.

## `includeOffers` (type: `boolean`):

Adds every booking site Google lists for the hotel (Booking.com, Expedia, Agoda, the hotel's own website...) with its price, perks like free cancellation, booking link and individual room offers. Loads one extra page per hotel, so it costs a bit more per hotel.

## `minRating` (type: `number`):

Only output hotels rated at least this (1-5), e.g. 4.

## `hotelClasses` (type: `array`):

Only output these star classes, e.g. 4 and 5. Leave empty for all.

## `maxPricePerNight` (type: `number`):

In the chosen currency, including taxes.

## `onlyHotels` (type: `boolean`):

Skip hostels, B\&Bs, apartments and other property types.

## `onlyAvailable` (type: `boolean`):

Skip hotels that are sold out or have no price for your dates.

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

Usually not needed. If Google starts blocking runs, enable Apify Proxy.

## Actor input object example

```json
{
  "locations": [
    "Barcelona"
  ],
  "adults": 2,
  "currency": "USD",
  "maxHotelsPerLocation": 100,
  "includeOffers": false,
  "onlyHotels": false,
  "onlyAvailable": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All hotels output by this run, as a table.

## `hotelsFull` (type: `string`):

The same hotels with every field, including review topics, nearby places and images.

## `summary` (type: `string`):

One entry per location: the place Google searched, results on Google, pages scraped, hotels output and status.

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

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

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

```

## MCP server setup

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