Viator Reviews Scraper avatar

Viator Reviews Scraper

Pricing

from $0.49 / 1,000 results

Go to Apify Store
Viator Reviews Scraper

Viator Reviews Scraper

Extracts guest reviews for tours/activities listed on Viator.com -- currently in recon mode while DataDome's profile-rotation requirement is confirmed.

Pricing

from $0.49 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Extracts the full guest review history for any tour/activity listed on Viator — just give it the tour URL.

Why use this actor

  • No account, no login, no API key — works on public tour pages only.
  • Returns the tour's total review count plus every guest review up to your chosen limit — full text, rating, reviewer name, party type (solo/couple/family/friends), publish date, and helpful-vote count. Unlike a single-page snapshot, this actually paginates through the tour's full review history.
  • Every tour you submit gets at least one output row — including a clear diagnostic reason on the rare rows that couldn't be fetched, so nothing silently disappears from your results.

How it works

  1. You give the actor one or more Viator tour page URLs.
  2. For each tour, it establishes a session against the tour page, then pages through the tour's own review API (100 reviews per page) until it reaches your limit or runs out of reviews.
  3. Results are streamed to your dataset as they finish.
  4. You export the finished dataset as JSON, CSV, or Excel straight from the Apify Console.

Input

{
"tourUrls": [
"https://www.viator.com/tours/Rome/Skip-the-Line-Vatican-Museums-and-Sistine-Chapel-Entrance-Tickets/d511-6700P15"
],
"maxReviewsPerTour": 300,
"maxConcurrency": 3
}
FieldTypeDescription
tourUrlsarray of stringsViator tour/activity page URLs.
maxReviewsPerTourintegerStop paginating a tour after this many reviews. Popular tours can have thousands of reviews, so this is capped by default. Set to 0 to fetch every review.
maxConcurrencyintegerHow many tours to process at the same time. Default 3.

Output

Each tour produces one summary row plus one review row per guest review. Real examples from a live run:

Summary row (recordType: "SUMMARY"):

{
"_input": "https://www.viator.com/tours/Rome/Skip-the-Line-Vatican-Museums-and-Sistine-Chapel-Entrance-Tickets/d511-6700P15",
"_source": "S1-graphql-getreviews",
"_scrapedAt": "2026-08-11T02:33:20Z",
"recordType": "SUMMARY",
"tourUrl": "https://www.viator.com/tours/Rome/Skip-the-Line-Vatican-Museums-and-Sistine-Chapel-Entrance-Tickets/d511-6700P15",
"totalReviewCount": 6474,
"hasFeaturedReviews": false
}

Review row (recordType: "REVIEW"):

{
"_input": "https://www.viator.com/tours/Rome/Skip-the-Line-Vatican-Museums-and-Sistine-Chapel-Entrance-Tickets/d511-6700P15",
"_source": "S1-graphql-getreviews",
"_scrapedAt": "2026-08-11T02:33:20Z",
"recordType": "REVIEW",
"id": "1072279861",
"rating": 5,
"published": "2026-08-09T00:00:00Z",
"partyType": "FAMILY",
"helpfulVotes": 0,
"reviewBody": { "locale": "en", "text": "We had an amazing experience on the Vatican Skip-the-Line Tour! ..." },
"reviewer": { "username": "karacnutile", "userIdentifierValue": "211864522" },
"title": { "text": "We had an amazing..." }
}

When a tour can't be found or the input isn't a Viator URL, the actor still emits one row for that input with a clear reason:

{
"_input": "not-a-viator-url-at-all",
"_source": "none",
"_scrapedAt": "2026-08-11T02:33:20Z",
"recordType": "ERROR",
"_error": "invalid_input",
"_errorDetail": "Expected a viator.com tour page URL, e.g. 'https://www.viator.com/tours/<city>/<slug>/d<destId>-<productCode>'."
}
FieldTypeDescription
_inputstringThe tour URL you submitted.
_sourcestringWhich internal strategy produced this row. "none" on a failed row.
_scrapedAtstringUTC timestamp of when this row was produced.
recordTypestring"SUMMARY", "REVIEW", or "ERROR".
_errorstringPresent only on rows that couldn't be fetched, e.g. invalid_input, waf_challenge, graphql_error.
_errorDetailstringHuman-readable detail for the error, present only alongside _error.
(all other fields)On a successful row, every field Viator's own review API provides is passed through unchanged.

Notes / limits

  • This is a genuinely paginated feed, not a fixed snapshot — raise maxReviewsPerTour (or set it to 0) for tours with large review counts.
  • A partial_graphql_error row means pagination stopped partway through a tour after already returning some real reviews — you still get what was fetched, plus a diagnostic explaining why it stopped early.

Other actors in this collection

ActorWhat it returns
Agoda Reviews ScraperGuest reviews for hotels listed on Agoda.com
GetYourGuide Reviews ScraperGuest reviews for tours/activities listed on GetYourGuide
Trip.com Reviews ScraperGuest reviews for hotels listed on Trip.com
Booking.com Reviews ScraperGuest reviews for hotels listed on Booking.com
Orbitz Hotel Reviews ScraperGuest reviews for hotels listed on Orbitz.com