# GetYourGuide Reviews Scraper (`solidcode/getyourguide-reviews`) Actor

\[💰 $2.50 / 1K] Extract reviews from GetYourGuide activity pages — ratings, review text, author details, photos, owner responses, and activity metadata.

- **URL**: https://apify.com/solidcode/getyourguide-reviews.md
- **Developed by:** [SolidCode](https://apify.com/solidcode) (community)
- **Categories:** Travel, Developer tools, Automation
- **Stats:** 38 total users, 9 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 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.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## GetYourGuide Reviews Scraper

Pull traveler reviews from GetYourGuide activity pages at scale — star ratings, full review text, author names with country of origin, review language tags, traveler dates, owner responses, and the activity-level rating context on every row. Built for tour operators, travel marketers, and CX analysts who need to mine real GetYourGuide review signal across attractions like the Eiffel Tower, Vatican Museums, Disneyland Paris, and the Colosseum without copying page after page by hand.

### Why This Scraper?

- **Up to 1,550 reviews per activity** — a multi-rating sweep across all five star buckets lifts results past GetYourGuide's 310-per-feed public ceiling, the highest yield available without GetYourGuide partner credentials.
- **40-language filtering, including the ones nobody else lists** — beyond English, German, French, Spanish, Italian and Portuguese you can isolate Romanian, Slovak, Croatian, Bosnian, Slovenian, Bulgarian, Ukrainian, Lithuanian, Latvian, Vietnamese, Tagalog, Afrikaans, Swahili and more, or pull every language at once. Ask for a language that isn't on the list and it is still used as your filter, never quietly swapped for "all".
- **Reviewer country of origin on every row** — full English country name (`"Australia"`, `"United States"`, `"Brazil"`) for source-market analysis, not just an opaque ISO code.
- **Four sort modes** — Highest Rated First, Lowest Rated First, Newest First, and Most Helpful (aliased to Newest, since GetYourGuide's feed exposes no helpful-vote signal — and we say so up front instead of faking it).
- **Server-side star-rating partitioning + a 0–5 minimum-rating gate** — pull only the 1- and 2-star reviews to mine recurring complaints, or only 5-star quotes for marketing.
- **Activity context inlined on every review row** — `productTitle`, `productUrl`, `productId`, `overallRating`, and `overallReviewCount` are duplicated onto each row so a single CSV is ready for pivot tables, BI dashboards, or sentiment models.
- **Traveler type, coded and spelled out** — five segments (solo traveler, couple, family with kids, family with teens, friend group) ship as both a stable `travelerType` key you can pivot on and a plain-English `travelerTypeLabel` you can read.
- **Reviewer photos and operator replies** — review photos arrive at the largest available URL, and the operator's own reply lands on the same row as `ownerResponse` plus a dated `ownerResponseDate`. About one review in seven carries a reply overall, rising to 97% on owner-run guided tours — and landmark entry tickets reply essentially never (0 of 310 on the Colosseum, the Vatican Museums, and Sagrada Família), which is exactly the gap response-rate benchmarking is built to measure.
- **Every row is a review you can actually read** — GetYourGuide lets travelers post a bare star with no words, and those blanks are up to 55% of a low-star feed. They are left out by default, so a 300-row pull is 300 written reviews, not 134. Flip one checkbox if you want the rating-only entries back for star-distribution work.

### Use Cases

**Tour Operator Competitive Intelligence**

- Compare your activity's review volume and star distribution against competitor tours at the same attraction
- Track how recurring complaints differ between your operator and the top-listed alternative
- Benchmark response rates by counting how many reviews carry an `ownerResponse`

**Sentiment Analysis & Voice of Customer**

- Mine 1- and 2-star reviews per activity to surface the top three friction points
- Run multilingual sentiment models on French, Spanish, Italian, and Japanese reviews to spot market-specific issues
- Track sentiment shifts before and after a tour redesign by re-running the scraper monthly

**Marketing Content & Testimonials**

- Pull 5-star quotes for ad creative, landing pages, and email campaigns
- Filter to English-language testimonials when feeding global ad copy
- Surface reviewer country to build "loved by travelers from 40+ countries" social proof

**Travel Industry Research**

- Map which source markets visit which European attractions by month, using `authorCountry` plus `reviewDate`
- Study seasonal review patterns at landmark destinations (Eiffel Tower, Statue of Liberty, Colosseum)
- Compare traveler-type distribution (couple vs. family vs. solo) across activity categories

**Product & Activity Improvement**

- Cluster low-rating reviews by language to localize CX fixes for specific markets
- Identify recurring complaint themes by traveler type — what frustrates families differs from what frustrates couples
- Track owner-response coverage and median time-to-reply across your portfolio

### Getting Started

#### Just an Activity URL

Paste one GetYourGuide activity URL — the simplest possible run:

```json
{
    "startUrls": [
        "https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/"
    ],
    "maxReviewsPerActivity": 100
}
```

#### Filtered: Highest Rated, 4 Stars and Up

Pull marketing-friendly testimonials sorted top down:

```json
{
    "startUrls": [
        "https://www.getyourguide.com/rome-l33/colosseum-roman-forum-palatine-hill-guided-tour-t195566/"
    ],
    "sortBy": "highest_rating",
    "minRating": 4,
    "maxReviewsPerActivity": 200
}
```

#### Single-Market Sweep: French-Language Reviews

Mine reviews written in French to study a single source market:

```json
{
    "startUrls": [
        "https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/"
    ],
    "language": "fr",
    "sortBy": "newest",
    "maxReviewsPerActivity": 500
}
```

#### Maximum Extraction: All Buckets, Multiple Activities

Set `maxReviewsPerActivity` to `0` to extract up to the full 1,550-per-activity ceiling across several attractions in one run. `includeRatingOnlyReviews` adds the bare star ratings that carry no words, which you want for a complete rating spread and not much else:

```json
{
    "startUrls": [
        "https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/",
        "https://www.getyourguide.com/rome-l33/colosseum-roman-forum-palatine-hill-guided-tour-t195566/",
        "https://www.getyourguide.com/rome-l33/skip-the-line-vatican-museums-sistine-chapel-ticket-t62214/"
    ],
    "maxReviewsPerActivity": 0,
    "sortBy": "newest",
    "language": "all",
    "includeRatingOnlyReviews": true
}
```

### Input Reference

#### What to Scrape

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | string\[] | `[]` | GetYourGuide activity URLs. Paste one or more URLs ending in `-t<digits>` (e.g. `-t395320`). Locale-prefixed URLs (`/en-us/...`, `/de/...`) are accepted. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `language` | select | `All Languages` | Limit to one review language. Choices: All Languages, English, German, French, Spanish, Italian, Dutch, Portuguese, Danish, Swedish, Norwegian, Finnish, Polish, Czech, Slovak, Hungarian, Romanian, Bulgarian, Croatian, Bosnian, Slovenian, Lithuanian, Latvian, Greek, Ukrainian, Russian, Turkish, Azerbaijani, Arabic, Hebrew, Japanese, Korean, Chinese, Vietnamese, Tagalog, Swahili, Afrikaans, Yoruba, Igbo, Tswana, Somali. Calling by API, you can pass any other two-letter code as well: it is applied as your filter as given, and the run says so. |
| `minRating` | integer | `0` | Only collect reviews with at least this many stars (0–5). Set to `0` for no filter. |
| `includeRatingOnlyReviews` | boolean | `false` | GetYourGuide lets a traveler submit a star rating without writing anything. Those entries carry no review text, no language, no traveler type and no photo, so they are left out by default. Set to `true` to keep them, for example when you want the complete star distribution rather than the written feedback. |

#### Sorting & Volume

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `sortBy` | select | `Highest Rated First` | Order in the dataset: Highest Rated First, Lowest Rated First, Newest First, or Most Helpful First (same as Newest — GetYourGuide's feed has no helpful-vote signal). |
| `maxReviewsPerActivity` | integer | `100` | Cap per activity. `0` means "as many as available". GetYourGuide's public feed exposes at most 1,550 reviews per activity even when the activity has tens of thousands. |

### Output

Each row represents one review with the activity context inlined. One row per review, single flat shape — no nested record types.

```json
{
    "reviewId": "489812345",
    "productId": "395320",
    "productUrl": "https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/",
    "productTitle": "Disneyland Paris: 1-Day, 1-Park or 2-Park Ticket",
    "overallRating": 4.5,
    "overallReviewCount": 52638,
    "rating": 5,
    "text": "Skip-the-line was real — we were inside in under ten minutes. The summit view at sunset was unreal.",
    "language": "en",
    "reviewDate": "2026-04-12T18:42:00Z",
    "authorName": "Sarah M.",
    "isAnonymous": false,
    "authorCountry": "Australia",
    "travelerType": "couple",
    "travelerTypeLabel": "Couple",
    "photos": [
        "https://cdn.getyourguide.com/img/review/813e0614e6a8ded7ecd121c607da48e73111f28891de64ed1e016a6e2f065816.jpg/99.jpg"
    ],
    "ownerResponse": "Thank you for the kind words, Sarah — see you next time!",
    "ownerResponseDate": "2026-04-13T09:10:00Z",
    "source": "getyourguide",
    "scrapedAt": "2026-05-08T12:00:00Z"
}
```

#### Activity Metadata

| Field | Type | Description |
|-------|------|-------------|
| `productId` | string | GetYourGuide numeric activity ID (the digits after `-t` in the URL) |
| `productUrl` | string | The activity URL you submitted |
| `productTitle` | string | Activity name exactly as GetYourGuide lists it (`null` if the activity has been retired and no longer has a published name) |
| `overallRating` | number | Average star rating across all GetYourGuide reviews for this activity, rounded to two decimals (e.g. `4.77`) |
| `overallReviewCount` | number | Total review count GetYourGuide reports for this activity |

#### Review Content

| Field | Type | Description |
|-------|------|-------------|
| `reviewId` | string | Stable GetYourGuide review identifier |
| `rating` | integer | Star rating awarded, always 1–5 (`null` on the rare entry GetYourGuide publishes without a readable star, so averages you compute stay honest) |
| `text` | string | Full review body. Always filled, unless you set `includeRatingOnlyReviews` to `true`, which also brings in star ratings that carry no words (`null` on those) |
| `language` | string | ISO-639-1 language code of the review, always the two-letter form (e.g. `en`, `de`, `fr`). `null` only on rating-only entries, which you get by setting `includeRatingOnlyReviews` to `true` |
| `reviewDate` | string | ISO 8601 timestamp the review was submitted (`null` on the rare entry GetYourGuide publishes without a date) |
| `photos` | string\[] | Reviewer-uploaded photo URLs at the largest available size |
| `ownerResponse` | string | Operator's reply text, when present |
| `ownerResponseDate` | string | ISO 8601 timestamp of the operator reply |

#### Reviewer Info

| Field | Type | Description |
|-------|------|-------------|
| `authorName` | string | Reviewer's first name as shown on GetYourGuide. `null` when the reviewer posted anonymously — filter on it to get only named reviewers |
| `isAnonymous` | boolean | `true` when the reviewer posted anonymously and GetYourGuide shows no name |
| `authorCountry` | string | Reviewer's country of origin (full English name, e.g. `"Australia"`). `null` when the reviewer never set one, so you can filter those rows out of a source-market breakdown |
| `travelerType` | string | Stable segment key: `solo`, `couple`, `family_young`, `family_old`, or `friends`, when GetYourGuide records it |
| `travelerTypeLabel` | string | The same segment in plain English: `Solo traveler`, `Couple`, `Family with kids`, `Family with teens`, `Friend group` |
| `source` | string | Always `"getyourguide"` |
| `scrapedAt` | string | ISO 8601 timestamp of extraction |

### Tips for Best Results

- **GetYourGuide's public feed caps at 1,550 reviews per activity** — even on heavyweight attractions like Disneyland Paris (52,000+ reviews), the Eiffel Tower (25,000+), the Vatican Museums, and the Colosseum. This actor's all-buckets sweep already pulls the maximum available; activities with more reviews will return 1,550.
- **Use `minRating: 1` or `minRating: 2` for complaint mining.** The lowest-star reviews are where product-improvement signal lives — the rating filter routes the sweep through low-star buckets first instead of wasting quota on five-star fluff.
- **Combine multiple activity URLs in one run.** You pay per result, not per activity, so a five-attraction city study costs the same as five separate runs and finishes faster.
- **Filter by `language` for source-market work.** Set `language: "de"` to study only German-speaking travelers, or `language: "ja"` to mine the Japanese market. Reviews are filtered after collection, so the actor automatically scans up to 5× your cap to compensate — for less-common languages on activities that mostly receive English reviews, raise `maxReviewsPerActivity` if you need more matches.
- **Turn on `includeRatingOnlyReviews` only for star-distribution studies.** Roughly half of what GetYourGuide's star-rating feeds return is a bare rating with no words, and those rows carry no text, language, traveler type or photo. Leave the switch off for quote mining, complaint analysis, and anything you plan to read; turn it on when you want the full rating spread, and expect the extra rows to be blank apart from the star, the date and the country.
- **Pick `sortBy` to match your goal.** `highest_rating` for marketing quotes, `lowest_rating` for CX research, `newest` for ongoing monitoring runs.
- **`travelerType` is a free segmentation axis.** Couples, families, and solo travelers leave systematically different reviews — pivot on `travelerType` before running any sentiment model, and chart with `travelerTypeLabel` so `family_old` reads as what it means, "Family with teens", rather than an older family.
- **Anonymous reviews still count.** Roughly half the reviews in the low-star and language-filtered buckets are posted anonymously, so `authorName` is `null` on those rows by design rather than a placeholder that looks like a name. Filter on `isAnonymous: false` when you need quotable testimonials with a name attached.
- **Point response-rate studies at owner-run tours, not ticket products.** `ownerResponse` is filled by the operator who runs the experience, so guided walking tours, cooking classes, and boat trips reply often, while skip-the-line entry tickets for major attractions almost never do. Benchmark like against like or the comparison will look artificially empty.
- **Re-run weekly for trend tracking.** Reviews are timestamped, so a recurring run with `sortBy: "newest"` builds a clean week-over-week sentiment time series in your warehouse.

### Pricing

**From $2.10 per 1,000 results** — one flat rate per review row, with the multi-rating sweep that lifts you past the 310-review single-feed ceiling included at no extra charge. Bronze, Silver, and Gold subscribers pay progressively less, and the table below shows the total cost at each Apify loyalty tier.

| Results | No discount | Bronze | Silver | Gold |
|---------|-------------|--------|--------|------|
| 100 | $0.250 | $0.238 | $0.225 | $0.210 |
| 1,000 | $2.50 | $2.38 | $2.25 | $2.10 |
| 10,000 | $25.00 | $23.80 | $22.50 | $21.00 |
| 100,000 | $250.00 | $238.00 | $225.00 | $210.00 |

A "result" is one review row in your dataset. There are no compute or time-based charges — you pay per result returned, plus a small fixed start fee each time a run begins. Rating-only entries (a bare star with no words) are left out by default, so you are not billed for rows you cannot read.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor is designed for legitimate market research, voice-of-customer analysis, competitive intelligence, and content development using publicly visible review data. Users are responsible for complying with applicable laws and GetYourGuide's Terms of Service. When republishing reviews or quotes, credit the original reviewer and link back to the activity page. Do not use extracted data for spam, harassment, retaliatory action against reviewers, or any illegal purpose.

# Actor input Schema

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

GetYourGuide activity page URLs. Paste one or more URLs like https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/

## `maxReviewsPerActivity` (type: `integer`):

Maximum number of reviews to extract per activity. Set to 0 for all reviews. This counts reviews that carry written text, so unless you switch on 'Include Rating-Only Reviews' below, the actor keeps reading further to fill your number with reviews you can actually read. Note: GetYourGuide caps results at 310 reviews per activity when no rating filter is applied, and at 1,550 reviews per activity when reviews are gathered across all 5 star buckets — even on activities with tens of thousands of total reviews. The actor automatically uses the broader 1,550-review strategy when you ask for more than 310 reviews and have not set a minimum rating.

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

Order in which reviews are returned in the dataset. Sorting is applied after collection. Note: GetYourGuide's API does not expose a helpful-vote signal, so 'Most Helpful First' returns reviews in the same order as 'Newest First'.

## `language` (type: `string`):

Only return reviews written in this language. Choose 'All Languages' to include every language. The filter is applied after reviews are collected — when filtering by a less-common language on activities with mostly English reviews, fewer than your requested cap may be returned. To maximize matches, raise 'Max Reviews per Activity' (the actor automatically scans up to 5x your cap, capped at GetYourGuide's 1,550-review ceiling). If you call this actor through the API you can also pass any other two-letter language code: it is used as the filter exactly as given, and the run tells you it wasn't one of the listed languages.

## `minRating` (type: `integer`):

Only collect reviews with at least this many stars (0–5). Set to 0 for no filter.

## `includeRatingOnlyReviews` (type: `boolean`):

GetYourGuide lets a traveler submit a star rating without writing anything. Those entries make up roughly half of what the star-rating feeds return, and they arrive with no review text, no language, no traveler type and no photo — just a star, a date and a country. They are left out by default so you only pay for reviews you can actually read. Turn this on if you want them, for example to study the full star distribution rather than the written feedback.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/"
  ],
  "maxReviewsPerActivity": 100,
  "sortBy": "highest_rating",
  "language": "all"
}
```

# Actor output Schema

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

Table of scraped reviews with key fields.

# 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": [
        "https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/"
    ],
    "maxReviewsPerActivity": 100,
    "sortBy": "highest_rating",
    "language": "all",
    "minRating": 0,
    "includeRatingOnlyReviews": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/getyourguide-reviews").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": ["https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/"],
    "maxReviewsPerActivity": 100,
    "sortBy": "highest_rating",
    "language": "all",
    "minRating": 0,
    "includeRatingOnlyReviews": False,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/getyourguide-reviews").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": [
    "https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/"
  ],
  "maxReviewsPerActivity": 100,
  "sortBy": "highest_rating",
  "language": "all",
  "minRating": 0,
  "includeRatingOnlyReviews": false
}' |
apify call solidcode/getyourguide-reviews --silent --output-dataset

```

## MCP server setup

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

```

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/4HboKCdmFMHXtxDf1/builds/Qu21Qs4D3RwKe2KvF/openapi.json
