# Google Hotels Scraper — Hotel Prices & OTA Rates API | $0.90/1k (`glasswing/google-hotels-scraper`) Actor

Scrape Google Hotels for any destination and dates: hotel name, star class, rating, review count, price per night and total with taxes, deals, amenities, lat/lng and Google hotel link. Optional price from every booking site (OTA rates). Filter by class and property type. CSV, JSON, Excel.

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

## Pricing

from $0.72 / 1,000 results

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

### What does Google Hotels Scraper do?

Google Hotels Scraper reads **Google Hotels** (google.com/travel) and turns every property it lists for a destination and your dates into one clean row: hotel name, star class, guest rating and review count, **price per night and total price for the stay** (with taxes and fees), Google's deal badge, amenities, check-in and check-out times, coordinates, the hotel's website and its Google Hotels link.

Google Hotels compares prices from Booking.com, Expedia, Hotels.com, Agoda, the hotels' own sites and dozens more, so one search here gives you the market price of a whole city. Switch on **Include every booking site's price** and each row also gets the nightly and total price from every booking site, with the cheapest one named. It works like a Google Hotels API: type a destination, pick dates and guests, and export CSV, Excel or JSON.

- **Try it:** the prefill (Lisbon, 2 adults, 2 nights starting in two weeks) returns 20 properties in well under a minute.
- **No proxy setup, no Google account:** the Actor uses Apify's datacenter proxy, which is included in the price.

### Use cases for this Google Hotels scraper

- **Hotel revenue management** - track competitors' nightly rates for your dates, every day, and see when a "less than usual" deal appears.
- **Travel agencies and booking startups** - fill a hotel search with prices, star class, ratings, amenities and coordinates.
- **Rate parity checks** - with booking-site prices on, compare a hotel's own-site rate with Booking.com, Expedia and the rest.
- **Market research** - average price by star class and neighbourhood, seasonality by repeating the same search for other dates.
- **AI agents and travel assistants** - structured JSON a model can filter by price, rating and amenities.
- **Automation** - schedule runs and send the results to Google Sheets, Airtable or Slack via Make, n8n or Zapier.

### What data can Google Hotels Scraper extract?

| Field | Example | Notes |
|---|---|---|
| `name` | Dos Reis by The Beautique Hotels | Property name |
| `propertyType` | hotel | `hotel` or `vacation rental` (Google mixes both) |
| `hotelClass` / `hotelClassText` | 4 / 4-star hotel | Star class, hotels only |
| `rating` / `reviewCount` | 4.4 / 423 | Average guest rating out of 5 and the number of reviews |
| `reviewsByStars` | {"5": 294, "4": 67, ...} | Review counts per star; aggregate only |
| `locationRating` | 4.4 | Google's location score |
| `pricePerNight` / `pricePerNightText` | 106.04 / $106 | Nightly price as Google shows it |
| `pricePerNightWithTaxes` | 121.37 | Stay total with taxes and fees divided by the nights |
| `totalPrice` | 242.73 | Whole stay including taxes and fees |
| `priceBeforeTaxes` / `taxesAndFees` | 212.09 / 30.65 | The stay total split |
| `currency` | USD | Any currency you choose |
| `dealText` | 26% less than usual | Google's deal badge, when shown |
| `cheapestProvider` | Booking.com | Cheapest booking site (with booking-site prices on; for vacation rentals always) |
| `providerPrices` | \[{"provider": "Booking.com", "pricePerNight": 198.42, ...}] | Every booking site's price, cheapest first (option) |
| `checkInDate` / `checkOutDate` / `nights` | 2026-11-02 / 2026-11-04 / 2 | The stay the prices are for |
| `checkInTime` / `checkOutTime` | 2:00 PM / 12:00 PM | The hotel's times |
| `amenities` | \["Free Wi-Fi", "Outdoor pool", "Spa"] | As Google lists them |
| `latitude` / `longitude` | 38.723424 / -9.135078 | Location |
| `countryCode` | PT | ISO country |
| `website` | http://www.thebeautiquehotels.com/dos-reis | The property's own site |
| `description` | Polished adults-only hotel offering ... | Google's one-line summary |
| `thumbnailUrl` | https://lh3.googleusercontent.com/... | Main photo |
| `googleHotelUrl` | https://www.google.com/travel/hotels/entity/... | The property on Google Hotels for these dates |
| `entityId` / `placeId` | ChkI66Oq5oeW... / 0xd1933c1c... | Google's ids |
| `destination`, `position`, `adults`, `children` | Lisbon, 3, 2, 0 | The search and the rank in Google's list |
| `status`, `error`, `scrapedAt` | ok | See below |

Field coverage on the prefilled 20-property run: name, prices, rating, review count, amenities, coordinates and Google link 100%, location score 95%, website 85%, star class 80% (vacation rentals have none), deal badge 25%.

#### Result status (tri-state output)

Every row has a `status`:

- `ok` - a property was extracted. Only these rows are billed.
- `not_found` - Google returned no list for the search (no results, or the search named a single hotel). Free.
- `error` - a page could not be read after retries; `error` says why. Free.

### How to scrape Google Hotels with this Actor

1. **Enter destinations** - one per line, as you would type them into Google Hotels: `Lisbon`, `hotels near Times Square`, `Kyoto ryokan`.
2. **Pick dates and guests** - check-in and check-out (leave empty for 2 nights starting 14 days from today), adults and children's ages.
3. **Choose currency, filters and Maximum results** - for example EUR, hotels only, at least 4 stars, 200 properties.
4. **Run** - properties appear in the dataset in Google's order. Export as CSV, Excel, JSON or HTML, or read them through the API.

Google Hotels shows about 20 properties per page; the Actor follows Google's own next-page link and removes the few properties that appear on two pages, so you never pay twice for one property. Maximum results is split evenly across the destinations.

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

Pay per result: **$0.90 per 1,000 properties** plus a $0.005 start fee per run. The proxy and platform usage are included.

| Event | Price | Charged when |
|---|---|---|
| Actor start | $0.005 | Once per run (default 1 GB memory) |
| Result | $0.0009 | One property with status `ok` saved to the dataset |

Examples: 100 properties cost about $0.10, 1,000 about $0.91, 10,000 about $9. Booking-site prices are included in the same price per result; they only make the run take longer (one extra page per property). Rows with status `not_found` or `error` are never charged. The Actor stops gracefully when your run's maximum charge is reached.

### Input

| Field | What it does |
|---|---|
| `destinations` | Cities, areas or landmarks, one search each. |
| `checkInDate` / `checkOutDate` | `YYYY-MM-DD`. Empty = 14 days from today, 2 nights. A stay can be up to 30 nights. |
| `adults` | 1-12 adults (default 2). |
| `childrenAges` | One age per child, e.g. `[8, 12]`. |
| `currency` | `USD`, `EUR`, `GBP`, `JPY` and any other code Google supports. |
| `country` | Two-letter code of the Google market you search from (`us`, `gb`, `de` ...). |
| `propertyType` | `all` (default), `hotels` or `vacationRentals`. |
| `minHotelClass` | Keep only hotels with at least this many stars (0 = no filter). |
| `includeProviderPrices` | Add every booking site's nightly and total price and the cheapest one. |
| `startUrls` | Optional Google Hotels search URLs from your browser; their own dates and guests are used. The prefilled example is skipped while Destinations has entries. |
| `maxItems` | Maximum properties in total. |

Example input (the prefill):

```json
{
    "destinations": ["Lisbon"],
    "adults": 2,
    "currency": "USD",
    "maxItems": 20
}
```

Two cities, fixed dates, a family, 4-star hotels and up, with every booking site's price:

```json
{
    "destinations": ["Barcelona", "Rome"],
    "checkInDate": "2026-12-10",
    "checkOutDate": "2026-12-13",
    "adults": 2,
    "childrenAges": [8],
    "currency": "EUR",
    "propertyType": "hotels",
    "minHotelClass": 4,
    "includeProviderPrices": true,
    "maxItems": 100
}
```

### Output

A real row from the prefilled run (thumbnail and Google links shortened):

```json
{
    "url": "https://www.google.com/travel/hotels/entity/ChkI66Oq5oeW-oxCGg0vZy8xMWticWJ4Xzh5EAE?q=Lisbon&hl=en-US&gl=us&curr=USD&ts=...",
    "status": "ok",
    "scrapedAt": "2026-10-19T09:10:29.474Z",
    "destination": "Lisbon",
    "position": 3,
    "name": "Dos Reis by The Beautique Hotels",
    "propertyType": "hotel",
    "hotelClass": 4,
    "hotelClassText": "4-star hotel",
    "rating": 4.4,
    "reviewCount": 423,
    "reviewsByStars": { "1": 32, "2": 9, "3": 21, "4": 67, "5": 294 },
    "locationRating": 4.4,
    "pricePerNight": 106.04,
    "pricePerNightText": "$106",
    "pricePerNightWithTaxes": 121.37,
    "totalPrice": 242.73,
    "priceBeforeTaxes": 212.09,
    "taxesAndFees": 30.65,
    "currency": "USD",
    "dealText": "26% less than usual",
    "checkInDate": "2026-11-02",
    "checkOutDate": "2026-11-04",
    "nights": 2,
    "checkInTime": "2:00 PM",
    "checkOutTime": "12:00 PM",
    "amenities": ["Breakfast ($)", "Free Wi-Fi", "Air conditioning", "Parking", "Restaurant", "Airport shuttle", "Full-service laundry", "Accessible", "Business center", "Smoke-free property"],
    "latitude": 38.723424,
    "longitude": -9.135078,
    "countryCode": "PT",
    "website": "http://www.thebeautiquehotels.com/dos-reis",
    "thumbnailUrl": "https://lh3.googleusercontent.com/grass-cs/...",
    "googleHotelUrl": "https://www.google.com/travel/hotels/entity/ChkI66Oq5oeW-oxCGg0vZy8xMWticWJ4Xzh5EAE?q=Lisbon&...",
    "entityId": "ChkI66Oq5oeW-oxCGg0vZy8xMWticWJ4Xzh5EAE",
    "placeId": "0xd1933c1c3577a1b:0x4219e8b07cca91eb",
    "adults": 2,
    "children": 0
}
```

With `includeProviderPrices` the row also carries the booking sites (from a real run, Rome, 3 nights):

```json
{
    "cheapestProvider": "Rome Times Hotel",
    "cheapestProviderPricePerNight": 150.6,
    "cheapestProviderTotalPrice": 451.79,
    "providerCount": 12,
    "providerPrices": [
        { "provider": "Rome Times Hotel", "isOfficialSite": true, "pricePerNight": 150.6, "totalPrice": 451.79, "pricePerNightText": "$151", "totalPriceText": "$452" },
        { "provider": "Evendo", "isOfficialSite": false, "pricePerNight": 174.37, "totalPrice": 523.1, "pricePerNightText": "$174", "totalPriceText": "$523" }
    ]
}
```

A missing field is honest: Google did not show it for that property. Reviews are aggregate numbers only; the Actor never outputs reviewer names, review texts or any other personal data.

### Integrations, exports and API access

Download results as CSV, Excel, JSON, XML or HTML from the run's Storage tab, or read them with the Apify API:

```bash
curl "https://api.apify.com/v2/acts/glasswing~google-hotels-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -X POST -H "Content-Type: application/json" \
  -d '{"destinations": ["Paris"], "checkInDate": "2026-12-10", "checkOutDate": "2026-12-12", "maxItems": 50}'
```

The Actor also works from Make, n8n, Zapier, Google Sheets and any MCP client or AI agent (plain JSON input; every field has a default).

### Tips

- Use a city or area (`Shibuya Tokyo`), not a single hotel name: a search for one hotel makes Google show that hotel's own page instead of a list.
- For daily rate tracking, schedule the same search with fixed dates and compare `pricePerNightWithTaxes` over time.
- `totalPrice` always includes taxes and fees; `pricePerNight` is exactly what Google displays, which in some markets excludes taxes.
- Set `country` to your customers' market: Google shows different booking sites (and sometimes prices) per country.

### Limitations

- **Depth:** Google Hotels lists a few hundred properties per destination; the Actor reads up to 40 pages (about 600-700 properties) per destination. Add nearby areas for more.
- **Booking-site prices:** cost one extra page per property, so a run with them takes several times longer.
- **Prices change:** they are Google's live prices at the time of the run for the dates and guests you gave.
- **Vacation rentals:** have no star class or check-in times; their booking site is named in `cheapestProvider` even without the option.
- **Language:** pages are read in English; names stay as the property publishes them.

### FAQ

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

The Actor reads only public Google Hotels pages, without logging in. Hotel names, prices and ratings are public business information. Check Google's terms and your local law for your use case.

#### Can I use this Actor from an AI agent or MCP client?

Yes. Every field has a default, so a call with just `{"destinations": ["Berlin"]}` works.

#### Why did I get fewer rows than `maxItems`?

Google ran out of properties for that destination and those dates, your filters (`propertyType`, `minHotelClass`) removed some, or `maxItems` was split across several destinations.

#### Does the Actor return duplicates?

No. Google repeats a few properties between pages; each property is written and charged once per search.

#### Do I need a proxy or a Google account?

No. The proxy is set up and paid for by the Actor; no Google account is used.

#### What if a field is missing?

Google did not show it for that property. Fields are omitted rather than guessed.

### Related Actors

- [Ryanair Flights Scraper](https://apify.com/glasswing/ryanair-flights-scraper) - Ryanair fares and flight schedules for your travel dates.
- [Google Trends Scraper](https://apify.com/glasswing/google-trends-scraper) - search interest over time, to time travel demand.
- [Google News Scraper](https://apify.com/glasswing/google-news-scraper) - news about a destination or hotel brand.
- [Google Jobs Scraper](https://apify.com/glasswing/google-jobs-scraper) - hospitality job postings from every board Google lists.
- [Google Ads Transparency Scraper](https://apify.com/glasswing/google-ads-transparency-scraper) - the ads hotel chains and booking sites run on Google.
- [Keyword Suggestions Scraper](https://apify.com/glasswing/keyword-suggestions-scraper) - Google autocomplete ideas for travel keywords.
- [Rightmove Scraper](https://apify.com/glasswing/rightmove-scraper) - UK property listings, for short-let and rental market research.

### Legal and data-protection notice

This Actor extracts only data that Google Hotels publishes publicly; it does not extract private user data such as e-mail addresses, phone numbers, gender or precise location, and it does not log in or circumvent access controls. However, your results could still contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you are unsure whether your reason is legitimate, consult your lawyers. You are responsible for complying with Google's terms of service and applicable law when using the extracted data.

This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Google or its owners. All trademarks belong to their respective owners.

# Changelog

This Actor's version history is a separate document: https://apify.com/glasswing/google-hotels-scraper/changelog.md

# Actor input Schema

## `destinations` (type: `array`):

Cities, areas or landmarks as you would type them into Google Hotels, one per line (for example `Lisbon`, `hotels near Times Square`, `Kyoto ryokan`). Each destination is one search; Maximum results is split evenly across them.

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

YYYY-MM-DD. Leave empty for 14 days from today.

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

YYYY-MM-DD, after check-in, at most 30 nights later. Leave empty for check-in + 2 nights.

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

Number of adult guests (1-12).

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

One age (0-17) per child, for example `[8, 12]`. Leave empty for no children.

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

Three-letter currency code for all prices (USD, EUR, GBP, JPY ...).

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

Two-letter country code of the Google market you search from (us, gb, de, in ...). It affects which booking sites and prices Google shows.

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

Google Hotels mixes hotels and vacation rentals. Keep both, or only one kind.

## `minHotelClass` (type: `integer`):

Only keep hotels with at least this many stars (2-5). 0 keeps everything, including unrated properties.

## `includeProviderPrices` (type: `boolean`):

Also open each property's prices page and add the nightly and total price from every booking site (Booking.com, Expedia, the hotel's own site ...) plus the cheapest one. One extra page per property, so runs take longer; the price per result stays the same.

## `startUrls` (type: `array`):

Optional: Google Hotels search URLs copied from your browser (google.com/travel/search?...). The URL's own dates and guests are used when it has them. The prefilled example only runs when Destinations is empty.

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

Stop after this many properties have been saved. Each saved property with status `ok` is one billable result.

## Actor input object example

```json
{
  "destinations": [
    "Lisbon"
  ],
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "country": "us",
  "propertyType": "all",
  "minHotelClass": 0,
  "includeProviderPrices": false,
  "startUrls": [
    "https://www.google.com/travel/search?q=hotels%20in%20Barcelona"
  ],
  "maxItems": 20
}
```

# Actor output Schema

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

No description

# 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 = {
    "destinations": [
        "Lisbon"
    ],
    "adults": 2,
    "currency": "USD",
    "startUrls": [
        "https://www.google.com/travel/search?q=hotels%20in%20Barcelona"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("glasswing/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 = {
    "destinations": ["Lisbon"],
    "adults": 2,
    "currency": "USD",
    "startUrls": ["https://www.google.com/travel/search?q=hotels%20in%20Barcelona"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("glasswing/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 '{
  "destinations": [
    "Lisbon"
  ],
  "adults": 2,
  "currency": "USD",
  "startUrls": [
    "https://www.google.com/travel/search?q=hotels%20in%20Barcelona"
  ],
  "maxItems": 20
}' |
apify call glasswing/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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