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
The Actor
Run it with the Apify CLI
Scrape one page of hotel prices for a city and stay date:
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:
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
- 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).
- 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.
- 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.
- Localize when needed with
gl (country), hl (language), and currency.
- 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.
- 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
1---2name: apify-scrape-hotel-prices3description: 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.4license: MIT5---67# Scrape Hotel Prices: Google Hotels to Structured JSON89Scrape 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.1011## When to use this skill1213- The user wants to scrape hotel prices from Google Hotels (to JSON, CSV, a sheet, or a database).14- They want nightly and total rates for a destination and stay date as a dataset.15- They want rates, ratings, and amenities for hotel market research or a travel app.16- They ask for a "hotel prices scraper", "hotel data scraper", or "hotel prices API".1718Not 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).1920## What you get (one object per results page)2122Each 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.2324## Prerequisites2526- Apify account (sign up at https://apify.com?fpr=9n7kx3&fp_sid=skillrepo).27- Authentication via `apify login`, or an `APIFY_TOKEN` environment variable (Apify Console, Settings, Integrations).2829## The Actor3031- Store page: https://apify.com/johnvc/google-hotels-search-scraper?fpr=9n7kx3&fp_sid=skillrepo32- Actor ID: `johnvc/google-hotels-search-scraper`33- Pricing: pay per page of results processed plus a small per-run setup fee (see `references/gotchas.md`).3435## Run it with the Apify CLI3637Scrape one page of hotel prices for a city and stay date:3839```bash40apify 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}' \41 --json \42 --user-agent apify-awesome-skills/apify-scrape-hotel-prices \43 2>/dev/null44```4546Filtered scrape: 4-star class and up, guest rating at least 4.0, under 250 USD a night, two pages:4748```bash49apify 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}' \50 --json \51 --user-agent apify-awesome-skills/apify-scrape-hotel-prices \52 2>/dev/null53```5455Every call carries the three flags this repo expects: `--json`, `--user-agent apify-awesome-skills/apify-scrape-hotel-prices`, and `2>/dev/null`.5657## Run it from Claude or another AI agent (MCP)5859The Actor is MCP-ready. Add the hosted server URL:6061`https://mcp.apify.com/?tools=actors,docs,johnvc/google-hotels-search-scraper`6263Then 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/mcp6465## Workflow66671. 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).682. 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.693. 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`.704. Localize when needed with `gl` (country), `hl` (language), and `currency`.715. 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`.726. 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.7374## Inputs7576- `search_type` (enum: `search`, `autocomplete`, `photos`, `reviews`; default `search`)77- `q` (string): destination or hotel query, required for search unless `property_token` is given78- `check_in_date` / `check_out_date` (YYYY-MM-DD): required with a query search79- `adults` (default 2), `children` (default 0), `children_ages` (comma-separated, required if children above 0)80- `min_price`, `max_price`, `currency`: price window81- `stars`, `hotel_class` (2 to 5), `guest_rating`, `amenities`, `property_type`: filters82- `vacation_rentals` (boolean) plus `rental_type`, `bedrooms`, `bathrooms`83- `gl`, `hl`: country and language codes84- `max_pages` (default 1, 0 = all pages): the cost bound85- `property_token` (string): single-property mode, also required for photos and reviews8687## Cost8889Billing 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`.9091## Honest limits9293- Read-only extraction. The Actor does not make reservations and is not a booking API.94- Rates are quoted for the exact stay dates, party, and currency you pass; change the dates and the prices change.95- One dataset item per page, not per hotel. Flatten the `properties` array yourself.96- Field coverage varies by property: `description`, `hotel_class`, `deal`, the per-vendor `prices` array, and `reviews_breakdown` show up only on some listings.97- The `ads` array is sponsored placement, not organic ranking; keep it separate in analysis.9899## Troubleshooting100101- Empty `properties`: broaden the query, drop filters, and check the dates are in the future with `check_out_date` after `check_in_date`.102- Input validation error about children: `children` above 0 requires `children_ages`.103- `hotel_class` filter with `vacation_rentals` true: not compatible, pick one.104- `pagination_limit_reached` is true: more pages exist; raise `max_pages` if you want them.105106See `references/gotchas.md` for cost guardrails and error recovery, and `references/actor-index.md` for the Actor routing table.107108## Related travel-data Actors109110- Google Flights Data Scraper: https://apify.com/johnvc/Google-Flights-Data-Scraper-Flight-and-Price-Search?fpr=9n7kx3&fp_sid=skillrepo111- Google Travel Explore API: https://apify.com/johnvc/google-travel-explore-api?fpr=9n7kx3&fp_sid=skillrepo112- Google Local API: https://apify.com/johnvc/google-local-api?fpr=9n7kx3&fp_sid=skillrepo