Viator Reviews Scraper | Tour Reviews and Ratings avatar

Viator Reviews Scraper | Tour Reviews and Ratings

Pricing

from $1.70 / 1,000 reviews

Go to Apify Store
Viator Reviews Scraper | Tour Reviews and Ratings

Viator Reviews Scraper | Tour Reviews and Ratings

Viator scraper for tour and activity reviews: 100 reviews in 1 second, 26 fields each. Star rating, title, text, traveler type, reviewer, photos, operator reply, Viator or Tripadvisor source, plus the tour title, city, operator and overall rating. Start from a tour link, product code or search term.

Pricing

from $1.70 / 1,000 reviews

Rating

0.0

(0)

Developer

SilentFlow

SilentFlow

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share

Viator Reviews Scraper | Tour Reviews and Ratings (2026)

Viator reviews, 26 fields each, from any URL.

From SilentFlow. Creators of Facebook Search Scraper and JD Products Scraper (#1 for β€œjd scraper” in Apify Store search), with 750,000+ combined lifetime runs.

Every traveler review of the Viator tours you sell, compete with or study, one row per review, from a tour link, a product code or a search term. Our test run turned the Viator page of Epic Tours' Eiffel Tower climb into its 100 newest reviews in under 2 seconds, each with the star rating, title and text, the traveler type, the reviewer, the operator's reply, the photos, and the tour's own title, city, operator and overall rating. No Viator account, no partner key.

Why choose this actor?

Clicking "Show more reviews" ten at a time on every Viator tour page? Hunting for each competitor's tour link before you can read a single review? Getting rows that do not even say which tour, which city or which operator they are about?

  • 25 filled fields per review, not 18. On our default run (100 reviews of the Eiffel Tower Guided Tour by Stairs, Paris), 22 data fields were filled on all 100 rows and 3 more on 99 of them: the review (id, link, title, text, language, star rating, traveler type, helpful votes, photo count, machine-translation flag, source), the reviewer (name and id), the operator's reply (text, author, date) and the tour itself (code, title, link, destination, destination id, operator, exact rating and number of reviews). The most used Viator reviews scraper lists 18 fields, without the tour's title, city or operator.
  • Start from a place, not only a link. Type Colosseum and the run reads the first tours Viator shows for it: in our test, the 2 first Colosseum tours gave their 60 most helpful reviews in 1.2 seconds. No need to collect tour links first, where the most used alternative takes links only.
  • Paste product codes straight from your booking system or affiliate feed. 3251TOW and 3731EIFFELTOWER gave 50 one- and two-star Tripadvisor reviews of the Tower of London ticket and an Eiffel Tower elevator tour in under a second in our test. Links from any Viator language site work too: three ways in, in one run.

Try Viator Reviews Scraper

Try your first 100 reviews

Paste this input in the JSON tab of the Input page and press Start. It reads the 100 newest reviews of the Eiffel Tower Guided Tour by Stairs with Reserved Access (Epic Tours, Paris).

{
"startUrls": [
{ "url": "https://www.viator.com/tours/Paris/Eiffel-Tower-guided-climb/d479-5522676P3" }
],
"maxReviews": 100,
"sortBy": "newest",
"source": "all",
"maxToursPerSearch": 3
}

It runs on the Apify Free plan. Each review becomes one row of your dataset: open the Output tab to see the table, switch to the "Reviews with tour and reply" view for every field, or export the rows as JSON, CSV or Excel.

How it works

Copy to your AI assistant

Paste this block into Claude, ChatGPT or Cursor to give it the full picture of this scraper:

You have access to the Viator Reviews Scraper on Apify: silentflow/viator-reviews-scraper
It reads the public traveler reviews of tours and activities on Viator (www.viator.com), without an
account, and returns one row per review, with the tour it is about. It reads Viator's own reviews and
the Tripadvisor reviews Viator shows on the same tour.
Input schema (no field is required; give at least one tour link, search term or product code):
- startUrls (array of {url}): Viator tour pages from any language site, such as
https://www.viator.com/tours/Paris/Eiffel-Tower-guided-climb/d479-5522676P3
(query strings are fine). City and attraction pages are not tours: use searches for those.
- searches (array of strings): places, attractions or kinds of tours as typed on Viator
("Colosseum", "Lisbon food tour"). Each term reads the first maxToursPerSearch tours Viator shows.
- productIds (array of strings): Viator product codes, the end of a tour link ("5522676P3", "d479-5522676P3").
- maxReviews (integer, default 100): reviews saved per tour, Viator's and Tripadvisor's together.
- sortBy (string, default "newest"): newest | highest_rated | most_helpful.
- ratings (array of strings, optional): "1" to "5", keep only these star ratings.
- travelerTypes (array of strings, optional): couple | family | friends | solo | business.
- source (string, default "all"): all | viator | tripadvisor. "all" reads Viator's reviews first,
then Tripadvisor's, until maxReviews.
- maxToursPerSearch (integer, default 3, at most 24): tours read per search term.
Output per review (28 fields):
- id (string, Viator review id), url (string, the tour page + #review-{id}), productCode (string),
productTitle (string|null), productUrl (string|null)
- title (string|null), text (string|null), language (string|null, e.g. "en"),
travelerType (string|null: couples, family, friends, solo, business), isMachineTranslated (boolean),
source ("viator" | "tripadvisor")
- reviewerName (string|null), reviewerId (string|null)
- rating (number, 1 to 5), helpfulVotes (integer), photosCount (integer),
productRating (number|null, the tour's exact average out of 5),
productReviewsCount (integer|null, all the tour's reviews)
- ownerResponse (string|null, the operator's reply), ownerResponseAuthor (string|null),
ownerResponseDate (RFC 3339|null)
- destination (string|null), destinationId (string|null), supplierName (string|null, the operator),
publishedAt (RFC 3339 UTC, the review's day)
- photos (array of image URLs, empty when the review has none)
- searchQuery (string|null, the search term that found the tour), scrapedAt (RFC 3339)
Use apify-client for Python or JavaScript: client.actor("silentflow/viator-reviews-scraper").call(run_input=...).

How to scrape Viator tour reviews

Three inputs, from the simplest to the most complete. Each one runs as is.

Copy the link from your browser, any Viator language site, tracking parameters included.

{
"startUrls": [
{ "url": "https://www.viator.com/fr-FR/tours/London/Tower-of-London-Entrance-Ticket-Including-Crown-Jewels/d737-3251TOW?pid=P00012345&mcid=42383&medium=link" }
],
"travelerTypes": ["family"],
"maxReviews": 120
}

In our test this French-site link returned the 120 newest reviews families left for the Tower of London and Crown Jewels ticket in under a second, each row carrying the clean English link of the tour.

Read the most helpful reviews of the top tours for a place

No link needed: type the place the way you would in Viator's search box.

{
"searches": ["Colosseum"],
"maxToursPerSearch": 2,
"maxReviews": 30,
"sortBy": "most_helpful"
}

The run read the 2 first tours Viator shows for "Colosseum" (an arena floor, Forum and Palatine Hill guided tour, and a Colosseum and Forum tour with optional arena or underground access) and saved the 30 most helpful reviews of each: 60 rows in 1.2 seconds, each with searchQuery set to Colosseum.

Pull the one and two star Tripadvisor reviews of two tours by code

{
"productIds": ["3251TOW", "3731EIFFELTOWER"],
"ratings": ["1", "2"],
"source": "tripadvisor",
"maxReviews": 25
}

Two product codes, only the complaints, only the Tripadvisor reviews Viator shows: 50 rows in under a second in our test, 25 per tour, every rating a 1 or a 2.

Input parameters

ParameterTypeDefaultWhat it does
startUrlsarray of linksone tour, prefilledViator tour pages to read. Any language site, any tracking parameters.
searchesarray of textemptyPlaces, attractions or kinds of tours, as typed on Viator. Each term reads its first tours.
productIdsarray of textemptyViator product codes, such as 5522676P3, or the d479-5522676P3 end of a link.
maxReviewsinteger100Reviews saved for each tour, Viator's and Tripadvisor's together.
sortByselectnewestnewest, highest_rated or most_helpful.
ratingsmulti-selectallKeep only these star ratings, 1 to 5.
travelerTypesmulti-selecteveryoneKeep only couple, family, friends, solo or business travelers.
sourceselectallall, viator or tripadvisor.
maxToursPerSearchinteger3How many tours each search term reads, up to 24.

No field is required: the form opens with a tour already in place. Mix the three kinds of input in one run, and a tour given twice is read once.

Accepted tour links. https://www.viator.com/tours/{City}/{Tour-name}/d{destination}-{code}, from the English site or any language site (/fr-FR/, /de-DE/, /en-GB/ ...), with or without ?pid=...&mcid=... tracking parameters or a #reviews anchor. Every row carries the clean English link.

Accepted product codes. The code at the end of a tour link: 5522676P3, 3251TOW, 3731EIFFELTOWER, in any case, alone or with its destination (d479-5522676P3). A code typed in the search field or a link pasted in the codes field is recognised too.

Search terms. Anything you would type in Viator's search box: a city (Lisbon), an attraction (Colosseum), a kind of tour (Paris food tour). The run reads the first tours in the order Viator shows them.

What data can you extract from Viator?

One row per review, 28 fields, flat, ready for a spreadsheet, a BI tool or a language model.

GroupFieldsNotes
Identityid, url, productCode, productTitle, productUrlid is Viator's review id. url is the tour page with #review-{id}, unique per row.
Reviewtitle, text, language, rating, travelerType, isMachineTranslated, sourcerating is 1 to 5 stars. travelerType is couples, family, friends, solo or business. source is viator or tripadvisor.
ReviewerreviewerName, reviewerIdThe public display name and its stable id.
EngagementhelpfulVotes, photosCount, photosphotos lists full-size image links, empty when the traveler posted none.
Operator replyownerResponse, ownerResponseAuthor, ownerResponseDatenull when the operator did not reply.
Tourdestination, destinationId, supplierName, productRating, productReviewsCountproductRating is the tour's exact average (4.8), not the rounded stars the page shows (5).
TimepublishedAt, scrapedAtRFC 3339 in UTC. Viator dates reviews by day, so publishedAt reads midnight UTC.
SearchsearchQueryThe search term that found the tour, null for links and codes.

Missing values are null, never an empty text. Numbers are numbers, booleans are booleans.

Output example

A real row of our default run:

{
"id": "1075606405",
"url": "https://www.viator.com/tours/Paris/Eiffel-Tower-guided-climb/d479-5522676P3#review-1075606405",
"productCode": "5522676P3",
"productTitle": "Eiffel Tower Guided Tour by Stairs with Reserved Access",
"productUrl": "https://www.viator.com/tours/Paris/Eiffel-Tower-guided-climb/d479-5522676P3",
"title": "Great experience",
"text": "It was great. Our tour guide was excellent (Natalie), she answers all our questions and very knowledgeable of the area and the Eiffel Tower itself. We had fun.",
"language": "en",
"travelerType": "family",
"isMachineTranslated": false,
"source": "viator",
"reviewerName": "Johane_T",
"reviewerId": "214068928",
"rating": 5,
"helpfulVotes": 0,
"photosCount": 2,
"productRating": 4.8,
"productReviewsCount": 6193,
"ownerResponse": "We’re delighted to hear that Natalie made your experience so enjoyable! It’s wonderful to know that she was knowledgeable, attentive to your questions, and helped make the tour both informative and fun. Thank you for sharing your lovely feedback. We’ll be sure to pass it along to Natalie!",
"ownerResponseAuthor": "OpsTeam_EpicTours",
"ownerResponseDate": "2026-08-31T00:00:00Z",
"destination": "Paris",
"destinationId": "479",
"supplierName": "Epic Tours",
"publishedAt": "2026-08-30T00:00:00Z",
"photos": [
"https://media.tacdn.com/media/photo-w/34/65/c1/de/caption.jpg",
"https://media.tacdn.com/media/photo-w/34/65/c1/dd/caption.jpg"
],
"searchQuery": null,
"scrapedAt": "2026-10-28T02:57:07Z"
}

Advanced usage

Watch the new reviews of your own tours every week

{
"productIds": ["5522676P3", "3731EIFFELTOWER"],
"sortBy": "newest",
"maxReviews": 50
}

Save this input as a task and schedule it weekly in the Apify Console. Newest first, each run brings the latest 50 reviews of each tour; keep the id column to spot the new ones and route the low ratings to the team on duty.

Find what travelers complain about at an attraction

{
"searches": ["Colosseum underground"],
"maxToursPerSearch": 5,
"ratings": ["1", "2"],
"maxReviews": 100
}

The one and two star reviews of the first 5 tours of an attraction, side by side. Group the text column by productTitle and the recurring problems (queues, meeting point, guide, value) stand out before you design or reprice your own tour.

Compare what families and couples say about the same tour

{
"startUrls": [
{ "url": "https://www.viator.com/tours/London/Tower-of-London-Entrance-Ticket-Including-Crown-Jewels/d737-3251TOW" }
],
"travelerTypes": ["family", "couple"],
"maxReviews": 200
}

Filters combine: here the run keeps only families and couples, then travelerType on each row lets you split the two groups in a pivot table. Add "ratings": ["1", "2"] to see only their complaints.

Keep only the Tripadvisor reviews Viator shows

{
"productIds": ["5522676P3"],
"source": "tripadvisor",
"maxReviews": 300
}

Viator shows Tripadvisor reviews next to its own on many tours. source keeps one side or the other; with all, the run reads Viator's reviews first, then Tripadvisor's, until maxReviews. In our test, a tour with only 2 business-traveler reviews on Viator was completed with 8 from Tripadvisor to reach the 10 asked for.

Build a review dataset for sentiment analysis

from apify_client import ApifyClient
import pandas as pd
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("silentflow/viator-reviews-scraper").call(run_input={
"searches": ["Paris food tour", "Rome food tour", "Lisbon food tour"],
"maxToursPerSearch": 5,
"maxReviews": 200,
})
rows = client.dataset(run["defaultDatasetId"]).list_items().items
df = pd.DataFrame(rows)
# one line per review, with the city and operator it is about
print(df.groupby(["destination", "supplierName"])["rating"].agg(["count", "mean"]))
df[["destination", "productTitle", "rating", "travelerType", "text"]].to_csv("food_tours_reviews.csv", index=False)

Three cities, five tours each, up to 200 reviews per tour: a labeled corpus (stars, traveler type, language) ready for topic modeling or a language model, with the operator and city on every line.

FAQ

Do I need a Viator account or a partner API key? No. The actor reads the reviews any visitor sees on a tour page. No login, no key, nothing to set up before you press Start.

What is Viator? Viator is Tripadvisor's marketplace for tours, activities and attraction tickets. Each tour page carries the reviews of travelers who booked it on Viator, and on many tours the Tripadvisor reviews of the same experience.

Which reviews do I get, Viator's or Tripadvisor's? Both, by default. source: "all" reads Viator's own reviews first, then the Tripadvisor reviews Viator shows, until maxReviews per tour. Each row says where it comes from in source. Pick viator or tripadvisor to keep one side.

How many reviews can I get per tour? As many as you set in maxReviews: the run reads page after page until it has them or the tour has no more. Popular tours have thousands of reviews (6,193 for the Eiffel Tower climb of our default run). Set the number you need: the run stops there.

How fresh is the data? Live. Every run reads the tour pages at run time, nothing is cached. Viator dates reviews by day, so publishedAt is the day of the review at midnight UTC.

How does a search term pick its tours? The run reads the first tours in the order Viator's own search shows them, up to maxToursPerSearch. Viator's search sometimes mixes in related tours: in our test, a Tower of London ticket came third for "Eiffel Tower". When you know the exact tours, give their links or codes; searchQuery on each row tells you which term found the tour.

Can I combine filters? Yes. Star ratings, traveler types and source combine: "ratings": ["1", "2"] with "travelerTypes": ["family"] and "source": "viator" returns the complaints of families on Viator, sorted by sortBy.

What about machine-translated reviews? isMachineTranslated flags them and language gives the language of the text you get. In our test runs, all 330 reviews came in their original language, none machine translated.

Are the links permanent? url and productUrl are the tour's permanent page. id, productCode and reviewerId are stable identifiers, safe to deduplicate on across runs. The photos links are the images Viator shows; download the ones you want to keep.

Can I read many tours in one run? Yes. Mix tour links, search terms and product codes in one run; a tour given twice, or found by two search terms, is read once.

Why is productRating 4.8 when the page shows 5 stars? The page rounds the tour's rating to the nearest half star. productRating is the exact average, more useful to rank tours that all show 5 stars.

Is it legal to scrape Viator reviews? The actor reads public reviews only and never logs in. Reviewer names are personal data: see the section below for how to handle them.

More SilentFlow scrapers

πŸ›’ E-commerce

πŸ’Ό Jobs

🏠 Real estate

πŸ“£ Social media

🏒 Business data

✈️ Travel

🎯 Lead generation

πŸ”Ž SEO

πŸ“ˆ Marketing

🎬 Video

πŸ“° News

🧰 More tools

Support

Need something this scraper does not do yet? We ship features fast.

  • Feature requests go straight to our backlog
  • Enterprise needs? We do custom integrations and high-volume plans
  • Pricing questions? Check the Monetization tab on the actor page

Response time: usually under 24 hours.

This actor extracts publicly available reviews from Viator tour pages. It does not log in and does not bypass any login, paywall or CAPTCHA. Users are responsible for complying with Viator's terms of service and with the data protection laws that apply to them (GDPR in the EU, CCPA in California, PIPL in China). Reviewer names and ids are personal data: store them only for a legitimate purpose, keep them no longer than needed, and do not use them to contact or profile reviewers. The data is informational; verify it before relying on it for regulated decisions.

Viator Reviews Scraper by SilentFlow: every review of every tour, one row each.