# Google Hotels Scraper: Hotel Prices by Date (`steady_scrape/google-hotels-scraper`) Actor

Scrape Google Hotels for any city and dates: nightly prices, deals, stars, ratings, reviews, GPS, photos. Auto-retries on fresh IPs. $3 per 1,000 hotels.

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

$3.00 / 1,000 hotel results

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 by city and dates

Scrape **Google Hotels** for any city, neighborhood or region and your travel dates. For every hotel you get the nightly price, deal badge, star class, Google rating, review count and star breakdown, what reviews say (cleanliness, location, service...), coordinates, website, check-in times, photos and Google hotel IDs. Export to Excel, CSV or JSON.

**Price: $3 per 1,000 hotels** ($0.003 per hotel). No start fee. You pay only for hotels delivered.

### What does Google Hotels Scraper do?

It runs the same search you would run on google.com/travel/hotels (for example "hotels in Lisbon, Dec 5 to Dec 8") and turns every hotel in the results into a clean row, page after page. Each location runs on a fresh IP and is retried automatically, so runs finish with data instead of failing.

### Use cases

- **Hotel price monitoring:** track rates for your city and dates, daily or weekly, with Apify Schedules.
- **Revenue management for hotels:** compare your property to competitors around you on price, rating and reviews.
- **Travel apps and comparison sites:** fill hotel lists with prices, ratings, photos and coordinates.
- **Market research and real estate:** map hotel supply, price levels and quality across destinations.
- **AI travel agents:** call it via the Apify API or MCP server and get compact JSON per hotel.

### How to use it

1. Click **Try for free** (Apify's free plan includes monthly credit, enough for over a thousand hotels).
2. Enter one or more **locations**, optional **check-in / check-out dates**, and **max hotels per location**.
3. Click **Start**. 20 hotels take under a minute; 100 hotels about 2 minutes.
4. Export to Excel, CSV or JSON, or read the dataset via the API.

### Input example

```json
{
  "locations": ["Lisbon", "Manhattan, New York", "Marrakech"],
  "checkIn": "2026-12-05",
  "checkOut": "2026-12-08",
  "maxItemsPerLocation": 60,
  "currency": "EUR",
  "language": "en",
  "country": "us"
}
```

| Option | Example | Notes |
|---|---|---|
| Locations | `["Lisbon", "Manhattan, New York"]` | One search per location |
| Check-in / Check-out | `2026-12-05` / `2026-12-08` | Optional. Leave empty for Google's default dates. Only check-in = 1-night stay. |
| Max hotels per location | `40` | About 20 hotels per results page |
| Currency | `USD`, `EUR`, `GBP` | Any ISO code |
| Language / Google country | `en` / `us` | Market Google shows prices for |

### Output example

Real item from a run (shortened):

```json
{
  "name": "Chalet d'Ávila Guest House",
  "hotelClass": "3-star hotel",
  "stars": 3,
  "rating": 4.7,
  "reviewsCount": 974,
  "ratingBreakdown": {"5star": 744, "4star": 176, "3star": 33, "2star": 8, "1star": 13},
  "reviewTopics": {
    "Cleanliness": {"mentions": 96, "positive": 89, "negative": 3},
    "Location": {"mentions": 87, "positive": 78, "negative": 1}
  },
  "pricePerNight": 62.84,
  "priceText": "$63",
  "currency": "USD",
  "deal": null,
  "checkIn": "2026-12-05",
  "checkOut": "2026-12-08",
  "latitude": 38.735005,
  "longitude": -9.143025,
  "countryCode": "PT",
  "website": "http://www.chaletdavila.com/",
  "checkInTime": "2:00 PM",
  "checkOutTime": "12:00 PM",
  "description": "Stylish rooms with shared bathrooms in a chic guesthouse offering breakfast & a lounge.",
  "thumbnail": "https://lh3.googleusercontent.com/...",
  "images": ["https://lh3.googleusercontent.com/..."],
  "googleHotelId": "...",
  "url": "https://www.google.com/travel/hotels/entity/...",
  "searchLocation": "Lisbon",
  "scrapedAt": "2026-10-10T16:01:12+00:00"
}
```

| Field | Description |
|---|---|
| `name`, `hotelClass`, `stars` | Hotel name and star class |
| `pricePerNight`, `priceText`, `currency` | Lowest nightly price shown by Google, in your currency |
| `deal` | Deal badge, e.g. `27% less than usual` |
| `checkIn`, `checkOut` | Dates the price applies to |
| `rating`, `reviewsCount`, `ratingBreakdown` | Google rating, review count and 1-5 star distribution |
| `reviewTopics` | What reviews talk about, with positive/negative counts |
| `latitude`, `longitude`, `countryCode` | Location |
| `website`, `checkInTime`, `checkOutTime`, `description` | Hotel details when available |
| `thumbnail`, `images` | Photo URLs |
| `googleHotelId`, `placeId`, `url` | IDs and the Google Hotels link |

### Pricing (plain terms)

You are charged **$0.003 for each hotel** in your results, and nothing else:

| Hotels | Cost |
|---|---|
| 100 | $0.30 |
| 1,000 | $3.00 |
| 10,000 | $30.00 |

There is no start fee and no extra charge for compute or proxies. If a location returns no hotels, you pay nothing. You can also set a maximum cost per run in the run options.

### FAQ

**Do I need a Google account or API key?** No. The actor reads public Google Hotels search results.

**Which price is returned?** The lowest nightly price Google shows for the hotel and dates, in the currency you choose. Taxes and fees follow Google's display for the selected country.

**How many hotels per city?** As many as Google lists for that search, about 20 per page. Big cities have hundreds. Use neighborhoods ("Shibuya, Tokyo") to go deeper.

**Can I track prices over time?** Yes. Create an Apify Schedule with your locations and dates and run it daily; each run is a new dataset you can compare.

**Does it return prices from each booking site (Booking.com, Expedia...)?** Not yet: you get Google's lowest price per hotel. Open an issue if you need per-site prices.

### Limits

- Prices depend on the Google country and currency you choose and can differ slightly from what you see logged in.
- Vacation rentals are not included, only hotels.
- Dates must be today or later; invalid dates are ignored with a warning and Google's default dates are used.

### API example

```bash
curl -X POST "https://api.apify.com/v2/acts/steady_scrape~google-hotels-scraper/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"locations": ["Paris"], "checkIn": "2026-12-05", "checkOut": "2026-12-07", "maxItemsPerLocation": 40}'
```

Questions or a missing field? Open an issue in the **Issues** tab and it will usually be handled within a day.

This actor reads publicly available Google Hotels search results. It does not log in or collect personal data.

# Actor input Schema

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

Cities, neighborhoods or areas, e.g. "Lisbon", "Manhattan, New York", "Bali".

## `checkIn` (type: `string`):

Optional, YYYY-MM-DD. Leave empty for Google's default dates. If you set only check-in, a 1-night stay is used.

## `checkOut` (type: `string`):

Optional. Set together with check-in.

## `maxItemsPerLocation` (type: `integer`):

About 20 hotels per results page. You pay only for hotels delivered ($0.003 each), so 100 hotels = $0.30.

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

ISO currency code, e.g. USD, EUR, GBP.

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

Interface language code, e.g. en, fr, es.

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

Two-letter country code for Google's market, e.g. us, gb, de.

## `maxRetries` (type: `integer`):

Each retry uses a fresh proxy IP.

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

Apify Proxy is recommended. Each retry uses a new IP.

## Actor input object example

```json
{
  "locations": [
    "Lisbon"
  ],
  "maxItemsPerLocation": 20,
  "currency": "USD",
  "language": "en",
  "country": "us",
  "maxRetries": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

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

// Run the Actor and wait for it to finish
const run = await client.actor("steady_scrape/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"],
    "maxItemsPerLocation": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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