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

Extracts the aggregate rating and latest guest reviews for any GetYourGuide tour/activity page by activity URL.

- **URL**: https://apify.com/scrapyx/getyourguide-reviews-scraper.md
- **Developed by:** [Ibnu Adzim](https://apify.com/scrapyx) (community)
- **Categories:** Travel, Marketing, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 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?

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

Extracts the aggregate rating and latest guest reviews for any GetYourGuide tour/activity page — just give it the activity URL.

### Why use this actor

- No account, no login, no API key — works on public activity pages only.
- Returns the activity's aggregate rating (score, best-possible score, total review count) plus the platform's most recent guest reviews, each with rating, full text, reviewer name, and publish date.
- Every activity 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.
- Automatically retries once on a fresh IP if a bot-mitigation challenge is hit — confirmed on real runs to recover most challenges without any action from you.

### How it works

1. You give the actor one or more GetYourGuide activity page URLs.
2. For each activity, it reads the rating and reviews directly out of the page's own structured data (the same data GetYourGuide publishes for Google's rich snippets) — no separate API call, no pagination to manage.
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

```json
{
  "activityUrls": [
    "https://www.getyourguide.com/geneva-l54/best-of-geneva-guided-city-tour-with-scenic-lake-cruise-t4873/"
  ],
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

| Field | Type | Description |
|---|---|---|
| `activityUrls` | array of strings | GetYourGuide activity/tour page URLs. |
| `maxConcurrency` | integer | How many activities to process at the same time. Default `5`. |
| `proxyConfiguration` | object | Proxy settings. Residential is on by default — a datacenter IP gets bot-mitigation-challenged noticeably more often on this site. |

### Output

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

**Summary row** (`recordType: "SUMMARY"`):

```json
{
  "_input": "https://www.getyourguide.com/geneva-l54/best-of-geneva-guided-city-tour-with-scenic-lake-cruise-t4873/",
  "_source": "S1-activity-page-jsonld",
  "_scrapedAt": "2026-08-10T12:04:00Z",
  "recordType": "SUMMARY",
  "activityId": "4873",
  "activityUrl": "https://www.getyourguide.com/geneva-l54/best-of-geneva-guided-city-tour-with-scenic-lake-cruise-t4873/",
  "name": "Best of Geneva City Tour: UN Area, Old Town & Boat Cruise",
  "description": "Explore the Old Town and the international district of Geneva on this guided tour...",
  "aggregateRating": { "ratingValue": 4.29, "bestRating": 5, "reviewCount": 437 },
  "offers": { "priceCurrency": "USD", "...": "price fields" },
  "_reviewsInDataset": 10,
  "_reviewsTotalOnPlatform": 437,
  "_note": "GetYourGuide's activity page publishes only its 10 most recent reviews as structured data; 437 exist on the platform in total."
}
```

**Review row** (`recordType: "REVIEW"`):

```json
{
  "_input": "https://www.getyourguide.com/geneva-l54/best-of-geneva-guided-city-tour-with-scenic-lake-cruise-t4873/",
  "_source": "S1-activity-page-jsonld",
  "_scrapedAt": "2026-08-10T12:04:00Z",
  "recordType": "REVIEW",
  "activityId": "4873",
  "activityName": "Best of Geneva City Tour: UN Area, Old Town & Boat Cruise",
  "reviewRating": { "ratingValue": 5, "bestRating": 5 },
  "reviewBody": "Gabriel was so nice. His accent was so good, we understood everything! :) We loved the whole experience and we totally recommend it !",
  "author": { "name": "Alexandra" },
  "datePublished": "2026-08-05T06:02:04+02:00"
}
```

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

```json
{
  "_input": "https://www.getyourguide.com/this-activity-does-not-exist-t999999999/",
  "_source": "none",
  "_scrapedAt": "2026-08-10T12:04:00Z",
  "recordType": "ERROR",
  "_error": "not_found",
  "_errorDetail": "No Product structured data on ... -- likely a removed/invalid activity page."
}
```

| Field | Type | Description |
|---|---|---|
| `_input` | string | The activity 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"`. |
| `activityId` | string | GetYourGuide's numeric activity ID (present on successful rows). |
| `_reviewsInDataset` / `_reviewsTotalOnPlatform` / `_note` | — | Present on a SUMMARY row only when the platform has more reviews than are published in this dataset — see Notes / limits below. |
| `_error` | string | Present only on rows that couldn't be fetched, e.g. `not_found`, `invalid_input`, `waf_challenge`. |
| `_errorDetail` | string | Human-readable detail for the error, present only alongside `_error`. |
| *(all other fields)* | — | On a successful row, every field GetYourGuide's own structured data provides is passed through unchanged. |

### Notes / limits

- **Reviews are a snapshot, not full history.** GetYourGuide's activity pages publish only their most recent reviews as structured data (up to 10 per activity, confirmed across activities with 5 to 1,095 total reviews) — there is no pagination available for this data source. `aggregateRating.reviewCount` always reflects the true total; the `review` rows in this dataset are the latest slice of it, flagged explicitly on the SUMMARY row whenever the total exceeds what's included.
- An activity with zero reviews still gets a SUMMARY row (not an error) — it just has no accompanying REVIEW rows.

### Other actors in this collection

| Actor | What it returns |
|---|---|
| Agoda Reviews Scraper | Guest reviews for hotels listed on Agoda.com |
| Orbitz Hotel Reviews Scraper | Guest reviews for hotels listed on Orbitz.com |

# Actor input Schema

## `activityUrls` (type: `array`):

GetYourGuide activity/tour page URLs, e.g. https://www.getyourguide.com/geneva-l54/best-of-geneva-guided-city-tour-with-scenic-lake-cruise-t4873/

## `maxConcurrency` (type: `integer`):

Maximum number of activity pages processed in parallel.

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

Cloudflare (present on every response as a CDN, not usually in challenge mode) occasionally challenges datacenter IPs on this page tier -- Residential clears it in most cases and the actor retries once on a fresh IP if challenged.

## Actor input object example

```json
{
  "activityUrls": [
    "https://www.getyourguide.com/geneva-l54/best-of-geneva-guided-city-tour-with-scenic-lake-cruise-t4873/"
  ],
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `items` (type: `string`):

One row per scraped record. See the dataset's default view for field definitions.

# 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 = {
    "activityUrls": [
        "https://www.getyourguide.com/geneva-l54/best-of-geneva-guided-city-tour-with-scenic-lake-cruise-t4873/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapyx/getyourguide-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 = { "activityUrls": ["https://www.getyourguide.com/geneva-l54/best-of-geneva-guided-city-tour-with-scenic-lake-cruise-t4873/"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapyx/getyourguide-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 '{
  "activityUrls": [
    "https://www.getyourguide.com/geneva-l54/best-of-geneva-guided-city-tour-with-scenic-lake-cruise-t4873/"
  ]
}' |
apify call scrapyx/getyourguide-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapyx/getyourguide-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/MUhstugMUbLQpYl39/builds/mkK2BEK8sl4XkKLK4/openapi.json
