# Viator Reviews Scraper (`aboo.script/viator-reviews-scraper`) Actor

\[💰$2 / 1K] ⚡ Cheap Viator reviews scraper that bypasses anti-bot blocking on DataDome-protected pages. No login, no API key. Viator and Tripadvisor reviews by tour URL, destination, search page or keyword: rating, text, date, traveler type, photos, owner reply. Filter by stars, traveler, date.

- **URL**: https://apify.com/aboo.script/viator-reviews-scraper.md
- **Developed by:** [Aboo Script](https://apify.com/aboo.script) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Viator Reviews Scraper

![Viator Reviews Scraper](https://i.ibb.co/wrP6dtF8/viator-banner.png)

**Viator Reviews Scraper** extracts customer reviews of tours and activities from [Viator](https://www.viator.com/) into clean, structured data you can download as JSON, CSV, Excel, or HTML. Paste a Viator tour URL, a destination or search page, or type a few keywords, and get the star rating, title, full text, date, reviewer, traveler type, photos, and owner response for every review, from both Viator and Tripadvisor. No account or login required.

### Introduction

[Viator](https://www.viator.com/), a Tripadvisor company, is one of the largest marketplaces for tours, activities, and attractions, with more than 400,000 travel experiences worldwide. Each tour collects reviews from travelers on Viator and on Tripadvisor, which makes it a rich source of honest feedback about tour operators, guides, and destinations.

This actor collects the same public reviews you see in your browser and turns them into a ready-to-use dataset. You can run it once, schedule it to run daily, or connect it to your own tools. It works on Viator's DataDome-protected pages.

### What data can you extract from Viator?

- ⭐ Star rating, review title, and full review text
- 📅 Publication date and review language
- 👤 Reviewer name and traveler type (couples, family, friends, solo, business)
- 🏷️ Review source (Viator or Tripadvisor), helpful votes, and machine translation flag
- 🖼️ Review photos in full size and as thumbnails
- 💬 Owner response with its text, date, and author
- 🗺️ Tour details on every review: tour title, product code, destination, overall rating, review counts per source, and rating breakdown
- 🔗 Direct URL of each tour

### Use Cases

- 📈 **Market research**: compare how travelers rate tours, activities, and operators across destinations.
- 🕵️ **Competitor monitoring**: follow new reviews of competing tours and see what customers praise or complain about.
- 😊 **Sentiment analysis**: collect negative or positive reviews only and find recurring issues such as pickup, guides, or food.
- 🗂️ **Reputation tracking**: check your own tours, owner responses, and rating changes over time.
- 🤖 **AI and automation**: feed clean, structured reviews into spreadsheets, dashboards, or AI workflows.

### How to scrape Viator reviews step by step

1. Paste one or more Viator URLs into **Start URLs**, or type keywords into **Search queries**.
2. Set **Maximum number of reviews** to how many reviews you want per URL or per query.
3. Optionally choose the review source, sort order, star ratings, traveler types, a keyword, or a start date.
4. Click **Start** and wait for the run to finish.
5. Download your data in JSON, CSV, Excel, or HTML from the **Output** tab.

### Input

- **Start URLs**: Viator URLs to scrape reviews from. Tour pages give the reviews of that tour. Destination, category, attraction, and search result pages give the reviews of the tours listed on them, page by page. A list URL ending with a page number starts from that page.
- **Search queries**: keywords to search on Viator, one per line, for example a city, attraction, or activity. The reviews of the tours found are scraped, separately for each query.
- **Maximum number of reviews**: how many reviews to collect for each start URL or search query. For destination, category, attraction, and search pages, the limit counts the reviews of all their tours together. Set 0 for no limit.
- **Maximum reviews per tour**: how many reviews to collect from each tour, useful to spread a destination or search run over more tours. Set 0 for no per-tour limit.
- **Review source**: Viator and Tripadvisor reviews (Viator reviews first), Viator reviews only, or Tripadvisor reviews only.
- **Sort by**: most recent, highest rated, or most helpful first.
- **Star ratings**: only reviews with the selected star ratings, for example 1 and 2 stars for negative reviews.
- **Traveler types**: only reviews from couples, families, friends, solo travelers, or business travelers.
- **Review keyword**: only reviews that mention a word or phrase, for example guide, food, or pickup.
- **Reviews from date**: only reviews published on or after this date.
- **Proxy configuration**: residential proxies are required, Viator blocks datacenter and server IPs. The default setting already uses them.

You can use start URLs, search queries, or both in the same run.

### Input Examples

Scrape the reviews of a Viator tour:

```json
{
  "startUrls": [
    { "url": "https://www.viator.com/tours/Dubai/Luxury-Yacht-Shared-Tour/d828-21100P7" }
  ],
  "maxResults": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

Search by keywords and collect negative reviews from several tours:

```json
{
  "searchQueries": ["Louvre"],
  "maxResults": 50,
  "maxReviewsPerTour": 10,
  "ratings": ["1", "2"],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

### Output

Each review is saved as one item in the dataset. Here is an example of a single item:

```json
{
  "url": "https://www.viator.com/tours/Dubai/Luxury-Yacht-Shared-Tour/d828-21100P7",
  "reviewId": "1063526615",
  "source": "Tripadvisor",
  "rating": 1,
  "title": "Not worth the money.",
  "text": "Paid nearly £200 for the marina yacht tour and it was absolutely not worth it. The dinner was awful for the price you paid...",
  "language": "en",
  "publishedAt": "2026-06-08T00:00:00Z",
  "reviewerName": "uniquegem",
  "travelerType": "Family",
  "helpfulVotes": 0,
  "machineTranslated": false,
  "photoCount": 1,
  "photos": [
    {
      "url": "https://media.tacdn.com/media/photo-w/33/7c/db/d9/caption.jpg",
      "thumbnailUrl": "https://media.tacdn.com/media/photo-l/33/7c/db/d9/caption.jpg",
      "width": 1024,
      "height": 1820
    }
  ],
  "ownerResponse": {
    "title": "Owner response",
    "text": "Thank you for sharing your feedback. We are sorry to hear that your experience did not meet your expectations...",
    "publishedAt": "2026-06-11T00:00:00Z",
    "responderName": "Getaway46182363186"
  },
  "productCode": "21100P7",
  "tourTitle": "Dubai Marina Luxury Yacht Tour with Optional Breakfast or BBQ",
  "destination": "Dubai",
  "destinationId": "828",
  "tourRating": 4.8,
  "tourReviewCount": 7927,
  "tourViatorRating": 4.5,
  "tourViatorReviewCount": 1305,
  "tourTripadvisorRating": 4.9,
  "tourTripadvisorReviewCount": 6622,
  "tourRatingBreakdown": [
    { "rating": 5, "count": 6972 },
    { "rating": 4, "count": 554 },
    { "rating": 3, "count": 195 },
    { "rating": 2, "count": 87 },
    { "rating": 1, "count": 118 }
  ]
}
```

You can download the dataset in JSON, CSV, Excel, XML, or HTML, or access it through the Apify API.

### Notes

- Residential proxies are required. Runs without them, or with datacenter proxies, are blocked by Viator.
- The first reviews can take a minute or two to appear, because the run first opens Viator like a regular visitor.
- With **Viator and Tripadvisor** as the source, all Viator reviews of a tour come first, then the Tripadvisor reviews.
- **Reviews from date** works best with **Most recent** order: the run then stops at the first older review of each tour. With other orders, every review is checked.
- Viator's search is broad: keywords with no exact match still return the closest tours, and their reviews are scraped.
- Only tour pages and destination, category, attraction, and search result pages are supported. Other URLs are skipped, and tours that no longer exist are skipped with a warning.
- A tour that appears in several of your inputs is scraped only once.
- Reviews are returned in the language shown on Viator's English site.
- Fields such as the review title, owner response, or photos are `null` or empty when the reviewer or operator did not add them.

### Why use the Viator Reviews Scraper?

- ✅ **No login needed**: works with public reviews only, so there is no account to manage.
- 🌐 **Viator and Tripadvisor reviews**: get both review sources in one dataset, each review labeled with its source.
- 🎯 **Powerful filters**: star ratings, traveler types, keyword, start date, and sort order, just like on the website.
- 🗺️ **Whole destinations at once**: paste a destination, category, attraction, or search page and collect reviews of every tour on it.
- 🧹 **Clean data**: ratings are real numbers, dates use one standard format, and text is free of HTML.
- 💸 **Pay for what you need**: set a limit per URL, per query, and per tour to keep every run small and cheap.
- 🔄 **Ready for automation**: schedule runs, export to Google Sheets, or connect to Make, Zapier, and n8n.

### FAQ

#### How many reviews can I scrape?

You can set any number in **Maximum number of reviews**, or 0 for no limit. The actor keeps going until it reaches your limit or runs out of reviews.

#### Do I need a Viator account?

No. The actor only collects publicly available reviews. You do not need to log in or provide any account details.

#### Can I scrape reviews on a schedule?

Yes. Use Apify Schedules to run the actor every hour, day, or week. Combine it with **Most recent** order and **Reviews from date** to collect only new reviews.

#### Can I get only negative reviews?

Yes. Select 1 and 2 stars in **Star ratings**. You can also add a keyword, for example "pickup", to find reviews about a specific topic.

#### Can I request a new feature or filter?

Yes. If you need other inputs or filters, get in touch and they can be added.

#### Can I get a custom or private version?

Yes. The actor can be customized for your workflow, delivered as a private version, or a new scraper can be built for a different website. Use the contact details below.

### Need to scrape other travel review platforms?

- [Agoda Reviews Scraper](https://apify.com/aboo.script/agoda-reviews-scraper): hotel and activity reviews from Agoda and Booking.com.
- [Fever Event Reviews Scraper](https://apify.com/aboo.script/feverup-reviews-scraper): reviews of events and experiences on Fever.
- [GetYourGuide Scraper - Activities & Attractions](https://apify.com/aboo.script/getyourguide-scraper): tours, activities, prices, and ratings from GetYourGuide.
- [Tiqets Scraper - Attractions & Tours](https://apify.com/aboo.script/tiqets-scraper): attraction tickets and tours with prices and ratings from Tiqets.
- [Agoda Activities Scraper](https://apify.com/aboo.script/agoda-scraper): tours and activities with prices and ratings from Agoda.

***

**Need help or want a custom solution?**

- 📧 Email: aboo.script@gmail.com
- 🧩 More scrapers: [Apify profile](https://apify.com/aboo.script)

### Image Credit

Image credit: [Viator](https://www.viator.com/)

# Actor input Schema

## `startUrls` (type: `array`):

Viator URLs to scrape reviews from: tour pages (https://www.viator.com/tours/Dubai/Luxury-Yacht-Shared-Tour/d828-21100P7) give the reviews of that tour. Destination (https://www.viator.com/Dubai/d828-ttd), category, attraction and search result pages give the reviews of the tours listed on them, page by page.

## `searchQueries` (type: `array`):

Keywords to search on Viator, for example a city, attraction or activity (Louvre, Rome food tour). The reviews of the tours found are scraped, separately for each query.

## `maxResults` (type: `integer`):

Maximum number of reviews to scrape per start URL or search query. For destination, category, attraction and search pages the limit counts the reviews of all their tours together. Set 0 for no limit.

## `maxReviewsPerTour` (type: `integer`):

Maximum number of reviews per tour, useful to spread a destination or search run over more tours. Set 0 for no per-tour limit.

## `reviewSource` (type: `string`):

Which reviews to scrape: reviews written on Viator, reviews from Tripadvisor shown on Viator, or both (Viator reviews first, then Tripadvisor reviews).

## `sortBy` (type: `string`):

Order in which reviews are collected, as on the website.

## `ratings` (type: `array`):

Only reviews with these star ratings, for example 1 and 2 for negative reviews. Leave empty for all ratings.

## `travelerTypes` (type: `array`):

Only reviews from these types of travelers. Leave empty for all travelers.

## `reviewKeyword` (type: `string`):

Only reviews that mention this word or phrase, using the Viator review search (for example: guide, food, pickup).

## `dateFrom` (type: `string`):

Only reviews published on or after this date. With "Most recent" order, scraping of a tour stops at the first older review.

## `proxyConfiguration` (type: `object`):

Residential proxies are required, Viator blocks datacenter and server IPs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.viator.com/tours/Dubai/Luxury-Yacht-Shared-Tour/d828-21100P7"
    }
  ],
  "maxResults": 5,
  "maxReviewsPerTour": 0,
  "reviewSource": "all",
  "sortBy": "mostRecent",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.viator.com/tours/Dubai/Luxury-Yacht-Shared-Tour/d828-21100P7"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("aboo.script/viator-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [{ "url": "https://www.viator.com/tours/Dubai/Luxury-Yacht-Shared-Tour/d828-21100P7" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("aboo.script/viator-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.viator.com/tours/Dubai/Luxury-Yacht-Shared-Tour/d828-21100P7"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call aboo.script/viator-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aboo.script/viator-reviews-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/yT3yM1Bgh3tsMMmkc/builds/OrWwE9omj5TiOn6Jj/openapi.json
