# Google Hotels Scraper — Prices, Ratings & Booking Sites (`skeela/google-hotels-scraper`) Actor

Scrape Google Hotels for any city and dates: nightly prices, deals, ratings, star class, location, amenities and, optionally, the price on every booking site (Booking.com, Expedia, Hotels.com, official site…). Fast HTTP-only, no browser.

- **URL**: https://apify.com/skeela/google-hotels-scraper.md
- **Developed by:** [Alexandre Caron](https://apify.com/skeela) (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 & Booking Sites

Extract hotels and vacation rentals from **Google Hotels** for any city and any dates. Get the nightly price, deals, guest rating, star class, location, amenities and — optionally — **the price on every booking site** (Booking.com, Expedia, Hotels.com, Agoda, Trip.com, the hotel's official site…) with direct links.

- ⚡ **Fast and reliable**: plain HTTP requests, no headless browser. Hundreds of hotels per minute.
- 📅 **Your dates, your guests, your currency**: check-in / check-out, adults, children ages, any currency.
- 🏷️ **Booking-site price comparison**: every offer Google shows for a hotel, cheapest first.
- 🔎 **Filters**: hotels only / vacation rentals only, minimum rating, star class, maximum price.
- 💸 **Pay only for results**: you are charged per property saved, nothing for failed pages. If Google does not recognise a location, it is skipped instead of billing you for unrelated hotels.

### What can I use it for?

- **Rate shopping / revenue management** — monitor competitor prices for your hotel's dates.
- **Price-parity checks** — see whether OTAs undercut the official site.
- **Travel apps & price alerts** — feed live hotel prices into your product or a spreadsheet.
- **Market research** — supply, prices and ratings by city, neighbourhood or season.
- **Lead lists for B2B travel** — hotel names, websites, phones and addresses.

### Input

| Field | Description |
|---|---|
| `queries` | Locations or searches: `"Lisbon"`, `"Paris 11e"`, `"ski resorts in Val Thorens"` |
| `checkInDate` / `checkOutDate` | `YYYY-MM-DD` (default: in 14 days, 1 night) |
| `adults`, `childrenAges` | Guests, e.g. `2` and `[4, 9]` |
| `currency` | `USD`, `EUR`, `GBP`, `JPY`… |
| `maxResultsPerQuery` | Up to ~1,000 per location |
| `includeBookingPrices` | Add the per-site offers (one extra request per property) |
| `propertyType`, `minRating`, `hotelClass`, `maxPricePerNight` | Filters |

Example:

```json
{
  "queries": ["Lisbon", "Porto"],
  "checkInDate": "2026-11-10",
  "checkOutDate": "2026-11-13",
  "adults": 2,
  "currency": "EUR",
  "maxResultsPerQuery": 200,
  "includeBookingPrices": true,
  "minRating": 4
}
```

### Output

One item per property. Example (trimmed, values illustrative):

```json
{
  "query": "Lisbon",
  "searchLocation": "Lisbon",
  "position": 1,
  "name": "Boutique Chiado Apartments & Suites",
  "type": "hotel",
  "hotelClass": 4,
  "rating": 4.6,
  "reviewsCount": 426,
  "ratingDistribution": {"5": 349, "4": 39, "3": 14, "2": 7, "1": 17},
  "pricePerNight": 134.66,
  "pricePerNightText": "$135",
  "currency": "USD",
  "dealText": "21% less than usual",
  "latitude": 38.7102437,
  "longitude": -9.144626,
  "countryCode": "PT",
  "checkInTime": "3:00 PM",
  "checkOutTime": "12:00 PM",
  "website": "http://www.boutiquechiado.com/",
  "nearbyPlaces": [{"type": "transit", "name": "Pç. Luis Camões", "travelTimes": ["1 min"]}],
  "images": ["https://lh3.googleusercontent.com/..."],
  "checkInDate": "2026-11-10",
  "checkOutDate": "2026-11-13",
  "nights": 3,
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/...",
  "address": "R. da Misericórdia 14, 1200-273 Lisboa, Portugal",
  "phone": "+351 21 ...",
  "googlePlaceId": "ChIJ...",
  "offers": [
    {"source": "Boutique Chiado", "isOfficialSite": true, "pricePerNight": 129.1, "totalPrice": 387.3, "url": "https://..."},
    {"source": "Booking.com", "isOfficialSite": false, "pricePerNight": 134.66, "totalPrice": 403.98, "url": "https://www.booking.com/..."}
  ],
  "cheapestOffer": {"source": "Boutique Chiado", "isOfficialSite": true, "pricePerNight": 129.1, "totalPrice": 387.3, "url": "https://..."}
}
```

`address`, `phone`, `googlePlaceId`, `offers` and `cheapestOffer` are only present when `includeBookingPrices` is on. Fields Google does not show for a property are `null`.

### Pricing

Pay per event:

- **Property saved** — per hotel or rental in the dataset.
- **Booking-site prices** — only when `includeBookingPrices` is on, per property enriched.

Set a maximum cost per run in the run options: the scraper stops cleanly when it is reached.

### Tips

- Prices depend on dates, guests, currency and `country`. Keep them fixed when you compare runs over time.
- Schedule the actor (daily/weekly) to build a price history for a city or a list of competitors.
- Google shows at most ~1,000 properties per search; split large cities into neighbourhoods for full coverage.

### Is it legal?

This actor only collects publicly available hotel information (prices, ratings, addresses of businesses). It does not collect personal data or reviewer identities. You are responsible for using the data in line with applicable laws and Google's terms.

# Actor input Schema

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

Cities, neighbourhoods or free-text searches, e.g. "Lisbon", "Paris 11e", "beach resorts in Algarve". "hotels in" is added automatically when needed.

## `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.

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

Number of adult guests.

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

One age per child, e.g. \[4, 9].

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

ISO code: USD, EUR, GBP, JPY…

## `maxResultsPerQuery` (type: `integer`):

Maximum properties saved per location (Google shows up to ~1,000).

## `includeBookingPrices` (type: `boolean`):

Adds the offer list (Booking.com, Expedia, Hotels.com, official site…) with per-night and total prices, direct links, address and phone. One extra request per property, billed as a separate event.

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

Keep hotels, vacation rentals, or both.

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

From 1 to 5, e.g. 4.

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

Keep only these star classes.

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

In the selected currency.

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

Google interface language (hl), e.g. en, fr, de.

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

Google country (gl), e.g. us, gb, fr. Influences which booking sites appear.

## `maxImages` (type: `integer`):

Number of photo URLs returned per property.

## `maxConcurrency` (type: `integer`):

Parallel requests when fetching booking-site prices.

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

Proxy settings. Apify Proxy is recommended.

## Actor input object example

```json
{
  "queries": [
    "Lisbon"
  ],
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "maxResultsPerQuery": 100,
  "includeBookingPrices": false,
  "propertyType": "all",
  "language": "en",
  "country": "us",
  "maxImages": 5,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Table view: name, class, rating, price per night, deal and cheapest booking site.

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

Every property with all extracted fields (JSON, CSV, Excel…).

# 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": [
        "Lisbon"
    ]
};

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

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

```

## MCP server setup

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