# Booking.com Things-to-Do Price & Rating Snapshot (`nimbryxo-studio/booking-com-things-to-do-price-and-rating-snapshot`) Actor

Get Booking.com tours and activities for a destination with price, currency, rating, review count and a photo for each listing, by city or a custom country/city code.

- **URL**: https://apify.com/nimbryxo-studio/booking-com-things-to-do-price-and-rating-snapshot.md
- **Developed by:** [Nimbryxo-studio](https://apify.com/nimbryxo-studio) (community)
- **Categories:** Travel, Automation, E-commerce
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Booking.com Things-to-Do Price & Rating Snapshot

Turn a destination into a clean table of bookable tours, tickets and activities: price, currency, rating on both Booking's 5-point scale and a familiar 0–10 scale, review counts, duration, cancellation policy, categories, photos and addresses. Search any city, or paste product URLs/IDs to pull one record per activity.

No account, no cookies and no proxy setup are needed. The actor reads Booking.com's public attractions data directly and returns one JSON record per activity.

### What this actor does

- **Five modes** - search a destination, fetch product details, check availability, read reviews, or list the destination catalogue
- **Any destination** - 30 popular cities plus custom city/country input
- **Prices and ratings** - public and discounted prices, Booking's 0-5 rating plus a 0-10 compatibility field, and review counts
- **Activity detail** - duration, cancellation policy, categories, photos, addresses, guide languages, inclusions and supplier
- **Filters** - rating, free cancellation, skip-the-line, wheelchair access, time of day, guide language, category, price and review count
- **Optional enrichment** - reviews, availability calendars and full product details
- **Empty fields are omitted** - never `null`, blank or placeholder values

### Modes

| Mode | What it returns |
|---|---|
| `search` | Activities for a destination, with optional filters and pagination (default) |
| `productDetails` | Full records for specific product IDs or URLs |
| `availability` | Time slots for one date, plus an optional available-dates calendar |
| `reviews` | Guest reviews for specific products, with sorting and a per-product cap |
| `destinations` | The Booking.com city catalogue with ufi, country and product count |

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | select | `search` | One of the five modes above |
| `destination` | select | `fr/paris` | 30 popular cities or `custom` |
| `customCity` | text | – | City name or slug, e.g. `kuala-lumpur` |
| `customCountry` | text | – | Two-letter code or country name, e.g. `my` |
| `query` | text | – | Free-text search inside the destination |
| `sortBy` | select | `trending` | `trending`, `lowest_price`, `highest_weighted_rating` |
| `minRating` | select | any | `4.5`, `4.0`, `3.5` or `3.0` on Booking's 5-point scale |
| `freeCancellationOnly` | boolean | false | Keep free-cancellation activities |
| `skipTheLineOnly` | boolean | false | Keep skip-the-line activities |
| `wheelchairAccessibleOnly` | boolean | false | Keep wheelchair-accessible activities |
| `timeOfDay` | select | any | Morning, afternoon or evening start |
| `guideLanguage` | select | any | Guide language filter |
| `category` | select | any | Tours, museums, nature, entertainment, food, services |
| `minPrice` / `maxPrice` | number | – | Representative-price bounds |
| `minReviews` | integer | – | Minimum guest-review count |
| `startDate` / `endDate` | text | – | Availability window in `YYYY-MM-DD` |
| `productIds` | string list | `[]` | Booking product IDs or product URLs |
| `productUrls` | URL list | `[]` | Product URLs (merged with `productIds`) |
| `availabilityDate` | text | tomorrow | Date for `availability` mode |
| `includeCalendar` | boolean | false | Fetch available dates and cheapest-price groups |
| `includeReviews` | boolean | false | Attach reviews to each product |
| `reviewSortBy` | select | `most_relevant` | Review order |
| `maxReviewsPerProduct` | integer | 10 | 1–50 |
| `includeAvailability` | boolean | false | Attach time slots to each product |
| `includeDetails` | boolean | false | Fetch full details (all photos, inclusions, accessibility) per search result |
| `maxResults` | integer | 50 | 1–1,000; the daily prefill uses 3 |
| `language` | select | `en` | Content language for names and descriptions |
| `currency` | select | `EUR` | Currency for representative prices |

#### Examples

Smallest daily run:

```json
{ "destination": "fr/paris", "maxResults": 3 }
```

Filtered city search:

```json
{
  "mode": "search",
  "destination": "it/rome",
  "minRating": "4.5",
  "freeCancellationOnly": true,
  "sortBy": "lowest_price",
  "maxResults": 40
}
```

Custom city:

```json
{
  "mode": "search",
  "destination": "custom",
  "customCity": "kuala-lumpur",
  "customCountry": "my",
  "maxResults": 20
}
```

Product details by URL or ID:

```json
{
  "mode": "productDetails",
  "productIds": [
    "PRe4kSVWXdrD",
    "https://www.booking.com/attractions/fr/pre4ksvwxdrd-seine-river-sightseeing-cruise.html"
  ]
}
```

Availability for one date, plus the calendar:

```json
{
  "mode": "availability",
  "productIds": ["PRe4kSVWXdrD"],
  "availabilityDate": "2026-12-15",
  "startDate": "2026-12-01",
  "endDate": "2026-12-31",
  "includeCalendar": true
}
```

### Output per record type

Every record includes the fields the source provides; empty values are omitted, never sentinel-filled.

- Identity: `recordType`, `id`, `name`, `slug`, `url`, `sourceUrl`, `city`, `cityName`, `destinationUfi`, `destinationName`, `destinationCountry`
- Price: `price`, `currency`, `pricePublicAmount`, `priceDiscountAmount`, `priceDiscountPercentage`
- Ratings: `rating` (0–10), `ratingOutOf5`, `ratingScale`, `reviewCount`, `reviewCountAll`, `photosCount`, `ratingCategoryBreakdown`
- Duration: `duration`, `durationValue`, `durationMin`, `durationMax`
- Policy: `freeCancellation`, `cancellationPolicy`, `availableFrom`, `bookingWindowDays`, `isBookable`
- Taxonomy: `type`, `categories`, `tags`, `labels`, `primaryLabel`, `flags`, `highlights`, `itinerary`
- Copy: `shortDescription`, `description`, `additionalInfo`; `whatsIncluded`, `notIncluded`, `uniqueSellingPoints` and `accessibility` are lists
- Languages: `guideLanguages`, `audioLanguages`
- Media: `photoUrl`, `photoCaption`, `photos`
- Location: `address`, `countryCode`, `countryName`, `postalCode`, `latitude`, `longitude`, `locationType`, `locationInstructions`, `departurePoint`, `meetingPoint`
- Commerce: `supplier`, `externalSellerUrl`, `poweredBy`, `operatedBy`, `timeZone`
- Optional: `reviews`, `reviewSummary`, `timeSlots`, `availabilityDate`, `availableDates`, `cheapestPrices`
- `scrapedAt`

**Rating scales:** Booking's attractions API reports 0–5. This actor keeps the original `rating` field at 0–10 for compatibility, and also emits `ratingOutOf5` and `ratingScale`, so you can use either without guessing.

### Use cases

- **Travel planning** - compare tours, tickets and activities across a destination
- **Price monitoring** - track public and discounted activity prices over time
- **Market research** - map a city's attraction supply, categories and ratings
- **Review analysis** - export guest reviews for sentiment and complaint research
- **Availability checks** - inspect time slots and calendars for specific dates

### FAQ

**Do I need a Booking.com account?**
No. The actor reads public listing data and needs no login, cookie or API key.

**Do I need a proxy?**
No. It connects directly and switches to a working connection automatically only if one is needed. No proxy setup is required.

**Can I use any city?**
Yes. Pick one of the 30 popular cities or set `destination` to `custom` and enter a city name and country. Cities with no attractions inventory return a clean empty result with a status message.

**Why are some fields missing on a record?**
Booking.com does not publish every detail for every activity. The actor omits fields the source does not have instead of writing `0`, `"N/A"` or an empty string.

**Why is `category` applied after fetching?**
Booking's category parameter is broader than its own product taxonomy. The actor fetches the page, then verifies each product's own type/categories/tags, so a category filter is accurate rather than approximate.

**How many results can I get?**
`maxResults` supports up to 1,000. The source may have thousands of activities in a large city; the status message reports when the cap was reached.

**How fresh is the data?**
Each run reads Booking.com live, so prices, ratings and availability reflect the request time.

**Is this affiliated with Booking.com?**
No. This is an independent third-party actor that reads publicly available Booking.com pages and data. It is not affiliated with or endorsed by Booking.com.

### Data source and limitations

The actor reads Booking.com's public attractions listing, product, review, availability and destination endpoints. There is no official free public API for this data; the official Booking.com Demand API is partner-only and requires credentials. This actor uses the same public web data a browser sees, with no account.

Known limits:

- Availability and review enrichment add one or more requests per product; they are off by default and off in the daily prefill.
- Category, price and minimum-review filters are verified after fetch because the source's server-side parameters are not strict.
- Some activities have no rating, duration or cancellation data because the source does not publish it.
- Availability is date-specific. A product with no time slots on the requested date may still be bookable on another date; use the calendar fields to see available dates.
- Large city catalogues can exceed 1,000 activities; raise `maxResults` or partition by category, date or price.

# Actor input Schema

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

What to fetch. Search lists activities for a destination; productDetails looks up specific products; availability returns time slots; reviews returns guest reviews; destinations lists the city catalogue.

## `destination` (type: `string`):

City to search. Pick a popular destination or choose Custom and enter a city slug and country code below. Used by mode=search.

## `customCity` (type: `string`):

City name or Booking.com city slug (e.g. 'kuala-lumpur', 'Porto'). Used when destination=custom.

## `customCountry` (type: `string`):

Two-letter country code or country name (e.g. 'my', 'Portugal'). Used when destination=custom.

## `query` (type: `string`):

Optional free-text search inside the destination, e.g. 'Eiffel', 'Louvre', 'food tour' (mode=search).

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

Result order (mode=search).

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

Minimum guest rating on Booking.com's 5-point scale (mode=search).

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

Keep only activities with free cancellation (mode=search).

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

Keep only activities labelled skip the line (mode=search).

## `wheelchairAccessibleOnly` (type: `boolean`):

Keep only activities labelled wheelchair accessible (mode=search).

## `timeOfDay` (type: `string`):

Filter by start time (mode=search).

## `guideLanguage` (type: `string`):

Keep activities available with a guide in this language (mode=search).

## `category` (type: `string`):

Keep activities in this category. Applied after fetch and verified against each product's own categories (mode=search).

## `minPrice` (type: `number`):

Keep activities at or above this representative price (mode=search).

## `maxPrice` (type: `number`):

Keep activities at or below this representative price (mode=search).

## `minReviews` (type: `integer`):

Keep activities with at least this many guest reviews (mode=search).

## `startDate` (type: `string`):

Optional availability window start in YYYY-MM-DD format (mode=search or availability).

## `endDate` (type: `string`):

Optional availability window end in YYYY-MM-DD format (mode=search or availability).

## `productIds` (type: `array`):

Booking.com attraction IDs (e.g. 'PRe4kSVWXdrD') or product URLs. Used by productDetails, availability and reviews modes.

## `productUrls` (type: `array`):

One or more Booking.com attraction product URLs. Used by productDetails, availability and reviews modes.

## `availabilityDate` (type: `string`):

Date for time-slot availability in YYYY-MM-DD format. Defaults to tomorrow (mode=availability or includeAvailability).

## `includeCalendar` (type: `boolean`):

Also fetch available dates and cheapest-price groups for the startDate/endDate range (mode=availability or productDetails).

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

Fetch guest reviews for each product. Adds one or more requests per product.

## `reviewSortBy` (type: `string`):

Review order when includeReviews or mode=reviews is active.

## `maxReviewsPerProduct` (type: `integer`):

Maximum guest reviews to include per product.

## `includeAvailability` (type: `boolean`):

Fetch time slots for each product in search or product modes. Adds one request per product.

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

Fetch the full product record (all photos, inclusions, accessibility, additional info) for each search result. Adds one request per product.

## `maxResults` (type: `integer`):

Maximum records to return (attractions, products, reviews products or destinations depending on mode).

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

Language for names and descriptions. Prices use the selected currency.

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

Currency for representative prices.

## Actor input object example

```json
{
  "mode": "search",
  "destination": "fr/paris",
  "sortBy": "trending",
  "minRating": "",
  "freeCancellationOnly": false,
  "skipTheLineOnly": false,
  "wheelchairAccessibleOnly": false,
  "timeOfDay": "",
  "guideLanguage": "",
  "category": "",
  "productIds": [],
  "productUrls": [],
  "includeCalendar": false,
  "includeReviews": false,
  "reviewSortBy": "most_relevant",
  "maxReviewsPerProduct": 10,
  "includeAvailability": false,
  "includeDetails": false,
  "maxResults": 3,
  "language": "en",
  "currency": "EUR"
}
```

# Actor output Schema

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

Dataset containing all scraped Booking.com activities.

# 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",
    "destination": "fr/paris",
    "sortBy": "trending",
    "minRating": "",
    "freeCancellationOnly": false,
    "skipTheLineOnly": false,
    "wheelchairAccessibleOnly": false,
    "timeOfDay": "",
    "guideLanguage": "",
    "category": "",
    "productIds": [],
    "productUrls": [],
    "includeCalendar": false,
    "includeReviews": false,
    "reviewSortBy": "most_relevant",
    "maxReviewsPerProduct": 10,
    "includeAvailability": false,
    "includeDetails": false,
    "maxResults": 3,
    "language": "en",
    "currency": "EUR"
};

// Run the Actor and wait for it to finish
const run = await client.actor("nimbryxo-studio/booking-com-things-to-do-price-and-rating-snapshot").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",
    "destination": "fr/paris",
    "sortBy": "trending",
    "minRating": "",
    "freeCancellationOnly": False,
    "skipTheLineOnly": False,
    "wheelchairAccessibleOnly": False,
    "timeOfDay": "",
    "guideLanguage": "",
    "category": "",
    "productIds": [],
    "productUrls": [],
    "includeCalendar": False,
    "includeReviews": False,
    "reviewSortBy": "most_relevant",
    "maxReviewsPerProduct": 10,
    "includeAvailability": False,
    "includeDetails": False,
    "maxResults": 3,
    "language": "en",
    "currency": "EUR",
}

# Run the Actor and wait for it to finish
run = client.actor("nimbryxo-studio/booking-com-things-to-do-price-and-rating-snapshot").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",
  "destination": "fr/paris",
  "sortBy": "trending",
  "minRating": "",
  "freeCancellationOnly": false,
  "skipTheLineOnly": false,
  "wheelchairAccessibleOnly": false,
  "timeOfDay": "",
  "guideLanguage": "",
  "category": "",
  "productIds": [],
  "productUrls": [],
  "includeCalendar": false,
  "includeReviews": false,
  "reviewSortBy": "most_relevant",
  "maxReviewsPerProduct": 10,
  "includeAvailability": false,
  "includeDetails": false,
  "maxResults": 3,
  "language": "en",
  "currency": "EUR"
}' |
apify call nimbryxo-studio/booking-com-things-to-do-price-and-rating-snapshot --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nimbryxo-studio/booking-com-things-to-do-price-and-rating-snapshot"
        }
    }
}
```

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/4WvoVSVYzAS16pZCa/builds/qKkfpiPudTr5BblJN/openapi.json
