Tripadvisor Reviews Scraper avatar

Tripadvisor Reviews Scraper

Pricing

from $0.25 / 1,000 reviews

Go to Apify Store
Tripadvisor Reviews Scraper

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

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.

InputTripadvisor place URLs, up to 50 per run
OutputOne row per review
Ceiling5,000 reviews per place
Account neededNone, 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
}
FieldDefaultWhat it is
placeUrlsbox starts at one example hotelTripadvisor hotel, restaurant or attraction URLs, or bare slugs. Leave it empty and you get one labelled sample row instead of a real run.
maxReviewsPerPlacebox starts at 20Reviews per place, newest first, up to 5,000. Rounds up to the next whole page.
maxPlacesbox starts at 10How many of the URLs you supplied get processed, up to 50. Extras beyond it are ignored.
proxyConfigurationnoneOptional. 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"
}
FieldWhat it is
reviewIdTripadvisor's own id. Stable, so use it as your dedupe key across runs.
publishedAt, createdAtWhen the review went up, and when it was written. Usually the same day.
tripDateTripadvisor's stay date for the visit, passed through as they publish it. Not the same thing as when the review was posted.
tripTypeFAMILY, BUSINESS, SOLO, COUPLES, FRIENDS, or null when the reviewer skipped it.
reviewerHometownnull whenever the reviewer has no hometown on their profile.
reviewerContributionsHow many reviews that person has written. A useful weight when a rating looks odd.
ownerResponseTextThe owner's reply, with ownerResponseAt beside it, or null when there is none.
placeRating, placeReviewCountThe place's overall score and total, as Tripadvisor showed them at the time of the run.
scrapedAtWhen 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.

RowHow to spot itCharged
A reviewa reviewId and no _sampleyes
The sample row_sample: trueno
A diagnostic_diagnostic: true and an errorCodeno

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.

CodeWhat it means
BAD_INPUTThat entry was not a Tripadvisor place URL or slug. The input field shows what you sent.
NOT_FOUNDThe page answered 404. Usually a URL that has moved or a place that was removed.
BLOCKEDTripadvisor refused the request. Try again, or put your own servers in proxyUrls.
RATE_LIMITEDToo many requests too quickly. Lower maxReviewsPerPlace or come back later.
NO_RESULTSThe page loaded and carried no reviews. Either the place has none, or the URL is not a review page.
NETWORKTripadvisor 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

  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 reviewId so 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.
  • reviewerHometown is frequently null, and so is tripType. Both depend on the reviewer filling in a profile.
  • Translation is Tripadvisor's. language records 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 scrapedAt records when yours was read.

🧭 Which travel scraper do you need?

If you wantUse
Tripadvisor reviews for a place you can linkThis one
Guest reviews from Booking.com, with stay datesBooking.com Reviews Scraper
Hotels and live prices for your own datesBooking.com Hotels Scraper
Nightly rates compared across booking sitesGoogle Hotels Scraper
Short-let listings, hosts and ratingsAirbnb 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.