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

Hotels from Google Hotels for any place and dates: price per night and stay total in your currency, taxes, rating, reviews, star class, amenities, location and photos; plus each hotel's prices on every booking site (hotel website, Booking.com, Expedia, Agoda...) with rooms and free cancellation.

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

## Pricing

from $4.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.
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: hotel prices by date, ratings and every booking site's price

Get **Google Hotels results for any place, dates and guests**: each hotel's **price per night and stay total in your currency**, the **taxes** and the **total with taxes**, **star class**, **rating and review count**, **amenities**, **location**, **photos** and Google's **review topics**. Turn on **every booking site's price** to see, for each hotel, what **the hotel's own website, Booking.com, Expedia, Agoda, Trip.com and a dozen more** charge for the same stay, with **room types** and **free-cancellation dates**.

Built for **hotel revenue managers** (competitor rates and **rate parity**), **travel agencies and OTAs**, **travel startups**, **market researchers** and **anyone tracking hotel prices** by date. Signed out, no Google account and no API key.

### What you get

| Field | What it holds |
|---|---|
| Hotel rows | `name`, `type` (hotel, hostel, guest house, vacation rental), `hotelClass`, `rating`, `reviews`, `pricePerNight`, `priceTotal` (before taxes, fees included), `taxes`, `fees`, `totalWithTaxes`, `currency`, `checkIn`, `checkOut`, `nights`, `adults`, `children` |
| Hotel details | `amenities`, `description`, `latitude`, `longitude`, `countryCode`, `website`, `ratingBreakdown`, `reviewAspects`, `nearby`, `images`, `hotelId`, `propertyToken`, `url`, `rank` |
| Booking-site prices (when asked) | `offers`: every site's `pricePerNight`, `priceTotal`, link and whether it is the hotel's own website; `rooms`: room, price and free cancellation; `lowestPricePerNight`, `lowestPriceSite`, `hotelWebsitePricePerNight`, `address`, `phone` |

### What people use it for

- **Competitor rate tracking:** your comp set's prices for the next 30, 60 or 90 days, every morning
- **Rate parity checks:** is any booking site cheaper than the hotel's own website for the same dates?
- **Price calendars:** one run per date to see how prices move with weekends, events and seasons
- **Travel products:** hotel lists with prices, ratings, amenities and photos for apps, sites and AI agents
- **Market research:** supply, star mix, prices and ratings for a city or area
- **Lead lists:** hotels with their website, phone and address for B2B outreach

### How to use it

1. Enter **searches** as you would type them in Google Hotels, such as `hotels in Lisbon`.
2. Pick **check-in and check-out**, **guests** and **currency**.
3. Turn on **Every booking site's price** if you want each hotel's price on every site, then click **Start**.

### Input

| Field | Example | Notes |
|---|---|---|
| Searches | `hotels in Lisbon` | A place, an area or a kind of stay |
| Check-in / Check-out | `2026-11-20` / `2026-11-23` | Empty = in 14 days, for 2 nights; up to 30 nights |
| Adults / Children's ages | `2` / `7` | Prices are for these guests |
| Currency | `USD` | Any three-letter code |
| Hotels per search | `20` | About 20 a page; up to 500 |
| Include vacation rentals | on | Turn off for hotels, hostels and guest houses only |
| Every booking site's price | off | Opens each hotel; charged per hotel |
| Hotel links | `https://www.google.com/travel/hotels/entity/...` | Prices for chosen hotels, without a search |
| Google country / Language | `us` / `en` | Google's country and language |

### Output

Each result is one row in the run's dataset (download it as JSON, CSV, Excel, XML or HTML, or read it through the API). An example row (values shortened):

```json
{
  "kind": "hotel",
  "name": "Sample Avenue Hotel",
  "type": "hotel",
  "hotelClass": 5,
  "rating": 4.6,
  "reviews": 282,
  "pricePerNight": 161.3,
  "priceTotal": 483.9,
  "taxes": 48.3,
  "fees": 0,
  "totalWithTaxes": 532.2,
  "checkIn": "2026-11-20",
  "checkOut": "2026-11-23",
  "nights": 3,
  "adults": 2,
  "children": 0,
  "currency": "EUR",
  "amenities": [
    "Breakfast",
    "Free Wi-Fi",
    "Parking ($)",
    "Outdoor pool",
    "Air conditioning",
    "Bar",
    "Restaurant"
  ],
  "latitude": 38.722,
  "longitude": -9.1456,
  "ratingBreakdown": {
    "5": 774,
    "4": 348,
    "3": 164,
    "2": 94,
    "1": 211
  },
  "reviewAspects": [
    {
      "aspect": "Location",
      "mentions": 115,
      "positive": 100,
      "negative": 9
    }
  ],
  "url": "https://www.google.com/travel/hotels/entity/...",
  "search": "hotels in Lisbon",
  "rank": 3
}
```

A record named `SUMMARY` in the run's key-value store says what each input returned, with any notes (for example an account that does not exist), what was charged and how much traffic the run used.

### Pricing

- **$0.005 per hotel** in the search results
- **$0.015 per hotel's booking-site prices** (every site, rooms and free cancellation), when you turn them on
- Hotels with no prices for your dates are free

What typical jobs cost at the list price:

| Job | Cost |
|---|---|
| 100 hotels in a city, with prices for your dates | $0.50 |
| Booking-site prices for a comp set of 10 hotels, one date | $0.15 |
| 10 hotels, every date for the next 30 days | $4.50 |
| 1,000 hotels across 20 cities | $5 |

On Apify's Scale and Business plans the per-event prices are lower (Store discounts). Set **Maximum cost per run** and the Actor stops cleanly when it is reached: you never pay more than that.

### Tips

- For a price calendar, schedule one run per date (or run a task per date) and compare the datasets.
- To watch your comp set, paste their Google Hotels links in **Hotel links**: you skip the search and pay only for the price lists.
- Set the **currency** you report in: prices come converted by Google.
- Prices depend on the guests: children change both price and availability, and adults-only hotels show no prices for families.

### Use it through the API

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("zaiq/google-hotels-scraper").call(run_input={"searches": ["hotels in Lisbon"], "checkIn": "2026-11-20", "checkOut": "2026-11-23", "currency": "EUR", "includePrices": true, "maxHotelsPerSearch": 20})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
```

**JavaScript**

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('zaiq/google-hotels-scraper').call({"searches": ["hotels in Lisbon"], "checkIn": "2026-11-20", "checkOut": "2026-11-23", "currency": "EUR", "includePrices": true, "maxHotelsPerSearch": 20});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**HTTP (one call, results back)**

```bash
curl -X POST 'https://api.apify.com/v2/acts/zaiq~google-hotels-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{"searches": ["hotels in Lisbon"], "checkIn": "2026-11-20", "checkOut": "2026-11-23", "currency": "EUR", "includePrices": true, "maxHotelsPerSearch": 20}'
```

### Integrations and schedules

- **Schedules:** run it every hour, day or week from the Apify Console (Schedules) and keep a history of results.
- **Make, Zapier, n8n, Google Sheets, Slack, Airtable:** connect it through Apify's integrations, or send each finished run to a **webhook**.
- **Datasets:** results stay in the run's dataset; export them or read them by API whenever you need them.

### Use it with AI agents (MCP)

Add Apify's MCP server (`https://mcp.apify.com`) to Claude, ChatGPT, Cursor, VS Code or any MCP client. The agent can find this Actor and run it for you: ask it for "5-star hotels in Lisbon for 20 to 23 November with prices in euros, and which booking site is cheapest for each". AI agents can also pay for runs directly through Apify's agentic payments.

### Limits

- Prices are what Google Hotels shows for your dates, guests and currency at run time; booking sites change them often.
- Booking-site prices are as Google shows them to a U.S. visitor: per night and for the stay, before taxes. The hotel rows add the taxes and the total with taxes.
- Booking-site lists come from Google: some hotels list only a few sites, and some show none for some dates.
- Links that pass through an ad-click counter are left out, so following a link never counts as a paid click.
- One room per search (Google's default); about 20 hotels a page.

### FAQ

**Do I need a Google account or API key?**

No. Everything is what Google Hotels shows a signed-out visitor.

**Are prices per night or for the stay?**

Both. `pricePerNight` and `priceTotal` are before taxes with any fees included (how Google shows prices in the U.S.); `taxes` and `totalWithTaxes` give the rest of what the stay costs.

**Which booking sites are covered?**

Every site Google lists for the hotel: usually the hotel's own website, Booking.com, Expedia, Hotels.com, Agoda, Trip.com, Priceline and smaller sites.

**Can I check rate parity?**

Yes: each price list marks the hotel's own website and gives `hotelWebsitePricePerNight` next to `lowestPricePerNight`.

**Can I get prices for many dates?**

Run once per date (a task or a schedule per date); each run is one stay.

**Does it include vacation rentals?**

Yes, as Google mixes them in; turn **Include vacation rentals** off for hotels only.

### Related Actors from Zaiq

- [google-trends-scraper](https://apify.com/zaiq/google-trends-scraper): how search interest in a destination moves
- [contact-details-extractor](https://apify.com/zaiq/contact-details-extractor): emails and phones from the hotels' websites
- [google-news-scraper](https://apify.com/zaiq/google-news-scraper): news about a destination or a hotel group

### Support

Questions, a site that changed, or a field you need? Open an issue on this Actor's **Issues** tab: we answer there, usually within a day.

***

Also found as: google hotels scraper, google hotels api, hotel price scraper, hotel rate shopping, rate parity, hotel price comparison, google travel scraper, booking.com prices, hotel prices by date.

# Actor input Schema

## `searches` (type: `array`):

What you would type in Google Hotels, one per line: a place (Lisbon), an area (hotels near Times Square) or a kind (beach resorts in Mallorca).

## `checkIn` (type: `string`):

Empty = 14 days from today.

## `checkOut` (type: `string`):

Empty = 2 nights after check-in. Up to 30 nights.

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

Guests 18 and over.

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

One age per child, e.g. 7.

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

Three-letter code: USD, EUR, GBP, ZAR, AUD...

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

About 20 come on each page of Google's results.

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

Google mixes apartments and holiday homes into hotel results; turn off for hotels, hostels and guest houses only.

## `includePrices` (type: `boolean`):

Also open each hotel and list its price on every booking site (the hotel's website, Booking.com, Expedia, Agoda and more), with rooms and free cancellation. Charged per hotel.

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

Google Hotels links (google.com/travel/hotels/entity/...) to get booking-site prices for, without a search.

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

Two-letter country code for Google (gl).

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

Language of names and amenities (hl), e.g. en, de, fr.

## Actor input object example

```json
{
  "searches": [
    "hotels in Lisbon"
  ],
  "adults": 2,
  "currency": "USD",
  "maxHotelsPerSearch": 20,
  "vacationRentals": true,
  "includePrices": false,
  "country": "us",
  "language": "en"
}
```

# Actor output Schema

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

Dataset: the results.

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

What each input returned, and notes.

# 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 = {
    "searches": [
        "hotels in Lisbon"
    ]
};

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

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

```

## MCP server setup

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