Tripadvisor Review Scraper — Sentiment & Analytics
Under maintenancePricing
from $5.99 / 1,000 results
Tripadvisor Review Scraper — Sentiment & Analytics
Under maintenanceAutomate Tripadvisor review scraping for any listing. The actor pulls full review metadata including text, ratings, dates, and user profiles. Useful for dashboards, reports, and competitive benchmarking.
Pricing
from $5.99 / 1,000 results
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
TripAdvisor Review Scraper — Reviews, Sentiment and Analytics
A TripAdvisor review scraper that pulls every guest review, rating, reviewer profile, photo, and owner (management) response from any TripAdvisor hotel page, then adds two things a plain scraper doesn't: an optional AI layer that classifies each review's sentiment, emotion, and topics (and scores the tone of management's replies), and a free, zero-extra-request derived analytics row per property — rating-histogram percentages, response rate, and average response time. Every result is typed JSON, ready to load into a BI tool, a spreadsheet, or an LLM context window. Point it at a hotel URL, a hotel name, or a keyword and it handles cookies, rotating query IDs, pagination, and anti-bot challenges on its own.
🏨 What is TripAdvisor Review Scraper — Sentiment & Analytics?
It's an Apify Actor that queries TripAdvisor's own review GraphQL endpoint for a given hotel and returns every review as a structured row — no TripAdvisor account or login required. What sets it apart from a plain text-and-rating scraper is that it optionally classifies each review's sentiment, emotion, and topics, scores the genuineness of any management reply, and — independently of the AI step — always has the option to compute a derived analytics summary for the property from the reviews it just collected, at no extra request cost.
Query controls exposed in the input form:
- 🎯 How many reviews to pull per hotel (
maxComments, up to 10,000) - 🔀 Sort order — newest, oldest, "relevant" (currently identical to newest), or highest-rated first
- 🌍 Review language — all languages or one specific locale
- ⭐ Rating filter — all ratings, positive/negative/average groups, or a single star count
- 👤 Whether to include the reviewer's profile (name, username, location, avatar) or strip it
- 🤖 Optional AI sentiment/emotion/topic/response-tone classification (bring your own provider key)
- 📊 Whether to include the free derived property-analytics row
📦 What data can you get with TripAdvisor Review Scraper — Sentiment & Analytics?
The Actor returns two row types in the same dataset: individual review rows, and one optional property analytics summary row per hotel.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Review | id, type, url, title, lang, locationId, publishedDate, publishedPlatform, rating, helpfulVotes, text, roomTip, travelDate, tripType, user, ownerResponse, subratings, photos, placeInfo, scrapedAt | Raw guest feedback, review-response auditing, dataset for BI/NLP |
| Review (AI fields) | aiSentiment, aiEmotion, aiTopics, aiResponseTone, aiResponseToneScore | Sentiment dashboards, reply-quality coaching |
| Property analytics | reviewsAnalyzed, ratingHistogramPercent, responseRate, avgResponseTimeDays, avgSubratingsByCategory, placeInfo, scrapedAt | Property-level KPIs without a separate aggregation step |
🤖 AI sentiment, emotion, and response-tone analysis
When enableAiAnalysis is on and a valid provider key resolves, every review is sent to the chosen model with a closed-set prompt and comes back with a sentiment label (positive/neutral/negative), one emotion from a fixed list (joy, satisfaction, gratitude, excitement, neutral, disappointment, frustration, anger, disgust), and up to three topics from a fixed list (cleanliness, location, service, staff, value, food, amenities, noise, room quality, booking/check-in, other) — closed sets so the output stays aggregable instead of drifting into free-text labels. If the review has an owner response, the same call also returns a tone label (empathetic, professional, defensive, dismissive, generic) and a aiResponseToneScore between 0.0 and 1.0 rating how specifically the reply addresses the guest's points. Any failure — no key, network error, malformed model output — leaves all five AI fields null on that row; nothing is ever guessed:
{"aiSentiment": "positive","aiEmotion": "satisfaction","aiTopics": ["location", "service"],"aiResponseTone": "empathetic","aiResponseToneScore": 0.82}
📊 Derived property analytics
Independent of the AI step, when includePropertyAnalytics is on (default) the Actor computes a summary row from the reviews it just collected for that property — no extra HTTP requests, no AI call, and it is pushed without a charged event, so it never costs an extra billed result: rating-histogram percentages, the share of collected reviews with an owner reply, the average days between a review and its reply, and average subratings per category (Value, Location, Cleanliness, Service, …), each computed only from reviews that actually carry the underlying data.
🆚 How does this differ from the official TripAdvisor Content API?
TripAdvisor publishes an official Content API for partners, but it is not a general-purpose self-serve review feed: access requires submitting a partner application, and its Location Reviews endpoint returns only the 5 most recent reviews per location, with no sentiment, emotion, or response-tone classification (as documented on TripAdvisor's Content API reference at tripadvisor-content-api.readme.io, checked 2026-08-04).
| Feature | TripAdvisor Content API | This Actor |
|---|---|---|
| Access | Partner application, approval required | Run directly from the Apify Console, no approval |
| Reviews per property | Up to 5 most recent (documented endpoint limit) | Up to 10,000 per URL (maxComments) |
| Query input | TripAdvisor's internal location ID | Direct hotel URL, hotel name, or keyword |
| Sentiment/emotion/topic classification | Not documented | Optional, multi-provider, bring your own key |
| Response-tone scoring on owner replies | Not documented | Optional (aiResponseTone, aiResponseToneScore) |
| Derived analytics (histogram %, response rate) | Not documented | Included free, zero extra requests |
| Output formats | JSON via API integration | JSON, CSV, Excel, XML, RSS via Apify dataset |
The Content API is the right choice if you're an approved travel-industry partner who only needs a handful of recent reviews per listing inside an existing integration. This Actor is the better fit when you need full review history, per-review filtering, and sentiment/response analytics without going through a partner approval process.
🔍 What's the difference between a review scraper and a review sentiment-analysis tool?
A plain review scraper returns raw text and a star rating — you still have to run your own NLP step to know whether a review is positive or negative, or whether management's reply actually addressed the complaint. A sentiment-analysis tool consumes that raw text and returns a structured judgment: sentiment, emotion, topics, and (here) a tone score on the reply itself.
This distinction matters more for review data than for most scraped content because reputation-management decisions depend on the classification, not the text — a team monitoring dozens of properties can't manually read every review, but can act on an aiSentiment: "negative" filter or a low aiResponseToneScore flag. This Actor returns both in the same row: the raw fields (text, rating, subratings, ownerResponse) that a plain scraper would give you, and the classified fields (aiSentiment, aiEmotion, aiTopics, aiResponseTone, aiResponseToneScore) that a sentiment-analysis layer adds — with the classification step fully optional and billed by your own AI provider account, not bundled into the scrape.
🚀 How to scrape TripAdvisor hotel reviews with this Actor?
- Open the Actor on its Apify Store listing and go to the Input tab.
- Add one or more entries to
startUrls— a direct TripAdvisorHotel_ReviewURL, a hotel name, or a keyword. - Set
maxComments,sortOrder,reviewsLanguages, andreviewRatingsto scope the run. - (Optional) Turn on
enableAiAnalysis, pick anaiModel, and supplyaiApiKeyfor sentiment/emotion/response-tone classification. - Click Start, then export the dataset as JSON, CSV, Excel, XML, or RSS once the run finishes.
Example request body:
{"startUrls": ["https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"],"maxComments": 200,"sortOrder": "newest","reviewRatings": "NEGATIVE"}
Running multiple hotels in one job
Add more entries to the startUrls array — direct URLs, hotel names, or keywords in any mix. The Actor processes each hotel in that list one after another within the same run (bootstrapping a fresh session and sticky proxy per hotel), pushing that hotel's rows to the dataset before moving to the next; it does not run multiple hotels concurrently within a single run. To parallelize across hotels, start separate runs.
⬇️ Input
All fields live under a single input object; only startUrls is required.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array of string | One or more TripAdvisor Hotel_Review URLs, hotel names, or keywords. Names/keywords are resolved to a URL via Google Search — direct URLs are faster and more reliable. | ["https://www.tripadvisor.com/Hotel_Review-g60763-d208453-Reviews-Hilton_New_York_Times_Square-New_York_City_New_York.html"] |
maxComments | No | integer | Reviews to extract per hotel. Default 10, minimum 1, maximum 10000. The Actor auto-paginates; no need to click "Next page". | 100 |
sortOrder | No | string (enum) | Order reviews are fetched in. Default "newest". One of "newest", "oldest", "relevant", "rating" — see note below. | "newest" |
reviewsLanguages | No | string (enum) | Which review language to keep. Default "English". "ALL_REVIEW_LANGUAGES" keeps every locale; see the full list below. | "English" |
reviewRatings | No | string (enum) | Which star ratings to keep. Default "ALL_REVIEW_RATINGS". Also accepts the grouped values "POSITIVE" (4–5★), "NEGATIVE" (1–2★), "AVERAGE" (3★), or a single star count "1"–"5". | "NEGATIVE" |
scrapeReviewerInfo | No | boolean | Include the reviewer's profile (name, username, location, avatar, contribution count, profile link) on each row. Default true. When false, the user field is null. | true |
enableAiAnalysis | No | boolean | Turn on AI sentiment/emotion/topic/response-tone classification. Default false. Requires aiApiKey (or a matching environment variable) to actually run. | false |
aiModel | No | string (enum) | Which AI model/provider to use for classification. Default "claude-haiku-4-5". Provider is auto-detected from the name prefix — see the full model list below. | "claude-haiku-4-5" |
aiApiKey | No | string (secret) | API key for the provider matching aiModel. Falls back to the matching environment variable (ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, XAI_API_KEY, DEEPSEEK_API_KEY, PERPLEXITY_API_KEY, MISTRAL_API_KEY) if left blank. Ignored when enableAiAnalysis is false. | (secret — not shown) |
includePropertyAnalytics | No | boolean | Push one extra derived-analytics summary row per hotel after its reviews. Default true. Pure local computation — no extra requests, not billed as an extra result. | true |
proxyConfiguration | No | object | Apify Proxy configuration. Defaults to {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} when left blank — residential is strongly recommended; datacenter IPs get challenged quickly. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Common pitfall: only Hotel_Review-* URLs are supported — TripAdvisor restaurant and attraction URLs are skipped with a logged warning, not converted. And when startUrls contains a hotel name or keyword instead of a direct URL, resolution goes through a Google search and can pick the wrong property for ambiguous names — use the direct Hotel_Review URL whenever accuracy matters.
⬆️ Output
Every review and every property-analytics row is pushed to the Actor's default dataset as normalized JSON, one row per item, with a consistent schema across runs. Export it as JSON, CSV, Excel, XML, or RSS from the Apify Console, or pull it with the API/SDK.
Scraped results
[{"id": "1040504451","type": "review","url": "https://www.tripadvisor.com/ShowUserReviews-g60763-d208453-r1040504451-Hilton_New_York_Times_Square-New_York_City_New_York.html","title": "Perfect Holidays at Hilton Times Square","lang": "en","locationId": "208453","publishedDate": "2025-11-27","publishedPlatform": "OTHER","rating": 5,"helpfulVotes": 0,"text": "We stayed for 2 weeks over the holidays...","roomTip": null,"travelDate": "2025-11","tripType": "FAMILY","user": {"userId": "4381D233A5C57ADAF67693B272BEFE70","name": "Dimitris T","contributions": { "totalContributions": 2, "helpfulVotes": null },"username": "margaretmN8866NJ","userLocation": "Thessaloniki, Greece","avatar": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/1a/f6/de/5a/default-avatar-2020-36.jpg?w=100&h=100&s=1","link": "www.tripadvisor.com/Profile/margaretmN8866NJ"},"ownerResponse": null,"subratings": [{ "name": "Value", "value": 5 },{ "name": "Location", "value": 5 }],"photos": [],"placeInfo": {"id": "208453","name": "Hilton New York Times Square","rating": 4.3,"numberOfReviews": 7879,"locationString": "New York City, New York","latitude": 40.7566,"longitude": -73.9862,"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/","address": "234 W 42nd St, New York City, NY 10036","addressObj": { "street1": "234 W 42nd St", "street2": "", "city": "New York City", "state": "NY", "country": "United States", "postalcode": "10036" },"ratingHistogram": { "count1": 267, "count2": 290, "count3": 704, "count4": 2568, "count5": 5064 }},"aiSentiment": "positive","aiEmotion": "satisfaction","aiTopics": ["location", "service"],"aiResponseTone": null,"aiResponseToneScore": null,"scrapedAt": "2026-08-04T09:12:00Z"},{"id": "1040498211","type": "review","url": "https://www.tripadvisor.com/ShowUserReviews-g60763-d208453-r1040498211-Hilton_New_York_Times_Square-New_York_City_New_York.html","title": "Noisy room, great location","lang": "en","locationId": "208453","publishedDate": "2025-11-20","publishedPlatform": "MOBILE","rating": 3,"helpfulVotes": 2,"text": "Location was unbeatable but street noise kept us up...","roomTip": "Ask for a room on a higher floor away from 42nd St.","travelDate": "2025-11","tripType": "COUPLES","user": null,"ownerResponse": {"id": "9981234","text": "Thank you for your feedback, we're addressing the noise concern...","lang": "en","publishedDate": "2025-11-23","responder": "Hotel Management","connectionToSubject": "GENERAL_MANAGER"},"subratings": [{ "name": "Location", "value": 5 },{ "name": "Cleanliness", "value": 4 }],"photos": [],"placeInfo": { "id": "208453", "name": "Hilton New York Times Square" },"aiSentiment": "neutral","aiEmotion": "disappointment","aiTopics": ["noise", "location"],"aiResponseTone": "professional","aiResponseToneScore": 0.65,"scrapedAt": "2026-08-04T09:12:02Z"},{"id": "1040490087","type": "review","url": "https://www.tripadvisor.com/ShowUserReviews-g60763-d208453-r1040490087-Hilton_New_York_Times_Square-New_York_City_New_York.html","title": "Would not stay again","lang": "en","locationId": "208453","publishedDate": "2025-11-15","publishedPlatform": "OTHER","rating": 1,"helpfulVotes": 5,"text": "Check-in took over an hour and the room wasn't ready...","roomTip": null,"travelDate": "2025-11","tripType": "BUSINESS","user": null,"ownerResponse": null,"subratings": [],"photos": [],"placeInfo": { "id": "208453", "name": "Hilton New York Times Square" },"aiSentiment": "negative","aiEmotion": "frustration","aiTopics": ["booking/check-in"],"aiResponseTone": null,"aiResponseToneScore": null,"scrapedAt": "2026-08-04T09:12:04Z"},{"id": "analytics-208453-2026-08-04T09:15:00Z","type": "propertyAnalytics","locationId": "208453","placeInfo": { "id": "208453", "name": "Hilton New York Times Square" },"reviewsAnalyzed": 200,"ratingHistogramPercent": { "count1Pct": 2.99, "count2Pct": 3.25, "count3Pct": 7.88, "count4Pct": 28.75, "count5Pct": 57.13 },"responseRate": 41.5,"avgResponseTimeDays": 3.2,"avgSubratingsByCategory": { "Value": 4.6, "Location": 4.9, "Cleanliness": 4.7, "Service": 4.8 },"scrapedAt": "2026-08-04T09:15:00Z"}]
⚠️ The propertyAnalytics row is pushed without a charged event, so it never bills as an extra result — if you're reconciling usage against dataset size, filter it out with type == "review".
💡 How can I use the data extracted with TripAdvisor Review Scraper — Sentiment & Analytics?
- 🏨 Hotel and reputation-management teams: filter on
aiSentiment: "negative"andaiTopicsto route specific complaint categories (noise, cleanliness, check-in) to the right department before they show up in a public rating drop. - 🤖 AI engineers and LLM developers: pass the structured
text,rating, andaiSentiment/aiEmotionfields directly into a retrieval-augmented agent or a summarization pipeline — no separate classification step needed whenenableAiAnalysisis on. - 📊 Market researchers and revenue teams: compare
ratingHistogramPercentandavgSubratingsByCategoryacross competing properties to benchmark guest experience by category, not just overall star rating. - 💬 Guest-experience and CX teams: use
responseRate,avgResponseTimeDays, andaiResponseTone/aiResponseToneScoreto audit whether management replies are timely and genuinely address complaints, versus generic boilerplate.
📈 How do you monitor guest sentiment and response quality over time?
Guest-sentiment monitoring means re-running the same hotel URL on a schedule and comparing each run's aggregate numbers against the last, rather than reading every individual review. Because the Actor pushes a fresh propertyAnalytics row (and a fresh aiSentiment distribution across the review rows) on every run, the delta between two runs is what tells you something changed — not the absolute numbers.
Track these fields between runs: responseRate and avgResponseTimeDays (is management getting slower or more responsive?), ratingHistogramPercent (is the property drifting toward more 1–2★ reviews?), and the distribution of aiSentiment/aiEmotion across newly published reviews (is a specific complaint topic, via aiTopics, trending up?).
A concrete workflow: set sortOrder to newest, schedule the Actor to run daily or weekly against your property list using Apify's built-in Schedules, and diff the new run's propertyAnalytics row against the previous one — alert your team when responseRate drops or a negative-sentiment topic spikes.
🔌 Integrate TripAdvisor Review Scraper — Sentiment & Analytics and automate your workflow
This Actor works with any language or tool that can call the Apify API — trigger it with apify_client, a raw HTTP request, or the Apify CLI.
REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")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,"reviewRatings": "NEGATIVE",}run = client.actor("<ACTOR_ID_OR_TASK_NAME>").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("type") == "review":print(item["rating"], item.get("aiSentiment"), item["text"][:80])
Scheduled monitoring and delivery
Set up a recurring run from the Actor's Schedules tab in the Apify Console to re-scrape a property on a fixed interval, and attach a webhook to fire on run completion (e.g. to a Slack or email integration) so a new negative-sentiment spike doesn't sit unnoticed in a dataset nobody opened.
⚖️ Is it legal to scrape TripAdvisor reviews?
Scraping publicly visible TripAdvisor review pages is generally lawful — you're collecting what any visitor to the page can already see, and this Actor doesn't bypass any login wall or paywall. That said, this Actor's review rows can include personal data about reviewers (display name, username, home location, avatar, profile link) when scrapeReviewerInfo is left on, so GDPR and CCPA considerations apply to that part of the output, not just TripAdvisor's own terms of service. If your use case is privacy-sensitive, set scrapeReviewerInfo to false to strip all reviewer-identifying fields and keep only review text, ratings, and owner responses. Scraping for internal monitoring or reputation management carries a different risk profile than scraping personal data at scale for AI training or resale. Consult your legal team for commercial use cases involving bulk storage of reviewer personal data.
❓ Frequently asked questions
Does this scraper extract reviews for restaurants or attractions?
No — this Actor is scoped to TripAdvisor hotel pages (Hotel_Review-* URLs) only. Restaurant and attraction URLs are detected and skipped with a logged warning rather than processed.
How many reviews does this Actor return per hotel?
Up to whatever maxComments is set to, capped at 10,000 by the input schema's maximum — the Actor also stops pagination as a safety measure once it has paged past 10,000 reviews internally, regardless of maxComments. TripAdvisor's GraphQL endpoint returns 10 reviews per page; the Actor pages through automatically.
Is AI sentiment analysis required to use this Actor?
No. enableAiAnalysis is off by default. With it off — or on without a resolvable provider key — the Actor still returns the full review dataset and the free propertyAnalytics row; the five AI fields are simply null, never guessed or faked.
Which AI providers does the sentiment/response-tone analysis support?
Anthropic (Claude), OpenAI, Google (Gemini), xAI (Grok), DeepSeek, Perplexity (Sonar), and Mistral, auto-detected from the aiModel value you choose. You supply your own provider API key (or a matching environment variable); usage is billed by that provider directly, not by this Actor.
Does the sortOrder: "relevant" option actually sort by relevance?
Not currently — TripAdvisor's review endpoint doesn't expose a separate relevance ranking, so relevant returns the same order as newest. It's kept as its own option in case TripAdvisor adds a true relevance sort later.
How does this Actor handle TripAdvisor's anti-bot protection?
TripAdvisor fronts every request with DataDome bot detection. The Actor uses Safari TLS impersonation, sticky proxy sessions per hotel, and defaults to Apify's residential proxy group — datacenter IPs and no-proxy runs get challenged or blocked quickly, which is why residential is the default when proxyConfiguration is left blank.
Is the derived property-analytics row billed as an extra AI feature?
No — it's local arithmetic (percentages and averages) over reviews the run already collected, with zero extra HTTP requests. It's pushed to the dataset without a charged event, so it never counts as an extra billed result.
How do I monitor a hotel's guest sentiment over time?
Schedule a recurring run against the same hotel URL using Apify Schedules, then diff each run's propertyAnalytics row and the aiSentiment/aiTopics distribution on new review rows against the previous run to catch a rating slide or a rising complaint topic early.
Does this Actor work with Claude, ChatGPT, or other AI agent frameworks?
The Actor itself is callable as a standard Apify Actor run via HTTP or apify_client, which any agent framework can invoke as a tool — issue the run, poll or wait for completion, and read the dataset back as grounding context. It also happens to use several of those same providers (Claude, GPT, Gemini) internally for the optional sentiment/response-tone step.
Can I use this Actor without managing my own proxies or a TripAdvisor account?
Yes. No TripAdvisor login is required, and Apify Proxy (residential group, by default) is handled for you unless you supply your own proxyConfiguration. You do need to supply your own AI provider API key if you turn on enableAiAnalysis.
💬 Your feedback
Found a bug or missing a field? Let us know through the Actor's Issues tab on the Apify Store listing, or via Scrapier's support contact on the Console — feedback shapes what gets fixed first.