Viator Reviews Scraper
Pricing
from $0.49 / 1,000 results
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
Maintained by CommunityActor 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
- You give the actor one or more Viator tour page URLs.
- 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.
- Results are streamed to your dataset as they finish.
- 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}
| Field | Type | Description |
|---|---|---|
tourUrls | array of strings | Viator tour/activity page URLs. |
maxReviewsPerTour | integer | Stop 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. |
maxConcurrency | integer | How 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>'."}
| Field | Type | Description |
|---|---|---|
_input | string | The tour URL you submitted. |
_source | string | Which internal strategy produced this row. "none" on a failed row. |
_scrapedAt | string | UTC timestamp of when this row was produced. |
recordType | string | "SUMMARY", "REVIEW", or "ERROR". |
_error | string | Present only on rows that couldn't be fetched, e.g. invalid_input, waf_challenge, graphql_error. |
_errorDetail | string | Human-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 to0) for tours with large review counts. - A
partial_graphql_errorrow 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
| Actor | What it returns |
|---|---|
| Agoda Reviews Scraper | Guest reviews for hotels listed on Agoda.com |
| GetYourGuide Reviews Scraper | Guest reviews for tours/activities listed on GetYourGuide |
| Trip.com Reviews Scraper | Guest reviews for hotels listed on Trip.com |
| Booking.com Reviews Scraper | Guest reviews for hotels listed on Booking.com |
| Orbitz Hotel Reviews Scraper | Guest reviews for hotels listed on Orbitz.com |