# Google Hotels Scraper: Hotel Prices, OTA Rates & Calendar (`vncntlabs/google-hotels-scraper`) Actor

Google Hotels scraper for hotel prices in any city and dates: nightly and total price, deals, stars, rating and coordinates. Get every booking site's price (official site, Booking.com, Expedia and more) with rooms, a rate-parity check and a nightly price calendar up to 1 year ahead.

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

## Pricing

from $2.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.

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, OTA rates, rate parity and price calendar

**Google Hotels scraper for hotel prices.** Get prices from **Google Hotels** for any city, landmark or hotel, for any dates and guests, including every booking site's rate (OTA rates), a rate-parity check and a nightly price calendar. Pick what you need:

- **Hotel search.** Up to 150 hotels per destination and date, with nightly and total price, Google's deal label ("28% less than usual"), star class, guest rating, review count, coordinates and photo.
- **Every booking site's price.** For the top N hotels or for hotels you name, you also get each site's price: the official hotel site, Booking.com, Expedia, Hotels.com, Agoda, Trip.com and more. Each site comes with room offers, free-cancellation dates and the booking link. You also get the address, phone, review breakdown (by topic and by star), reviews from other sites and location scores.
- **Rate-parity check.** The official site price is compared with the cheapest online travel agency (OTA), with the gap in money and %. `officialSiteUndercut` flags hotels where a booking site sells below the hotel's own site.
- **Nightly price calendar.** The lowest price for every check-in date over the next month, 3 months, 6 months or full year. It includes the cheapest and most expensive dates, and the average and median price.
- **Market snapshot.** Each search also gets one summary row with the min, median, average and max nightly price for that destination and date.

Data comes from DataForSEO's licensed Google Hotels API, so there are no proxies, captchas or blocked runs. Most runs finish in under a minute.

**Who uses it**

- **Hotel owners and revenue managers:** check your rate against your comp set every day, and catch OTAs undercutting your direct rate.
- **Travel agencies and tour operators:** quote and compare hotels for any dates and group size, in bulk.
- **Travel startups and analysts:** feed price data into apps, dashboards, AI agents and price-drop alerts. You can also study how prices change with season and lead time.

### Input examples

Search a destination (top 20 hotels, 30 days from today, 2 nights, 2 adults):

```json
{ "destinations": ["Austin, Texas"], "checkInDates": ["+30"], "nights": 2 }
```

Rate check for your hotel and your competitors on several dates, with a one-year price calendar:

```json
{
  "hotels": ["Hilton Austin, Austin, TX", "JW Marriott Austin, Austin, TX", "Fairmont Austin, Austin, TX"],
  "checkInDates": ["+7", "+14", "+30"],
  "priceCalendar": "year"
}
```

Luxury hotels near a landmark, cheapest first, with every booking site's price for the top 5:

```json
{
  "destinations": ["Times Square, New York, NY"],
  "hotelClass": ["4", "5"], "minRating": "4.5", "sortBy": "lowest_price",
  "detailsForTopHotels": 5, "checkInDates": ["2026-12-18"], "nights": 3
}
```

**Destinations:**

- A city, region or country, e.g. `Paris`, `Austin, TX`, `Bali`, `Japan`.
- A landmark or neighborhood followed by its city, e.g. `Eiffel Tower, Paris`.
- A place we don't recognize is searched as text inside the country you set.

**Hotels:**

- `Hotel name, City`.
- A Google Hotels URL.
- The `hotelId` from an earlier run. IDs and URLs are cheaper because they skip the name lookup.

**Dates:** `2026-12-18`, or `+30` for 30 days from today. Relative dates keep scheduled runs rolling forward.

### Output example (hotel with booking-site prices, shortened)

```json
{
  "type": "hotel", "source": "search", "destination": "Austin, Texas", "checkIn": "2026-11-20", "checkOut": "2026-11-22",
  "rank": 6, "hotelId": "ChYI6YrJipS6urUgGgovbS8wYm1nbnBmEAE", "name": "Hilton Austin", "hotelClass": 4,
  "rating": 4.3, "reviewsCount": 6041, "pricePerNight": 184, "totalPrice": 368, "currency": "USD",
  "dealText": "16% less than usual", "dealPercent": 16, "available": true,
  "address": "500 E 4th St, Austin, TX 78701", "phone": "+15124828000", "neighborhood": "Downtown Austin",
  "locationScore": 4.7, "locationScores": {"thingsToDo": 4.9, "restaurants": 4.9, "transit": 5, "airportAccess": 4.2},
  "bookingSitesCount": 34, "lowestPrice": 184, "lowestPriceSite": "Traveluro", "medianPrice": 229,
  "officialSitePrice": 229, "lowestOtaPrice": 184, "lowestOtaSite": "Traveluro",
  "parityGap": -45, "parityGapPct": -19.7, "officialSiteUndercut": true,
  "bookingSites": [
    {"site": "Hilton Austin", "pricePerNight": 229, "totalPrice": 458, "isOfficialSite": true, "isAd": false,
     "freeCancellationUntil": null, "bookingUrl": "https://...", "roomOffers": []},
    {"site": "Expedia.com", "pricePerNight": 229, "isOfficialSite": false, "isAd": true,
     "roomOffers": [{"room": "Room, 1 King Bed", "pricePerNight": 257, "maxGuests": 2,
                     "freeCancellationUntil": "2026-11-14"}]}
  ],
  "ratingDistribution": {"5": 61, "4": 26, "3": 6, "2": 3, "1": 4},
  "reviewTopics": [{"topic": "Wellness", "positiveScore": 0.43, "positive": 50, "negative": 14, "total": 70}],
  "calendarPricedDays": 278, "calendarMinPrice": 111, "calendarMinDate": "2027-01-03",
  "calendarMaxPrice": 1006, "calendarMaxDate": "2026-12-09", "calendarMedianPrice": 205,
  "priceCalendar": [{"checkIn": "2026-11-20", "checkOut": "2026-11-21", "price": 184, "currency": "USD"}],
  "googleHotelsUrl": "https://www.google.com/travel/hotels/entity/ChYI6YrJipS6urUgGgovbS8wYm1nbnBmEAE",
  "chargedEvents": ["hotel", "hotel-details", "price-calendar"], "scrapedAt": "2026-10-16T21:20:11Z"
}
```

Dataset views:

- **Hotels:** one row per hotel.
- **Rate parity:** official site vs. the cheapest booking site.
- **Searches:** price stats per destination and date.
- **Price calendar rows:** one row per date, when you turn on *one row per calendar date*.

Export as JSON, CSV or Excel, or connect with the API, Zapier, Make or n8n. To track prices over time, schedule the Actor (for example daily) with relative dates like `+7` and `+30`.

### Pricing (pay per event)

| Event | When it is charged |
|---|---|
| Actor start | once per run |
| `hotel` | one hotel with a price delivered from a search (a name lookup counts as one hotel too) |
| `hotel-details` | one hotel × check-in date with every booking site's price, rooms, parity check, address, phone, reviews and location scores |
| `price-calendar` | one nightly price calendar for one hotel (any range up to 1 year) |

You are not charged for:

- searches with no hotels;
- hotels listed without a price for your dates (sold out or not bookable);
- hotels that can't be found by name;
- hotel details when Google shows no booking-site rates for those dates (sold out or not bookable). You still get the address, phone and reviews, with `detailsStatus: "no_rates"`;
- failed requests;
- skipped inputs;
- search summary rows and calendar rows;
- anything beyond your run's maximum charge. The run stops cleanly and lists what it didn't process.

Hotels with no rate for your dates (sold out or not bookable) are still delivered, free, with `available: false`.

**Apify free plan:** each run gets 1 search with up to 20 hotels, plus 3 hotel-details lookups (1 with a price calendar). A paid Apify plan raises this to 300 searches, 150 hotels per search and 1,000 detail lookups per run.

### FAQ

**Are prices per night?** Yes. `pricePerNight` is the nightly rate Google Hotels showed for your dates, guests and currency. `totalPrice` is that rate times the number of nights. Depending on the market, Google may include or exclude some taxes and fees, so compare like with like.

**Why do prices differ from what I see on Google?** Hotel prices change quickly, and they depend on where you browse from, on your currency and on whether you are signed in. Every row has `scrapedAt` and a `googleHotelsUrl` you can open to check.

**What is `isAd`?** Some booking-site prices are paid placements on Google. They are real offers, but their booking links go through a Google redirect.

**Can I get prices for a specific room type?** `roomOffers` lists the rooms each site shows (up to 20 per site), with price, maximum guests and free-cancellation date.

**Is this the official Google Hotels API?** No. Google has no public Hotels API. This Actor uses DataForSEO's licensed API and is not affiliated with or endorsed by Google.

# Actor input Schema

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

City, region or country, one per line (up to 100): <code>Paris</code>, <code>Austin, TX</code>, <code>Bali</code>. Put a landmark or neighborhood in front of the city to search around it: <code>Times Square, New York, NY</code>, <code>Eiffel Tower, Paris</code>. Every destination is searched for every check-in date.

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

Optional. Hotels to price directly, one per line (up to 500): <code>Hotel name, City</code> (e.g. <code>Hilton Austin, Austin, TX</code>), a Google Hotels URL, or a hotel ID from a previous run (<code>hotelId</code>). Returns every booking site's price, rooms and the rate-parity check for each check-in date. Tip: IDs and URLs skip the name lookup (cheaper).

## `checkInDates` (type: `array`):

One per line (up to 30): a date <code>2026-12-18</code> or days from today <code>+30</code> (relative dates keep scheduled runs rolling forward). Rates are available up to about 330 days ahead.

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

Length of stay. Check-out = check-in + nights. totalPrice = nightly price x nights.

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

Guests per room (adults + children up to 6).

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

Optional, e.g. <code>\[8, 12]</code> for two children aged 8 and 12.

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

3-letter code, e.g. USD, EUR, GBP, INR, JPY.

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

Hotels per destination and date (Google's order). Up to 150.

## `detailsForTopHotels` (type: `integer`):

For the first N hotels of each search, also fetch every booking site's price (official site, Booking.com, Expedia, Agoda and more) with room offers and free-cancellation dates, the rate-parity check, address, phone, review breakdown and location scores. Charged per hotel (hotel-details).

## `priceCalendar` (type: `string`):

For hotels with booking-site prices (top N or specific hotels): the lowest nightly price for every check-in date in the range, with cheapest/most expensive dates. Charged once per hotel (price-calendar).

## `calendarRows` (type: `boolean`):

Also output each calendar date as its own row (easy charts and spreadsheets; free).

## `includeRoomOffers` (type: `boolean`):

Room types and prices per booking site (up to 20 each).

## `includeImages` (type: `boolean`):

All overview photo URLs (otherwise only the main photo).

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

Only these star ratings.

## `minRating` (type: `string`):

Google guest rating.

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

In the selected currency.

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

In the selected currency.

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

Only hotels offering free cancellation.

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

Hotels must have all selected amenities.

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

Google Hotels sort order.

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

Search vacation rentals (houses, apartments).

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

Google interface language code (en, de, fr, es, ja...).

## `defaultCountry` (type: `string`):

A destination we can't match to a known city/region (e.g. <code>Maui</code>) is searched as text within this country. Tip: add the state or country after a comma instead (<code>Maui, Hawaii</code>).

## Actor input object example

```json
{
  "destinations": [
    "Austin, Texas",
    "Times Square, New York, NY"
  ],
  "checkInDates": [
    "+30"
  ],
  "nights": 2,
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "maxHotelsPerSearch": 20,
  "detailsForTopHotels": 0,
  "priceCalendar": "off",
  "calendarRows": false,
  "includeRoomOffers": true,
  "includeImages": false,
  "minRating": "any",
  "freeCancellation": false,
  "sortBy": "relevance",
  "vacationRentals": false,
  "language": "en",
  "defaultCountry": "United States"
}
```

# Actor output Schema

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

No description

## `parity` (type: `string`):

No description

## `searches` (type: `string`):

No description

## `all` (type: `string`):

No description

## `summary` (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": [
        "Austin, Texas",
        "Times Square, New York, NY"
    ],
    "checkInDates": [
        "+30"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vncntlabs/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": [
        "Austin, Texas",
        "Times Square, New York, NY",
    ],
    "checkInDates": ["+30"],
}

# Run the Actor and wait for it to finish
run = client.actor("vncntlabs/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": [
    "Austin, Texas",
    "Times Square, New York, NY"
  ],
  "checkInDates": [
    "+30"
  ]
}' |
apify call vncntlabs/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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