# Google Hotels Scraper (`herus13/google-hotel-scraper`) Actor

Google Hotels Scraper: search any destination and get hotels with prices per night, ratings, review counts, stars, address and coordinates. Filter by rating, price, star class, free cancellation and pool or spa. Export JSON, CSV or Excel.

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

## Pricing

from $2.45 / 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.
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

The Google Hotels Scraper extracts hotels from Google Hotels for any destination, with the price per night and for the stay, rating, review count, star class, address and coordinates. Pick the dates, the number of adults and a currency, then narrow the list by rating, price, stars, free cancellation, pool or spa.

### What you get

One dataset, one row per hotel or vacation rental, priced for your dates and party size. A row:

```json
{
  "kind": "hotel",
  "position": 1,
  "query": "Paris",
  "entity_id": "ChkIu9HfsMXs5vmqARoNL2cvMTF4NDRqdnR0YxAB",
  "name": "Hotel Example Paris Centre",
  "property_type": "hotel",
  "categories": ["Hotel"],
  "hotel_class": 4,
  "rating": 4.4,
  "review_count": 2713,
  "rating_histogram": {"1": 70, "2": 41, "3": 160, "4": 520, "5": 1922},
  "price_per_night": 212.0,
  "price_total": 424.0,
  "taxes": 31.0,
  "currency": "USD",
  "deal_label": "GREAT DEAL",
  "price_vs_usual_pct": 31,
  "check_in": "2026-11-10",
  "check_out": "2026-11-12",
  "adults": 2,
  "address": "1 Rue Example, 75001 Paris, France",
  "latitude": 48.8606,
  "longitude": 2.3376,
  "phone": "+33 1 23 45 67 89",
  "website": "https://www.example.com",
  "check_in_time": "3:00 PM",
  "thumbnail": "https://lh3.googleusercontent.com/example",
  "source_url": "https://www.google.com/travel/search?q=hotels+in+Paris",
  "scraped_at": "2026-10-06T09:30:00+00:00",
  "_meta": {"author": "https://apify.com/herus13", "status": "ok", "message": null}
}
```

`_meta` is run metadata, not scraped data. Google can leave a field empty for a listing, for example a phone number or a deal label; those stay `null` rather than being guessed.

- `position` is the row's place in the order you asked for, within its destination.
- `price_per_night` and `price_total` follow the `currency` you choose and cover your `check_in` date and `nights`. `taxes` is the amount Google shows on top, when it shows one.
- `deal_label` and `price_vs_usual_pct` carry Google's own comparison with the usual price for that hotel.
- `rating_histogram` counts reviews per star, `"1"` to `"5"`.
- `entity_id` is Google's id for the hotel.

A hotel with no price for your dates and party size is left out, not returned as an empty row. The run's log says how many listings were skipped for that reason.

### What it costs

| Event | Free | Bronze | Silver | Gold+ |
|---|---|---|---|---|
| Actor Start (`apify-actor-start`) | $0.00005 | $0.00005 | $0.00005 | $0.00005 |
| hotel result (`hotel-result`) | $0.0035 | $0.00315 | $0.0028 | $0.00245 |

### Input

| Field | Type | Required | Default | What it does |
|---|---|---|---|---|
| `queries` | array | no | — | Places to search, one per entry, for example `Paris` or `hotels near Shibuya`. Each destination is searched separately and returns up to `max_results` hotels; a hotel found twice in one destination is returned once. Required: if empty, the run is refused. |
| `check_in` | string | no | — | Check-in date as YYYY-MM-DD, for example 2026-12-01. Must not be in the past. Leave empty for 30 days after the run starts. Prices are quoted for this date and `nights`. |
| `nights` | integer | no | `1` | Length of the stay the prices are quoted for, from 1 to 30 nights. Default 1. Each row reports the price per night and the total for the stay. |
| `adults` | integer | no | `2` | Adults in the party, from 1 to 6. Default 2. Children and the number of rooms cannot be set. Prices rise with the party size, and a hotel with no room for it has no price and is skipped. |
| `currency` | string | no | `"USD"` | Currency every price is quoted in: USD, EUR, GBP, THB or VND. Default USD. `min_price` and `max_price` are in this currency too. |
| `max_results` | integer | no | `20` | How many hotels to return for each destination, from 0 to 1000. Default 20. N returns at most N; 0 returns none. Google lists fewer for small places, so a run can return less than N. |
| `property_types` | array | no | `["hotel"]` | Which listings to keep: `hotel`, `vacation_rental` or both. Default \["hotel"], hotels only. Must name at least one. Vacation rentals have no star class and fewer fields filled. |
| `sort` | string | no | `"relevance"` | Order of the results: relevance, lowest_price, most_reviewed or highest_rating. Default relevance. Lowest_price is near-monotone, not exact. Highest_rating returns Google's top-rated set (4.7 and up) in a weighted order, not strictly by rating. Most_reviewed is exact. |
| `min_rating` | number | no | — | Keep only hotels rated at least this: 3.5, 4.0, 4.5 or 4.8. Any other value is refused. Leave empty for no minimum. |
| `min_price` | integer | no | — | Keep only hotels priced at or above this per night, in `currency`, whole units, 0 or more. Leave empty for no lower bound. Must not exceed `max_price`. |
| `max_price` | integer | no | — | Keep only hotels priced at or below this per night, in `currency`, whole units, 0 or more. Leave empty for no upper bound. Must not be below `min_price`. |
| `free_cancellation` | boolean | no | `false` | Keep only hotels with free cancellation. Default false. |
| `hotel_class` | array | no | — | Keep only hotels of these star classes; tick any of 2, 3, 4 and 5. Leave empty for every class. Each row reports its `hotel_class`. |
| `amenities` | array | no | — | Keep only hotels that have all of these: pool, spa. No other amenity can be filtered. Leave empty for no amenity filter. |
| `proxyUrls` | array | no | — | Leave empty and the run uses the residential proxy this actor ships with, included in the price of the run. To route the run through your own account instead, add one gateway URL per entry, for example http://user:pass@host:port — works with any provider that issues URLs. When set, the run uses these first and switches to the included proxy if they stop working, so a broken proxy never fails the run. Use US exits. |

### How to run it

1. Open the actor and add one or more destinations, such as `Paris` or `hotels near Shibuya`.
2. Set the check-in date, the number of nights and adults, and the currency. Leave the date empty to quote 30 days ahead.
3. Optionally narrow the list: sort order, minimum rating, price range, star classes, free cancellation, pool or spa.
4. Set **Max results per destination** to the number of hotels you want, then run it and export the dataset as JSON, CSV or Excel.

Four and five star hotels in New York with a pool, most reviewed first. Price bounds, when you set them, are per night and in your chosen currency:

```json
{
  "queries": ["New York"],
  "check_in": "2026-12-05",
  "nights": 3,
  "adults": 2,
  "currency": "USD",
  "max_results": 50,
  "hotel_class": ["4", "5"],
  "amenities": ["pool"],
  "sort": "most_reviewed"
}
```

Minimal input:

```json
{
  "queries": ["Paris"],
  "max_results": 5
}
```

Available as the MCP tool `herus13--google-hotel-scraper` on mcp.apify.com and through the Apify API; send the same JSON.

### Use cases

- **Travel price monitoring**: run the same destination and dates every day and track how the price per night moves against the usual price.
- **Market and competitor research**: compare rates, star classes and ratings across a city or a neighbourhood for a hotel, an agency or an investor.
- **Lead lists for hospitality suppliers**: collect hotel names, addresses, websites and phone numbers for a destination.
- **Trip-planning tools and agents**: feed a shortlist of priced hotels, sorted and filtered, into an app or an AI assistant.
- **Review and reputation analysis**: pull ratings, review counts and the star histogram for every hotel in a place.

### FAQ

**How many hotels can one destination return?** Up to 1,000 per destination, as many as Google lists for it. A small place returns fewer. Use several destinations to go wider.

**Is the order exact?** Relevance and most reviewed follow Google's own order. Lowest price is close to ascending but not exact, because Google sorts on an internal key that is not the price shown. Highest rating returns Google's top-rated set, 4.7 and up, in a weighted order rather than strictly by rating.

**Which filters can I use?** Property type, sort, minimum rating (3.5, 4.0, 4.5 or 4.8), price range per night, free cancellation, star classes 2 to 5, and the amenities pool and spa. No other amenity can be filtered.

**How many guests can I search for?** One to six adults. Children and the number of rooms cannot be set, and a hotel with no room for your party has no price and is skipped.

**Which currencies are supported?** US dollar, euro, pound sterling, Thai baht and Vietnamese dong. Every price in a row uses the currency you picked.

**Why did I get fewer rows than I asked for?** The destination may list fewer hotels, filters can leave few, and listings with no price for your dates are skipped. A long walk through a very large result stops at a page limit and says so in the log.

**Do I pay for skipped listings?** No. You are charged for each hotel row that lands in the dataset, nothing else, and no failure is ever billed as a row.

**Is a proxy included?** Yes, a residential proxy is included in the price of the run. To use your own, paste gateway URLs into **Your own proxy URLs**.

**What happens if my input is wrong?** The run stops before it scrapes anything, so no results are charged. Its status and log name each field that is wrong and say what to change — fix the input and run again.

**Is scraping Google Hotels legal?** The actor reads only public search results, the ones any visitor can open without signing in. You are responsible for how you use the data; check Google's terms and your local rules.

### Related actors

- [Google Maps Scraper](https://apify.com/herus13/google-maps-scraper) — businesses, contacts and reviews from Google Maps.
- [Flight Search](https://apify.com/herus13/flight-search) — flight prices between airports on given dates.

# Actor input Schema

## `queries` (type: `array`):

Places to search, one per entry, for example `Paris` or `hotels near Shibuya`. Each destination is searched separately and returns up to `max_results` hotels; a hotel found twice in one destination is returned once. Required: if empty, the run is refused.

## `check_in` (type: `string`):

Check-in date as YYYY-MM-DD, for example 2026-12-01. Must not be in the past. Leave empty for 30 days after the run starts. Prices are quoted for this date and `nights`.

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

Length of the stay the prices are quoted for, from 1 to 30 nights. Default 1. Each row reports the price per night and the total for the stay.

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

Adults in the party, from 1 to 6. Default 2. Children and the number of rooms cannot be set. Prices rise with the party size, and a hotel with no room for it has no price and is skipped.

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

Currency every price is quoted in: USD, EUR, GBP, THB or VND. Default USD. `min_price` and `max_price` are in this currency too.

## `max_results` (type: `integer`):

How many hotels to return for each destination, from 0 to 1000. Default 20. N returns at most N; 0 returns none. Google lists fewer for small places, so a run can return less than N.

## `property_types` (type: `array`):

Which listings to keep: `hotel`, `vacation_rental` or both. Default \["hotel"], hotels only. Must name at least one. Vacation rentals have no star class and fewer fields filled.

## `sort` (type: `string`):

Order of the results: relevance, lowest_price, most_reviewed or highest_rating. Default relevance. Lowest_price is near-monotone, not exact. Highest_rating returns Google's top-rated set (4.7 and up) in a weighted order, not strictly by rating. Most_reviewed is exact.

## `min_rating` (type: `number`):

Keep only hotels rated at least this: 3.5, 4.0, 4.5 or 4.8. Any other value is refused. Leave empty for no minimum.

## `min_price` (type: `integer`):

Keep only hotels priced at or above this per night, in `currency`, whole units, 0 or more. Leave empty for no lower bound. Must not exceed `max_price`.

## `max_price` (type: `integer`):

Keep only hotels priced at or below this per night, in `currency`, whole units, 0 or more. Leave empty for no upper bound. Must not be below `min_price`.

## `free_cancellation` (type: `boolean`):

Keep only hotels with free cancellation. Default false.

## `hotel_class` (type: `array`):

Keep only hotels of these star classes; tick any of 2, 3, 4 and 5. Leave empty for every class. Each row reports its `hotel_class`.

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

Keep only hotels that have all of these: pool, spa. No other amenity can be filtered. Leave empty for no amenity filter.

## `proxyUrls` (type: `array`):

Leave empty and the run uses the residential proxy this actor ships with, included in the price of the run. To route the run through your own account instead, add one gateway URL per entry, for example http://user:pass@host:port — works with any provider that issues URLs. When set, the run uses these first and switches to the included proxy if they stop working, so a broken proxy never fails the run. Use US exits.

## Actor input object example

```json
{
  "queries": [
    "Paris"
  ],
  "nights": 1,
  "adults": 2,
  "currency": "USD",
  "max_results": 20,
  "property_types": [
    "hotel"
  ],
  "sort": "relevance",
  "free_cancellation": false
}
```

# Actor output Schema

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

One row per hotel or vacation rental, priced for the stay. Each row also carries `_meta` (author, status, message): run metadata, not scraped data.

# 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 = {
    "queries": [
        "Paris"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("herus13/google-hotel-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 = { "queries": ["Paris"] }

# Run the Actor and wait for it to finish
run = client.actor("herus13/google-hotel-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 '{
  "queries": [
    "Paris"
  ]
}' |
apify call herus13/google-hotel-scraper --silent --output-dataset

```

## MCP server setup

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