# GetYourGuide, Viator, Klook & Tiqets Tours Scraper (`memo23/tours-activities-scraper`) Actor

Compare tour prices and reviews across GetYourGuide, Viator, Klook and Tiqets from one scraper. Pull each tour's price, currency, rating, full reviews, duration and location by destination or URL — built for travel price intelligence, market research and OTA monitoring. JSON or CSV

- **URL**: https://apify.com/memo23/tours-activities-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Travel, AI, Agents
- **Stats:** 52 total users, 27 monthly users, 99.6% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 tour 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/platform/actors/running/actors-in-store#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

## Tours & Activities Scraper — GetYourGuide, Viator, Klook & Tiqets

Scrape tours, activities and attraction tickets from **GetYourGuide, Viator, Klook and Tiqets** with a single actor. Paste a city/destination page and crawl every tour on it, or paste individual tour URLs — and get a clean, identical row for each: price, currency, rating, review count, **full review text**, duration, location, provider and images.

![How it works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-tours.png)

### Why use this scraper

- **Four platforms, one schema.** GetYourGuide, Viator, Klook and Tiqets normalised into the same fields — no per-site glue code on your side.
- **Real reviews on every platform.** Author, rating, title, text and date — including Klook, whose reviews sit behind bot protection that most scrapers can't reach.
- **Crawl a whole city or target single tours.** Drop in a destination page and the actor fans out to every activity; or pass exact tour URLs for surgical pulls.
- **Price intelligence ready.** Stable currency (pin a country), per-tour price and rating make it a drop-in feed for competitor monitoring and market research.
- **Pure HTTP, pay per result.** Fast, no headless browser tax, and you only pay for the tours you actually get.

### Overview

The Tours & Activities Scraper extracts structured data from the four largest online tours/activities marketplaces. Give it any mix of listing pages (city, destination, category) or detail pages (a single tour), or a search term, and it returns one row per tour/activity with pricing, ratings, reviews, duration, location and images — exportable as JSON, CSV or Excel.

### Supported inputs

| Platform | Listing page (crawl) | Single tour (detail) |
|---|---|---|
| **GetYourGuide** | `getyourguide.com/paris-l16/` | `…/…-t989157/` |
| **Viator** | `viator.com/Paris/d479-ttd` | `…/d479-382015P1` |
| **Klook** | `klook.com/en-US/destination/c8-bali/1-things-to-do/` | `…/activity/73749-…` |
| **Tiqets** | `tiqets.com/en/paris-attractions-c66007/` | `…/…-p703295` |

You can mix platforms and page types in one run. Listing pages are expanded into their individual tours automatically.

### Use cases

- **Competitor & price monitoring** — track tour prices and ratings across all four OTAs for the same destinations.
- **Market research** — measure supply, pricing and review sentiment for a city or activity category.
- **Travel content & affiliates** — build "things to do" pages with live prices, ratings and images.
- **Review mining** — pull review text at scale to analyse what travellers say about a tour or operator.
- **Lead lists for operators** — find which experiences exist in a market and how they're positioned.

### How it works

1. **You provide** start URLs (listing or detail) or search terms, plus a result cap.
2. **Listing pages fan out** — the actor discovers every tour URL on a destination/city/category page and paginates where supported.
3. **Each tour is fetched** with the right strategy per platform and parsed into one normalised row.
4. **Reviews are attached** — embedded reviews for GetYourGuide, Viator and Tiqets; Klook reviews are pulled from its review API.
5. **Results stream to the dataset** — one row per tour, ready to export as JSON, CSV or Excel.

### Input configuration

| Field | Type | Description |
|---|---|---|
| `startUrls` | array | Listing or detail URLs from any of the four platforms. |
| `search` | array | Free-text destinations/keywords (resolved to each platform's search page). |
| `maxItems` | integer | Max tours to scrape across all inputs. Default `20`. |
| `includeReviews` | boolean | Capture per-tour review text. Default `true`. |
| `maxReviewsPerItem` | integer | Cap reviews per tour. Default `10`. |
| `country` | string | ISO-2 exit country (e.g. `us`, `gb`, `de`). Also stabilises GetYourGuide's price currency. |
| `maxConcurrency` | integer | Parallel detail fetches. Default `6`. |

#### Example input

```json
{
  "startUrls": [
    { "url": "https://www.getyourguide.com/paris-l16/" },
    { "url": "https://www.viator.com/Paris/d479-ttd" }
  ],
  "maxItems": 50,
  "includeReviews": true,
  "maxReviewsPerItem": 10,
  "country": "us"
}
```

### Output overview

One row per tour/activity, identical shape across all four platforms. Export as JSON, CSV, Excel or HTML from the dataset.

### Output sample

```json
{
  "platform": "getyourguide",
  "url": "https://www.getyourguide.com/paris-l16/louvre-museum-guided-tour-with-mona-lisa-t989157/",
  "productId": "989157",
  "title": "Louvre Priority Access Mona Lisa & Museum Icons Guided Tour",
  "description": "Discover the Louvre the easy way. Meet icons like the Mona Lisa and the Venus de Milo…",
  "price": 90.28,
  "currency": "USD",
  "rating": 4.53,
  "reviewCount": 929,
  "durationText": null,
  "location": "Paris",
  "latitude": null,
  "longitude": null,
  "provider": "GetYourGuide",
  "categories": [],
  "images": [
    "https://cdn.getyourguide.com/img/tour/…/53.jpg"
  ],
  "reviews": [
    {
      "author": "Barbora",
      "rating": 5,
      "title": null,
      "text": "This tour was absolutely excellent from beginning to end…",
      "date": "2026-06-23T15:52:47+02:00",
      "language": null
    }
  ],
  "scrapedAt": "2026-06-23T17:27:26.424Z"
}
```

### Key output fields

| Field | Description |
|---|---|
| `platform` | `getyourguide` | `viator` | `klook` | `tiqets` |
| `url` | Canonical tour URL |
| `productId` | Platform product/activity ID |
| `title` | Tour/activity name |
| `description` | Short description |
| `price` / `currency` | Lead price + ISO currency |
| `rating` / `reviewCount` | Average rating + total reviews |
| `reviews[]` | `author`, `rating`, `title`, `text`, `date`, `language` |
| `durationText` | Duration where the platform exposes it (e.g. Viator) |
| `location` | City/destination or venue address |
| `latitude` / `longitude` | Coordinates where available |
| `provider` | Brand/operator where available |
| `images[]` | Image URLs |
| `scrapedAt` | ISO timestamp |

### FAQ

**Which platforms are supported?** GetYourGuide, Viator, Klook and Tiqets — in a single actor with one output schema.

**Can I scrape a whole city at once?** Yes. Paste a destination/city/category URL and the actor expands it to every tour it lists, paginating where the platform supports it.

**Do I get individual reviews?** Yes, on all four platforms. GetYourGuide, Viator and Tiqets embed reviews on the page; Klook reviews are fetched from its review API.

**Why is `durationText` sometimes null?** Many entries are tickets or transport with no fixed duration, and some platforms don't publish a machine-readable duration. Viator durations are extracted; GetYourGuide doesn't expose a clean value.

**Why does GetYourGuide price currency change?** GetYourGuide localises currency by IP. Set `country` (e.g. `us`) for a stable currency.

**Do you support search by keyword?** Yes, best-effort via the `search` field. Explicit start URLs are the most reliable.

### Support

Found a bug or need another field or platform? Open an issue on the actor's Issues tab in Apify Console — issues are monitored and addressed quickly.

### Additional services

Need a custom field, an extra tours platform, a scheduled feed, or the data pushed to your database/webhook? Reach out via the Issues tab — custom work and integrations are available.

### Explore more scrapers

Looking for related travel data? Check the rest of the portfolio for hotel, flight and review scrapers across major travel platforms.

### 🤖 For AI Agents & LLM Apps

Compact reference for AI agents calling this actor via the [Apify MCP server](https://mcp.apify.com) or the Apify API (actor: `memo23/tours-activities-scraper`).

**Purpose:** Scrapes tours, activities and attraction tickets from GetYourGuide, Viator, Klook and Tiqets into one identical row per tour, with full per-tour review text normalized across all four platforms.

**Minimal input:**

```json
{
  "startUrls": [{ "url": "https://www.getyourguide.com/paris-l16/" }],
  "maxItems": 20
}
```

Search mode variant: `{ "search": ["Paris"], "maxItems": 20 }` (resolved to each platform's search page; best-effort — start URLs are more reliable).

**Output:** one row per tour — `platform`, `url`, `productId`, `title`, `description`, `price`, `currency`, `rating`, `reviewCount`, `durationText`, `location`, `latitude`, `longitude`, `provider`, `categories[]`, `images[]`, `scrapedAt`, and `reviews[]` (each `author`, `rating`, `title`, `text`, `date`, `language`).

**Behaviors an agent should know:**

- `maxItems` defaults to 20 and caps total tours across all inputs — set it explicitly to size the run.
- Listing/destination/category URLs fan out to every tour they contain (paginating where supported); detail URLs are scraped directly; platforms and page types can be mixed in one run.
- `includeReviews` defaults to true (`maxReviewsPerItem` default 10); GetYourGuide/Viator/Tiqets reviews are embedded, Klook reviews come from its review API.
- Set `country` (ISO-2, e.g. `us`) for a stable price currency — all four platforms localize currency by IP.
- Publicly available data only; keyword `search` is best-effort.
- Billed per result (per tour returned) — see the Pricing tab on the actor page for the exact rate.

### ⚠️ Disclaimer

This actor extracts **publicly available** information only. It does not access any data behind a login, and it does not collect personal data beyond what platforms publish publicly (e.g. public review author display names). You are responsible for using the scraped data in compliance with each platform's terms, applicable laws (including GDPR/CCPA where relevant) and copyright. Use the data responsibly and lawfully.

### SEO keywords

GetYourGuide scraper, Viator scraper, Klook scraper, Tiqets scraper, tours and activities scraper, things to do scraper, travel experiences API, tour price scraper, activity reviews scraper, attraction tickets data, OTA price monitoring, travel data extraction, tours data API, experiences price intelligence, destination activities scraper.

# Actor input Schema

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

Listing pages (city / destination / category) or detail pages (a single tour) from GetYourGuide, Viator, Klook or Tiqets. Listing pages fan out to every tour they contain; detail pages are scraped directly.

## `search` (type: `array`):

Optional free-text destinations or keywords (e.g. "Paris", "Rome colosseum"). Each term is resolved to the search page of every platform. Best-effort — explicit Start URLs are more reliable.

## `maxItems` (type: `integer`):

Maximum number of tours/activities to scrape across all start URLs.

## `includeReviews` (type: `boolean`):

Capture individual review text per tour (author, rating, title, text, date) where the platform exposes it. GetYourGuide, Viator and Tiqets embed reviews on the page; Klook review text is fetched via its review API.

## `maxReviewsPerItem` (type: `integer`):

Upper bound on reviews captured per tour when 'Include reviews' is on.

## `country` (type: `string`):

Optional ISO-2 country code (e.g. 'us', 'gb', 'de') for the residential exit. All four platforms localize price currency by IP — set this for a consistent currency across results.

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

Parallel detail-page fetches. Lower this if you hit rate limits.

## `saveDebugFiles` (type: `boolean`):

Save raw HTML of each detail page to the key-value store for debugging.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.getyourguide.com/paris-l16/"
    },
    {
      "url": "https://www.viator.com/Paris/d479-ttd"
    },
    {
      "url": "https://www.klook.com/en-US/destination/c8-bali/1-things-to-do/"
    },
    {
      "url": "https://www.tiqets.com/en/paris-attractions-c66007/"
    }
  ],
  "search": [],
  "maxItems": 20,
  "includeReviews": true,
  "maxReviewsPerItem": 10,
  "maxConcurrency": 6,
  "saveDebugFiles": false
}
```

# 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.getyourguide.com/paris-l16/"
        },
        {
            "url": "https://www.viator.com/Paris/d479-ttd"
        },
        {
            "url": "https://www.klook.com/en-US/destination/c8-bali/1-things-to-do/"
        },
        {
            "url": "https://www.tiqets.com/en/paris-attractions-c66007/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/tours-activities-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.getyourguide.com/paris-l16/" },
        { "url": "https://www.viator.com/Paris/d479-ttd" },
        { "url": "https://www.klook.com/en-US/destination/c8-bali/1-things-to-do/" },
        { "url": "https://www.tiqets.com/en/paris-attractions-c66007/" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("memo23/tours-activities-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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.getyourguide.com/paris-l16/"
    },
    {
      "url": "https://www.viator.com/Paris/d479-ttd"
    },
    {
      "url": "https://www.klook.com/en-US/destination/c8-bali/1-things-to-do/"
    },
    {
      "url": "https://www.tiqets.com/en/paris-attractions-c66007/"
    }
  ]
}' |
apify call memo23/tours-activities-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/tours-activities-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/VdhZpgOOi6ug1iIqa/builds/HORYBM5TcEcz8ihyd/openapi.json
