# Apify Scrape Hotel Prices

> Scrape hotel prices from Google Hotels into structured JSON with the Apify Google Hotels Search Scraper Actor (johnvc/google-hotels-search-scraper). Give a destination query plus check-in and check-out dates, and get one page object per results page whose properties array carries name, rate_per_night and total_rate (display string plus extracted numeric value), overall_rating, reviews count, amenities, gps_coordinates, images, and a property_token for chaining into reviews or photos. Use when the user wants to scrape hotel prices, export Google Hotels results to JSON or CSV, build a hotel prices or hotel rates dataset, compare rates across a city for a stay date, or asks for a hotel prices scraper, hotel data scraper, or hotel prices API. Pay-per-page billing plus a small per-run setup fee, MCP-ready for Claude and other AI agents.

- Skill: `johnisanerd/apify-scrape-hotel-prices` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add johnisanerd/apify-scrape-hotel-prices`
- Raw SKILL.md: https://api.skillmd.com/api/skills/johnisanerd/apify-scrape-hotel-prices/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- License: MIT
- Author: johnisanerd (https://skillmd.com/u/johnisanerd)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/johnisanerd/apify-scrape-hotel-prices

---


# Scrape Hotel Prices: Google Hotels to Structured JSON

Scrape hotel prices from Google Hotels into clean JSON with the Apify Google Hotels Search Scraper. Give it a destination query and stay dates, and get every listed property with its nightly rate, total rate, rating, review count, amenities, coordinates, and a token you can chain into reviews or photo pulls.

## When to use this skill

- The user wants to scrape hotel prices from Google Hotels (to JSON, CSV, a sheet, or a database).
- They want nightly and total rates for a destination and stay date as a dataset.
- They want rates, ratings, and amenities for hotel market research or a travel app.
- They ask for a "hotel prices scraper", "hotel data scraper", or "hotel prices API".

Not for: making reservations (the Actor reads data, it does not book), flight prices (use the Google Flights Data Scraper), or restaurant and attraction listings (use the Google Local API).

## What you get (one object per results page)

Each dataset item is one page of results: `search_parameters` (your echoed input), `search_metadata` (`total_results`, `properties_count`, `ads_count`, `pages_processed`, `pagination_limit_reached`), a `properties` array of organic listings, and an `ads` array of sponsored listings. Each property carries `name`, `type` (hotel or vacation rental), `rate_per_night` and `total_rate` (display string `lowest` plus numeric `extracted_lowest`, with before-tax variants), `overall_rating`, `reviews` count, `amenities`, `gps_coordinates`, `images`, `check_in_time`, `check_out_time`, `property_token`, and usually `link`. When present: `hotel_class` and `extracted_hotel_class`, `location_rating`, a `ratings` star histogram, a `reviews_breakdown` by topic, `description`, `deal` plus `deal_description`, `eco_certified`, `nearby_places`, and a per-vendor `prices` array with cancellation flags.

## Prerequisites

- Apify account (sign up at https://apify.com?fpr=9n7kx3&fp_sid=skillrepo).
- Authentication via `apify login`, or an `APIFY_TOKEN` environment variable (Apify Console, Settings, Integrations).

## The Actor

- Store page: https://apify.com/johnvc/google-hotels-search-scraper?fpr=9n7kx3&fp_sid=skillrepo
- Actor ID: `johnvc/google-hotels-search-scraper`
- Pricing: pay per page of results processed plus a small per-run setup fee (see `references/gotchas.md`).

## Run it with the Apify CLI

Scrape one page of hotel prices for a city and stay date:

```bash
apify actors call "johnvc/google-hotels-search-scraper" -i '{"search_type":"search","q":"hotels in Austin","check_in_date":"2026-09-10","check_out_date":"2026-09-12","max_pages":1}' \
  --json \
  --user-agent apify-awesome-skills/apify-scrape-hotel-prices \
  2>/dev/null
```

Filtered scrape: 4-star class and up, guest rating at least 4.0, under 250 USD a night, two pages:

```bash
apify actors call "johnvc/google-hotels-search-scraper" -i '{"search_type":"search","q":"hotels in Miami","check_in_date":"2026-09-10","check_out_date":"2026-09-12","hotel_class":"4,5","guest_rating":"4.0","max_price":"250","currency":"USD","max_pages":2}' \
  --json \
  --user-agent apify-awesome-skills/apify-scrape-hotel-prices \
  2>/dev/null
```

Every call carries the three flags this repo expects: `--json`, `--user-agent apify-awesome-skills/apify-scrape-hotel-prices`, and `2>/dev/null`.

## Run it from Claude or another AI agent (MCP)

The Actor is MCP-ready. Add the hosted server URL:

`https://mcp.apify.com/?tools=actors,docs,johnvc/google-hotels-search-scraper`

Then ask, for example: "Scrape hotel prices in Lisbon for the first weekend of October and give me the ten cheapest four-star options as JSON." MCP setup docs: https://docs.apify.com/platform/integrations/mcp

## Workflow

1. Build the search. `q` is the destination query ("hotels in Paris", "Bali resorts", "vacation rentals in Miami"). `check_in_date` (YYYY-MM-DD) is required when searching by query; add `check_out_date` after it. Party size via `adults`, `children`, and `children_ages` (required when `children` is above 0).
2. Bound the volume. `max_pages` defaults to 1, about 20 properties plus a handful of sponsored ads per page. Do not set `max_pages` to 0 (fetch all pages) on a broad city query without estimating cost first; big cities report thousands of results.
3. Filter server-side where you can. `min_price` and `max_price` with `currency`, `stars` or `hotel_class`, `guest_rating`, `amenities` IDs, `property_type` IDs, and `vacation_rentals` with `bedrooms` and `bathrooms`.
4. Localize when needed with `gl` (country), `hl` (language), and `currency`.
5. Run, then flatten. Each dataset item is a page object; expand its `properties` array into one row per hotel. Compute on the numeric `extracted_lowest` fields, not the display strings. Dedupe across runs on `property_token`.
6. Chain deeper when asked. Feed a `property_token` back into the Actor with `search_type` set to `reviews` or `photos` for guest reviews or the photo gallery of one property.

## Inputs

- `search_type` (enum: `search`, `autocomplete`, `photos`, `reviews`; default `search`)
- `q` (string): destination or hotel query, required for search unless `property_token` is given
- `check_in_date` / `check_out_date` (YYYY-MM-DD): required with a query search
- `adults` (default 2), `children` (default 0), `children_ages` (comma-separated, required if children above 0)
- `min_price`, `max_price`, `currency`: price window
- `stars`, `hotel_class` (2 to 5), `guest_rating`, `amenities`, `property_type`: filters
- `vacation_rentals` (boolean) plus `rental_type`, `bedrooms`, `bathrooms`
- `gl`, `hl`: country and language codes
- `max_pages` (default 1, 0 = all pages): the cost bound
- `property_token` (string): single-property mode, also required for photos and reviews

## Cost

Billing is pay per event: a per-run setup fee plus a fee for each page of results processed, with tiny per-result and per-start charges on top. A one-page scrape lands around $0.04 at the time of writing. Estimate first and confirm large runs; live prices and thresholds are in `references/gotchas.md`.

## Honest limits

- Read-only extraction. The Actor does not make reservations and is not a booking API.
- Rates are quoted for the exact stay dates, party, and currency you pass; change the dates and the prices change.
- One dataset item per page, not per hotel. Flatten the `properties` array yourself.
- Field coverage varies by property: `description`, `hotel_class`, `deal`, the per-vendor `prices` array, and `reviews_breakdown` show up only on some listings.
- The `ads` array is sponsored placement, not organic ranking; keep it separate in analysis.

## Troubleshooting

- Empty `properties`: broaden the query, drop filters, and check the dates are in the future with `check_out_date` after `check_in_date`.
- Input validation error about children: `children` above 0 requires `children_ages`.
- `hotel_class` filter with `vacation_rentals` true: not compatible, pick one.
- `pagination_limit_reached` is true: more pages exist; raise `max_pages` if you want them.

See `references/gotchas.md` for cost guardrails and error recovery, and `references/actor-index.md` for the Actor routing table.

## Related travel-data Actors

- Google Flights Data Scraper: https://apify.com/johnvc/Google-Flights-Data-Scraper-Flight-and-Price-Search?fpr=9n7kx3&fp_sid=skillrepo
- Google Travel Explore API: https://apify.com/johnvc/google-travel-explore-api?fpr=9n7kx3&fp_sid=skillrepo
- Google Local API: https://apify.com/johnvc/google-local-api?fpr=9n7kx3&fp_sid=skillrepo

