# Google Hotels Prices Scraper (`wulfcare/google-hotels-scraper`) Actor

Hotel prices from Google Hotels: every booking site's price (Booking.com, Expedia, Agoda, the hotel's own site...) for any hotel and dates, per night and total, with and without taxes, plus hotel searches like "hotels in Paris" with ratings, stars, address and lowest price. $0.80 per 1,000 prices.

- **URL**: https://apify.com/wulfcare/google-hotels-scraper.md
- **Developed by:** [Wulfcare Data](https://apify.com/wulfcare) (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 $0.80 / 1,000 prices

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Prices Scraper

Get **hotel prices from Google Hotels**: what **every booking site** (Booking.com, Expedia, Hotels.com, Agoda, Trip.com, Priceline, the hotel's own website...) charges for **any hotel, any dates and any number of guests**. You get per-night and total prices, before and after taxes, with a direct booking link and the room types and free-cancellation terms where Google shows them.

- **Hotels**: give a hotel's **name** ("Hilton London Paddington"), its **Google Hotels link**, its **entity ID** or its **Google Maps link**. You get one row per booking site and date.
- **Price calendars**: set **Check-in dates** to 30, 90 or 365 to get the prices for each check-in date in a row, in one run.
- **Searches**: "hotels in Paris", "beach hotels in Bali"... give **one row per hotel** with stars, rating, review count, address, phone, website, coordinates, photos and the **lowest price**. Every booking site's price for each hotel is optional.

**$0.80 per 1,000 prices** and **no start fee**.

### What people use it for

- **Rate shopping and parity checks** for hotels and revenue managers: what each booking site charges for your rooms (and your competitors') day by day, and whether your own website is the cheapest.
- **Price calendars and alerts**: a daily schedule over the next 90 check-in dates shows when prices move.
- **Travel apps and price comparison sites**: live prices with booking links for the hotels your users look at.
- **Market research**: hotel supply, stars, ratings and price levels for a city or an area.
- **Datasets for analytics and AI**: clean, structured hotel and price data in JSON, CSV or Excel.

### How to use it

1. Add **hotels** (names, links or IDs) and/or **searches**.
2. Pick the **check-in date** (default: tomorrow), how many **check-in dates** in a row, the **nights** per stay and the **adults**.
3. Run it, then download JSON, CSV or Excel, or use the API.

### What you get

#### One row per booking site and date (hotels)

```json
{
  "hotelName": "Hôtel Atrium by HappyCulture",
  "provider": "Travelocity.com",
  "isOfficial": false,
  "price": 105,
  "price2": 128,
  "adults": 2,
  "currency": "USD",
  "checkInDate": "2026-11-10",
  "checkOutDate": "2026-11-11",
  "nights": 1,
  "pricePerNight": 105.13,
  "pricePerNightWithTaxes": 128.18,
  "totalPrice": 105.13,
  "totalPriceWithTaxes": 128.18,
  "rank": 19,
  "isCheapest": false,
  "bookingUrl": "https://www.travelocity.com/Hotel-Search?selected=44896&...",
  "otaUrl": "https://www.google.com/travel/lodging/clk?pc=...",
  "isAd": false,
  "rooms": [
    { "room": "Classic Double or Twin Room", "pricePerNight": 105.13, "pricePerNightWithTaxes": 128.18,
      "totalPrice": 105.13, "totalPriceWithTaxes": 128.18, "freeCancellation": false, "freeCancellationUntil": null }
  ],
  "priceText": "$105",
  "googleCurrency": null,
  "exchangeRate": null,
  "entityId": "ChcIhpronI2bp7cBGgsvZy8xdmc2dDB6NRAB",
  "hotelUrl": "https://www.google.com/travel/hotels/entity/ChcIhpronI2bp7cBGgsvZy8xdmc2dDB6NRAB/prices?hl=en&gl=us&ts=...",
  "input": "ChcIhpronI2bp7cBGgsvZy8xdmc2dDB6NRAB",
  "scrapedAt": "2026-10-01T13:53:51+00:00",
  "error": null
}
```

- `price` and `price2` are the per-night price before and after taxes and fees, rounded. `pricePerNight`, `pricePerNightWithTaxes`, `totalPrice` and `totalPriceWithTaxes` are exact. A total is for the whole stay.
- `rank` 1 is the cheapest site for that hotel and date, and `isCheapest` marks every site at the lowest price.
- `isOfficial` is the hotel's own website. `isAd` is a sponsored listing.
- `bookingUrl` goes straight to the booking site's page for the hotel and dates. `otaUrl` is Google's link to it.
- `rooms` lists room types with their prices and free-cancellation terms when Google shows them (mostly for the hotel's own site and sponsored listings).
- When a date has no prices (sold out, or no site lists the hotel), you get one row with `error` set and no charge.

#### One row per hotel (searches, or Output: "One row per hotel and date")

```json
{
  "query": "hotels in London",
  "rank": 1,
  "name": "Hilton London Paddington",
  "hotelClass": 4,
  "hotelClassText": "4-star hotel",
  "rating": 4,
  "reviewCount": 4649,
  "checkInDate": "2026-11-10",
  "checkOutDate": "2026-11-12",
  "nights": 2,
  "adults": 2,
  "currency": "USD",
  "pricePerNight": 309.19,
  "pricePerNightWithTaxes": 368.62,
  "totalPrice": 618.38,
  "totalPriceWithTaxes": 737.24,
  "priceText": "$309",
  "dealText": null,
  "cheapestProvider": "KAYAK.com",
  "prices": [{ "provider": "KAYAK.com", "isOfficial": false, "pricePerNight": 309.19, "...": "..." }],
  "address": "146 Praed St, London W2 1EE, United Kingdom",
  "phone": "+44 20 7850 0500",
  "website": "https://www.hilton.com/en/hotels/lonpdhi-hilton-london-paddington/",
  "latitude": 51.5157041,
  "longitude": -0.1758593,
  "countryCode": "GB",
  "checkInTime": "4:00 PM",
  "checkOutTime": "12:00 PM",
  "description": "Art deco-style rooms in a 19th-century hotel offering a restaurant, a bar & a fitness centre.",
  "descriptionLong": "Set in a 19th-century building connected to Paddington Station, ...",
  "ratingBreakdown": { "1": 303, "2": 231, "3": 608, "4": 1343, "5": 2164 },
  "reviewAspects": [{ "aspect": "Location", "mentions": 756, "positive": 632, "negative": 62 }],
  "otherRatings": [{ "source": "Tripadvisor", "rating": 3.8, "outOf": 5, "reviews": 5939 }],
  "nearbyPlaces": [{ "name": "Hyde Park", "travelTimes": { "walking": "11 min", "transit": "12 min" } }],
  "thumbnailUrl": "https://lh3.googleusercontent.com/...",
  "photos": ["https://lh3.googleusercontent.com/..."],
  "googleMapsUrl": "https://www.google.com/maps?cid=574977390524767931",
  "entityId": "ChUIu73w4L7crv0HGgkvbS8wZDI1cl8QAQ",
  "hotelUrl": "https://www.google.com/travel/hotels/entity/ChUIu73w4L7crv0HGgkvbS8wZDI1cl8QAQ/prices?...",
  "error": null
}
```

- `pricePerNight` ... `totalPriceWithTaxes` are the lowest price Google shows, and `dealText` is its note when the price is low for the hotel ("36% less than usual").
- `prices` has every booking site's price (the same fields as the rows above). For searches it's filled when **Every booking site's price for searched hotels** is on.
- A search's hotels come in Google's order (`rank`). Some fields (address, phone, long description) are only in a hotel's full record: they're always there for hotels you list, and for searched hotels with every booking site's price on.

### Pricing

Pay per result, no start fee:

| | Price |
|---|---|
| **A price** (one booking site's price for one hotel and date) | **$0.80 per 1,000** |
| **A hotel from a search** (with its lowest price) | **$1.50 per 1,000** |
| Rows without prices, and errors | free |

Examples: one hotel's prices on about 20 booking sites for the next 30 check-in dates comes to about 600 prices, or **$0.48**. 100 hotels from a search cost **$0.15**. Apify's platform usage is included.

Set a **maximum cost per run** in the run options to cap the spend: the run stops when it gets there.

### Input examples

**Every booking site's price for one hotel, for each of the next 30 check-in dates**

```json
{ "hotels": ["Hilton London Paddington"], "days": 30 }
```

**Several hotels, 3-night stays from 20 December, 1 adult, in euros**

```json
{ "hotels": ["https://www.google.com/travel/hotels/entity/ChcIhpronI2bp7cBGgsvZy8xdmc2dDB6NRAB", "The Plaza New York", "https://www.google.com/maps?cid=574977390524767931"],
  "checkInDate": "2026-12-20", "nights": 3, "adults": 1, "currency": "EUR" }
```

**The top 100 hotels for a search, with their lowest prices**

```json
{ "searchQueries": ["hotels in Paris"], "maxHotels": 100, "checkInDate": "2026-11-10" }
```

**The top 10 hotels for a search, with every booking site's price**

```json
{ "searchQueries": ["hotels near Shibuya Tokyo"], "maxHotels": 10, "includeAllPrices": true }
```

**Same input as other Google Hotels price scrapers** (`entity`, `checkInDate`, `days`, `adults`, `currency`, `device`, `proxyConfig`)

```json
{ "entity": "ChcIhpronI2bp7cBGgsvZy8xdmc2dDB6NRAB", "checkInDate": "2026-11-10", "days": 7, "adults": 2, "currency": "USD", "device": "desktop" }
```

### Good to know

- **Currency**: Google prices hotels in the currency of the country the request comes from: US dollars with the default Apify Proxy. When you ask for another currency, prices are converted at the day's ECB reference rate, and the rows show `googleCurrency` and `exchangeRate`. (`priceText` stays as Google wrote it.) For prices exactly as shown in a country, with its currency and tax rules (in Europe prices include taxes), use a **residential proxy** from that country.
- **Dates**: Google has prices for about a year ahead. A stay can be 1 to 30 nights. When Google has no prices for a date it shows other dates; the Actor spots that and returns a free row with an error rather than wrong prices.
- **Guests**: prices and the booking sites offering them change with the number of adults. Children aren't supported.
- **Hotel names**: the best results come from the name with the city ("ibis Paris Gare du Nord"). When the name isn't exact, the Actor takes the closest hotel Google lists for it and says so in the log. If nothing matches, the row has an error (and no charge). For bulk work, Google Hotels links, entity IDs and Google Maps links are exact.
- **Speed**: about **70 prices a second** (7,400 prices for 10 hotels × 30 dates in under 2 minutes). Up to 5 dates of one hotel come in one request to Google.
- **Proxy**: Apify Proxy (datacenter) is on by default and works well.
- **Public data only**: everything comes from Google Hotels as a logged-out visitor sees it. No Google account, no login, no personal data.

### Other Actors by Wulfcare Data

- [Google Jobs Scraper](https://apify.com/wulfcare/google-jobs-scraper): job listings from Google's job search
- [Google Trends Scraper](https://apify.com/wulfcare/google-trends-scraper): interest over time, rising queries and Trending Now
- [ChatGPT Search Scraper & AI Brand Visibility Tracker](https://apify.com/wulfcare/chatgpt-search-scraper): what ChatGPT answers and cites for any prompt
- [Free YouTube Scraper](https://apify.com/wulfcare/youtube-scraper) and [YouTube Transcript Scraper](https://apify.com/wulfcare/youtube-transcript-scraper): videos, channels, searches and transcripts
- [Google Play Scraper](https://apify.com/wulfcare/google-play-scraper) and [App Store Scraper](https://apify.com/wulfcare/app-store-scraper): reviews, app details and charts
- [AI Training Jobs Scraper](https://apify.com/wulfcare/ai-training-jobs-scraper): AI training and data annotation jobs

# Actor input Schema

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

Hotels to get every booking site's prices for. Each one can be a hotel's name (best with the city: "Hilton London Paddington"), a Google Hotels link (https://www.google.com/travel/hotels/entity/...) or its entity ID (the "Ch..." code in that link), or the hotel's Google Maps link or CID.

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

Google Hotels searches, e.g. "hotels in Paris" or "beach hotels in Bali". Each gives one row per hotel (name, stars, rating, reviews, address, lowest price and more), up to "Maximum hotels per search".

## `maxHotels` (type: `integer`):

Hotels to get from each search, in Google's order.

## `includeAllPrices` (type: `boolean`):

Searches give each hotel's lowest price. Turn this on to also get every booking site's price for each hotel found (in its "prices" list, charged per price).

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

First check-in date (YYYY-MM-DD, or "tomorrow", "+7 days"). Empty = tomorrow. Google has prices for about a year ahead.

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

How many check-in dates in a row, from the first: 30 gives a price calendar for the next 30 check-ins.

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

Length of each stay.

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

Guests. Prices and the booking sites offering them change with the number of guests.

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

Three-letter code (USD, EUR, GBP, AUD...). Google prices in the currency of the country the request comes from (USD with the default US proxy); other currencies are converted at the day's ECB reference rate. For prices exactly as shown in a country (local currency and taxes), use a residential proxy from that country.

## `outputFormat` (type: `string`):

How rows for the hotels above come out. Searches always give one row per hotel.

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

Get the prices Google shows on desktop or on mobile (some sites have mobile-only rates).

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

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

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

Requests to Google at once.

## `proxyConfig` (type: `object`):

Apify Proxy (datacenter) works well. Pick a residential proxy and a country to get prices in that country's currency and with its taxes.

## `entity` (type: `string`):

A single hotel (entity ID, link or name): same as one line in Hotels.

## Actor input object example

```json
{
  "hotels": [
    "Hilton London Paddington"
  ],
  "maxHotels": 20,
  "includeAllPrices": false,
  "days": 1,
  "nights": 1,
  "adults": 2,
  "currency": "USD",
  "outputFormat": "providers",
  "device": "desktop",
  "language": "en",
  "maxConcurrency": 6,
  "proxyConfig": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `hotels` (type: `string`):

No description

## `all` (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 = {
    "hotels": [
        "Hilton London Paddington"
    ],
    "proxyConfig": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("wulfcare/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 = {
    "hotels": ["Hilton London Paddington"],
    "proxyConfig": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("wulfcare/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 '{
  "hotels": [
    "Hilton London Paddington"
  ],
  "proxyConfig": {
    "useApifyProxy": true
  }
}' |
apify call wulfcare/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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