# Klook Scraper (`aboo.script/klook-scraper`) Actor

\[💰$3.5 / 1K] Klook scraper that works on DataDome-protected pages. No login, no API key. Get tours, activities and attraction tickets by keyword, search, city or activity URL: price, rating, reviews, bookings, category, tags, GPS, highlights, opening hours and every package price in any currency.

- **URL**: https://apify.com/aboo.script/klook-scraper.md
- **Developed by:** [Aboo Script](https://apify.com/aboo.script) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.45 / 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

## Klook Scraper

![Klook Scraper](https://i.ibb.co/8LDNqdZr/klook-banner.png)

**Klook Scraper** extracts tours, activities, attraction tickets, and experiences from [Klook](https://www.klook.com/) into clean, structured data you can download as JSON, CSV, Excel, or HTML. Paste a Klook search, city, or activity URL, or type a few keywords, and get the price, original price, rating, number of reviews, number of bookings, category, city, tags, promotions, location, and image for every activity, plus the description, highlights, duration, opening hours, and every package with its price for activity pages. Works on DataDome-protected pages, no account or login required.

### Introduction

[Klook](https://www.klook.com/) is one of the largest travel booking platforms in Asia and beyond, selling tours, attraction tickets, day trips, transport, and local experiences in thousands of destinations. Travel agencies, tour operators, and analysts follow Klook to understand prices, demand, and competition in a destination.

This actor collects the same public information you see on Klook search, city, and activity pages and turns it into a ready-to-use dataset. You can run it once, schedule it to run daily, or connect it to your own tools.

### What data can you extract from Klook?

- 🏷️ Activity title, activity ID, and category
- 💲 Price as shown, price as a number, original price before discount, and currency
- ⭐ Rating and number of reviews
- 👥 Number of bookings, as a number and as shown on the site
- 🎁 Tags (free cancellation, instant confirmation, guided language, and more) and promotions
- 📍 City, city ID, country ID, departure city, latitude, and longitude
- 🖼️ Cover image, image gallery, and sold out flag
- 📝 Description, highlights, suggested duration, address, opening hours, and next availability (activity pages)
- 🎟️ Every package with its name, description, price, features, promotions, and availability (activity pages)
- 🔗 Direct URL to each activity

### Use Cases

- 📈 **Market research**: compare activity prices, ratings, and booking volumes across destinations and categories.
- 🕵️ **Competitor monitoring**: track what tour operators sell on Klook, at what price, and with which discounts.
- 💰 **Price tracking**: schedule runs and follow price changes in your currency.
- 🗂️ **Database building**: build your own catalog of things to do per city.
- 🤖 **AI and automation**: feed clean, structured data into spreadsheets, dashboards, or AI workflows.

### How to scrape Klook step by step

1. Paste one or more Klook URLs into **Start URLs**, or type keywords into **Search queries**.
2. Set **Maximum number of results** to how many activities you want per URL or per query.
3. Pick the **Currency** for the prices.
4. Click **Start** and wait for the run to finish.
5. Download your data in JSON, CSV, Excel, or HTML from the **Output** tab.

### Input

- **Start URLs**: Klook URLs to scrape. Supported pages: search result pages (https://www.klook.com/en-US/search/result/?query=dubai) city pages (https://www.klook.com/en-US/city/78-dubai-things-to-do/ or https://www.klook.com/en-US/destination/c78-dubai/1-things-to-do/), and activity pages (https://www.klook.com/en-US/activity/2228-burj-khalifa-observation-deck-dubai/). Filters chosen on the search page, such as the category tab, are kept in the results. A search URL with a page number starts from that page.
- **Search queries**: keywords to search on Klook, for example a city, attraction, or activity. Each query is scraped separately.
- **Maximum number of results**: how many activities to collect for each start URL or search query. Set 0 for no limit. Activity URLs always return one activity.
- **Currency**: the currency of every price in the results.
- **Proxy configuration**: residential proxies are required, Klook blocks datacenter and server IPs.

You can use start URLs, search queries, or both in the same run.

### Input Examples

Scrape a Klook city page:

```json
{
  "startUrls": [{ "url": "https://www.klook.com/en-US/city/78-dubai-things-to-do/" }],
  "maxResults": 5,
  "currency": "USD",
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

Search by keywords:

```json
{
  "searchQueries": ["Tokyo", "Bali snorkeling"],
  "maxResults": 5,
  "currency": "USD",
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### Output

Each activity is saved as one item in the dataset. Here is an example of an activity page result (search and city results have the same fields, with the activity page details left empty):

```json
{
  "url": "https://www.klook.com/en-US/activity/2228-burj-khalifa-observation-deck-dubai/",
  "activityId": 2228,
  "title": "At The Top - Burj Khalifa Observation Deck Ticket",
  "category": null,
  "city": "Dubai",
  "cityId": 78,
  "countryId": 23,
  "price": "€ 10.30",
  "priceNumeric": 10.3,
  "originalPrice": null,
  "originalPriceNumeric": null,
  "currency": "EUR",
  "rating": 4.4,
  "reviewCount": 10427,
  "bookedCount": null,
  "bookedText": "500K+ booked",
  "tags": [
    "2025 Best Things to do in UAE"
  ],
  "promotions": [],
  "departure": null,
  "latitude": 25.1975148,
  "longitude": 55.27487319999999,
  "imageUrl": "https://res.klook.com/image/upload/activities/wnkhtwo4n0dhe6zmrbcs.jpg",
  "soldOut": false,
  "country": "United Arab Emirates",
  "description": "Book At The Top: Burj Khalifa Observation Deck ticket on Klook now! Enjoy breath-taking views of Dubai from the 124th-125th floor of the world's tallest tower!",
  "highlights": [
    "Sky-High Views: Enjoy breathtaking 360-degree panoramic views of Dubai from the iconic Burj Khalifa observation deck",
    "World’s Tallest: Visit the world's tallest building and experience one of Dubai’s most famous landmarks"
  ],
  "duration": "1-2 hour(s)",
  "address": "Burj Khalifa, 1 Sheikh Mohammed bin Rashid Blvd - Downtown Dubai - Dubai - United Arab Emirates",
  "openingHours": [
    {
      "dateRange": "All year",
      "days": "Mon ~ Sun",
      "hours": "10:00 - 21:00",
      "note": "Last entry at 20:00"
    }
  ],
  "availability": "Available tomorrow",
  "images": [
    "https://res.klook.com/image/upload/activities/pzmximgmjfjqvm2x1ow2.jpg",
    "https://res.klook.com/image/upload/activities/kd15vqga9yuc8lipvgie.jpg"
  ],
  "packages": [
    {
      "group": "Admission ticket",
      "packageId": 333323,
      "name": "Admission (level 124 & 125)",
      "description": "Admission to: the 124th and 125th floor of the Burj Khalifa",
      "price": "€ 45.80",
      "priceNumeric": 45.8,
      "originalPrice": null,
      "features": [
        "Valid on the selected date",
        "No cancellation",
        "Instant confirmation"
      ],
      "promotions": [
        "Free audio guide"
      ],
      "available": true
    }
  ]
}
```

You can download the dataset in JSON, CSV, Excel, XML, or HTML, or access it through the Apify API.

### Notes

- Residential proxies are required. Klook blocks datacenter and server IPs, so runs without residential proxies fail.
- Search result pages, city pages, and activity pages are supported. Other URLs are skipped with a warning.
- Description, highlights, duration, address, opening hours, images, and packages are only filled for activity URLs. Results from search and city pages leave them empty, so paste activity URLs when you need those details.
- Some tour pages do not show highlights, duration, or an address, so those fields are empty there.
- The price of an activity page is the lowest "from" price shown on Klook, which can be lower than the first package.
- Klook shows at most 1,000 results per search. Split broad searches into smaller ones, for example by city or category tab.
- Activities from city pages do not include the category, country ID, or coordinates, so those fields are `null` there. Search results include them.
- The original price is only filled when Klook shows a price before discount.
- Klook may return close matches for a search with no exact results.
- Results are in English.

### Why use the Klook Scraper?

- ✅ **No login needed**: works with public data only, so there is no account to manage.
- 🛡️ **Works on DataDome-protected pages**: get Klook data without being blocked.
- 🎯 **Keeps your filters**: paste a search URL from your browser and get what you see there.
- 💱 **Any currency**: get every price in the currency you need.
- 🧹 **Clean data**: prices, ratings, reviews, and bookings are real numbers, and text is free of HTML.
- 💸 **Pay for what you need**: set a result limit per URL or query and keep every run small and cheap.

### FAQ

#### How many results can I scrape?

You can set any number in **Maximum number of results**. The actor keeps going until it reaches your limit or runs out of results. See **Notes** for the search limit set by Klook.

#### Do I need a Klook account?

No. The actor only collects publicly available data. You do not need to log in or provide any account details.

#### Can I scrape data on a schedule?

Yes. Use Apify Schedules to run the actor every hour, day, or week, and get fresh data automatically.

#### Why are some fields empty?

Some activities simply do not show every piece of information. When a field is not available on Klook, it is returned as `null`.

#### Can I request a new feature or filter?

Yes. Right now the actor supports start URLs, search queries, and currency. If you need other inputs, such as reviews or package availability per date, get in touch and they can be added.

#### Can I get a custom or private version?

Yes. The actor can be customized for your workflow, delivered as a private version, or a new scraper can be built for a different website. Use the contact details below.

### Need to scrape other travel and activity platforms?

- [Viator Scraper](https://apify.com/aboo.script/viator-scraper): tours and activities with tour options, prices, itineraries, and ratings.
- [GetYourGuide Scraper - Activities & Attractions](https://apify.com/aboo.script/getyourguide-scraper): activities and attraction tickets with prices and ratings.
- [Tiqets Scraper - Attractions & Tours](https://apify.com/aboo.script/tiqets-scraper): attraction tickets and tours with prices and ratings.
- [Agoda Activities Scraper](https://apify.com/aboo.script/agoda-scraper): things to do on Agoda with prices and reviews.
- [Rayna Tours Scraper](https://apify.com/aboo.script/raynatours-scraper): tours, activities, and attraction tickets from Rayna Tours.

***

**Need help or want a custom solution?**

- 📧 Email: aboo.script@gmail.com
- 🧩 More scrapers: [Apify profile](https://apify.com/aboo.script)

### Image Credit

Image credit: [Klook](https://www.klook.com/)

# Actor input Schema

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

Klook URLs to scrape: search result pages (https://www.klook.com/en-US/search/result/?query=dubai), including any filter chosen on the site, city pages (https://www.klook.com/en-US/city/78-dubai-things-to-do/ or https://www.klook.com/en-US/destination/c78-dubai/1-things-to-do/) and activity pages (https://www.klook.com/en-US/activity/2228-burj-khalifa-observation-deck-dubai/). Activity pages also return the description, highlights, duration, address, opening hours, images and every package with its price. A search URL with start=3 starts from page 3.

## `searchQueries` (type: `array`):

Keywords to search on Klook, for example a city, attraction or activity (Tokyo, Universal Studios, Bali snorkeling). Each query is scraped separately.

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

Maximum number of activities to scrape per start URL or search query. Set 0 for no limit. Activity URLs always return one activity. Klook search shows at most 1,000 results per query.

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

Currency of every price in the results.

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

Residential proxies are required, Klook blocks datacenter and server IPs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.klook.com/en-US/city/78-dubai-things-to-do/"
    }
  ],
  "maxResults": 5,
  "currency": "USD",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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.klook.com/en-US/city/78-dubai-things-to-do/"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("aboo.script/klook-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.klook.com/en-US/city/78-dubai-things-to-do/" }],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("aboo.script/klook-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.klook.com/en-US/city/78-dubai-things-to-do/"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call aboo.script/klook-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aboo.script/klook-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/P0bMKIjN3elkzwlHi/builds/Upgj3A2WTjZy4TXQ4/openapi.json
