Tripadvisor Reviews Scraper
Scrape Tripadvisor reviews for hotels, restaurants and attractions. Get rating, full text, reviewer, hometown, trip type and owner reply. $0.25/1,000.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
placeUrls,maxReviewsPerPlace,maxPlaces(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00025 per review = $0.25 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Review | One Tripadvisor review stored in the dataset. Sample rows and diagnostic rows are never charged. | $0.00025 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-10, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
placeUrls | Tripadvisor hotel, restaurant or attraction review URLs. A bare slug such as Hotel_Review-g60763-d671150-Reviews-The_Empire_Hotel-New_York_City_New_York.html also works. Country domains (.co.uk, .fr, ...) are accepted. Leave empty to get one free, clearly labelled sample row. | array |
maxReviewsPerPlace | How many reviews to return for each place, newest first. Tripadvisor serves 10 per page, so this rounds up to the next page. Only stored review rows are charged. | integer |
maxPlaces | Safety bound on how many of the supplied URLs are processed in one run. | integer |
travelerTypes | Optional. Keep only reviews from these kinds of trip, for example Families. Leave empty for all of them. Tripadvisor does the filtering, so reviewers who skipped the trip-type question are left out whenever a type is picked. | array |
sortBy | Most recent is Tripadvisor's default. Detailed reviews is Tripadvisor's own order for reviews that say the most, weighed with how recent they are. | string |
What you get
A structured dataset — each result includes fields like:
placeNameratingtitlereviewTextreviewerNamereviewerHometownpublishedAttripTypereviewUrlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
1 ready-to-run use cases
Tripadvisor Reviews for a Hotel or Restaurant
Get Tripadvisor reviews for any hotel or restaurant: rating, title, full text, reviewer, trip date and owner reply.
Related tools in Reviews & Reputation Data
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Booking.com Reviews Scraper
Scrape Booking.com guest reviews. Get the score, title, liked and disliked text, reviewer name, country and stay dates. $1.50 per 1,000 reviews.
Google Play Reviews Scraper
Google Play reviews by app ID or URL: score, text, reviewer, date, developer reply. Any country. Up to 5,000 per app. $0.09 per 1,000.
2GIS Reviews Scraper
Scrape 2GIS reviews by place URL or city: rating, text, author, date, photos, owner replies. No API key. $0.50 per 1,000.
Yelp Scraper
Scrape Yelp businesses and reviews through Yelp's official Fusion API. Get rating, review count, price, phone, address, GPS and text. Bring your own key.
Glassdoor Company Reviews Scraper
Scrape Glassdoor reviews: pros, cons, six sub-ratings, recommend rate and CEO approval. First page per company without login. $2.50 per 1,000.
Google Reviews Monitor — Multi-Location Alerts & Reports
Watch Google reviews for every location on a schedule. Get only the new ones, rating-drop alerts in Slack and AI reply drafts. $1.00 per 1,000 reviews.
Where this tool sits
- Categories
- Reviews & Reputation Data Travel, Hotels & Events
- Platforms
- Tripadvisor
Tripadvisor Reviews Scraper: every review for a hotel, restaurant or attraction
Paste the Tripadvisor page URL for a place and get its reviews back as rows: the star rating, the title, the full text, when it was posted, the trip type, the reviewer and their contribution count, and the owner's reply where there is one. It keeps following the next page rather than stopping at the first screen.
Hometown is the field to expect gaps in. Tripadvisor only shows it when the reviewer filled in a profile, so reviewerHometown is null on plenty of otherwise complete rows.
| Input | Tripadvisor place URLs, up to 50 per run |
| Output | One row per review |
| Ceiling | 5,000 reviews per place |
| Account needed | None, and no Tripadvisor key |
| Price | $0.25 per 1,000 reviews, flat on every plan |
🔍 What Tripadvisor Reviews Scraper does
Hand it the URL from your address bar. Hotels, restaurants and attractions all work, and so do the country domains: .co.uk, .fr, .de and the rest. A bare slug like Hotel_Review-g60763-d671150-Reviews-The_Empire_Hotel-New_York_City_New_York.html is enough on its own.
Then it pages. Tripadvisor does not use the same page size everywhere, so the step is read off the first page rather than assumed: hotels and attractions hand out ten reviews at a time, restaurants fifteen. Get that wrong and the second page silently repeats the first, which is why it is measured instead of guessed.
Each row carries the place alongside the review, so placeName, placeRating and placeReviewCount come back on every line and a multi-place run stays joinable without a lookup.
Two optional settings change what comes back: the traveller type (families, couples, solo, business, friends) and the order (most recent, or Tripadvisor's detailed reviews). Tripadvisor applies both itself, so a families-only run reads families' reviews and nothing else.
📥 What you give it
{
"placeUrls": [
"https://www.tripadvisor.com/Hotel_Review-g60763-d671150-Reviews-The_Empire_Hotel-New_York_City_New_York.html"
],
"maxReviewsPerPlace": 200,
"maxPlaces": 10
}
| Field | Default | What it is |
|---|---|---|
placeUrls | box starts at one example hotel | Tripadvisor hotel, restaurant or attraction URLs, or bare slugs. Leave it empty and you get one labelled sample row instead of a real run. |
maxReviewsPerPlace | box starts at 20 | Reviews per place, newest first, up to 5,000. Rounds up to the next whole page. |
maxPlaces | box starts at 10 | How many of the URLs you supplied get processed, up to 50. Extras beyond it are ignored. |
travelerTypes | none | Only reviews from these trips: Family, Couples, Solo, Business, Friends, as a list. Reviewers who skipped the question are left out once you pick one. |
sortBy | recent | recent is newest first, Tripadvisor's default. detailed is Tripadvisor's order for reviews that say the most, weighed with how recent they are. |
proxyConfiguration | none | Optional. Put your own servers in proxyUrls and they are used exactly as given. |
The limit is per place, not per run. Ten URLs at maxReviewsPerPlace: 200 is up to 2,000 rows, not 200 shared out.
📤 What you get back
A real row from a recent run, with the reply trimmed here for length:
{
"reviewId": "1074086621",
"reviewUrl": "https://www.tripadvisor.com/ShowUserReviews-g60763-d671150-r1074086621-...",
"rating": 5,
"title": "Warm welcome, comfortable, quiet room, super location",
"reviewText": "Very nice stay local to theaters and shopping for a NYC visit. We were warmly welcomed by Keenan and Leslie at the front desk, which made for a great start to our vacation",
"publishedAt": "2026-08-20",
"createdAt": "2026-08-20",
"tripDate": "2026-08-31",
"tripType": "FAMILY",
"language": "en",
"helpfulVotes": 0,
"reviewerName": "Amy R",
"reviewerId": "637B3F946F74826C3681F83597DDD0B0",
"reviewerProfileUrl": "https://www.tripadvisor.com/Profile/amyrL881UW",
"reviewerContributions": 2,
"reviewerHometown": null,
"ownerResponseText": "Thank you for the wonderful review! We're so glad you enjoyed our convenient location...",
"ownerResponseAt": "2026-08-20",
"placeId": "671150",
"placeName": "The Empire Hotel",
"placeUrl": "https://www.tripadvisor.com/Hotel_Review-g60763-d671150-...",
"placeType": "ACCOMMODATION",
"placeRating": 3.7,
"placeReviewCount": 9811,
"scrapedAt": "2026-08-20T20:13:29.282Z"
}
| Field | What it is |
|---|---|
reviewId | Tripadvisor's own id. Stable, so use it as your dedupe key across runs. |
publishedAt, createdAt | When the review went up, and when it was written. Usually the same day. |
tripDate | Tripadvisor's stay date for the visit, passed through as they publish it. Not the same thing as when the review was posted. |
tripType | FAMILY, BUSINESS, SOLO, COUPLES, FRIENDS, or null when the reviewer skipped it. |
reviewerHometown | null whenever the reviewer has no hometown on their profile. |
reviewerContributions | How many reviews that person has written. A useful weight when a rating looks odd. |
ownerResponseText | The owner's reply, with ownerResponseAt beside it, or null when there is none. |
placeRating, placeReviewCount | The place's overall score and total, as Tripadvisor showed them at the time of the run. |
scrapedAt | When the page was read. Reviews get edited and deleted, so a row is a snapshot. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Charged |
|---|---|---|
| A review | a reviewId and no _sample | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
The overview table in the console shows the review columns only, so a diagnostic row looks nearly blank there. Switch to the JSON or All fields view to read it.
| Code | What it means |
|---|---|
BAD_INPUT | That entry was not a Tripadvisor place URL or slug. The input field shows what you sent. |
NOT_FOUND | The page answered 404. Usually a URL that has moved or a place that was removed. |
BLOCKED | Tripadvisor refused the request. Try again, or put your own servers in proxyUrls. |
RATE_LIMITED | Too many requests too quickly. Lower maxReviewsPerPlace or come back later. |
NO_RESULTS | The page loaded and carried no reviews. Either the place has none, or the URL is not a review page. With a traveller type set it can also mean no review matched, and the row's note says so. |
NETWORK | Tripadvisor could not be reached. Re-run it. |
FILTER_NOT_APPLIED | Tripadvisor did not apply the traveller type or order you asked for on that place, so nothing was delivered for it rather than unfiltered reviews. Run it without them, or try again later. |
One bad URL never stops the others. Each place gets its own diagnostic row if it returns nothing, and the rest of the run carries on.
▶️ How to run it
1. Open Tripadvisor Reviews Scraper and click Try for free. 2. Paste one or more place URLs into Tripadvisor place URLs, exactly as the address bar gives them. 3. Set Reviews per place. Start around 20 to see the row shape. 4. Raise Maximum places if you are feeding it a long list, then click Start. 5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
💰 How much does it cost?
$0.25 per 1,000 reviews. Flat on every Apify plan, no volume tiers.
You pay per review row delivered. The sample row, diagnostic rows, reviews already seen in the same run and reviews with neither text nor a title are all free.
💡 What people use it for
- Reading everything below three stars for a property, to find the complaint that keeps recurring.
- Checking which reviews an owner replied to and how quickly, across a set of places.
- Watching a restaurant or hotel on a schedule and deduping on
reviewIdso each run is only new. - Comparing every branch or every competitor in a city on the same terms, in one run.
- Handing a model the review text with the trip type attached, so it can separate business from
family complaints.
🚧 What it does not do
- Reviews only. No room rates, no availability, no menu, no opening hours, no photos.
- No rating or date filter. Traveller type and order are the two settings. Filter on
ratingor
publishedAt afterwards.
- 5,000 reviews per place. A very large hotel has more history than that.
- Empty reviews are skipped. A row with no text and no title is dropped rather than delivered.
reviewerHometownis frequentlynull, and so istripType. Both depend on the reviewer
filling in a profile.
- Translation is Tripadvisor's.
languagerecords what the review is in, and the text is
whatever the page served.
- It does not search. Give it the URL of a place you already have. There is no name lookup.
- Rows are a snapshot. Reviews get edited and removed, and
scrapedAtrecords when yours was
read.
🧭 Which travel scraper do you need?
| If you want | Use |
|---|---|
| Tripadvisor reviews for a place you can link | This one |
| Guest reviews from Booking.com, with stay dates | Booking.com Reviews Scraper |
| Hotels and live prices for your own dates | Booking.com Hotels Scraper |
| Nightly rates compared across booking sites | Google Hotels Scraper |
| Short-let listings, hosts and ratings | Airbnb Listings Scraper |
❓ Questions people ask
Do I need a Tripadvisor account or API key? No. It reads the public review pages.
Does it work on restaurants and attractions, or only hotels? All three. The page size differs between them and that is handled for you.
Can I use a .co.uk or .fr URL? Yes, and the domain decides the language. A .fr page lists French reviews plus English ones Tripadvisor has machine-translated into French, and on those rows language still says en, the language the review was written in.
Can I monitor a place over time? Yes. Schedule it, ask for a small number of reviews per run, and dedupe on reviewId. Anything already seen in the same run is skipped and free.
Why did one of my URLs return a single row with an error on it? That place returned nothing. The errorCode says why, it is not charged, and the other places in the run still ran.
Is scraping reviews legal? These are public reviews on public pages. They contain personal data all the same, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on scraping and the law is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the place URL and the run ID. The errorCode on the diagnostic row usually names the problem on its own.