Tripadvisor Review Scraper: Hotels, Restaurants & Attractions
Under maintenancePricing
from $4.99 / 1,000 results
Tripadvisor Review Scraper: Hotels, Restaurants & Attractions
Under maintenanceCollect structured Tripadvisor review data with ease. The actor gathers review text, star ratings, timestamps, reviewer profiles, and helpful votes. Ideal for analysts, agencies, and businesses needing deep customer insights.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
0
Monthly active users
5 days ago
Last modified
Categories
Share
Tripadvisor Review Scraper — Hotels, Restaurants & Attractions
The Tripadvisor review scraper extracts reviews, ratings, reviewer profiles, and property intelligence from TripAdvisor hotel, restaurant, and attraction pages — mixing all three property types in a single run. Every response comes back as typed, normalized JSON: no HTML, no CSS selectors, no parsing step. Point it at a property URL (or a hotel name), set how many reviews you need, and it returns structured review data ready for a spreadsheet, a database, or an LLM pipeline.
🏨🍽️🎡 What is the Tripadvisor Review Scraper?
The Tripadvisor Review Scraper is an Apify Actor that collects publicly visible guest reviews from TripAdvisor's Hotel_Review, Restaurant_Review, and Attraction_Review pages. It calls TripAdvisor's own GraphQL API directly — the same endpoint TripAdvisor's website uses to render reviews — rather than scraping rendered HTML. No TripAdvisor account, login, or API key is required; it runs entirely from the Apify Console or the Apify API.
- Scrape hotel, restaurant, and attraction reviews in one run
- Attach full reviewer profiles (name, username, location, contribution count) — optional
- Attach property intelligence (ranking, price range, amenities, contact details) — optional
- Filter by star rating and review language before rows are pushed
- Export as JSON, CSV, Excel, XML, or RSS
- No proxy setup required — defaults to Apify Residential Proxy
📊 What data does the Tripadvisor Review Scraper collect?
Every dataset row is a single review, tagged with the property type it came from, plus two optional nested blocks — the reviewer's profile and the property's own intelligence data.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Hotel reviews | star rating, review text, travel date, trip type, room tip | rating, text, travelDate, tripType, roomTip, propertyType: "HOTEL" |
| Restaurant reviews | star rating, review text, owner/management responses | rating, text, ownerResponse, propertyType: "RESTAURANT" |
| Attraction reviews | star rating, review text, visit context, helpful votes | rating, text, tripType, helpfulVotes, propertyType: "ATTRACTION" |
| Reviewer profiles | display name, username, home location, avatar, contribution count | user.name, user.username, user.userLocation, user.avatar, user.contributions.totalContributions |
| Property intelligence | ranking position, price range, amenities, telephone, website | propertyIntelligence.rankingText, propertyIntelligence.priceRange, propertyIntelligence.amenitiesHighlighted, propertyIntelligence.telephone, propertyIntelligence.website |
🆚 How does the Tripadvisor Review Scraper differ from the official TripAdvisor API?
TripAdvisor's own Content API caps reviews at 5 per location and requires a billing relationship before a single call succeeds; the Tripadvisor Review Scraper returns up to 10,000 reviews per property with no TripAdvisor account at all.
| Feature | TripAdvisor Content API | Tripadvisor Review Scraper |
|---|---|---|
| Reviews per location | Up to 5 reviews and 5 photos per location (tripadvisor-content-api.readme.io, checked 2026-08-04) | Up to 10,000 per property (input-configurable) |
| Property types covered | Hotels, restaurants, attractions | Same 3 types, mixed in one run |
| Access process | Register a developer account, add billing, set a daily call budget before any request succeeds (tripadvisor-content-api.readme.io/reference/faq, checked 2026-08-04) | Start directly from the Apify Console — no TripAdvisor account needed |
| Pricing model | Pay-per-call; first 5,000 calls/month free, then billed, volume discounts above that (same source, checked 2026-08-04) | Apify pay-per-result on the row_result event |
| Rate limits | Up to 50 calls/second; Search endpoints capped at 10,000 calls/day (same source, checked 2026-08-04) | No per-second cap set by the Actor itself — throughput depends on TripAdvisor's own anti-bot response and proxy speed |
| Reviewer profile fields | Not documented as part of the public review schema | Full reviewer profile available, optional per run |
The Content API is the right choice if you already hold a TripAdvisor partner/developer account and only need a handful of the most recent reviews per listing. The Tripadvisor Review Scraper is the better fit when you need deep review history across hotels, restaurants, and attractions without setting up billing with TripAdvisor directly.
🎯 Why do developers and teams scrape TripAdvisor?
TripAdvisor review data is used well beyond travel blogging — here's who actually pulls it, and why.
🤖 For AI engineers and agent builders
Guest reviews are dense, opinionated, unstructured text — exactly what RAG pipelines and travel-recommendation agents need to ground answers in real guest sentiment. A typical workflow: pull the last 500 reviews for a shortlist of hotels via maxComments, index text, rating, and subratings into a vector store, and let an agent answer "which of these hotels has the quietest rooms?" by retrieving matching review passages instead of hallucinating an answer.
📈 For hospitality and travel analysts
Revenue managers and OTAs use review volume, rating, and the per-star ratingHistogram inside placeInfo to benchmark a property against its competitive set over time. Tracking propertyIntelligence.rankingText ("#285 of 525 hotels in New York City") across scheduled runs turns a single scrape into a trend line for competitive rank movement.
📣 For marketers and reputation management teams
Hotel and restaurant chains monitor new reviews and ownerResponse data to see which locations are responding to guest feedback and which aren't. Filtering by reviewRatings: "NEGATIVE" isolates the reviews that need a response before they compound into repeat complaints.
🔬 For researchers and market analysts
Tourism and hospitality researchers use review text, tripType, travelDate, and reviewer userLocation to study visitor demographics and seasonal travel patterns across markets — using only reviews that are already public on the property's page, with no login or paywall involved.
🧭 How to scrape TripAdvisor (step by step)
- Open Tripadvisor Review Scraper: Hotels, Restaurants & Attractions on the Apify Console (or call it through the Apify API).
- Add one or more TripAdvisor property URLs, hotel names, or keywords to the required
startUrlsfield — direct URLs work for all three property types; names/keywords only resolve hotels. - Set
maxComments,sortOrder,reviewsLanguages, andreviewRatingsto scope the run, and togglescrapeReviewerInfo/includePropertyIntelligencefor the nested data you want. - Click Start. The Actor auto-paginates through TripAdvisor's review pages and defaults to Apify Residential Proxy to avoid anti-bot blocks.
- Download results as JSON, CSV, Excel, XML, or RSS from the run's dataset.
🛠️ What to do when TripAdvisor changes its structure
TripAdvisor rotates its persisted GraphQL query IDs with nearly every front-end deploy. The Actor re-extracts those IDs live from TripAdvisor's own JS bundle on every run instead of hardcoding them, and falls back automatically to TripAdvisor's default sort order if a specific sortBy value is rejected mid-run. The output schema itself stays the same either way, so integrations built against it keep working.
⬇️ Input
The Actor accepts the following parameters, defined in .actor/actor.json:
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array (stringList) | TripAdvisor property URLs, hotel names, or keywords. Direct URLs are required for restaurants and attractions; name/keyword lookup only resolves hotels. | ["https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"] |
maxComments | No | integer | Maximum reviews to extract per property. Minimum: 1. Maximum: 10000. Default: 10. | 500 |
sortOrder | No | string (enum) | Review fetch order. Enum: newest, oldest, relevant, rating. Default: newest. Note: relevant currently returns the same order as newest — TripAdvisor does not expose a distinct relevance sort on this data source. | "newest" |
reviewsLanguages | No | string (enum) | Language to filter reviews by. Enum includes ALL_REVIEW_LANGUAGES and 29 named languages (English, Spanish, French, German, Italian, Portuguese, Dutch, Russian, Japanese, Korean, Chinese Simplified/Traditional, Arabic, Turkish, Hebrew, Swedish, Norwegian, Danish, Finnish, Polish, Czech, Hungarian, Romanian, Greek, Thai, Vietnamese, Indonesian, Malay, Hindi). Default: English. | "English" |
reviewRatings | No | string (enum) | Star-rating filter. Enum: ALL_REVIEW_RATINGS, POSITIVE (4–5★), NEGATIVE (1–2★), AVERAGE (3★), or a specific star count "1"–"5". Default: ALL_REVIEW_RATINGS. | "POSITIVE" |
scrapeReviewerInfo | No | boolean | When true, includes the full reviewer profile object. When false, the user field is null. Default: true. | true |
includePropertyIntelligence | No | boolean | When true, includes the propertyIntelligence object (ranking, price range, amenities, contact info). Default: true. | true |
proxyConfiguration | No | object (proxy editor) | Apify Proxy configuration. Defaults to Residential group if left blank. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Example input:
{"startUrls": ["https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html","https://www.tripadvisor.com/Restaurant_Review-g60864-d477685-Reviews-Crescent_City_Brewhouse-New_Orleans_Louisiana.html","https://www.tripadvisor.com/Attraction_Review-g60763-d105127-Reviews-Central_Park-New_York_City_New_York.html"],"maxComments": 500,"sortOrder": "newest","reviewsLanguages": "English","reviewRatings": "ALL_REVIEW_RATINGS","scrapeReviewerInfo": true,"includePropertyIntelligence": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
The most common input mistake: passing a restaurant or attraction name instead of its direct URL. Name/keyword lookup is resolved via Google Search and only reliably finds hotels — restaurant and attraction inputs that aren't a direct Restaurant_Review or Attraction_Review URL are skipped with a warning in the run log.
⬆️ Output
Every run pushes one dataset row per review as typed JSON — the same 21 keys shown in the dataset's default table view, with nothing extra hidden. Export directly as JSON, CSV, Excel, XML, or RSS from the Apify Console.
⭐ Scraped hotel review
{"id": "918273645","url": "https://www.tripadvisor.com/ShowUserReviews-g60763-d208453-r918273645-Hilton_New_York_Times_Square-New_York_City_New_York.html","title": "Great location, tired rooms","lang": "en","locationId": "208453","publishedDate": "2026-06-18","publishedPlatform": "MOBILE","rating": 4,"helpfulVotes": 3,"text": "The location right on Times Square can't be beat, but the rooms are due for a refresh.","roomTip": "Ask for a room on a high floor away from the elevator.","travelDate": "2026-05","tripType": "COUPLES","user": {"userId": "ABCDEFG123","name": "Sarah M","contributions": { "totalContributions": 42, "helpfulVotes": null },"username": "SarahM_NYC","userLocation": "Chicago, Illinois","avatar": "https://dynamic-media-cdn.tripadvisor.com/media/photo-t/avatar_100x100.jpg","link": "www.tripadvisor.com/Profile/SarahM_NYC"},"ownerResponse": {"id": "812345","text": "Thank you for staying with us — we appreciate the feedback and are addressing the room refresh.","lang": "en","publishedDate": "2026-06-20","responder": "Guest Relations Manager","connectionToSubject": "MANAGEMENT"},"subratings": [{ "name": "Rooms", "value": 3 },{ "name": "Service", "value": 5 },{ "name": "Location", "value": 5 }],"photos": [{"id": "812223344","url": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/550x309.jpg","caption": "View from the room","albumId": "112233"}],"placeInfo": {"id": "208453","name": "Hilton New York Times Square","rating": 4.0,"numberOfReviews": 5243,"locationString": "New York City, New York","latitude": 40.758,"longitude": -73.9855,"webUrl": "https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html","website": "https://www.hilton.com/en/hotels/nycpwhh-hilton-new-york-times-square/","address": "1335 6th Ave, New York City, NY 10019","addressObj": {"street1": "1335 6th Ave","street2": "","city": "New York City","state": "NY","country": "United States","postalcode": "10019"},"ratingHistogram": { "count1": 120, "count2": 180, "count3": 420, "count4": 1450, "count5": 3073 }},"propertyType": "HOTEL","propertyIntelligence": {"rankingText": "#285 of 525 hotels in New York City","priceRange": "$250 - $450","amenitiesHighlighted": ["Free Wifi", "Fitness Center", "Restaurant"],"amenitiesNonHighlighted": ["Air conditioning", "Non-smoking rooms"],"telephone": "+1 212-586-7000","website": "https://www.hilton.com/en/hotels/nycpwhh-hilton-new-york-times-square/","heroImage": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/hero.jpg"},"scrapedAt": "2026-08-04T12:34:56.789Z"}
🍽️ Scraped restaurant review
Same 21-key shape as above, with propertyType: "RESTAURANT". propertyIntelligence.priceRange is populated (price ranges exist on TripAdvisor's restaurant pages), but amenitiesHighlighted and amenitiesNonHighlighted are null — TripAdvisor doesn't expose an amenities list for restaurants, so the Actor leaves the field genuinely null rather than returning an empty amenity claim.
🎡 Scraped attraction review
Same shape again, with propertyType: "ATTRACTION". Here both propertyIntelligence.priceRange and the amenities fields are null — TripAdvisor's own attraction pages don't carry price-range or amenity data at all, confirmed by the Actor's source parsing, not omitted by mistake.
🔍 How does the Tripadvisor Review Scraper compare to other TripAdvisor scrapers?
| Feature | Tripadvisor Review Scraper | Generic alternative |
|---|---|---|
| Output format | Typed, normalized JSON straight from TripAdvisor's GraphQL API | Often HTML-parsed fields that break when TripAdvisor changes its markup |
| Property coverage | Hotels, restaurants, and attractions mixed in one run | Frequently limited to a single property type per run |
| Input flexibility | Direct URLs for all 3 types, plus hotel name/keyword lookup | Direct URL only, in most cases |
| Anti-bot handling | TLS impersonation, sticky proxy sessions, live query-ID discovery per run | Varies — undocumented in most listings |
| Schema stability across TripAdvisor deploys | Query IDs re-extracted live each run, so output schema stays fixed | Depends on how the underlying scraper is maintained |
If you're building an AI agent or RAG pipeline, the output format row is the decision-maker — parsing HTML inside an agent loop is a reliability failure mode, not a feature.
📈 How many results can you scrape with the Tripadvisor Review Scraper?
Up to 10,000 reviews per property — set by both the maxComments input maximum and an internal safety cap in the scrape loop that stops pagination once the offset passes 10,000. TripAdvisor's own GraphQL endpoint returns reviews 10 at a time; the Actor loops through pages automatically until it hits maxComments, the property's total review count, or that safety cap — whichever comes first. No manual pagination is needed.
⚠️ If you combine a low maxComments with a restrictive reviewRatings filter on a property that has few matching reviews, the run will keep paginating (up to the property's total review count or the safety cap) until it finds enough matches, since rating filtering happens after each page is fetched, not inside the TripAdvisor query itself.
🔌 Integrate the Tripadvisor Review Scraper and automate your workflow
The Tripadvisor Review Scraper works with any language or tool that can send an HTTP request, since it runs on the Apify platform like any other Actor.
🌐 REST API integration
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("API-Empire/tripadvisor-review-scraper-hotels-restaurants-and-attractions").call(run_input={"startUrls": ["https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"],"maxComments": 200,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["rating"])
Works in Python, Node.js, Go, Ruby, cURL.
🔗 Automation platforms (n8n, Make, LangChain)
n8n — the community Apify node can run this Actor by ID and pass its dataset output straight into any downstream workflow node. Make — the Apify app's "Run Actor" module supports the same call pattern for scenario automation. LangChain — the langchain-apify package exposes an Apify Actor as a callable tool (ApifyActorsTool), so an agent can trigger a scrape and consume the resulting JSON directly inside a chain.
⚖️ Is it legal to scrape TripAdvisor?
Scraping publicly available TripAdvisor reviews is generally legal, but the reviewer profile data this Actor can attach is personal data, so different rules apply to different parts of the output. The Tripadvisor Review Scraper only returns data already visible to any visitor on TripAdvisor's public property pages — nothing behind a login. Because scrapeReviewerInfo (on by default) attaches a reviewer's name, username, home location, and profile link to each row, that portion of the output is personal data under GDPR and CCPA, and you need a lawful basis before storing or using it in bulk — disabling scrapeReviewerInfo removes it entirely if you only need review text and ratings. The review text, ratings, and property data itself are governed by TripAdvisor's Terms of Service rather than data-protection law. Consult legal counsel for commercial use cases involving bulk personal data.
❓ Frequently asked questions
Does the Tripadvisor Review Scraper work without a TripAdvisor account?
Yes. It connects to TripAdvisor's public GraphQL endpoint as an anonymous browser session; no TripAdvisor login, account, or API key is required. You only need an Apify account to run the Actor.
How often is the scraped data updated?
Every run fetches live from TripAdvisor at the moment it executes — there is no caching layer. Run it on a schedule if you need continuously refreshed review data.
What happens if a property has fewer reviews than I requested, or the URL is no longer valid?
If TripAdvisor has fewer reviews than maxComments, the run logs "reached the end" and returns everything available rather than erroring out. If the URL doesn't resolve to a supported property page, the run logs an error and returns 0 rows for that URL instead of stopping the whole run — other URLs in the same startUrls list still run normally.
Can I scrape private or restricted TripAdvisor content?
No. Only reviews and property details already visible to any visitor on TripAdvisor's public pages are returned. There is no login-gated or private content access.
Does the Tripadvisor Review Scraper work for AI agent workflows and LLM pipelines?
Yes — it's callable as an HTTP endpoint through the Apify API by any agent framework. Every response is already typed JSON with stable field names, so there's no parsing step before passing review text and ratings into an LLM.
How does the Tripadvisor Review Scraper handle TripAdvisor's anti-bot system?
TripAdvisor fronts every request with DataDome. The Actor uses Safari TLS impersonation (Chrome impersonation profiles get a 403 challenge from DataDome), seeds a DataDome session cookie per property, and keeps that session sticky to one residential proxy IP across every request for that property. If a request fails, it retries automatically before giving up on that page.
How does the Tripadvisor Review Scraper compare to other TripAdvisor scrapers?
It calls TripAdvisor's own internal GraphQL API — the same one the TripAdvisor website itself uses — rather than parsing the rendered HTML page. That makes it less brittle against markup-only redesigns, though TripAdvisor's persisted query IDs still rotate periodically, which is why the Actor re-extracts them live on every run instead of hardcoding them.
Does the Tripadvisor Review Scraper return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with stable field names — pass it directly into an LLM context window, index it into a vector store, or route it through an agent tool without a parsing step.
Can I use the Tripadvisor Review Scraper without managing proxies?
Yes. It defaults to Apify Residential Proxy automatically if you leave proxyConfiguration blank; residential proxy traffic is billed under your own Apify plan, but you don't need to source or configure proxies yourself.
Why does the relevant sort option return the same reviews as newest?
Because TripAdvisor's GraphQL endpoint doesn't expose a separate relevance-ranking value on this data source — the Actor's sortOrder: "relevant" currently maps to the same default TripAdvisor ordering as newest, documented honestly rather than faked as a distinct sort.
What happens when TripAdvisor changes its structure or blocks the scraper?
The Actor is maintained, and the output schema stays stable — field names and types don't change on your end even when TripAdvisor rotates its internal query IDs or front-end structure.
💬 Your feedback
Found a bug, a missing field, or a property page this Actor doesn't handle correctly? We want to know. Open the Issues tab on this Actor's Apify Store page, or reach out to API-Empire through the Apify Console — reports like this directly shape what gets fixed next.