# Google Hotels Scraper — Prices, Ratings & Amenities (`vor_al/google-hotels-scraper`) Actor

Scrape Google Hotels: nightly prices with and without taxes, prices from every booking site (Booking, Expedia, official site), deals, star class, ratings, reviews count, amenities, location, images and links. Fast HTTP scraper, no browser.

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

## Pricing

from $2.00 / 1,000 hotel results

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 & Amenities

Scrape **Google Hotels** search results for any city, landmark or area and get clean JSON/CSV/Excel with nightly prices (with and without taxes), deals, star class, guest rating, review counts, amenities, coordinates, photos and direct links. Works for hotels and vacation rentals, any dates, any number of adults and children, and 100+ currencies.

Optional **prices by booking site**: for every property get all offers Google compares — Booking.com, Expedia, Hotels.com, Agoda, Trip.com, Priceline, the hotel's official site and more — with nightly and total prices (with and without taxes) and direct booking links.

Fast HTTP scraper, **no browser** — about 100 hotels in 15–20 seconds.

### What you can do with it

- **Hotel price monitoring** — track nightly rates for your competitive set by date, occupancy and currency.
- **Revenue management & rate parity** — compare your property with nearby hotels, and check whether OTAs undercut your official-site price.
- **Travel apps & AI agents** — give your agent live hotel prices and ratings for a destination in one call.
- **Market research** — supply by star class, average price per night, best-rated hotels, deal frequency.
- **Lead generation for hospitality** — hotel names, websites, locations and ratings for a whole city.

### Input

| Field | Description | Default |
|---|---|---|
| `queries` | What you would type into Google Hotels: `hotels in Warsaw`, `hotels near Eiffel Tower`, `Barcelona` | required |
| `checkInDate` / `checkOutDate` | `YYYY-MM-DD` | 14 days from today, 1 night |
| `adults` | 1–12 | 2 |
| `childrenAges` | e.g. `[5, 9]` | `[]` |
| `currency` | ISO code: USD, EUR, GBP, PLN… | USD |
| `maxResultsPerQuery` | Properties to save per query | 100 |
| `propertyType` | `all`, `hotels`, `vacation_rentals` | all |
| `includeOffers` | Also save prices from every booking site (slower, extra event per property) | false |
| `language` / `country` | Google `hl` / `gl` | en / us |
| `proxyConfiguration` | Apify Proxy (datacenter is enough for most runs) | Apify Proxy |

```json
{
  "queries": ["hotels in Warsaw", "hotels near Eiffel Tower"],
  "checkInDate": "2026-11-20",
  "checkOutDate": "2026-11-22",
  "adults": 2,
  "currency": "EUR",
  "maxResultsPerQuery": 100
}
```

### Output

One item per property:

```json
{
  "query": "hotels near Eiffel Tower",
  "position": 1,
  "name": "Hôtel Mercure Paris Centre Tour Eiffel",
  "type": "hotel",
  "hotelClass": 4,
  "rating": 3.9,
  "reviewsCount": 5018,
  "ratingBreakdown": { "5_star": 2206, "4_star": 1326, "3_star": 664, "2_star": 309, "1_star": 513 },
  "currency": "EUR",
  "pricePerNight": 153.91,
  "pricePerNightText": "€154",
  "pricePerNightWithTaxes": 186,
  "dealText": "18% less than usual",
  "checkInDate": "2026-11-20",
  "checkOutDate": "2026-11-22",
  "nights": 2,
  "amenities": ["Free Wi-Fi", "Breakfast ($)", "Air conditioning", "Fitness center", "Bar", "Room service"],
  "latitude": 48.8552471,
  "longitude": 2.2919128,
  "countryCode": "FR",
  "checkInTime": "3:00 PM",
  "checkOutTime": "12:00 PM",
  "nearbyPlaces": [{ "name": "Eiffel Tower", "travel": [{ "mode": "walking", "duration": "4 min" }] }],
  "reviewTopics": [{ "topic": "Location", "mentions": 658, "positive": 505, "negative": 80 }],
  "website": "https://all.accor.com/...",
  "imageUrls": ["https://lh3.googleusercontent.com/...=w1200"],
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/...",
  "googleMapsUrl": "https://www.google.com/maps?cid=..."
}
```

With `includeOffers: true` each item also has `offersCount`, `cheapestOffer` and `offers`:

```json
"offers": [
  { "provider": "Hotel SOHO Barcelona", "isOfficialSite": true, "pricePerNight": 105.12, "pricePerNightWithTaxes": 114.09, "totalPriceWithTaxes": 228.19, "bookingUrl": "https://..." },
  { "provider": "Booking.com", "isOfficialSite": false, "pricePerNight": 98.73, "pricePerNightWithTaxes": 107.49, "totalPriceWithTaxes": 214.98, "bookingUrl": "https://www.booking.com/..." }
]
```

Typically 15–30 offers per hotel in big cities (fewer for hostels and rentals). With `country` set to an EU country Google shows tax-inclusive prices only, so the `...WithTaxes` fields may be empty.

Vacation rentals also include `rentalDetails` (e.g. `Entire apartment`, `Sleeps 4`, `2 bedrooms`) and `bookingProviders` with links.

**About prices.** `pricePerNight` is the nightly price as Google shows it for the selected country. In the US it excludes taxes and `pricePerNightWithTaxes` holds the total with taxes and fees; in most EU countries the displayed price already includes taxes and `pricePerNightWithTaxes` is empty. A property without a price usually has no availability for the chosen dates and occupancy.

### Pricing

Pay per result: you are charged only for properties saved to the dataset, plus a separate small charge per property when `includeOffers` is on and offers were found. No monthly fee.

### Tips

- Use specific queries (`hotels in Kraków Old Town`, `spa hotels Zakopane`) to get the most relevant list.
- Google returns results in pages of ~20 and ranking can shift slightly between pages; the scraper removes duplicates.
- Run it on a schedule to build a daily price history.

### FAQ

**Is scraping Google Hotels legal?** The scraper collects publicly available information only and no personal data. You are responsible for using the data in line with applicable laws and Google's terms.

**Do I need a proxy?** The default Apify datacenter proxy works for most runs. If you see repeated blocks, switch to residential proxy.

**Found a bug or need a field?** Open an issue on the Issues tab — I usually reply within a day.

# Actor input Schema

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

What you would type into Google Hotels, one per line. Examples: "hotels in Warsaw", "hotels near Eiffel Tower", "spa hotels in Zakopane", "Barcelona".

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

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

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

Format YYYY-MM-DD. Defaults to one night after check-in.

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

Number of adult guests (1-12).

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

Age of each child (0-17), e.g. \[5, 9]. Leave empty for no children.

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

ISO 4217 code, e.g. USD, EUR, GBP, PLN.

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

How many properties to save for each query. You pay only for saved results.

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

Keep all results, only hotels, or only vacation rentals.

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

Also open each property's Google Hotels page and save all offers: Booking.com, Expedia, Hotels.com, Agoda, Trip.com, the official site and more — nightly and total price, with and without taxes, and the booking link. Slower and charged as an extra event per property.

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

Google interface language (hl), e.g. en, de, pl. Affects text fields such as descriptions; amenity names are always English.

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

Google country (gl), e.g. us, gb, de, pl. Can affect ranking and available prices.

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

How many queries to process at the same time.

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

Apify Proxy (datacenter) works for most runs. Switch to residential only if you see repeated blocks.

## Actor input object example

```json
{
  "queries": [
    "hotels in Warsaw"
  ],
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "maxResultsPerQuery": 100,
  "propertyType": "all",
  "includeOffers": false,
  "language": "en",
  "country": "us",
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All scraped hotels and vacation rentals with prices, ratings, amenities and links.

## `offers` (type: `string`):

Per-hotel offers from booking sites (filled only when includeOffers is enabled).

# 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 Warsaw"
    ]
};

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

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

```

## MCP server setup

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