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

Extract public Google Hotels listings with prices, ratings, review counts, booking links, and dates for a destination. Direct HTTP by default; optional Apify proxy fallback.

- **URL**: https://apify.com/dami\_studio/google-hotels-scraper.md
- **Developed by:** [Dami's Studio](https://apify.com/dami_studio) (community)
- **Categories:** Travel, Lead generation, Integrations
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.50 / 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/platform/actors/running/actors-in-store#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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

Extract public Google Hotels search results as structured dataset rows. Each row includes the property name, displayed price, currency, rating, review count when shown, booking vendor, thumbnail, Google Hotels detail link, query, and stay dates.

### Why this actor

- Direct HTTP to Google Travel by default, so ordinary runs do not pay SERP or residential proxy costs.
- Multiple destination queries in one run with cross-query deduplication.
- Optional check-in/check-out dates, adults, country, language, and currency hints.
- Charges only successfully parsed hotel rows through the `hotel` event. Empty, blocked, timed-out, and diagnostic rows are never charged.
- Strict 30-second wall deadline per query and bounded request timeouts.

### Input example

```json
{
  "searchQueries": ["hotels in Toronto", "boutique hotels in Montreal"],
  "checkIn": "2026-08-01",
  "checkOut": "2026-08-03",
  "adults": 2,
  "country": "ca",
  "language": "en",
  "maxItemsPerQuery": 50,
  "fallbackToProxy": false
}
````

Google sometimes ignores date or currency hints in its public layout. The output records the requested dates and the price/currency actually displayed by Google; it does not invent rates.

### Proxy policy

Direct traffic is the default and was the successful local test path. Enable `fallbackToProxy` only for rate limiting, blocking, or geo-sensitive volume. A single Apify proxy URL is used for a fallback retry. Residential/SERP traffic can cost more than the proposed event price and must be re-benchmarked before enabling it for high-volume customers.

### Local development

```powershell
npm install --omit=dev --no-audit --no-fund
npm test
npm run check
npm run smoke
```

This directory is prepared for a private build. Do not run `apify push` as part of local validation.

### Output

Rows are stored in the default dataset and shown in the `Hotels` dataset view. A no-input run emits one `_sample: true` row and no chargeable hotel event.

### Pricing proposal

Proposed primary event: **`hotel` at $0.0035 per successful hotel row**, with no start fee. This is below the observed $0.004-$0.00499 competitor range while leaving a direct-traffic margin. Proxy fallback is a cost-risk path and should remain opt-in.

# Actor input Schema

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

Destination searches such as 'hotels in Toronto' or 'family hotels near Disneyland Paris'. One row is returned per hotel and each row includes the query that produced it.

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

Optional check-in date in YYYY-MM-DD format. Google may show its default stay when dates are omitted or unavailable.

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

Optional check-out date in YYYY-MM-DD format. Must be after check-in when both dates are supplied.

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

Number of adults for the hotel search. Google may ignore this field for some public result layouts.

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

Google interface language, for example en, fr, or de.

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

Two-letter Google country edition code, such as ca, us, gb, or fr.

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

Optional three-letter currency hint such as CAD, USD, or EUR. Google may display the currency associated with the country edition.

## `maxItemsPerQuery` (type: `integer`):

Maximum number of unique hotel rows returned for each search query.

## `fallbackToProxy` (type: `boolean`):

If direct Google traffic is blocked or rate-limited, retry with one Apify proxy URL. Leave off for the lowest cost; proxy usage can reduce margin.

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

Optional Apify Proxy settings used only when proxy fallback is enabled. Residential or SERP proxies may be required for high-volume or geo-sensitive traffic and incur extra cost.

## Actor input object example

```json
{
  "searchQueries": [],
  "checkIn": "",
  "checkOut": "",
  "adults": 2,
  "language": "en",
  "country": "ca",
  "currency": "",
  "maxItemsPerQuery": 50,
  "fallbackToProxy": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One dataset row per public Google Hotels property. Empty, blocked, and invalid runs return one uncharged diagnostic or sample row.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/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 = {}

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/google-hotels-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call dami_studio/google-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=dami_studio/google-hotels-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Google Hotels Scraper",
        "description": "Extract public Google Hotels listings with prices, ratings, review counts, booking links, and dates for a destination. Direct HTTP by default; optional Apify proxy fallback.",
        "version": "0.1",
        "x-build-id": "yrjXClU5bhpNmMCxz"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dami_studio~google-hotels-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dami_studio-google-hotels-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/dami_studio~google-hotels-scraper/runs": {
            "post": {
                "operationId": "runs-sync-dami_studio-google-hotels-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/dami_studio~google-hotels-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-dami_studio-google-hotels-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchQueries": {
                        "title": "Hotel searches",
                        "minItems": 0,
                        "maxItems": 10,
                        "type": "array",
                        "description": "Destination searches such as 'hotels in Toronto' or 'family hotels near Disneyland Paris'. One row is returned per hotel and each row includes the query that produced it.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "checkIn": {
                        "title": "Check-in date",
                        "type": "string",
                        "description": "Optional check-in date in YYYY-MM-DD format. Google may show its default stay when dates are omitted or unavailable.",
                        "default": ""
                    },
                    "checkOut": {
                        "title": "Check-out date",
                        "type": "string",
                        "description": "Optional check-out date in YYYY-MM-DD format. Must be after check-in when both dates are supplied.",
                        "default": ""
                    },
                    "adults": {
                        "title": "Adults",
                        "minimum": 1,
                        "maximum": 12,
                        "type": "integer",
                        "description": "Number of adults for the hotel search. Google may ignore this field for some public result layouts.",
                        "default": 2
                    },
                    "language": {
                        "title": "Language",
                        "type": "string",
                        "description": "Google interface language, for example en, fr, or de.",
                        "default": "en"
                    },
                    "country": {
                        "title": "Country",
                        "type": "string",
                        "description": "Two-letter Google country edition code, such as ca, us, gb, or fr.",
                        "default": "ca"
                    },
                    "currency": {
                        "title": "Currency",
                        "type": "string",
                        "description": "Optional three-letter currency hint such as CAD, USD, or EUR. Google may display the currency associated with the country edition.",
                        "default": ""
                    },
                    "maxItemsPerQuery": {
                        "title": "Maximum hotels per search",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of unique hotel rows returned for each search query.",
                        "default": 50
                    },
                    "fallbackToProxy": {
                        "title": "Use proxy fallback",
                        "type": "boolean",
                        "description": "If direct Google traffic is blocked or rate-limited, retry with one Apify proxy URL. Leave off for the lowest cost; proxy usage can reduce margin.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Optional Apify Proxy settings used only when proxy fallback is enabled. Residential or SERP proxies may be required for high-volume or geo-sensitive traffic and incur extra cost.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
