# GetYourGuide Scraper - Tours, Activities, Prices & Reviews (`abotapi/getyourguide-scraper`) Actor

Scrape GetYourGuide tours and activities by keyword, city or link. Get prices, discounts, ratings, review counts, duration, languages, activity provider, categories, badges, highlights, meeting-point coordinates, images and traveler reviews with provider replies and photos.

- **URL**: https://apify.com/abotapi/getyourguide-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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: Tours, Activities, Prices & Reviews

GetYourGuide Scraper turns GetYourGuide (getyourguide.com) into a clean data feed. Search any city, place or activity keyword, or paste activity links, and get prices, discounts, ratings, review counts, duration, languages, the activity provider, categories, badges, highlights, full image galleries and traveler reviews.

### Why This Scraper?

- **Three ways in.** Search by plain keyword or city name, paste any GetYourGuide link (activity, search, destination, category, any language), or collect traveler reviews. No ids or URLs to build by hand.
- **Real prices in your currency.** The "from" price, the original price and the discount percentage, in the currency you pick.
- **Provider and languages.** Every activity can carry its provider name, the guide languages, group size, cancellation terms and Reserve now, pay later flag.
- **Deep detail on demand.** Highlights, inclusions, exclusions, what to bring, meeting point, itinerary stops, full description and the complete image gallery.
- **Filters that really narrow.** Sort order, minimum rating, price range, tour languages and duration are applied by the site itself, plus free cancellation and skip-the-line toggles. Reviews can be narrowed by star rating, language, traveler type and written text.
- **Coordinates and demand signals.** Meeting-point coordinates and address, every map pin of the itinerary, the best-seller flag and the daily "booked yesterday" counter.
- **Built for schedules.** Incremental mode returns only new and changed items on recurring runs (optionally only when a price moves), and Resume continues an interrupted run without paying twice.

### Use Cases

- **Travel price monitoring:** track "from" prices and discounts for the same destination every day.
- **Competitive research for tour operators:** compare ratings, review counts, durations and providers across a city.
- **Travel apps and aggregators:** feed activity cards, galleries and highlights into your own product.
- **Reputation analysis:** collect traveler reviews with rating, country, traveler type and language for sentiment work.
- **Market sizing:** count and classify what is on offer per destination, category and price band.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `type` | `"activity"` (or `"review"`) |
| `activityId` | `100000` |
| `title` | `"City: Guided Walking Tour"` |
| `url` | link to the activity page |
| `description` | short description |
| `priceFrom` / `priceCurrency` | `43.45` / `"USD"` |
| `originalPrice` / `discountPercent` / `priceUnit` | `51.0` / `15` / `"per person"` |
| `rating` / `reviewCount` | `4.9` / `686` |
| `durationText` | `"3 hours"` |
| `freeCancellation` / `skipTheLine` / `badges` | `true` / `false` / `["Top rated"]` |
| `categories` | `["dayTrip", "privateTour"]` |
| `languages` | `["English", "French"]` |
| `supplier` | `"Sample Tours Ltd"` |
| `highlights` / `inclusions` / `exclusions` | lists of text |
| `meetingPoint` / `itinerary` | start location line and stops |
| `latitude` / `longitude` / `meetingPointAddress` / `endPointAddress` | meeting-point coordinates and where the activity starts and ends |
| `mapMarkers` | every itinerary pin with `title`, `latitude`, `longitude`, `description` and `kind` (`meeting` or `stop`) |
| `isBestseller` / `bookedIn24Hours` | best-seller flag and the "booked yesterday" counter |
| `audioGuide` / `pickupAvailable` / `privateGroup` / `wheelchairAccessible` | card flags from the results list |
| `city` / `area` / `country` / `pointOfInterest` | `"City"` / `"Region"` / `"Country"` / `"Landmark"` |
| `images` / `imageUrl` | full gallery and the first image |
| `subRatings` / `aiReviewSummary` | per-topic ratings and the site's traveler summary |
| `searchQuery` / `position` | the query that found it and its rank |

Review rows carry `reviewId`, `rating`, `text`, `author`, `authorCountry`, `authorCountryCode`, `date`, `language`, `travelerType`, `verifiedBooking`, the traveler `photos`, the provider's reply (`ownerResponse`, `ownerResponseDate`) and the activity's overall `activityRating` and `activityReviewCount`.

### How to Use

1. Pick a **mode**: `search`, `url` or `reviews`.
2. Fill in the fields for that mode, then set the filters you need.
3. Set **Max items** to control run size and cost, then click **Start**.
4. Download the dataset as JSON, CSV or Excel, or read it through the API.

**Search a city with filters:**

```json
{
  "mode": "search",
  "queries": ["paris"],
  "sortBy": "rating_desc",
  "minRating": "4.5",
  "freeCancellationOnly": true,
  "maxItems": 50
}
```

**Paste an activity link for the full record:**

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

**Collect traveler reviews:**

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

**Collect only 5-star couple reviews written in English:**

```json
{
  "mode": "reviews",
  "urls": ["https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/"],
  "minReviewRating": "5",
  "reviewTravelerTypes": ["couple"],
  "reviewLanguages": ["en"]
}
```

An activity link always returns the full record. Every link the site itself shows works in `url` and `reviews` modes:

| Link you paste | What the actor does |
| --- | --- |
| Activity page (`/paris-l16/<name>-t395320/`, also `/x-t395320/` or the bare id) | returns the full record |
| Search page (`/s/?q=paris`) | walks the results like a search |
| Destination page (city, area, country or attraction, `/rome-l33/`) | walks the destination like a search |
| Category page (`/amsterdam-l36/cruises-boat-tours-tc48/`) | walks the destination narrowed by the category name |
| The same links with a language prefix (`/en-gb/`) or on a country domain | normalised to the main site, same result |
| Home, help, partner or other-site links | skipped with a note in the log |

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/getyourguide-scraper").call(run_input={"mode": "search", "queries": ["rome"], "maxItems": 20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["priceFrom"], item["rating"])
```

JavaScript:

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/getyourguide-scraper').call({ mode: 'search', queries: ['rome'], maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Tips

- Prices follow the **Currency** you select for search and reviews runs. An activity link returns the price the page shows by default.
- Turn **Fetch full activity details** off for a lighter run that returns list fields only (no provider, languages or itinerary).
- Entry tickets have no guide, so `languages` can be empty for them.
- Review filters are applied while reading the reviews feed, so a narrow filter scans more pages (up to 1000 reviews per activity) to find enough matches.

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one interrupted run: paste its run or dataset ID and the actor skips everything already collected there.
- **Incremental mode** (`incrementalMode`) is for scheduled runs over the same search. Each item is classified `NEW`, `UPDATED` (with `changedFields`), `UNCHANGED` (suppressed and not billed unless `emitUnchanged` is on), `REAPPEARED` or `EXPIRED` (only after a run that scanned the whole search; on by default, switch it off with `emitExpired`). `stateKey` names or shares the stored state.
- **Price monitoring:** set `changeScope` to `priceAndStock` so an item is `UPDATED` only when its from-price, original price, discount, currency or price unit moves. Add `compactUpdates` to receive slim `UPDATED` and `EXPIRED` rows (identity, link, current price and a `priceChanges` object with old and new values). `expireAfterMissedScans` waits for N complete scans before an item is `EXPIRED`. `EXPIRED` means the activity dropped out of the search results; it does not prove the activity is unavailable.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search`, `url` or `reviews`. |
| `queries` | array | `["paris"]` | Cities, places or activity keywords (search mode; also picks activities in reviews mode). |
| `sortBy` | string | `popularity` | `popularity`, `price_asc`, `price_desc` or `rating_desc`. |
| `minRating` | string | `0` | Minimum star rating: `0`, `3.0`, `3.5`, `4.0` or `4.5`. |
| `minPrice` | integer | (none) | Lowest "from" price in the selected currency. |
| `maxPrice` | integer | (none) | Highest "from" price in the selected currency. |
| `languages` | array | `[]` | Tour language codes such as `en`, `de`, `fr`. |
| `durations` | array | `[]` | Duration buckets: `0` (0-3 h), `1` (3-5 h), `2` (5-7 h), `3` (full day), `4` (2 days), `5` (3 days), `6` (4 days), `7` (5+ days). |
| `freeCancellationOnly` | boolean | `false` | Keep only activities with free cancellation. |
| `skipTheLineOnly` | boolean | `false` | Keep only activities with skip-the-line or fast-track entry. |
| `urls` | array | four example links | Activity, search, destination or category links in any language, or activity ids (url and reviews modes). |
| `fetchDetails` | boolean | `true` | Add provider, languages, highlights, inclusions, itinerary, full description and gallery. |
| `maxPages` | integer | (none) | Optional limit on result pages per search; empty means no page limit. |
| `maxItems` | integer | `20` | Stop after this many rows (`0` = no limit). |
| `maxReviewsPerActivity` | integer | `20` | Reviews mode: reviews collected per activity (up to 1000). |
| `minReviewRating` | string | `0` | Reviews mode: minimum star rating, `0` (any) to `5`. |
| `reviewLanguages` | array | `[]` | Reviews mode: keep reviews written in these languages (`en`, `de`, ...). |
| `reviewTravelerTypes` | array | `[]` | Reviews mode: `couple`, `friends`, `solo` or `family`. |
| `reviewsWithTextOnly` | boolean | `false` | Reviews mode: skip star-only reviews. |
| `currency` | string | `USD` | Currency for prices. |
| `language` | string | `en-US` | Language of titles and descriptions. |
| `proxy` | object | Apify Proxy | Connection settings. |
| `resumeFromRunId` | string | (none) | Continue one interrupted run. |
| `incrementalMode` | boolean | `false` | Return only new and changed items on scheduled runs. |
| `stateKey` | string | (none) | Name or share an incremental-mode state. |
| `emitUnchanged` | boolean | `false` | Also return (and bill) unchanged items. |
| `emitExpired` | boolean | `true` | Incremental mode: also return (and bill) items no longer found after a full scan. |
| `changeScope` | string | `all` | Incremental mode: `all` fields or `priceAndStock` (price and discount only). |
| `compactUpdates` | boolean | `false` | Incremental mode: slim `UPDATED` and `EXPIRED` rows. |
| `expireAfterMissedScans` | integer | `1` | Incremental mode: complete scans an item must be missing before `EXPIRED`. |
| `ignoreFieldsForChanges` | array | `[]` | Incremental mode only: field names excluded from change detection. |
| `mcpConnectors` | array | (none) | Optional: send a summary of each item to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which items are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. |

### Output Example

The Output tab offers a combined **Results** table plus **Activities** and **Reviews** tables. Every row carries a `type` field (`activity` or `review`).

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "type": "activity",
  "source": "getyourguide.com",
  "activityId": 100000,
  "title": "City: Guided Walking Tour",
  "url": "https://www.getyourguide.com/city-l1/city-guided-walking-tour-t100000/",
  "description": "Explore the old town with a local guide.",
  "priceFrom": 43.45,
  "originalPrice": null,
  "discountPercent": 0,
  "priceCurrency": "USD",
  "priceUnit": "per person",
  "rating": 4.9,
  "reviewCount": 686,
  "durationText": "3 hours",
  "freeCancellation": true,
  "skipTheLine": false,
  "badges": ["Top rated"],
  "categories": ["dayTrip"],
  "languages": ["English"],
  "supplier": "Sample Tours Ltd",
  "highlights": ["Walk through the old town"],
  "meetingPoint": "1 Sample Street, City",
  "city": "City",
  "country": "Country",
  "images": ["https://cdn.getyourguide.com/image/sample.jpg"],
  "searchQuery": "city"
}
```

### Plan Requirement

The default connection is the standard Apify Proxy pool, which works for search, reviews and gallery data. A residential connection is recommended for the most reliable results: choose a residential group in the **Proxy configuration** field. If a run keeps hitting failures on the standard pool it moves to a residential connection by itself, and it rotates to a fresh exit on every request.

Apify free plans do not include residential proxies. On a free plan, if the selected connection is refused, the run logs a clear warning and continues on a backup connection; some pages may still be unavailable. For residential access, upgrade at https://apify.com/pricing or supply your own proxy URLs (custom URLs are used exactly as given, with no backup). Full activity details are collected through the platform's managed connection; if a run cannot reach them the rows are still returned with list fields only.

### FAQ

#### How much does it cost?

Pay per event. The current rates are shown on the **Pricing** tab (paid Apify plans get lower tiered rates). The events and when each one is charged:

| Event | When it is charged |
| --- | --- |
| Result (`apify-default-dataset-item`) | once for each activity row and once for each review row pushed to the dataset (every review is its own row, so there is no separate review charge) |
| Detail enrichment (`detail-enrichment`) | once per activity row pushed with full details, charged as each row is delivered; list-only rows, review rows, unchanged rows and slim `compactUpdates` rows never carry it |
| Actor Start (`apify-actor-start`) | once per run, per GB of memory |

Unchanged or suppressed rows in incremental mode are not billed. Use **Max items** to cap the cost of any run.

#### Is it legal to scrape GetYourGuide?

This actor collects only publicly available listing and review data. You are responsible for how you use it: follow the site's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution.

#### Can I get only new or changed activities on a schedule?

Yes. Schedule the actor from the **Schedules** tab and turn on **Incremental mode**. Each run then returns only new and updated rows, and unchanged ones are not billed.

#### Why do titles and order differ between two runs?

The site ranks and words some results differently per visitor. The actor keeps one stable visitor identity per search so scheduled runs stay comparable.

#### Why did my run fail instead of returning an empty dataset?

If no page could be read at all, the run ends as failed with a clear message (proxy refused, residential unavailable on a free plan, or a connection problem) so "no matches" is never confused with "nothing could be read". Run it again in a few minutes or follow the upgrade hint in the message.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

### 🔗 Want more travel data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>✈️ <a href="https://apify.com/abotapi/viator-com-scraper"><b>Viator Scraper</b></a><br>Collect Viator.com tour and activity results from destinations, categories, search pages...</td><td>🧩 <a href="https://apify.com/abotapi/kkday-com-scraper"><b>KKday Scraper</b></a><br>Scrape KKday travel activities by keyword, city or URL. Every row carries prices...</td></tr>
<tr><td>🏨 <a href="https://apify.com/abotapi/klook-activities-scraper"><b>Klook Scraper</b></a><br>Scrape Klook activities, tours, attractions and travel experiences from search pages or...</td><td>🏨 <a href="https://apify.com/abotapi/expedia-universal-scraper"><b>Expedia Hotels Scraper</b></a><br>Scrape Expedia.com hotel listings and reviews for any destination. Extract prices...</td></tr>
<tr><td>✈️ <a href="https://apify.com/abotapi/pollstar-concert-tour-scraper"><b>Pollstar Scraper</b></a><br>Scrape Pollstar upcoming concerts and tour dates: play date, venue with full address and...</td><td>🏨 <a href="https://apify.com/abotapi/booking-com-scraper"><b>Booking.com Scraper</b></a><br>Scrape booking.com hotels, apartments, villas and hostels. Search any destination with...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/getyourguide-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com>.
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

## `mode` (type: `string`):

Choose 'search' to find activities by keyword, city or place with filters, 'url' to paste activity, search or destination links, or 'reviews' to collect traveler reviews.

## `queries` (type: `array`):

Cities, places or activity keywords, for example 'paris', 'colosseum tickets' or 'food tour rome'. Each query is searched separately. Used in search mode, and in reviews mode to pick the top activities.

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

Order of results.

## `minRating` (type: `string`):

Only activities rated at least this many stars.

## `minPrice` (type: `integer`):

Lowest 'from' price per person, in the selected currency. Leave empty for no minimum.

## `maxPrice` (type: `integer`):

Highest 'from' price per person, in the selected currency. Leave empty for no maximum.

## `languages` (type: `array`):

Only activities offered in at least one of these languages. Leave empty for all.

## `durations` (type: `array`):

Only activities with one of these durations. Leave empty for all.

## `freeCancellationOnly` (type: `boolean`):

Keep only activities with free cancellation.

## `skipTheLineOnly` (type: `boolean`):

Keep only activities with skip-the-line or fast-track entry.

## `urls` (type: `array`):

Used when mode is url (and in reviews mode). Paste any GetYourGuide link: an activity link (full record), a search link with a q parameter, a destination link (city, area, country or attraction page) or a category link. Links in other languages or on country domains work too, and a bare activity id is accepted. Destination and category links are walked like a search. Other pages (home, help, partner pages) are skipped with a note. Filter fields are ignored for links.

## `fetchDetails` (type: `boolean`):

Adds the provider, languages, highlights, inclusions, meeting point, itinerary, full description and image gallery to every activity. Turn off for a lighter run with list fields only.

## `maxPages` (type: `integer`):

Optional page limit per search. Leave empty (or 0) for no page limit. This is not the run's cap and has no finite default: the run is capped by Max items (default 20), so raise or clear Max items to collect more.

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

Maximum number of rows returned across the whole run. This is the single default cap (20); Max pages per search does not cap and defers to this field. Use 0 for unlimited.

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

Reviews mode only: how many reviews to collect for each activity (default 20, up to 1000). Each review is one result row.

## `minReviewRating` (type: `string`):

Reviews mode only: keep only reviews with at least this many stars. 'Any rating' keeps everything.

## `reviewLanguages` (type: `array`):

Reviews mode only: keep only reviews written in these languages, for example 'en', 'de' or 'fr' (two-letter codes). Leave empty for every language.

## `reviewTravelerTypes` (type: `array`):

Reviews mode only: keep only reviews from these kinds of travelers. Leave empty for all.

## `reviewsWithTextOnly` (type: `boolean`):

Reviews mode only: skip star-only reviews that have no comment.

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

Currency for prices.

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

Language of titles and descriptions.

## `proxy` (type: `object`):

Standard Apify Proxy by default. A residential connection is recommended for the most reliable results. If the selected connection is refused, the run falls back to other connections automatically.

## `resumeFromRunId` (type: `string`):

Paste a previous run ID or dataset ID to continue a large collection without returning or charging for items already collected there. Use this after an interrupted run. For recurring monitoring of the same search, use Incremental mode instead.

## `incrementalMode` (type: `boolean`):

Turn this on for recurring monitoring. The first run returns everything as NEW. Later runs return only NEW, UPDATED and REAPPEARED items. Change detection compares price, discount, title, provider, languages and the other fields; it ignores scrape time, list position, duration and highlight wording, availability messages, rating and review counters and image links, so those alone never mark an item UPDATED. State is kept separately for each search or link set; use State key to name or share a campaign. Use 'What counts as a change' to narrow detection to prices.

## `stateKey` (type: `string`):

Optional. Name this monitoring campaign to keep its state stable, or to deliberately share state across differently-configured runs. Leave empty to derive a key automatically from the search or links and the filter settings.

## `emitUnchanged` (type: `boolean`):

Off by default. Turn on to also return items that have not changed since the last run, marked UNCHANGED. This returns, and bills, extra rows you already have.

## `emitExpired` (type: `boolean`):

On by default. Also returns items that were present in a previous run but are no longer found, marked EXPIRED. EXPIRED means the activity dropped out of the search results; it does not prove the activity is unavailable. Only produced once a run has fully scanned the tracked search, not when Max items capped it or when Resume was used. Turn off to skip these rows.

## `changeScope` (type: `string`):

'All fields' marks an item UPDATED when any tracked field changes. 'Price and discount only' marks it UPDATED only when its from-price, original price, discount, currency or price unit moves, so wording or provider edits never create a billable row.

## `compactUpdates` (type: `boolean`):

Off by default. When on, UPDATED and EXPIRED rows carry only the identity, link, current price and a priceChanges object with the old and new values, not the full record. NEW rows stay complete. A slim row does not include the detail fields, so it is not charged the detail enrichment.

## `expireAfterMissedScans` (type: `integer`):

An item is marked EXPIRED only after it was missing from this many consecutive complete scans (default 1). Raise it to ride out results that rotate in and out of a search.

## `ignoreFieldsForChanges` (type: `array`):

Optional. Top-level field names to exclude from UPDATED change detection, in addition to the built-in handling. The fields stay in the output; they just do not count as a change.

## `mcpConnectors` (type: `array`):

Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API & Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write/digest. Leave empty to skip; never changes the dataset output.

## `notionParentPageUrl` (type: `string`):

URL or id of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "queries": [
    "paris"
  ],
  "sortBy": "popularity",
  "minRating": "0",
  "freeCancellationOnly": false,
  "skipTheLineOnly": false,
  "urls": [
    "https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/",
    "https://www.getyourguide.com/s/?q=paris",
    "https://www.getyourguide.com/rome-l33/",
    "https://www.getyourguide.com/amsterdam-l36/cruises-boat-tours-tc48/"
  ],
  "fetchDetails": true,
  "maxItems": 20,
  "maxReviewsPerActivity": 20,
  "minReviewRating": "0",
  "reviewLanguages": [],
  "reviewTravelerTypes": [],
  "reviewsWithTextOnly": false,
  "currency": "USD",
  "language": "en-US",
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": true,
  "changeScope": "all",
  "compactUpdates": false,
  "expireAfterMissedScans": 1,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

## `activities` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `changes` (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 = {
    "mode": "search",
    "queries": [
        "paris"
    ],
    "urls": [
        "https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/",
        "https://www.getyourguide.com/s/?q=paris",
        "https://www.getyourguide.com/rome-l33/",
        "https://www.getyourguide.com/amsterdam-l36/cruises-boat-tours-tc48/"
    ],
    "maxItems": 20,
    "maxReviewsPerActivity": 20,
    "minReviewRating": "0",
    "reviewLanguages": [],
    "reviewTravelerTypes": [],
    "reviewsWithTextOnly": false,
    "proxy": {
        "useApifyProxy": true
    },
    "incrementalMode": false,
    "emitUnchanged": false,
    "emitExpired": true,
    "changeScope": "all",
    "compactUpdates": false,
    "expireAfterMissedScans": 1,
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/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 = {
    "mode": "search",
    "queries": ["paris"],
    "urls": [
        "https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/",
        "https://www.getyourguide.com/s/?q=paris",
        "https://www.getyourguide.com/rome-l33/",
        "https://www.getyourguide.com/amsterdam-l36/cruises-boat-tours-tc48/",
    ],
    "maxItems": 20,
    "maxReviewsPerActivity": 20,
    "minReviewRating": "0",
    "reviewLanguages": [],
    "reviewTravelerTypes": [],
    "reviewsWithTextOnly": False,
    "proxy": { "useApifyProxy": True },
    "incrementalMode": False,
    "emitUnchanged": False,
    "emitExpired": True,
    "changeScope": "all",
    "compactUpdates": False,
    "expireAfterMissedScans": 1,
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/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 '{
  "mode": "search",
  "queries": [
    "paris"
  ],
  "urls": [
    "https://www.getyourguide.com/paris-l16/disneyland-paris-2-parks-ticket-1-2-3-4-5-day-t395320/",
    "https://www.getyourguide.com/s/?q=paris",
    "https://www.getyourguide.com/rome-l33/",
    "https://www.getyourguide.com/amsterdam-l36/cruises-boat-tours-tc48/"
  ],
  "maxItems": 20,
  "maxReviewsPerActivity": 20,
  "minReviewRating": "0",
  "reviewLanguages": [],
  "reviewTravelerTypes": [],
  "reviewsWithTextOnly": false,
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": true,
  "changeScope": "all",
  "compactUpdates": false,
  "expireAfterMissedScans": 1,
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/getyourguide-scraper --silent --output-dataset

```

## MCP server setup

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