# GetYourGuide Scraper — Tours, Prices & Ratings (`tortuga/getyourguide-scraper`) Actor

Scrape tours and activities from GetYourGuide destination, category and search pages: prices, ratings, reviews count, duration, images and more.

- **URL**: https://apify.com/tortuga/getyourguide-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** Travel
- **Features:** Limited permissions
- **Stats:** 18 total users, 12 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 activities

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## GetYourGuide Scraper

Scrape tours and activities from GetYourGuide destination, category, attraction and search pages: prices, discounts, ratings, review counts, duration, images, badges and, optionally, the full activity details (highlights, inclusions, languages, cancellation policy, meeting point with coordinates, supplier).

Built for reliability: plain HTTP with browser TLS fingerprinting, no headless browser, no login. Each page carries a server-rendered data blob, so the scraper reads structured JSON instead of fragile CSS selectors. You pay only for the activities you get.

### What data does GetYourGuide Scraper extract?

Every listing item (destination, category, POI, country or search page):

| Field | Description |
|---|---|
| `id` | GetYourGuide activity ID (the `t123456` in the URL) |
| `title` | Activity title |
| `url` | Clean activity URL (tracking params removed) |
| `city` | City / place the activity is in ("Paris", "Chessy") |
| `locationLabel` | Raw label from the card, e.g. "In Paris" or "From Paris" (departure point) |
| `destination` | Name of the destination page the item came from |
| `priceFrom` | Lowest price, number (exact value where the page exposes it, otherwise the displayed rounded price) |
| `currency` | ISO currency code of `priceFrom` |
| `originalPrice` | Pre-discount price when the activity is on sale, else `null` |
| `discountPercent` | Discount in percent when on sale |
| `priceNote` | Pricing unit note such as "per group up to 8" |
| `rating` | Average rating 0-5 |
| `reviewCount` | Number of reviews |
| `duration` | Duration text ("2 hours", "1 - 2 hours", "1 day") |
| `tags` | Card attributes: "Skip the line", "Small group", "Private group", "Meal included", "Pickup available", … |
| `badges` | Badge texts: "Top pick", "Top rated", "Likely to sell out", "#1 selling guided tour", "Certified by GetYourGuide", "Booked 60 times yesterday", … |
| `isBestseller`, `isTopRated`, `isTopPick`, `isLikelyToSellOut`, `isCertified`, `isGygOriginal` | Booleans derived from the badges |
| `images` | Image URLs (card image plus gallery images where available) |
| `nextAvailableDate` | Next available date (ISO) where the page exposes it |
| `sourceUrl`, `scrapedAt` | Start URL that produced the item and the run timestamp |
| `changeType`, `previousValues` | Only with **Only new or changed items** on: `new` or `changed`, and for changed activities the old values of the fields that changed |

With **Include activity details** on, each item also gets:

| Field | Description |
|---|---|
| `description` | Short description |
| `fullDescription` | Full description text |
| `highlights` | Highlight bullet points |
| `inclusions` / `exclusions` | "Includes" list split into included and not-included items |
| `notSuitableFor`, `notAllowed`, `whatToBring`, `goodToKnow` | Important-information lists |
| `languages` | Live tour guide languages |
| `audioGuideLanguages` | Audio guide languages |
| `cancellationPolicy`, `freeCancellation` | Cancellation text and flag |
| `reserveNowPayLater`, `skipTheLine`, `wheelchairAccessible`, `privateOrSmallGroup` | Key-detail flags |
| `keyDetails` | All key-detail rows as `{key, title, description}` |
| `meetingPoint` | Meeting point description |
| `latitude`, `longitude` | Meeting point coordinates (falls back to the first itinerary stop) |
| `itinerary` | Itinerary stop names in order |
| `itineraryStops` | Stops with coordinates |
| `supplier`, `supplierUrl` | Activity provider and its GetYourGuide page |
| `ratingBreakdown` | Rating per category, e.g. `{"Guide": 4.2, "Value for money": 4.3}` |

### How to use GetYourGuide Scraper

1. Paste one or more GetYourGuide URLs into **Start URLs**: a destination (`https://www.getyourguide.com/rome-l33/`), a category page, an attraction page (`https://www.getyourguide.com/colosseum-l2619/`), a country page, or a search (`https://www.getyourguide.com/s/?q=rome+food+tour`).
2. Set **Max items** to cap the run (and the cost). Pages hold 24 activities each and are followed automatically.
3. Optionally pick a **Currency** (USD, EUR, GBP, …) and switch on **Include activity details**.
4. Click **Start**. Results appear in the **Dataset** tab; export as JSON, CSV or Excel, or read them through the API.

### Input example

```json
{
  "startUrls": [
    { "url": "https://www.getyourguide.com/paris-l16/" },
    { "url": "https://www.getyourguide.com/s/?q=lisbon+sunset+cruise" }
  ],
  "maxItems": 200,
  "currency": "EUR",
  "includeDetails": true
}
```

### Output example

```json
{
  "id": 193940,
  "title": "1-Hour Seine Cruise departing from the Eiffel Tower",
  "url": "https://www.getyourguide.com/paris-l16/paris-1-hour-seine-cruise-departing-from-the-eiffel-tower-t193940/",
  "city": "Paris",
  "destination": "Paris",
  "priceFrom": 20.92,
  "currency": "USD",
  "originalPrice": null,
  "rating": 4.41,
  "reviewCount": 90162,
  "duration": "1 hour",
  "tags": ["Optional audio guide"],
  "badges": ["#1 selling water activity"],
  "isBestseller": true,
  "images": ["https://cdn.getyourguide.com/img/tour/cf879ee295abc8e4.jpeg/132.jpg"],
  "highlights": ["Embark at the foot of the Eiffel Tower for a Seine cruise aboard a modern boat", "…"],
  "inclusions": ["1-hour river cruise departing from the Eiffel Tower", "Commentary and additional content via a smartphone app available in 11 languages"],
  "exclusions": ["Drinks and snacks", "Souvenir photos"],
  "audioGuideLanguages": ["Spanish", "Chinese", "Dutch", "English", "French", "German", "…"],
  "cancellationPolicy": "Cancel up to 24 hours in advance for a full refund",
  "meetingPoint": "Board at Port de la Bourdonnais (at the foot of the Eiffel Tower) at pontoon no. 3.",
  "latitude": 48.860385,
  "longitude": 2.293565,
  "supplier": "BATEAUX PARISIENS - S.E.V.P.T.E",
  "ratingBreakdown": { "Guide": 4.16, "Transportation": 4.48, "Value for money": 4.34 }
}
```

### How much does it cost?

Pay per result: a small price per activity from a listing page, plus a small extra per activity when **Include activity details** is on (one extra page fetch each). No subscription; Apify's free plan is enough to try it. Scraping 1,000 activities with details costs a few dollars.

### How do I scrape all tours in a city?

Use the destination URL (`https://www.getyourguide.com/<city>-l<id>/`) as the start URL and raise **Max items**. The scraper follows the `?p=2, ?p=3, …` pages until the site stops returning activities. Category pages (`…/<city>-l<id>/<category>-tc<id>/`) work the same way and are the best way to get a specific segment such as food tours or day trips.

### Can I get prices in my currency?

Yes. Set **Currency** to any ISO code GetYourGuide supports (USD, EUR, GBP, CHF, AUD, CAD, JPY, …). Every price in the output, including `originalPrice`, is returned in that currency and `currency` tells you which one was applied.

### Does it work without login or a browser?

Yes. All data comes from public pages that GetYourGuide serves to anonymous visitors. No account, cookies or headless browser are needed, which keeps runs fast and cheap.

### Can I scrape GetYourGuide reviews?

Listing items carry the average rating and review count, and detail items add the rating breakdown per category. Individual review texts are not part of this Actor.

### Monitor changes on a schedule

Turn on **Only new or changed items** and the Actor remembers what earlier runs of the same input returned: each run outputs only activities that are new in the watched window or whose price, struck-through original price, currency or rating changed. Unchanged activities are dropped before anything is saved or any activity page is opened, so they are not charged (activity URLs given as start URLs are compared after their page is read and are not charged when unchanged). **Max items** becomes the window that is checked on every run (for example the top 50 activities of a destination), so a run with nothing new costs only the listing pages. Save the input as a task, then add a Schedule to it in Apify Console (Schedules → Create new, for example daily). Every output activity carries `changeType` (`new` or `changed`); changed ones carry `previousValues`, e.g. `{"priceFrom": 52}` for a tour that now costs 49. GetYourGuide converts suppliers' prices into the currency you pick, so price moves under 1 % (exchange-rate drift) and rating moves under 0.05 are ignored; choose the destination's own currency (EUR for Paris) to follow the suppliers' real prices. Use **Monitoring key** to keep several schedules on the same input separate.

### Integrations and API

Use the run in Zapier, Make, n8n, Google Sheets, or call it from Python/Node with the Apify client. See the **API** tab for ready-made snippets. Schedule it to monitor prices or new activities in a destination.

### Is it legal to scrape GetYourGuide?

This Actor collects only publicly available data: activity listings, prices, ratings and the activity provider's name and GetYourGuide page as shown on the activity (usually a company; some independent guides trade under their own name). It does not collect reviews, reviewer names or any contact details. You are responsible for how you use the data and for complying with GetYourGuide's terms and applicable law.

### Support

Found a bug or need a field added? Open an issue in the **Issues** tab; it is usually answered within a day.

### Related scrapers

- [Klook Scraper](https://apify.com/tortuga/klook-scraper): Activities, Prices & Reviews
- [Tripadvisor Scraper](https://apify.com/tortuga/tripadvisor-scraper): Reviews, Hotels, Restaurants, Attractions
- [OpenTable Scraper](https://apify.com/tortuga/opentable-scraper): Restaurants, Availability & Reviews
- [Eventbrite Scraper](https://apify.com/tortuga/eventbrite-scraper): Events, Tickets & Organizers
- [Viator Scraper](https://apify.com/tortuga/viator-scraper): Tours, Prices, Ratings & Reviews

### Found it useful?

A ★ review on this Actor's Apify Store page helps other users find it and tells us what to improve. Issues and feature requests are welcome in the Actor's **Issues** tab.

# Actor input Schema

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

GetYourGuide pages to scrape: destination pages (https://www.getyourguide.com/paris-l16/), category pages (.../paris-l16/food-and-drink-tc55/), attraction pages (.../eiffel-tower-l2600/), country pages, or search results (https://www.getyourguide.com/s/?q=rome+food+tour). A single activity URL (…-t123456/) is also accepted and returns that one activity with full details. Each listing page is paginated automatically.

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

Stop after this many activities in total (across all start URLs). Keeps cost predictable. Listing pages hold 24 activities each.

## `includeDetails` (type: `boolean`):

Also open every activity page to get the full description, highlights, inclusions/exclusions, languages, cancellation policy, meeting point with coordinates, itinerary stops, supplier and rating breakdown. Slower and charged extra per activity (see pricing).

## `currency` (type: `string`):

3-letter ISO code (USD, EUR, GBP, …) to show prices in. Leave empty for the site default (USD).

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new items or items whose price/status changed. Use with a Schedule; unchanged items are not charged. With this on, Max items is the number of activities checked each run (the watched window, e.g. the top 50 of a destination), so a run never digs deeper than the first one. Compared: price, struck-through original price, currency and rating; price moves under 1 % (exchange-rate drift) and rating moves under 0.05 are ignored. Tip: pick the destination's own currency (EUR for Paris) to watch the suppliers' real prices.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input.

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

Apify Proxy is recommended. If GetYourGuide blocks the default datacenter proxy (HTTP 403), the actor switches to RESIDENTIAL proxy automatically for the rest of the run; residential traffic is billed to your account at Apify's proxy rates.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.getyourguide.com/paris-l16/"
    }
  ],
  "maxItems": 100,
  "includeDetails": false,
  "currency": "USD",
  "onlyNewOrChanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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/"
        }
    ],
    "currency": "USD",
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/getyourguide-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/" }],
    "currency": "USD",
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/getyourguide-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 '{
  "startUrls": [
    {
      "url": "https://www.getyourguide.com/paris-l16/"
    }
  ],
  "currency": "USD",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/getyourguide-scraper --silent --output-dataset

```

## MCP server setup

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