The Mine Works
TripAdvisor Reviews Scraper: Hotels, Restaurants and Attractions Without an API
← All posts
tutorial June 30, 2026 · 5 min read

TripAdvisor Reviews Scraper: Hotels, Restaurants and Attractions Without an API

How to pull TripAdvisor reviews at scale — star rating, full text, trip type, owner response and sub-ratings for any listing — with no TripAdvisor API key.

Try the scraper

The actor referenced in this article. Pay only for results delivered.

View the scraper →

TripAdvisor does not offer a public API for review data. Historically they ran a Content API that gave access to ratings and photos — it was deprecated and shut down years ago, leaving the hospitality industry with no programmatic path to the review content that directly influences booking decisions.

The TripAdvisor Reviews Scraper fills that gap: it pulls reviews from any Hotel_Review, Restaurant_Review or Attraction_Review listing URL — full text, star rating, reviewer location, trip type, helpful votes, owner response and sub-ratings (cleanliness, service, value, location for hotels). Pay per review, nothing charged on failed extractions.

What You Get Per Review

  • rating — integer 1–5
  • title — the review headline
  • text — full review body text, with “Read more” expansion handled
  • visitDate — month/year of the visit
  • visitType — trip type as tagged by the reviewer: “Couples”, “Solo”, “Business”, “Family”, “Friends”
  • reviewerName + reviewerLocation + reviewerContributions
  • helpfulVotes — how many other users found this review helpful
  • ownerResponse + ownerResponseDate — business reply when present
  • subRatings — object with cleanliness, service, value, location scores (hotel reviews)
  • photos — URLs of reviewer-uploaded photos
  • language — ISO code of the review language

Pull Reviews in Python

import os
from apify_client import ApifyClient

apify = ApifyClient(os.environ["APIFY_TOKEN"])

listings = [
    "https://www.tripadvisor.com/Hotel_Review-g60763-d112962-Reviews-The_Plaza-New_York_City_New_York.html",
    "https://www.tripadvisor.com/Restaurant_Review-g186338-d737537-Reviews-Dishoom-London_England.html",
]

run = apify.actor("themineworks/tripadvisor-reviews").call(run_input={
    "urls": listings,
    "maxReviews": 100,
    "language": "en",
    "sortBy": "date_desc",
})

reviews = list(apify.dataset(run["defaultDatasetId"]).iterate_items())

for r in reviews:
    if r.get("_type") == "summary":
        continue
    print(f"{r['listingName']} | {r['rating']}★ | {r.get('visitType', '')} | {r['visitDate']}")
    print(f"  {r.get('title', '')}")
    if r.get("ownerResponse"):
        print(f"  [Owner replied: {r['ownerResponseDate']}]")
    # Sub-ratings for hotels
    if r.get("subRatings"):
        subs = r["subRatings"]
        print(f"  Cleanliness: {subs.get('cleanliness')} | Service: {subs.get('service')} | Value: {subs.get('value')}")

Sort Options

ValueDescription
date_descMost recent first — best for active monitoring
date_ascOldest first — good for longitudinal analysis
rating_ascLowest ratings first — surfaces complaints
rating_descHighest ratings first

Wire It Into a Claude Agent

{
  "mcpServers": {
    "tripadvisor-reviews": {
      "command": "npx",
      "args": ["-y", "@apify/mcp-client"],
      "env": {
        "APIFY_TOKEN": "your-token-here",
        "MCP_ACTOR_URL": "https://mcp.apify.com/?tools=themineworks/tripadvisor-reviews"
      }
    }
  }
}

With Claude connected, paste a hotel or restaurant URL and ask Claude to summarise the last 50 reviews, break down ratings by trip type, identify unanswered negative reviews that need an owner response, or compare two competing properties side by side. Claude calls the actor, reads the results, and gives you a structured analysis rather than raw data.

Use Cases

Hotel reputation management. Pull the most recent 100 reviews sorted by date. Flag any 1-star or 2-star reviews that have no owner response — those are the leaking reputational damage. Draft templated responses for the most common complaint categories.

Competitive benchmarking for the hospitality industry. Compare your property to the 5 closest competitors on TripAdvisor. Which competitor has the highest sub-rating for service? Which has the most 1-star reviews mentioning noise or cleanliness? Sub-ratings make this analysis precise in a way that an overall star average cannot.

Review sentiment dataset. TripAdvisor reviews are rich, structured and labelled (rating + trip type + sub-ratings). They make a high-quality training and fine-tuning dataset for hospitality-specific sentiment models, significantly better than generic sentiment datasets that mix product and place reviews.

Travel content aggregation. Build destination guides by pulling reviews for the top 30 attractions in a city. The reviewerLocation field shows where visitors are coming from; the visitType shows the kind of trip they were on. Rich context for editorial travel content that generic tourism data cannot provide.

A Note on Anti-Bot Protection

TripAdvisor uses PerimeterX, one of the more aggressive bot-detection systems in the hospitality vertical. The actor handles this with:

  • Playwright rendering (full browser, not just HTTP)
  • Session rotation via residential proxy
  • Randomised viewport and realistic browser fingerprint
  • Automatic retry on bot-challenge responses

For the most reliable results, configure the input to use Apify’s SHADER proxy group ("apifyProxyGroups": ["SHADER"]) — their premium anti-detect tier — rather than the standard RESIDENTIAL group. SHADER is available on Apify’s Business plan and above.

Pricing

Each review costs $0.003. Pulling 500 recent reviews from a high-traffic hotel listing costs $1.50. A monthly monitoring sweep of 10 competing restaurants at 50 reviews each costs $1.50/month.

Reviews that fail to extract due to bot detection are not charged.

Frequently Asked Questions

Does it work for hotels, restaurants and attractions?

Yes. Paste any TripAdvisor Hotel_Review, Restaurant_Review or Attraction_Review URL. The actor detects the listing type from the URL and adapts its extraction — sub-ratings are captured for hotels, cuisine type for restaurants.

Are sub-ratings always available?

Sub-ratings (cleanliness, service, value, location) appear on hotel reviews. Restaurant reviews use different sub-dimensions (food, service, value, atmosphere) which may vary by region. Attraction reviews typically do not have sub-ratings. The subRatings object is null when not available.

Can I filter by trip type?

TripAdvisor’s URL parameters include a trip type filter. Pass the target listing URL with ?ttype=business or ?ttype=family appended to filter on the platform side before scraping.

What does SHADER proxy mean and do I need it?

SHADER is Apify’s premium residential proxy tier with advanced browser fingerprinting — it passes PerimeterX challenges that the standard RESIDENTIAL group sometimes fails. If your runs are returning empty results, switching from RESIDENTIAL to SHADER in the proxyConfig input is the first fix to try.

Related Actor

Explore the scraper referenced in this article — see inputs, outputs, and pricing, then run it on Apify.