# Google Hotels Scraper - Prices, OTA Rates, Ratings (`om_kh/google-hotels-scraper`) Actor

Google Hotels scraper that does not fail: 100% of runs succeeded in the last 30 days. Any city and dates: nightly and total price, about 20 booking-site offers per hotel, stars, rating, review themes, amenities, nearby places, photos. Google's own sort and filters. From $2 per 1,000.

- **URL**: https://apify.com/om_kh/google-hotels-scraper.md
- **Developed by:** [Khandji Omar](https://apify.com/om_kh) (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

Pay per event

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 — Prices, OTA Rates, Ratings

> Scrape **Google Hotels** for any city and dates: **nightly and total price**, star class,
> **guest rating, review count and review themes**, **amenities**, eco-certified flag, GPS, photos,
> **nearby places with travel times**, and, as an option, **prices from every booking site**
> (Booking.com, Expedia, Agoda, Hotels.com, Trip.com, the **hotel's own website**…) with booking
> links, room rates, free-cancellation dates, sponsored flag, address and phone. Google's own sort
> and filters. Hotels and vacation rentals, any currency, country and language.
> **From $2 per 1,000 properties, no start fee.**

### Free tier — 20 results free on every run

**The first 20 results of every run are free**, on every run you ever make — not a one-off trial. One guard: the free allowance never covers more than half of a run, so the offer stays sustainable.

### What does this Google Hotels scraper do?

Type destinations ("Lisbon", "Miami Beach", "boutique hotels near the Eiffel Tower"), pick your
dates and guests, and get every property Google Hotels shows — 20 per page, up to 600 per
destination — as clean rows. Turn on **Include prices from every booking site** to get the full
price comparison Google shows on each hotel page: one offer per site, nightly and total, before
and after taxes, and the cheapest site.

### Measured, not promised

Test of 17 October 2026: Paris, New York and Tokyo, 30 hotels each, 2 adults, 20 to 22 November
2026, in USD, with **prices from every booking site** on.

Both tools ran the same input on the same evening.

| | Google Hotels Scraper (om_kh) | zerobreak/google-hotels-scraper (most used) |
|---|---|---|
| Hotels returned | 90 of 90 | 90 of 90 |
| Prices per hotel | **about 20, one per booking site**, cheapest site marked | 1 |
| Hotel's own website price | **54 hotels** | no |
| Nearby places, review themes, amenities | yes | no |
| Star class, description | 70 and 64 (apartments and hostels have none on Google) | 81 and 72 |
| Time | 92 s | **24 s** |
| Cost of the run | **$0.36** with every site's prices ($0.18 without) | $0.39 |
| Runs that succeed, last 30 days (Store figure) | **100%** (14 of 14) | 67% (28,281 of 42,495; 14,207 failed) |

The two lists are not the same hotels: 45 names are in both. Ours includes apartments and hostels
that Google lists in the same search.

### Why use it

1. **Reliable.** Reads Google's own page data, not a fragile screen scrape — tested on many
   cities, pages and currencies.
2. **Full OTA price ladder** (option): Booking.com vs Expedia vs Agoda vs the hotel's website,
   with `cheapestSource` and `officialSitePricePerNight` for rate-parity checks.
3. **Real dates and guests:** prices are for your stay (check-in, check-out, adults, children),
   in your currency, as seen from your traveler country.
4. **Rich rows, at the base price:** description, amenities (names and Google codes), amenities
   the property lacks, eco-certified flag, star class, rating, review count, rating histogram,
   **review themes** (service, location, cleanliness… with positive and negative mentions),
   Google's location scores, GPS, website, photos, and **every nearby place Google
   lists** (sights, restaurants, transit, airports) with travel time by foot, transit and taxi.
5. **Google's own sort and filters:** lowest price, highest rating or most reviewed; stars,
   guest rating, minimum and maximum price, 19 amenities, free cancellation, eco-certified,
   special offers. Google applies them to the whole destination before the rows are read, so
   "the 50 cheapest 4-star hotels with a pool" really is that.
6. **Room rates and cancellation terms** (with the prices option), where Google lists them: room
   name, each rate, and the date until which cancellation is free.
7. **Sponsored or not:** each offer says whether it comes from Google's paid "Featured options".
8. **Any language:** descriptions, amenities and review themes in the language you pick.
9. **Cheaper than the alternatives:** $0.002 per property, $0.004 with every site's prices.

### How to use it in 3 steps

1. Click **Try for free** — Lisbon is prefilled.
2. Enter destinations, dates, guests and currency.
3. Click **Start** and download JSON, CSV or Excel.

### Input

| Field | What it does |
|---|---|
| `locations` | Cities, neighborhoods or full searches (up to 50). |
| `checkInDate` / `checkOutDate` | YYYY-MM-DD. Default: in 14 days, one night. Max 30 nights. |
| `adults` / `children` | Guests per room (prices depend on it). |
| `currency` | USD, EUR, GBP, CAD, AUD, JPY, INR… |
| `country` | Traveler country (`us`, `gb`, `fr`, `de`…): Google shows country-specific prices and sites. |
| `propertyType` | Hotels and vacation rentals, hotels only, or vacation rentals only. |
| `maxHotelsPerLocation` | In the chosen order, 1 to 600. Default 50. |
| `sortBy` | `relevance` (default), `lowest_price`, `highest_rating`, `most_reviewed`. |
| `minHotelClass` / `minRating` | Minimum stars (1-5) and minimum guest rating (0-5). |
| `minPricePerNight` / `maxPricePerNight` | Price range per night, before taxes, in your currency. |
| `amenities` | Keep properties that have all of: `free_wifi`, `free_breakfast`, `restaurant`, `bar`, `kid_friendly`, `pet_friendly`, `free_parking`, `parking`, `ev_charger`, `room_service`, `fitness_center`, `spa`, `pool`, `indoor_pool`, `outdoor_pool`, `air_conditioned`, `wheelchair_accessible`, `beach_access`, `all_inclusive`. |
| `freeCancellation` / `ecoCertified` / `specialOffers` | Keep only properties with a free-cancellation rate, an eco certification, or a deal. |
| `language` | Language of descriptions, amenities and review themes (`en`, `fr`, `es`, `de`…). |
| `includePrices` | Every booking site's offer (sponsored flag, room rates, free-cancellation date) + address, phone, check-in/out times, long description, grouped amenity list, ratings from other sites. |
| `days` | integer | Nights of the stay when no `checkOutDate` is given. |
| `entity` | array | Google Travel hotel IDs (`Ch...`) or exact hotel names: priced across every booking site. |
| `device` | string | `desktop` (default) or `mobile`: Google shows some prices only on mobile. |
| `maxTotalChargeUsd` | Optional hard cost cap for the run. |

```json
{
  "locations": ["Lisbon", "Porto"],
  "checkInDate": "2026-11-12",
  "checkOutDate": "2026-11-15",
  "adults": 2,
  "currency": "EUR",
  "propertyType": "hotels",
  "sortBy": "lowest_price",
  "minHotelClass": 4,
  "amenities": ["pool", "free_wifi"],
  "freeCancellation": true,
  "includePrices": true
}
```

### Output

Real example (Lisbon, 1 night, 2 adults, EUR, sorted by highest rating, prices option on; long
lists cut to their first entries):

```json
{
  "name": "The Homeboat Company Parque das Nações - Lisboa",
  "propertyType": "hotel",
  "hotelClass": 4,
  "rating": 4.9,
  "reviewCount": 2425,
  "reviewsBreakdown": [
    {"name": "Service", "mentions": 430, "positive": 414, "negative": 11, "neutral": 5},
    {"name": "Family friendly", "mentions": 60, "positive": 55, "negative": 3, "neutral": 2}
  ],
  "pricePerNight": 197.75,
  "pricePerNightWithTaxes": 218,
  "totalPriceWithTaxes": 217.62,
  "currency": "EUR",
  "checkIn": "2026-10-20",
  "checkOut": "2026-10-21",
  "description": "Snug houseboats with kitchens & terraces in a chic guesthouse offering breakfast.",
  "amenities": ["Breakfast ($)", "Free Wi-Fi", "Free parking", "Hot tub", "Air conditioning", "Pet-friendly", "Bar", "Restaurant"],
  "amenityCodes": [165, 29, 16, 10, 2, 18, 4, 23, 24, 12, 1, 27, 11, 25],
  "ecoCertified": false,
  "latitude": 38.757420499999995,
  "longitude": -9.093465,
  "website": "https://thehomeboatcompany.com/",
  "locationScore": 3.5,
  "thingsToDoScore": 3.1,
  "transitScore": 2.9,
  "airportAccessScore": 4.5,
  "nearestAirport": {"name": "Humberto Delgado Airport", "travelTime": "16 min"},
  "nearbyPlaces": [
    {"kind": "attraction", "name": "Oceanário de Lisboa", "category": "Point of interest", "travelTime": "9 min",
     "travelTimes": {"publicTransit": "9 min", "walk": "10 min"}, "rating": 4.6, "reviewCount": 104221,
     "description": "Modern, waterside aquarium with ocean habitats for sharks, rays, penguins & tropical fish.",
     "latitude": 38.7635435, "longitude": -9.0937415}
  ],
  "rank": 1,
  "sortBy": "highest_rating",
  "totalAvailable": 283,
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChkIh8adr4CP98kYGg0vZy8xMWZ2YjE2OF82EAE",
  "address": "Pontão E Edifício da Capitania, Passeio Neptuno, 1990-193 Lisboa, Portugal",
  "phone": "+351 936 155 134",
  "checkInTime": "3:00 PM",
  "checkOutTime": "12:00 PM",
  "amenitiesDetailed": [
    {"group": "Internet", "name": "Wi-Fi (free)", "available": true, "code": 28},
    {"group": "Internet", "name": "Wi-Fi in public areas", "available": true, "code": 162}
  ],
  "offers": [
    {"source": "Booking.com", "isOfficialSite": false, "isSponsored": true,
     "pricePerNight": 190.29, "pricePerNightWithTaxes": 209.7, "totalPriceWithTaxes": 209.7,
     "freeCancellation": true, "freeCancellationUntil": "Oct 18 11:59 PM",
     "rooms": [{"name": "One Cabin Boat", "rates": [{"pricePerNight": 190.29, "pricePerNightWithTaxes": 209.71, "freeCancellation": false}]}]}
  ],
  "offerCount": 8,
  "sponsoredOfferCount": 2,
  "cheapestSource": "Super.com",
  "cheapestPricePerNight": 179.99,
  "freeCancellationAvailable": true
}
```

In this row the real lists are longer: 31 nearby places, 35 detailed amenities, 8 offers, 9 photos.
Vacation rentals carry `amenities`, `amenitiesMissing` and `rentalFacts` ("Sleeps 2", "1 bedroom"…)
in place of the hotel fields.

Every offer and every room rate also carries its `bookingUrl` (the booking site's own link for
your dates; Google's click link on sponsored rates).

### How much does it cost?

| Event | Price |
|---|---|
| Property (search row) | **$0.002** ($2 per 1,000) |
| Property with every booking site's prices | **$0.004** ($4 per 1,000) |
| Start fee | none |

Up to 20 properties of every run are free (at most half of the run). A property whose price page
fails is delivered as a plain row and charged as one. Paid Apify plans get lower tier prices.

### Use cases

- **Hotel revenue managers** — your rates vs your competitive set, every day, on every site.
- **Rate parity** — is Booking.com cheaper than your own website?
- **Travel apps and agencies** — price and availability feeds for any city and dates.
- **Market research** — supply, star mix, ratings and price levels by city and season.
- **Lead generation** — hotels with website, phone and address, filtered by stars and rating.

### Use it from code (API)

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("om_kh/google-hotels-scraper").call(run_input={
    "locations": ["Barcelona"],
    "checkInDate": "2026-12-04",
    "checkOutDate": "2026-12-06",
    "currency": "EUR",
    "includePrices": True,
})
for h in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(h["name"], h["pricePerNight"], h.get("cheapestSource"))
```

```bash
curl -X POST "https://api.apify.com/v2/acts/om_kh~google-hotels-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"locations": ["Paris"], "maxHotelsPerLocation": 20}'
```

### Integrations and MCP

Schedule it daily to track prices over time and send them to Google Sheets, Slack or a database
with n8n, Make or Zapier. AI agents can call it through `https://mcp.apify.com` as
`om_kh/google-hotels-scraper`.

### Tips and limits

- Google shows a few hundred properties per search at most: split big cities by neighborhood
  ("hotels in Manhattan", "hotels in Brooklyn") for full coverage.
- A property with no price is not available for your dates on any site.
- `freeCancellation` on an offer is `true` (with `freeCancellationUntil`) or `false` when Google
  states it for that site, on the offer or on its room rates: about half of the offers in our
  check of 750 offers. `null` means Google does not say. The `freeCancellation` input filter is
  Google's own and does not depend on it.
- Google's rating filter has three steps (3.5, 4.0, 4.5); the robot then applies your exact value.
- Amenity names come from the page in your language; where Google sends only a code, the name is
  given in English, and `amenityCodes` always has every code.
- On vacation rentals `isOfficialSite` marks the listing partner that owns the listing.
- Prices change during the day; each row's `evidence.observed_at` says when it was read.

### FAQ

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

**Can I get prices for specific dates?** Yes — check-in, check-out, adults and children are
passed to Google exactly like on the website.

**Is it legal?** It reads public pages. Use the data in line with the laws and terms that apply
to you.

### Related Actors

- [Booking.com Reviews Scraper](https://apify.com/om_kh/booking-com-reviews-scraper) — what guests say about these hotels.
- [Tripadvisor Reviews Scraper](https://apify.com/om_kh/tripadvisor-reviews-scraper) — more reviews and ratings.
- [Google Maps Business Scraper](https://apify.com/om_kh/google-maps-business-scraper) — restaurants, shops and places around the hotels.

### Your feedback

Did this Actor save you time? A short review on the **Reviews** tab helps other people find it, and every review is read. Something missing or broken? Open an issue on the **Issues** tab: it is answered and fixed fast.

# Actor input Schema

## `locations` (type: `array`):

Cities, neighborhoods or full searches: Lisbon, Paris 11e, Miami Beach, 'boutique hotels near the Eiffel Tower' (up to 50).

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

YYYY-MM-DD. Default: 14 days from today.

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

YYYY-MM-DD. Default: one night after check-in (max 30 nights).

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

Guests per room. Prices depend on it.

## `children` (type: `integer`):

Children per room.

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

Three-letter code: USD, EUR, GBP, CAD, AUD, JPY, INR...

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

Two-letter country of the traveler (Google shows country-specific prices and booking sites).

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

What Google Hotels returns for each destination.

## `maxHotelsPerLocation` (type: `integer`):

In Google's order (20 per page), 1 to 600. Default 50.

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

Google's own sort, applied to the whole destination before the properties are read.

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

Keep only hotels with at least this star class.

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

Keep only properties rated at least this (out of 5).

## `minPricePerNight` (type: `number`):

In the chosen currency, before taxes.

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

In the chosen currency, before taxes.

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

Keep only properties that have every amenity picked here (Google's own Amenities filter).

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

Keep only properties with a free-cancellation rate for your dates.

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

Keep only hotels Google marks as eco-certified.

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

Keep only properties with a deal for your dates.

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

Two-letter language of descriptions, amenities and review themes: en, fr, es, de, it, pt, ja...

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

Open each property for every booking site's offer (Booking.com, Expedia, Agoda, hotel website...) with nightly and total price and booking link, plus address, phone, check-in times and ratings from other sites. $0.004 instead of $0.002 per property.

## `maxTotalChargeUsd` (type: `number`):

Optional hard cost cap for this run.

## `days` (type: `integer`):

Used when no check-out date is given.

## `entity` (type: `array`):

Google Travel hotel IDs (start with `Ch`) or exact hotel names: prices from every booking site are read for them.

## `device` (type: `string`):

Google Travel shows some prices only on mobile.

## Actor input object example

```json
{
  "locations": [
    "Lisbon"
  ],
  "adults": 2,
  "children": 0,
  "currency": "USD",
  "country": "us",
  "propertyType": "all",
  "maxHotelsPerLocation": 20,
  "sortBy": "relevance",
  "freeCancellation": false,
  "ecoCertified": false,
  "specialOffers": false,
  "language": "en",
  "includePrices": false,
  "device": "desktop"
}
```

# Actor output Schema

## `report` (type: `string`):

A visual summary of delivery, charges, and source issues.

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

Properties in a sortable table. No JSON knowledge required.

## `csv` (type: `string`):

Results ready for spreadsheets, CRMs, and analytics tools.

## `excel` (type: `string`):

Results as an Excel workbook for non-technical teams.

## `runSummary` (type: `string`):

Machine-readable delivery, billing, and source diagnostics.

# 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 = {
    "locations": [
        "Lisbon"
    ],
    "maxHotelsPerLocation": 20
};

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

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

```

## MCP server setup

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