# Google Hotels Scraper - Prices by Booking Site (`scrapewise/google-hotels`) Actor

Hotel prices from Google Hotels for any destination and dates: nightly and total price on every booking site (Booking.com, Expedia, Hotels.com, Agoda, official site) with links, rating, reviews, star class, amenities, coordinates. Any currency and country. HTTP only.

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

## Pricing

from $2.55 / 1,000 hotel delivereds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Google Hotels Scraper - Prices by Booking Site

Get hotel prices from Google Hotels for any destination and stay dates, with the nightly and total price on **every booking site Google lists** (Booking.com, Expedia, Hotels.com, Agoda, Trip.com, the hotel's official site...), plus rating, review count, star class, amenities, coordinates and links. Built for revenue managers, travel apps and market researchers who need rate data they can trust.

### What you can do with it

- **Rate shopping for hotels:** track your competitive set's price on each OTA and on their own website, for the exact dates you care about, every day.
- **Travel apps and agencies:** feed a comparison table with live prices, booking links and photos in any currency and language.
- **Market research:** map every property in a city with class, rating, reviews, price level and coordinates.

### Why this one

- **Price per booking site included**, not sold as an extra event: one row per hotel with the full `bookingPrices` list.
- **Your dates, guests and currency are really applied.** Every booking-site price is checked against the stay you asked for; if Google ever prices another stay, the offers are dropped and `detailsError` tells you why, instead of silently returning a wrong price.
- **A hotel that does not exist or is sold out does not fail your run** and is not charged. It comes back as a row with `errorCode` (or `available: false`) so your workflow keeps going.
- **Drop-in input:** accepts the field names of other Google Hotels scrapers (`locations`, `checkInDate`, `maxResults`, `searchQueries`, `hotelUrls`, `minGuestRating`, `minStars`, `q`, `gl`, `hl`, `check_in_date`...).
- HTTP only, no browser: fast and cheap. 60 New York hotels with all booking-site prices in about 90 seconds.

### Input example

```json
{
  "locations": ["New York", "Lisbon"],
  "hotels": ["The Savoy London"],
  "checkInDate": "2026-10-15",
  "checkOutDate": "2026-10-17",
  "adults": 2,
  "currency": "USD",
  "countryCode": "us",
  "languageCode": "en",
  "maxResults": 60,
  "includeDetails": true,
  "minRating": 4,
  "hotelClass": ["4", "5"]
}
```

| Field | What it does |
|---|---|
| `locations` | Cities, neighborhoods or landmarks. Each is searched as "hotels in ...". |
| `hotels` | Exact hotels: a name with the city, or a Google Hotels link. One row each. |
| `checkInDate`, `checkOutDate` | Stay dates (YYYY-MM-DD). Empty = 14 days from today, 1 night. |
| `adults` | Guests. Prices change with it. |
| `currency`, `countryCode`, `languageCode` | Any currency (USD, EUR, GBP, BRL, JPY...), the country the search is made from and the language of labels. |
| `maxResults` | Hotels per destination (up to 1000). `maxItems` caps the whole run. |
| `includeDetails` | Booking-site prices, full amenity list, check-in/out time and website (default on, same price). |
| `minPrice`, `maxPrice`, `minRating`, `hotelClass` | Optional filters. Filtered-out hotels are not charged. |

### Output example (real run, New York, Oct 15 to 17, 2 adults)

| Hotel | Stars | Rating | Lowest per night | Booking.com | Expedia | Hotels.com | Official site | Sites |
|---|---|---|---|---|---|---|---|---|
| The One Boutique Hotel | 3 | 3.3 (1,049) | $124 | $209 | $129 | $125 | | 27 |
| Hotel Executive Suites | 3 | 3.4 (1,363) | $104 | $118 | $131 | $131 | | 22 |
| PUBLIC Hotel | 4 | 4.1 (3,669) | $463 | | $693 | $693 | | 25 |
| Hilton Garden Inn New York/Staten Island | 3 | 4.2 (3,211) | $144 | $162 | $162 | $162 | $162 | 28 |
| 31 Street Broadway Hotel | 3 | 2.6 (438) | $106 | | $338 | $338 | | 14 |

One row, shortened:

```json
{
  "name": "31 Street Broadway Hotel",
  "type": "hotel",
  "hotelClass": "3-star hotel",
  "stars": 3,
  "rating": 2.6,
  "reviewCount": 438,
  "pricePerNight": 106,
  "pricePerNightText": "$106",
  "totalPrice": 211,
  "currency": "USD",
  "available": true,
  "lowestPriceSite": "Vio.com",
  "bookingSitesCount": 14,
  "bookingPrices": [
    { "site": "Vio.com", "pricePerNight": 106, "totalPrice": 211, "isOfficialSite": false, "url": "https://...", "googleRedirectUrl": "https://www.google.com/travel/lodging/clk?..." },
    { "site": "Etrip.net", "pricePerNight": 106, "totalPrice": 211, "isOfficialSite": false, "url": "https://...", "googleRedirectUrl": "https://..." }
  ],
  "popularAmenities": ["Wi-Fi (extra charge)", "Kitchen in rooms", "Pet-friendly (extra charge)"],
  "amenities": ["Wi-Fi (extra charge)", "Wi-Fi in public areas", "Front desk (24 hour)", "Baggage storage", "Concierge", "Self-service laundry", "Elevator"],
  "address": "38 W 31st St #110, New York, NY 10001",
  "latitude": 40.747211,
  "longitude": -73.9878074,
  "checkInTime": "4:00 PM",
  "checkOutTime": "10:00 AM",
  "website": "https://31streetbroadwayhotel.com/",
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChoIxPKIzoX4zIfLARoNL2cvMTFwd2g1N2c1NRAB?...",
  "searchQuery": "New York",
  "position": 1,
  "checkInDate": "2026-10-15",
  "checkOutDate": "2026-10-17",
  "adults": 2,
  "errorCode": null,
  "scrapedAt": "2026-09-13T01:43:50Z"
}
```

Also in each row: `ratingDistribution` (count per star), `amenitiesByCategory`, `description`, `descriptionLong`, `phone`, `imageUrl`, `placeId`, `propertyToken`, `googleMapsUrl`, `totalPriceText`. The dataset has a second view, **Price per booking site**, with one line per hotel and site, ready for a spreadsheet.

#### Rows that are not charged

| `errorCode` / flag | Meaning |
|---|---|
| `available: false` | The hotel exists but Google has no price for these dates and guests (often sold out). |
| `HOTEL_NOT_FOUND` | No Google Hotels property matches the name. Add the city or paste the link. |
| `NO_RESULTS` | Google Hotels has no hotels for this destination. |
| `BLOCKED` | Google refused the request on every retry. Run again. |

### Pricing

**US$ 3 per 1,000 hotels, with booking-site prices included. No monthly fee, no start fee.** You pay only for hotels delivered with a price. Destinations without results, hotels not found, sold-out hotels and blocked requests are free.

### Use it from the API, a schedule or your tools

- **API:** `POST https://api.apify.com/v2/acts/scrapewise~google-hotels/run-sync-get-dataset-items?token=YOUR_TOKEN` with the input JSON as the body returns the hotels directly.
- **Schedule:** in Apify Console create a Schedule (for example every morning) with your competitive set in `hotels` to build a daily rate history.
- **Integrations:** n8n, Make, Zapier, Google Sheets and webhooks through the Apify integrations tab.

### Limitations

- Prices are what Google Hotels shows for the chosen country (`countryCode`); booking sites and taxes shown vary by country.
- Google lists about 20 properties per page and some searches mix vacation rentals with hotels (see `type`).
- With `includeDetails` on, each hotel needs one extra page, so large runs take about 1.3 s per hotel.
- Something broke or a field is missing? Open an issue on the Issues tab; we answer within 24 hours.

This Actor collects only publicly available data shown on Google Hotels and does not log in or bypass any paywall.

### Em português

Preços de hotéis do Google Hotels para qualquer destino e datas, com o valor da diária e do total em **cada site de reserva** (Booking.com, Expedia, Hotels.com, Agoda, site oficial), nota, número de avaliações, estrelas, comodidades e coordenadas.

- **Revenue management:** acompanhe o preço dos concorrentes em cada OTA e no site deles, nas datas que importam.
- **Agências e apps de viagem:** alimente comparadores com preço atual e link de reserva em qualquer moeda.
- **Pesquisa de mercado:** todos os hotéis de uma cidade com classe, nota, avaliações, faixa de preço e localização.

**Preço: US$ 3 por 1.000 hotéis, com os preços por site incluídos, sem mensalidade.** Hotel sem preço para as datas, não encontrado ou bloqueado não é cobrado.

# Actor input Schema

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

Cities, neighborhoods or landmarks, one per line (e.g. New York, Lisbon, Shibuya Tokyo). Each one is searched as 'hotels in <destination>' on Google Hotels. Same field name as other Google Hotels scrapers; 'searchQueries', 'q' and 'destination' are also accepted.

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

Exact hotels to price, one per line: a hotel name with its city (e.g. 'Pestana Palace Lisbon') or a Google Hotels link (google.com/travel/hotels/entity/...). One row per hotel. 'hotelUrls' is also accepted.

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

YYYY-MM-DD. Prices are for this stay. Leave empty to use 14 days from the run date.

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

YYYY-MM-DD, after check-in. Leave empty for a 1-night stay.

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

Number of adult guests. Prices change with the number of guests.

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

Three-letter currency code for every price (USD, EUR, GBP, BRL, JPY...).

## `countryCode` (type: `string`):

Two-letter country the search is made from (us, gb, de, br...). Changes which booking sites Google shows.

## `languageCode` (type: `string`):

Language of hotel descriptions and labels (en, de, pt, es, fr...).

## `maxResults` (type: `integer`):

Stop after this many hotels for each destination. Google shows about 18 hotels per page; the scraper pages until this number or the end of the list.

## `includeDetails` (type: `boolean`):

Adds 'bookingPrices' (nightly and total price on each booking site Google lists: Booking.com, Expedia, Hotels.com, Agoda, official site... with links), the full amenity list, check-in/out times and the hotel website. One extra request per hotel, same price. 'includeBookingPrices' and 'includePrices' are also accepted.

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

Only hotels whose lowest nightly price is at or above this (in the chosen currency). Hotels without a price for your dates are dropped when a price filter is set.

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

Only hotels whose lowest nightly price is at or below this.

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

Only hotels with a Google guest rating at or above this (0 to 5). 'minGuestRating' is also accepted.

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

Only hotels with these star classes. Empty = any class, including unrated properties.

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

Hard cap across all destinations and hotels. Useful to limit spend.

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

Datacenter proxy is the default and works for most runs. Blocked requests are retried on new IPs and, if needed, on residential IPs automatically at no extra price.

## Actor input object example

```json
{
  "locations": [
    "New York"
  ],
  "adults": 2,
  "currency": "USD",
  "countryCode": "us",
  "languageCode": "en",
  "maxResults": 20,
  "includeDetails": true,
  "hotelClass": [],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `resultsCsv` (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 = {
    "locations": [
        "New York"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/google-hotels").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": ["New York"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/google-hotels").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": [
    "New York"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/google-hotels --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/google-hotels"
        }
    }
}
```

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/wnGd6aQYyXkhws5M7/builds/XagezaOd3yPQA2raA/openapi.json
