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

Export Google Hotels properties, live prices, ratings, amenities, and public booking offers for destinations and stay dates.

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

## Pricing

from $2.34 / 1,000 item processeds

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

Export public Google Hotels search results for destinations, stay dates, and guest counts. This Google Hotels API-ready hotel price scraper returns one hotel per dataset row with prices, ratings, review counts, amenities, images, and Google Travel links for spreadsheets, databases, and travel workflows.

### Who is it for?

Hotel revenue managers, travel agencies, travel-tech builders, destination analysts, and accommodation pricing teams can use this Actor for repeatable destination/date price monitoring.

### Why use this Actor?

- Compare hotel inventory for cities, neighborhoods, landmarks, or named properties.
- Track publicly displayed nightly rates for specific stay dates.
- Export structured hotel rows instead of manually copying Google Hotels cards.
- Preserve the requested currency and the currency Google actually displays.
- Process several destination queries in one run while keeping partial results if one query fails.

### Input example

```json
{
  "queries": ["hotels in New York", "hotels near Eiffel Tower"],
  "checkInDate": "2026-09-15",
  "checkOutDate": "2026-09-17",
  "adults": 2,
  "currency": "USD",
  "language": "en",
  "country": "US",
  "maxResultsPerQuery": 20,
  "includeDetails": false
}
```

Dates must be in the future and use `YYYY-MM-DD`. Checkout must be after check-in.

### Output example

```json
{
  "query": "hotels in New York",
  "checkInDate": "2026-09-15",
  "checkOutDate": "2026-09-17",
  "adults": 2,
  "childrenAges": [],
  "requestedCurrency": "USD",
  "currency": "USD",
  "language": "en",
  "country": "US",
  "hotelName": "Example Hotel",
  "propertyToken": "example-token",
  "googleTravelUrl": "https://www.google.com/travel/hotels/entity/example-token",
  "propertyType": "hotel",
  "description": null,
  "address": null,
  "latitude": null,
  "longitude": null,
  "hotelClass": 4,
  "rating": 4.4,
  "reviewCount": 1280,
  "locationRating": null,
  "pricePerNight": 219,
  "pricePerNightDisplay": "$219",
  "totalPrice": null,
  "totalPriceDisplay": null,
  "priceAvailable": true,
  "amenities": ["Pool", "Free Wi-Fi"],
  "images": ["https://example.com/hotel.jpg"],
  "checkInTime": null,
  "checkOutTime": null,
  "ecoCertified": false,
  "offers": [],
  "detailStatus": "not_requested",
  "status": "succeeded",
  "diagnostics": [],
  "scrapedAt": "2026-08-13T12:00:00.000Z"
}
```

Fields unavailable on a particular public result remain `null` or an empty array, so exports keep a stable shape.

### Input settings

| Field | Type | Description |
|---|---|---|
| `queries` | string\[] | Destinations, landmarks, neighborhoods, or hotel names; 1–20 queries. |
| `checkInDate` | string | Future check-in date in `YYYY-MM-DD` format. |
| `checkOutDate` | string | Checkout date after check-in. |
| `adults` | integer | Adult guests, from 1 to 20. |
| `childrenAges` | integer\[] | Ages of child guests, from 0 to 17. |
| `currency` | string | Requested three-letter currency code, such as `USD` or `EUR`. |
| `language` | string | Two-letter Google interface language code. |
| `country` | string | Two-letter Google search region code. |
| `maxResultsPerQuery` | integer | Maximum unique hotels saved for each query. |
| `includeDetails` | boolean | Request public property-detail enrichment when available. Search rows are preserved if enrichment is unavailable. |
| `includeOffers` | boolean | Include the public booking-offer ladder when Google displays it. |
| `minPrice`, `maxPrice` | number | Optional nightly-price filters. |
| `minRating` | number | Optional minimum guest rating from 0 to 5. |
| `hotelClasses` | integer\[] | Optional hotel star classes to keep. |
| `proxyConfiguration` | object | Optional Apify Proxy configuration. |

### Output fields

Each row includes:

- **Request context:** `query`, `checkInDate`, `checkOutDate`, `adults`, `childrenAges`, `requestedCurrency`, `language`, `country`.
- **Hotel identity:** `hotelName`, `propertyToken`, `googleTravelUrl`, `propertyType`, `description`, `address`, `latitude`, `longitude`.
- **Quality signals:** `hotelClass`, `rating`, `reviewCount`, `locationRating`, `ecoCertified`.
- **Rates:** `currency`, `pricePerNight`, `pricePerNightDisplay`, `totalPrice`, `totalPriceDisplay`, `priceAvailable`.
- **Property information:** `amenities`, `images`, `checkInTime`, `checkOutTime`.
- **Booking offers:** `offers` with vendor name/icon, sponsorship status, nightly and total prices, and booking URL when displayed publicly.
- **Run status:** `detailStatus`, `status`, `diagnostics`, `scrapedAt`.

### Input recipes

#### Destination rate comparison

Use one city query, exact stay dates, and `maxResultsPerQuery: 50` to create a market snapshot.

#### Compare several destinations

Add several entries to `queries`. Results retain their originating `query`, making grouping straightforward after export.

#### Find highly rated hotels in a budget range

Set `minRating`, `minPrice`, and `maxPrice`. Price filters apply only when Google displays a parseable public rate.

### Pricing

This Actor uses pay-per-event pricing: a small run-start charge plus a charge for each hotel row successfully stored. Failed or filtered rows are not charged as results. See the [live Pricing tab](https://apify.com/fetch_cat/google-hotels-scraper/pricing) for the current tier-specific rates before starting a run.

### API usage

```bash
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~google-hotels-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries":["hotels in Paris"],"checkInDate":"2026-10-20","checkOutDate":"2026-10-22","maxResultsPerQuery":10}'
```

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/google-hotels-scraper').call({ queries: ['hotels in Paris'], checkInDate: '2026-10-20', checkOutDate: '2026-10-22', maxResultsPerQuery: 10 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

```python
from apify_client import ApifyClient
client = ApifyClient(token='YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/google-hotels-scraper').call(run_input={'queries': ['hotels in Paris'], 'checkInDate': '2026-10-20', 'checkOutDate': '2026-10-22', 'maxResultsPerQuery': 10})
items = client.dataset(run['defaultDatasetId']).list_items().items
```

Use the run's default dataset after it succeeds.

### MCP and AI agents

Connect through [Apify MCP](https://mcp.apify.com/?tools=fetch_cat/google-hotels-scraper) to let compatible AI clients run hotel searches and consume structured results. Always supply explicit future dates and a bounded result limit.

```bash
claude mcp add apify -- npx -y @apify/mcp-server
```

```json
{"mcpServers":{"apify":{"command":"npx","args":["-y","@apify/mcp-server"],"env":{"APIFY_TOKEN":"YOUR_APIFY_TOKEN"}}}}
```

Example prompt: “Run `fetch_cat/google-hotels-scraper` for hotels in Paris for my stay dates and return rows with price, rating, and booking offers.”

### Tips and limitations

- Hotel prices and availability change frequently; store `scrapedAt` with every comparison.
- Google may resolve a different display currency based on availability. Compare `requestedCurrency` with `currency`.
- Some cards do not display prices, addresses, coordinates, or offers. Such fields remain empty rather than being guessed.
- Search presentation varies by language, country, dates, and consent region.
- This Actor exports public hotel search data. It does not complete bookings, access private accounts, or scrape full review histories.
- Keep query batches and result limits reasonable. One blocked query does not invalidate rows already saved from other queries.

### FAQ

#### Can I search by hotel name instead of a city?

Yes. `queries` accepts destinations, landmarks, neighborhoods, and named hotels.

#### What data can I export with Google Hotels Scraper?

You can scrape Google Hotels prices alongside hotel identity, stay dates, guest context, ratings, amenities, images, and public booking offers when displayed.

#### Does it return live prices?

It returns the public rates displayed by Google Hotels for the supplied dates and guests. A property may have no displayed price.

#### Can I run Google Hotels Scraper through an API, schedule, or MCP client?

Yes. Use the API request above, schedule saved Actor inputs in Apify, or connect the MCP tool for bounded date-specific hotel searches.

#### How much does it cost to use Google Hotels Scraper?

It charges a small start event plus one event for each hotel row successfully saved. Review the current rate on the Actor Pricing tab before starting a run.

#### Can I use the output in Excel, Google Sheets, or a database?

Yes. Apify datasets export to JSON, CSV, Excel, XML, and other formats and can be accessed through the API.

#### Does it support API and MCP automation?

Yes. Use the Apify API, client libraries, webhooks, integrations, or the MCP endpoint above.

#### Is this an official Google product?

No. This independent Actor reads publicly displayed search information and is not affiliated with Google. Follow applicable laws, website terms, and data-use requirements.

#### What happens when Google returns no usable results?

The run reports the failed query rather than fabricating rows. Results already saved for other queries remain in the dataset.

### Related Actors

- [Google Maps Lead Finder](https://apify.com/fetch_cat/google-maps-lead-finder)
- [Google Search Scraper](https://apify.com/fetch_cat/google-search-scraper)
- [Booking Scraper](https://apify.com/fetch_cat/booking-scraper)
- [Google Flights Scraper](https://apify.com/fetch_cat/google-flights-scraper)
- [Tripadvisor Scraper](https://apify.com/fetch_cat/tripadvisor-scraper)

### Support

For reproducible help, open an issue from the Actor page and include the input, run URL, expected behavior, and observed behavior. Do not include passwords, cookies, or private booking information.

# Actor input Schema

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

Cities, landmarks, neighborhoods, or hotel names to search.

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

Future date in YYYY-MM-DD format.

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

Date after check-in in YYYY-MM-DD format.

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

Number of adult guests.

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

Age of each child guest, from 0 to 17.

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

Three-letter currency code, such as USD or EUR.

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

Two-letter Google interface language code.

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

Two-letter Google search region code.

## `maxResultsPerQuery` (type: `integer`):

Stop after this many unique hotel rows per query.

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

Fetch additional public property details when available.

## `includeOffers` (type: `boolean`):

Collect the public vendor offer ladder when Google displays it.

## `minPrice` (type: `number`):

Optional post-filter in the requested currency.

## `maxPrice` (type: `number`):

Optional post-filter in the requested currency.

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

Optional minimum rating from 0 to 5.

## `hotelClasses` (type: `array`):

Optional star classes to keep.

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

Optional Apify Proxy settings for blocked requests.

## Actor input object example

```json
{
  "queries": [
    "hotels in New York"
  ],
  "checkInDate": "2026-09-15",
  "checkOutDate": "2026-09-16",
  "adults": 2,
  "childrenAges": [],
  "currency": "USD",
  "language": "en",
  "country": "US",
  "maxResultsPerQuery": 20,
  "includeDetails": true,
  "includeOffers": true
}
```

# Actor output Schema

## `overview` (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 = {
    "queries": [
        "hotels in New York"
    ],
    "checkInDate": "2026-09-15",
    "checkOutDate": "2026-09-16"
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/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 = {
    "queries": ["hotels in New York"],
    "checkInDate": "2026-09-15",
    "checkOutDate": "2026-09-16",
}

# Run the Actor and wait for it to finish
run = client.actor("fetch_cat/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 '{
  "queries": [
    "hotels in New York"
  ],
  "checkInDate": "2026-09-15",
  "checkOutDate": "2026-09-16"
}' |
apify call fetch_cat/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

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