Tripadvisor Reviews Scraper
Pricing
from $0.25 / 1,000 reviews
Tripadvisor Reviews Scraper
Scrape Tripadvisor reviews for hotels, restaurants and attractions. It follows the next pages, so you get the old reviews too, newest first. Rows have the rating, title, full text, reviewer name and hometown. You also get the trip date, trip type and the owner's reply. $0.25 per 1,000 reviews.
Pricing
from $0.25 / 1,000 reviews
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
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.
š„ 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. |
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. |
NETWORK | Tripadvisor could not be reached. Re-run it. |
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
- Open Tripadvisor Reviews Scraper and click Try for free.
- Paste one or more place URLs into Tripadvisor place URLs, exactly as the address bar gives them.
- Set Reviews per place. Start around 20 to see the row shape.
- Raise Maximum places if you are feeding it a long list, then click Start.
- 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 sort or filter options. Reviews come back newest first, and any filtering by rating or date is yours to do 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. Country domains are accepted and the reviews come back in
whatever language the page served them.
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.