# GetYourGuide Tours Scraper & Price Monitor - Ratings & Bookings (`neverempty/getyourguide-tours-monitor`) Actor

For tour operators and travel agencies watching competitors: price, discount, rating, review count, duration, free cancellation and bookings yesterday for every tour on a GetYourGuide city page (Paris had 2,708 on 2026-10-10). Monitoring returns only new tours, price and rating moves. CSV or Excel.

- **URL**: https://apify.com/neverempty/getyourguide-tours-monitor.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 tour returneds

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 Tours Scraper & Price Monitor

Track competitor tour prices on GetYourGuide: give this Actor a city or area page (for example `https://www.getyourguide.com/paris-l16/`) and it returns every tour listed there with its price, discount, rating, review count, duration, free cancellation and bookings yesterday. Turn on monitoring and scheduled runs return only what changed: new tours, price moves, rating changes and tours that gained many reviews.

Built for tour operators, activity providers, travel agencies and destination marketers who want to see how the tours around theirs are priced and rated, without copying numbers by hand.

No GetYourGuide account or API key needed. Prices in the currency you choose (USD, EUR, JPY and more). Export as JSON, CSV or Excel, or push changes to Slack, email or a sheet with an Apify integration.

### What you get

- **One row per tour** for each location, in GetYourGuide's order: title, short summary, starting price (`price`) and the struck-through price before a discount (`priceBeforeDiscount`, `discountPercent`), whether the price is per person or per group (`priceIsPer`, `priceUnitText`), rating (`rating`, and `ratingShown` exactly as the card shows it), review count, duration or validity, free cancellation, skip the line, "likely to sell out", new activity, bookings yesterday (`bookedYesterday`), booking cut-off, features (private option, pickup, small group, audio guide...), highlights, badges, category, image and the tour link.
- **Any currency GetYourGuide offers.** Choose `currency` (37 options, USD when empty). Every row carries the currency GetYourGuide actually used.
- **Four orders**: popularity (what a visitor sees first), price low to high, price high to low, rating high to low. `position` follows the order.
- **Monitoring mode** (`monitoringMode`): only tours that are new to the watch, whose price moved by `minPriceChangePercent` or more, whose shown rating moved (for example 4.6 to 4.7), or that gained `minNewReviews` reviews since the row last returned for them. Each changed row carries the previous values.
- **No failed runs for "nothing found".** An unknown location, a refused request or a spending limit each come back as a free row that says why.

For new tours without reviews, `rating` is `null`, `reviewCount` is `0`, and GetYourGuide's rating for the tour's provider is in `providerRating` / `providerReviewCount`.

### Input

| Field | What it does |
|---|---|
| `locations` | GetYourGuide city, region or country pages, one per entry: `https://www.getyourguide.com/paris-l16/`, `rome-l33` or just the number `33`. Pages in other languages (`/de-de/paris-l16/`) work too. Single tour pages are refused. Required. |
| `sortBy` | `popularity` (empty = this), `price-low-to-high`, `price-high-to-low` or `rating-high-to-low`. |
| `currency` | `USD`, `EUR`, `GBP`, `JPY` and the other currencies in GetYourGuide's menu. Empty = USD. |
| `maxTours` | Tours to read per location, 1-1000, 24 per page. Empty = 100. In monitoring mode this is the range being watched. |
| `monitoringMode` | Return only tours that are new to this watch or whose price, shown rating or review count moved. The first run returns every tour as new. |
| `minPriceChangePercent` | Monitoring only. Smallest price move that counts, in percent of the price last returned. Empty = 2. |
| `minNewReviews` | Monitoring only. Return a tour again when it gained at least this many reviews. `0` = do not watch review counts. Empty = 20. |
| `resetMonitoringState` | Forget what this watch remembered; this run returns every tour as new. |

### Output

```json
{
  "status": "ok",
  "locationQuery": "https://www.getyourguide.com/paris-l16/",
  "locationId": 16,
  "position": 1,
  "page": 1,
  "tourId": "1282311",
  "title": "Paris: Evening Lights Cruise with Legendary Bateaux-Mouches®",
  "summary": "Experience the magic of Paris after dark on an evening cruise with Bateaux-Mouches. Glide along the Seine and admire the city's most famous landmarks beautifully illuminated.",
  "price": 19.06,
  "priceBeforeDiscount": 23.54,
  "discountPercent": 19.04,
  "discountText": "Save up to 19%",
  "currency": "USD",
  "priceIsPer": "person",
  "priceUnitText": "per person",
  "rating": 4.34,
  "ratingShown": 4.3,
  "reviewCount": 5931,
  "duration": "70 minutes - 1.5 hours",
  "validity": null,
  "freeCancellation": false,
  "skipTheLine": false,
  "likelyToSellOut": false,
  "newActivity": false,
  "bookedYesterday": 306,
  "bookingCutoff": null,
  "features": [],
  "highlights": [],
  "badges": ["Best match"],
  "category": "entryTicket",
  "activityType": "waterActivity",
  "providerRating": null,
  "providerReviewCount": null,
  "imageUrl": "https://cdn.getyourguide.com/img/tour/115954509470854c4b5876061d932af25b3db3397d3dcd3b63c6a94855f52a90.jpeg/132.jpg",
  "tourUrl": "https://www.getyourguide.com/paris-l16/paris-bateaux-mouches-evening-cruise-souvenir-postcard-t1282311/",
  "totalToursInLocation": 2708,
  "sortBy": "popularity",
  "currencyRequested": "USD",
  "scrapedAt": "2026-10-10T09:00:00.529Z"
}
```

A value GetYourGuide does not show for a tour is `null` (for example `priceBeforeDiscount` when there is no struck-through price, or `bookedYesterday` when the card does not say). `freeCancellation` is `true` when the card shows "Free cancellation" and `false` when it does not; in our checks, tours without that label were non-refundable on their own page. The provider's company name is only on each tour's own page, so it is not in the rows.

In monitoring mode each row also has `change` (`new`, `price-down`, `price-up`, `price-shown`, `rating-up`, `rating-down` or `reviews-added`), `previousPrice`, `previousCurrency`, `previousRatingShown`, `previousReviewCount` and `previousReturnedAt`.

#### Free rows (never charged)

| `status` | When |
|---|---|
| `location-not-found` | GetYourGuide answered that the location does not exist. |
| `no-results` | The location has no tours. |
| `currency-not-as-requested` | GetYourGuide returned another currency than the one asked for (the rows say which). |
| `blocked` | GetYourGuide kept refusing the list. The Actor does not answer check pages; it says which locations were not searched. |
| `unreadable` | A page could not be read, or the answer was for another location. Nothing is guessed. |
| `bad-input` | The input could not be used (for example a single tour page or a city name without its page). Nothing was requested. |
| `robots-disallowed` | GetYourGuide's robots.txt disallows the address the Actor reads. Nothing was requested. |
| `no-change` | Monitoring: nothing new and nothing moved since the last returned rows. |
| `budget-reached` | The run reached the maximum total charge you set; the rest was not returned and not charged. |

### Monitoring competitors on a schedule

1. Run once with `monitoringMode` on: every tour comes back as `new` and becomes the starting point.
2. Schedule the same input (for example daily). Each run returns only tours that changed since the row last returned for them.
3. A run with no change returns one free `no-change` row; only a small watch check fee is charged for that run.

The memory is kept per location, sort order and currency (changing `maxTours` keeps the same watch). Tours not returned because of a spending limit are not remembered, so the next run returns them. `popularity` is GetYourGuide's own ranking and can change from day to day; tours that move into your top `maxTours` come back as `new` (in a 2026-10-10 check, two Paris runs a few minutes apart returned 48 new, then no change).

### How it works

Unofficial and not affiliated with GetYourGuide. The Actor reads the same tour list that GetYourGuide's location page loads when a visitor presses "Show more", 24 tours per request, and checks that each answer is for the location you asked for. It reads GetYourGuide's robots.txt at the start of every run and does not request addresses it disallows (it does not use GetYourGuide's search or date filters). It never logs in and never answers a check page; if GetYourGuide keeps refusing, the run stops with a free `blocked` row instead of guessing.

### Pricing

You pay per tour row returned. Free rows are never charged. In monitoring mode, a run that finds no change is charged one watch check instead of rows.

### FAQ

**How do I find the page for my city?** Open GetYourGuide, go to the city or region (for example "Things to do in Rome") and copy the address: it ends in `-l` and a number, like `https://www.getyourguide.com/rome-l33/`.

**Is the price per person?** Usually. `priceIsPer` says `person` or `group`, and `priceUnitText` repeats the card's own words (for example "per group up to 6"). The price is the "From" price on the card, before dates are chosen.

**Can I watch a competitor's price every day?** Yes. Turn on `monitoringMode` and schedule the run; you get a row only when that tour's price, shown rating or review count changes, with the old value next to the new one.

**Does it collect reviews or reviewer names?** No. It returns the rating and the number of reviews only.

**Can I get prices for a specific date?** Not yet: the list shows the "From" price. Tell us in the Issues tab if you need dated prices.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

## `locations` (type: `array`):

GetYourGuide pages that list tours for a city, region or country, for example https://www.getyourguide.com/paris-l16/ or https://www.getyourguide.com/rome-l33/. You can also write just the part with the number (paris-l16) or the number alone (16). Single tour pages (ending in -t followed by a number) are refused. Required.

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

The order GetYourGuide ranks the tours in; the position column follows it. Empty = popularity, the order a visitor sees first.

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

Currency GetYourGuide shows the prices in (its own conversion). Every row also carries the currency GetYourGuide actually used. Empty = USD.

## `maxTours` (type: `integer`):

How many tours to read for each location, from the top of the chosen order (24 per page). Empty = 100. In monitoring mode this is the range being watched.

## `monitoringMode` (type: `boolean`):

On: the first run remembers the tours and returns them all; later runs return only tours that are new to the watch, whose price moved, whose shown rating moved, or that gained many reviews. If nothing changed, a single small watch check fee applies instead. Off (empty): every run returns every tour.

## `minPriceChangePercent` (type: `number`):

Monitoring only. A price move smaller than this, compared with the price last returned for that tour, is ignored. Empty = 2.

## `minNewReviews` (type: `integer`):

Monitoring only. Return a tour again when its review count grew by at least this many since it was last returned. 0 = do not watch review counts. Empty = 20.

## `resetMonitoringState` (type: `boolean`):

On: forget what earlier runs remembered for these locations, so this run returns every tour as new. Empty = keep the memory.

## Actor input object example

```json
{
  "locations": [
    "https://www.getyourguide.com/paris-l16/"
  ],
  "maxTours": 20
}
```

# Actor output Schema

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

One row per tour on each GetYourGuide city or area page: title, price and price before discount in the chosen currency, whether the price is per person or per group, rating and review count, duration, free cancellation, skip the line, bookings yesterday, badges, category and the tour link. In monitoring mode, only tours new to the watch or whose price, shown rating or review count moved, with the values last returned. Unknown locations, refused requests and runs that hit their maximum charge come back as free rows that say why.

# 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 = {
    "locations": [
        "https://www.getyourguide.com/paris-l16/"
    ],
    "maxTours": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/getyourguide-tours-monitor").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 = {
    "locations": ["https://www.getyourguide.com/paris-l16/"],
    "maxTours": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("neverempty/getyourguide-tours-monitor").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 '{
  "locations": [
    "https://www.getyourguide.com/paris-l16/"
  ],
  "maxTours": 20
}' |
apify call neverempty/getyourguide-tours-monitor --silent --output-dataset

```

## MCP server setup

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

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/TaYQlsQS5CkMA0HUd/builds/LXbBMtiRaQhomjFPM/openapi.json
