# Google Hotels Scraper - Prices & Booking Sites (`eiv/google-hotels-scraper`) Actor

Scrape Google Hotels by destination or hotel: price per night and total for your dates and guests, deals, stars, rating, reviews, amenities and location. Add-on: every booking site's price and link (Booking.com, Expedia, the hotel's own site). Price calendars, vacation rentals. No login.

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

## Pricing

from $0.70 / 1,000 hotel scrapeds

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** extracts hotels and their live prices from **Google Hotels**: price per night and for the whole stay with taxes, Google's deal label, star class, rating, reviews, amenities, location and photos, for the dates and number of guests you choose. Search by destination ("hotels in Vienna") or list specific hotels, and add every booking site's price (Booking.com, Expedia, Agoda, the hotel's own site) with direct links. No login, no API key, no browser, from **$0.50 per 1,000 hotels**.

```json
{
  "name": "Hotel Regina",
  "searchQuery": "hotels in Vienna",
  "position": 3,
  "hotelClass": 4,
  "rating": 4.3,
  "reviewsCount": 1847,
  "pricePerNight": 139,
  "totalPrice": 319,
  "currency": "USD",
  "checkInDate": "2026-11-06",
  "checkOutDate": "2026-11-08",
  "deal": "15% less than usual",
  "typicalPriceLow": 133,
  "typicalPriceHigh": 194,
  "lowestPriceProvider": "Super.com",
  "bookingOptions": [
    { "provider": "Super.com", "nightlyPrice": 139, "totalStayPrice": 277, "isOfficialSite": false, "bookingUrl": "https://www.super.com/travel/…" },
    { "provider": "trivago DEALS", "nightlyPrice": 154, "totalStayPrice": 307, "isOfficialSite": false, "bookingUrl": "https://www.trivago.deals/…" },
    { "provider": "Hotel Regina", "nightlyPrice": 183, "totalStayPrice": 366, "isOfficialSite": true, "bookingUrl": "https://app.thebookingbutton.com/…" }
  ],
  "address": "Rooseveltplatz 15, 1090 Wien, Austria",
  "phone": "+43 1 404460",
  "amenities": ["Wi-Fi", "Restaurant", "Bar", "Room service", "Breakfast", "Airport shuttle", "Pet-friendly"],
  "latitude": 48.2162554,
  "longitude": 16.3594181
}
```

**Measured on Apify: 1,000 hotels across 10 cities in 38 seconds; 200 hotels with every booking site's price (19 sites per hotel on average) in 45 seconds.**

### What does Google Hotels Scraper do?

It searches Google Hotels the way you would, for your dates and guests, and returns every hotel as one row with the price Google shows. Turn on booking-site prices, or list hotels by name or link, and each row also carries the price on every booking site Google compares, the hotel's address and phone, and its typical price range. Repeat a stay over many check-in dates to build a price calendar.

- **Search any destination**: a city, an area, a landmark ("hotels near Times Square"), "resorts in Bali", "hostels in Amsterdam". Or paste Google Hotels links, hotel ids, or hotel names with their city.
- **Live prices for your stay**: check-in date (or a relative date such as "14 days"), nights, adults, 43 currencies, 50 countries and 32 languages.
- **Price comparison add-on**: Booking.com, Expedia, Agoda, Hotels.com, Trip.com, Priceline, the hotel's own site and more, with nightly and total prices and each site's own booking link.
- **Rate tracking**: price the same stay for up to 60 consecutive check-in dates in one run, for competitor monitoring and revenue management.
- **Google's own filters, free**: sort by price, rating or reviews; price range, star class, guest rating, 19 amenities, free cancellation, special offers, eco-certified; vacation rentals with bedrooms and bathrooms.
- **Only pay for results.** Searches Google does not understand, unknown hotels and failed requests return an error row and are never charged.
- **Built for automation.** Run it on a schedule, call it from the API, or connect it to Make, Zapier, n8n, Google Sheets or an AI agent through Apify's MCP server.

### Why it is fast and cheap

It reads the data the Google Hotels website itself sends to your browser, over plain HTTP, without running a browser. One request returns a page of about 20 hotels with all their fields, and one request returns a hotel's full price comparison. That is why it runs at a fraction of the price of browser-based or SERP-API-based scrapers.

### What data can you extract from Google Hotels?

| Field | Example | What it is |
|---|---|---|
| `name`, `hotelId`, `url` | `Hotel Regina` | Name, Google Hotels id, link with your dates |
| `category`, `hotelClass`, `hotelClassText` | `Hotel`, `4` | Property type and official star class |
| `rating`, `reviewsCount`, `ratingHistogram` | `4.3`, `1847` | Guest rating, reviews, reviews per star |
| `reviewTopics` | `{"topic":"Breakfast","positive":79,"negative":9}` | What guests talk about |
| `pricePerNight`, `totalPrice` | `139`, `319` | Nightly price as Google shows it; whole stay with taxes |
| `totalPriceBeforeTaxes`, `taxesAndFees`, `currency` | `277.22`, `41.59`, `USD` | The stay's price split |
| `deal` | `15% less than usual` | Google's deal label |
| `checkInDate`, `checkOutDate`, `nights`, `adults` | `2026-11-06` | The stay the prices are for |
| `bookingOptions` | see above | Add-on: every booking site's price and link |
| `lowestPrice`, `lowestPriceProvider` | `139`, `Super.com` | Add-on: the cheapest booking site |
| `typicalPriceLow`, `typicalPriceHigh` | `133`, `194` | Add-on: what the hotel usually costs per night |
| `address`, `phone`, `placeId` | `Rooseveltplatz 15, 1090 Wien` | Add-on: contact details and Google Maps Place ID |
| `website`, `latitude`, `longitude`, `countryCode` | `48.216`, `16.359` | Location and the hotel's own site |
| `amenities`, `checkInTime`, `checkOutTime`, `description` | `["Bar","Spa"]`, `2:00 PM` | Facilities and policies |
| `nearbyPlaces` | `St. Stephen's Cathedral, 10 min by taxi` | Sights, stations and airports with travel times |
| `maxGuests`, `bedrooms`, `bathrooms` | `5`, `3`, `2` | Vacation rentals |
| `thumbnail`, `images`, `googleMapsUrl`, `cid`, `featureId` | | Photos and Google Maps ids |
| `searchQuery`, `searchLocation`, `position`, `input` | `hotels in Vienna`, `Vienna`, `3` | Which search found the hotel, where, and its rank |

### How to scrape Google Hotels

1. Click **Try for free** and type a destination into **Searches** ("hotels in Vienna"), or paste hotels into **Specific hotels**.
2. Set the **Check-in** date, **Nights** and **Adults**, and the **Currency**.
3. Set **Hotels per search** (you pay per hotel) and turn on **Booking-site prices** if you want the price comparison. Click **Start**: 1,000 hotels take under a minute.
4. Open the **Output** tab (views: Overview, Price comparison, Booking sites, Contact and location), or download JSON, CSV, Excel or HTML.

### How much does it cost to scrape Google Hotels?

You pay per hotel row, and the price drops on higher Apify plans. The booking-site prices add-on is charged only for rows where booking sites returned prices.

| Apify plan | Per 1,000 hotels | Booking-site prices add-on, per 1,000 |
|---|---|---|
| Free | $1.25 | $2.50 |
| Starter | $1.00 | $2.00 |
| Scale | $0.85 | $1.70 |
| Business | $0.70 | $1.40 |
| Enterprise | $0.50 - $0.60 | $1.00 - $1.20 |

- 1,000 hotels from 10 cities on the Starter plan: 1,000 x $0.001 = **$1.00**.
- Rate tracking, 10 competitor hotels x 30 check-in dates with every booking site's price on Starter: 300 rows x ($0.001 + $0.002) = **$0.90**.
- Filters are free. A run also costs **$0.00005** per GB of memory to start. A search or hotel that fails costs nothing.
- The Free plan's $5 monthly credit covers about **4,000 hotels**.

### Input

```json
{
  "searchQueries": ["hotels in Vienna", "hotels near Times Square New York"],
  "checkInDate": "30 days",
  "nights": 2,
  "adults": 2,
  "currency": "USD",
  "includeBookingPrices": true,
  "hotelClass": ["4", "5"],
  "maxResultsPerSearch": 40
}
```

| Field | Default | Notes |
|---|---|---|
| Searches (`searchQueries`) | `hotels in Paris` | One per line; Google Hotels links work too |
| Specific hotels (`hotels`) | none | Links, ids (`ChoI…`) or names with the city; always with booking-site prices |
| Check-in (`checkInDate`) | `7 days` | `YYYY-MM-DD` or a relative date |
| Check-out (`checkOutDate`) / Nights (`nights`) | 1 night | Up to 30 nights |
| Price several check-in dates (`dateRangeDays`) | 1 | Up to 60 consecutive dates; rows multiply |
| Adults (`adults`) | 2 | 1-12 |
| Currency, Country, Language | `USD`, `us`, `en` | Country is the market Google prices for |
| Booking-site prices (`includeBookingPrices`) | off | One extra request per hotel; the add-on |
| Filters | off | Sort, price range, stars, rating, amenities, free cancellation, offers, eco-certified, vacation rentals |
| Skip vacation rentals (`skipVacationRentals`) | off | Keeps hotel searches to hotels; skipped rows are free |
| Hotels per search (`maxResultsPerSearch`) | 20 | Per search and check-in date: your main cost lever |
| Max rows in total (`maxItems`) | none | Optional cap for the whole run |
| Proxy | automatic | Leave empty: the Actor picks the address itself |

### Output

Each hotel and stay is one row. The **Overview** view shows the key columns, **Price comparison** puts Google's price next to the cheapest booking site and the typical range, and **Booking sites** shows one row per site. Every export includes all fields.

A search or hotel that cannot be read becomes a row with `"recordType": "error"` and an `errorCode` instead of failing the whole run:

| `errorCode` | Meaning |
|---|---|
| `NOT_FOUND` | No such hotel, or Google found no place in the search ("add a city") |
| `BLOCKED` | Google refused every address tried; run again later |
| `NETWORK` | The connection failed repeatedly |
| `PARSE_FAILED` | Google answered in an unknown format; please report it |

Error rows are never charged.

### Tips and limits

- **Taxes**: `totalPrice` always includes taxes and fees when Google gives the breakdown (`totalPriceBeforeTaxes` + `taxesAndFees`). `pricePerNight` and the booking sites' prices are shown the way Google shows them, which in some markets excludes taxes.
- **Adults only**: Google prices stays with children only in its live web page, so this Actor prices for adults. Most hotels price per room, so the price for a family is often the same.
- **Page by page**: Google shows about 20 hotels per page and ranks them slightly differently on each request, so a few hotels can repeat across pages (they are skipped, not charged) and the last pages can thin out. Narrow big cities with filters or several searches ("hotels in Manhattan", "hotels in Brooklyn").
- **Vacation rentals**: Google mixes some apartments and rooms-for-rent into hotel lists; turn on **Skip vacation rentals** to drop them, or **Vacation rentals instead of hotels** to get only them. For rooms in a guesthouse Google lists the whole property's bedrooms.
- **Reviews**: rows carry the rating, review count, star breakdown and review topics, not the review texts.
- **Hit your spending limit?** The run stops cleanly at your maximum cost per run and keeps everything it collected. Raise the limit in the run options to get more.

### FAQ

#### Is it legal to scrape Google Hotels?

This Actor collects only prices and hotel information that Google Hotels shows publicly, without logging in, and no personal data. Check that your use complies with the terms that apply to you, and ask a lawyer if you are unsure. Google Hotels is a trademark of Google LLC; this Actor is not affiliated with or endorsed by Google.

#### Can I track a hotel's prices every day?

Yes. Put the hotels under **Specific hotels**, set **Check-in** to a relative date ("30 days") and **Price several check-in dates** to the window you watch, and add a schedule on the **Schedules** tab. Every run prices the same lead times, so the results line up day by day.

#### Can I use it through the API or with Make, Zapier and n8n?

Yes. Every run can be started through the [Apify API](https://docs.apify.com/api/v2) and returns the dataset as JSON, CSV or Excel. Schedules, webhooks and integrations for Make, Zapier, n8n and Google Sheets are on the **Integrations** tab.

#### Can AI agents use it?

Yes. Agents connected to [Apify's MCP server](https://mcp.apify.com) can find and run this Actor as a tool to answer "find me a 4-star hotel in Lisbon under $150 for these dates", with the same per-result pricing.

#### Why did I get fewer hotels than I asked for?

Either Google had fewer hotels for the search, the dates or the filters, the run reached your maximum cost per run, or it reached its timeout. The log says which, and nothing collected before that is lost.

### Related scrapers

- [Google Maps Scraper](https://apify.com/eiv/google-maps-scraper): businesses, restaurants and attractions with phones, websites and reviews.
- [Airbnb Market Scraper](https://apify.com/eiv/airbnb-market-scraper): Airbnb listings, prices and availability for a market.
- [Google Search Results Scraper](https://apify.com/eiv/google-search-scraper): organic results, places and top stories for any keyword.
- [Google Trends Scraper](https://apify.com/eiv/google-trends-scraper): search interest over time and by region, for travel demand.

### Support

Missing a field, or found a search that does not work? Open an issue on the **Issues** tab with the input you used, and it will be looked at quickly.

# Actor input Schema

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

One search per line, as you would type it into Google Hotels: "hotels in Paris", "resorts in Bali", "hotels near Times Square", "hostels in Amsterdam". Google Hotels links work too. Each search returns up to "Hotels per search" rows, in Google's order.

## `hotels` (type: `array`):

One hotel per line: a Google Hotels link (google.com/travel/hotels/entity/…), its id ("ChoI…"), or the hotel's name with its city ("Hotel Artemide Rome"). Each hotel returns one row per stay, always with every booking site's price (charged as the booking-prices add-on). Ideal for rate tracking on a schedule.

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

A date (YYYY-MM-DD) or a time from today, such as "7 days" or "2 weeks". Relative dates keep scheduled runs pointing at the future. Prices are for this check-in.

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

Optional: a date (YYYY-MM-DD) or a time from today. Leave empty to use "Nights". Must be 1-30 nights after check-in.

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

Length of the stay when no check-out date is set.

## `dateRangeDays` (type: `integer`):

Price the same stay for this many consecutive check-in dates, starting at the check-in date: 1 = only that date, 30 = a month of daily prices. Every search and hotel is repeated for each date, so rows and cost multiply by this number.

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

Adult guests. Prices change with the number of guests. Google prices stays with children only in its live web page, so this Actor prices adults.

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

Currency for every price.

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

The market Google prices for: which booking sites appear and whether taxes are included can differ by country.

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

Language for descriptions, price labels and deal texts. Amenity names are always in English.

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

Opens each hotel a search returns for the price on every booking site (Booking.com, Expedia, Agoda, Hotels.com, the hotel's own site…) with direct links, plus address, phone, typical price range and Place ID. One extra request per hotel, charged as the booking-prices add-on only where prices came back. Hotels under "Specific hotels" always get this.

## `sortBy` (type: `string`):

Google's order for search results.

## `minPrice` (type: `integer`):

Optional, in the currency above.

## `maxPrice` (type: `integer`):

Optional, in the currency above.

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

Only these star classes. Leave empty for all.

## `minRating` (type: `string`):

Only hotels rated at least this.

## `amenities` (type: `array`):

Only hotels with all of these.

## `freeCancellation` (type: `boolean`):

Only offers that can be cancelled for free.

## `specialOffers` (type: `boolean`):

Only hotels with a special offer or deal.

## `ecoCertified` (type: `boolean`):

Only hotels with an eco certification.

## `vacationRentals` (type: `boolean`):

Search Google's vacation rentals (apartments, houses) instead of hotels. Rows then include guests, bedrooms and bathrooms.

## `skipVacationRentals` (type: `boolean`):

Google mixes some apartments and rooms-for-rent into hotel lists. Turn on to keep hotels, hostels, B\&Bs and the like only; skipped rentals are not charged.

## `minBedrooms` (type: `integer`):

Vacation rentals only.

## `minBathrooms` (type: `integer`):

Vacation rentals only.

## `maxResultsPerSearch` (type: `integer`):

Stop each search (per check-in date) after this many hotels. Google shows about 20 per page; one page is one request. You pay per hotel, so this is your main cost lever.

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

Optional cap for the whole run, across all searches, hotels and dates. Empty = no cap beyond "Hotels per search" and your maximum charge per run.

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

Leave empty: the Actor uses the run's own address (free) and moves to Apify datacenter, then residential proxy, only if Google refuses it. Set a proxy here only to force your own.

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

How many searches or hotels are processed at the same time.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for one response before giving up on it.

## `maxRetries` (type: `integer`):

Retries for blocked or failed requests, each from another address.

## Actor input object example

```json
{
  "searchQueries": [
    "hotels in Paris"
  ],
  "checkInDate": "7 days",
  "nights": 1,
  "dateRangeDays": 1,
  "adults": 2,
  "currency": "USD",
  "country": "us",
  "language": "en",
  "includeBookingPrices": false,
  "sortBy": "relevance",
  "minRating": "any",
  "freeCancellation": false,
  "specialOffers": false,
  "ecoCertified": false,
  "vacationRentals": false,
  "skipVacationRentals": false,
  "maxResultsPerSearch": 20,
  "maxConcurrency": 5,
  "requestTimeoutSecs": 30,
  "maxRetries": 2
}
```

# Actor output Schema

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

One row per hotel and stay (recordType "hotel"), plus one uncharged row per search or hotel that could not be read (recordType "error").

## `prices` (type: `string`):

Google's price next to the cheapest booking site and the hotel's typical price range.

## `bookingSites` (type: `string`):

One row per booking site per hotel: Booking.com, Expedia, Agoda, the hotel's own site, with prices and links.

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

Totals for the run: targets, rows, booking-price add-ons charged, failures, requests and why the run stopped.

# 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("eiv/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("eiv/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 eiv/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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