Hotel Reviews Scraper (Google, Booking, Tripadvisor) avatar

Hotel Reviews Scraper (Google, Booking, Tripadvisor)

Pricing

from $3.00 / 1,000 reviews pages

Go to Apify Store
Hotel Reviews Scraper (Google, Booking, Tripadvisor)

Hotel Reviews Scraper (Google, Booking, Tripadvisor)

Scrape hotel guest reviews from Google Hotels, Booking.com, Expedia, Hotels.com and Tripadvisor in one Actor: rating, title, text, date, stay date, room type, trip type, reviewer country and the hotel's reply. Paging, sorting and keyword filter. No proxies needed.

Pricing

from $3.00 / 1,000 reviews pages

Rating

0.0

(0)

Developer

ScraperCompany

ScraperCompany

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Hotel Reviews Scraper collects guest reviews for hotels from five sources with one consistent output: Google Hotels (which aggregates many providers), Booking.com, Expedia, Hotels.com and Tripadvisor. Every review keeps its rating and the source's rating scale, title and text, review date and stay date, room type, trip type, reviewer country, helpful votes and the hotel's reply. Use it for reputation monitoring, sentiment analysis, competitor benchmarking and training data.

Powered by the ScraperCompany API: requests, proxies, retries and anti-bot handling run on ScraperCompany's servers, so you don't need your own proxies or API key. Start a run, get structured JSON.

What can this scraper do?

  • Five sources, one schema: Google Hotels, Booking.com, Expedia, Hotels.com and Tripadvisor.
  • Full review data: rating (with the source's scale), title, text, language, review and stay dates, room type, trip type, reviewer country, helpful votes.
  • Management replies included when the hotel answered.
  • Paging: up to 50 requests per hotel; Google returns up to 100 reviews per request.
  • Booking.com sort (newest, oldest, relevant) and keyword filter.
  • Empty pages are never charged.

Sources

SourceWhat it returnsPrice per request
googleGoogle Hotels reviews from every provider Google aggregates (up to 100 per request)$0.003
bookingBooking.com reviews with 0-10 scores, room type, stay dates and the hotel's reply$0.003
expediaExpedia verified-guest reviews$0.003
hotelsHotels.com verified-guest reviews$0.003
tripadvisorTripadvisor reviews with 1-5 bubbles, trip type and the management response$0.003

What data can you extract?

FieldDescription
reviews[].rating / rating_scaleScore and the scale it is on (10 for Booking.com/Expedia/Hotels.com, 5 for Tripadvisor)
reviews[].title / text / languageReview content
reviews[].date / stay_dateWhen it was written and when the guest stayed
reviews[].room_type / trip_typeRoom booked and trip type (family, couple, business...)
reviews[].author / author_countryReviewer display name and country, as published
reviews[].management_replyThe hotel's public answer
reviews[].provider / source / urlWhere the review comes from
total / count / next_page_tokenTotals and paging cursor
rating_scoresBooking.com category scores (cleanliness, location, staff...)

Every dataset item also carries input (the exact request that was sent), request_id (quote it to support), billed and scraped_at.

How to use Hotel Reviews Scraper (Google, Booking, Tripadvisor)

  1. Open Hotel Reviews Scraper (Google, Booking, Tripadvisor) in Apify Console and go to the Input tab.
  2. Pick a Review source, then enter hotels the way that source identifies them (Google property token, Booking.com slug, Expedia/Hotels.com id or Tripadvisor location id). Set Pages per hotel for more reviews.
  3. Adjust the options if needed. Dates accept an exact date (2026-12-01) or a relative one (30 days from today), so saved tasks and schedules never go stale.
  4. Click Start and wait for the run to finish.
  5. Download the results from the Output tab as JSON, CSV, Excel or HTML, or fetch them with the Apify API.

Input example

This is the default input; running the Actor without changes uses it.

{
"source": "google",
"properties": [
"ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ"
],
"maxPages": 1,
"reviewsPerPage": 10,
"includeErrors": true,
"maxConcurrency": 3,
"maxRetries": 2
}

Output example

One dataset item per request (trimmed here; real items contain every field the API returns):

{
"source": "booking",
"endpoint": "/v1/ota/booking/reviews",
"input": {
"pagename": "newbury-guest-house",
"country": "us",
"limit": 10,
"sort": "MOST_RELEVANT"
},
"collection_id": "ratecol_0123456789abcdef0123456789abcdef",
"count": 2,
"country": "us",
"elapsed_s": 0.521,
"hotel_id": 236725,
"limit": 10,
"observed_at": "2026-08-07T01:23:45.678Z",
"pagename": "newbury-guest-house",
"rating_scale": 10,
"rating_scores": [
{
"count": 258,
"name": "Staff",
"translation": null,
"value": 9.3
}
],
"reviews": [
{
"author": "Anna",
"author_country": "United States",
"date": "2024-05-23",
"helpful_votes": 0,
"language": "xu",
"management_reply": "Hello Anna, we are pleased that you enjoyed your stay. We value your kind words and feedback.",
"provider": null,
"rating": 8,
"review_id": "48b4dc6c098c149e",
"room_type": "Deluxe Room",
"source": "booking",
"stay_date": "2024-05-23",
"text": "No breakfast but coffee/tea in lobby, location very good-on fanciest street in Boston and room was clean neat and comfortable.",
"title": "Good value, warm and inviting staff and very neat and clean rooms.",
"trip_type": null,
"url": "48b4dc6c098c149e"
}
],
"skip": 0,
"sort": "MOST_RELEVANT",
"sorters": [
{
"name": "Most relevant",
"value": "MOST_RELEVANT"
}
],
"total": 523,
"ufi": 20061717,
"wire_bytes": 14973,
"request_id": "req_3f9c0d6e2b8a4c1f9e7d5b3a1c0e8f6d",
"billed": true,
"scraped_at": "2026-10-01T14:03:27.512Z"
}

A request that fails is saved with an error message instead (turn off Include failed requests to skip those). Failed requests are never charged.

How much does it cost?

This Actor uses pay-per-event pricing: you pay for successful API requests, not for compute time.

EventCharged whenPricePer 1,000
review-pageOne page of guest reviews from one source (Google: up to 10 pages of 10 per request). Empty pages are free.$0.003$3.00

For example, 1,000 review pages cost $3.00. One Google request can return up to 100 reviews (10 pages) for the price of one page.

  • Failed requests (errors, invalid input, blocked upstream after retries) are free.
  • Requests where the source returns nothing at all (no results, nothing priced) are saved but not charged.
  • Set Maximum cost per run when you start a run and the Actor stops cleanly before going over it.

FAQ

Do I need proxies or a ScraperCompany API key?

No. Proxy rotation, retries and anti-bot handling run on the ScraperCompany side, and the Actor is already connected to the API. You only pay the per-event prices above.

How do I find the hotel identifiers?

Google property tokens come from the Google Hotels Search Scraper; Booking.com slugs from the Booking.com URL; Expedia and Hotels.com ids from their URLs or their scrapers' Find property id mode; Tripadvisor location ids from the URL (-d208453-) or the Tripadvisor scraper.

Are reviewer names personal data?

They are published publicly by the source, but they can still be personal data under GDPR. Only collect and store them if you have a lawful basis.

The Actor collects publicly available information that anyone can see without logging in. You are responsible for how you use the results: respect the source site's terms, copyright and privacy law (such as GDPR) and do not collect personal data without a lawful basis. If in doubt, ask a lawyer.

What happens when a request is blocked or rate-limited?

Rate limits (HTTP 429) and temporary errors (5xx) are retried automatically with exponential backoff, respecting Retry-After. If a request still fails it is saved with the error message and not charged, and the rest of the batch keeps going. A run only fails when every request failed.

Why did a request return an error?

Read the error field: validation problems (for example a malformed date or an unknown id) are reported exactly as the API sees them. Fix the input and run again; failed requests cost nothing.

How many requests can I run at once?

Any number per run. The Actor sends up to 3 requests in parallel by default (change it under Run options); larger batches simply take longer.

Use it from your code

Call the Actor from any language through the Apify API. With the JavaScript client (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('scrapercompany/hotel-reviews-scraper').call({
"source": "google",
"properties": [
"ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ"
]
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

With Python (pip install apify-client):

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("scrapercompany/hotel-reviews-scraper").call(run_input={
"source": "google",
"properties": ["ChUIoben2Mv6-CYaCi9tLzA3czVwbjQQAQ"],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

You can also schedule runs, chain them with webhooks, or connect them to Make, Zapier, n8n, Google Sheets and other integrations from the Integrations tab.

Support

Questions, a field you need, or a site that stopped working? Open an issue on the Issues tab or contact us at scrapercompany.com. Include the request_id from the dataset item so we can trace the request.