Klook Scraper - Activities, Tours & Attractions
Pricing
from $1.20 / 1,000 klook records
Klook Scraper - Activities, Tours & Attractions
Scrape Klook activities, tours, attractions and travel experiences from search pages or activity URLs. Extract structured data for destinations, prices, ratings, availability, images, package details and more.
Pricing
from $1.20 / 1,000 klook records
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
1
Bookmarked
4
Total users
2
Monthly active users
a day ago
Last modified
Categories
Share
Klook Activities & Hotels Scraper
Collect hotel offers, activity listings, activity details, public reviews and discovery links from klook.com. Search by keyword or provide activity and keyword-search URLs. Save structured records with prices, ratings, locations and images where available. Use resume and recurring updates to avoid collecting the same records again.
Why This Scraper?
- Search and URL modes. Discover activities by keyword or collect several selected activities in one run.
- Activity details. Add descriptions, addresses, images and cancellation information when available.
- Public reviews. Collect review text, available translations, dates and publicly displayed author names.
- Hotels for your stay. Search destinations and hotel URLs with dates, guests, rooms and offer filters. Categories, destinations and suggestions also provide discovery links.
- Themed searches. Find eSIM, dining, car rental, airport transfer and promotional listings.
- Recurring collection. Skip previously collected records or return new and changed records across runs.
- App exports. Send a summary of selected records to connected apps while keeping complete records in the dataset.
Use Cases
- Travel content and comparison sites: pull activity and hotel listings with prices, ratings and images to power itinerary pages or comparison tables.
- Rate and availability monitoring: track a specific activity or hotel stay with incremental mode so recurring runs return only new or changed offers.
- Review and reputation research: collect public review text, ratings and languages for an activity to study traveler sentiment.
- Destination and catalog mapping: walk Klook's categories, destinations, home feed and search suggestions to see how a market is organized.
- Themed listing research: gather eSIM, dining, car rental, airport transfer and promotional listings for a destination.
- App and workflow automation: export a condensed summary of matched records into Notion or another connected app while the full record stays in the dataset.
Data You Get
Fields depend on the operation and the information available for each record. These examples are fictional placeholders, not scraped records.
Sample shape: values are illustrative placeholders, not from a live record.
| Field | Example |
|---|---|
id | 000000 |
activityId | 000000 |
recordType | activity |
title | Example observation deck admission |
url | https://www.klook.com/en-US/activity/000000-example/ |
price | 25.00 |
currency | USD |
marketPrice | 30.00 |
rating | 4.5 for an activity |
reviewCount | 100 |
activity_id, activity_url, review_count, sell_price, price_from, price_to, city_name, country_name, image_url, booked_count, scraped_at | Activity records also carry these snake_case twins of the fields above (price_to is the strikethrough price when shown, booked_count the lower bound of the "booked" badge). |
latitude, longitude | Activity coordinates from search results when Klook shows them. |
location, country | Example city, Example country |
address, category | 100 Example Street, Attractions |
description | Example admission description |
cancellationPolicy | Example cancellation terms |
imageUrls | ["https://example.com/activity.jpg"] |
promotions | ["Example offer"] |
detailStatus | complete |
operation, sourceMode, changeType | activities, search, NEW |
hotelId, checkIn, checkOut | 000000, 2027-01-10, 2027-01-12 (hotel records) |
Review records also contain author, date, language and translatedText when available. The author's public masking is retained. A review's own rating comes from a different Klook endpoint than an activity's aggregate rating; do not assume the two use the same scale.
How to Use
Choose an operation, select search or URL mode, and set Max items. Start the actor and open the Results dataset view to inspect or export the records. The default input searches Tokyo and returns up to 20 records.
Search for activities
Search by keyword:
{"operation": "activities","mode": "search","query": "Tokyo","maxItems": 20,"fetchDetails": true}
Search hotels for a family stay
Search hotels for a family stay:
{"operation": "hotels","mode": "search","query": "Tokyo","checkIn": "30 days","adults": 4,"rooms": 2,"childrenAges": ["8"],"starRatings": ["4"],"freeCancellation": true,"breakfastIncluded": true,"hotelSort": "priceAsc","maxItems": 20}
An omitted check-out gives a two-night stay. Dates and guests affect available offers. For hotel URL mode, use a hotel property, hotel city or hotel search link. For example: https://www.klook.com/en-US/hotels/detail/81173-hotel-sardonyx-tokyo/. Hotel dates and guests included in a URL take precedence over the form values. Each hotel is returned once per run. Hotel search does not use Fetch activity details.
Collect multiple activities by URL
Paste activity links:
{"operation": "activities","mode": "url","urls": ["https://www.klook.com/en-US/activity/41352-tokyo-skytree/","https://www.klook.com/en-US/activity/52-hong-kong-disneyland-resort-hong-kong/"],"maxItems": 20}
Activity URLs read the selected activity's details directly. Keyword search URLs preserve the query and starting page; other URL filters are not supported.
| URL shape | Example | Behaviour |
|---|---|---|
| Activity detail | https://www.klook.com/en-US/activity/41352-tokyo-skytree/ | Reads that activity's details directly |
| Keyword search | https://www.klook.com/en-US/search/?query=tokyo | Searches the query, starting at start or page |
| City page | https://www.klook.com/en-US/city/28-tokyo-things-to-do/ | Read as a keyword search for the city name in the link; the run log says so |
| Hotel property, city or search (Hotels only) | https://www.klook.com/en-US/hotels/detail/81173-hotel-sardonyx-tokyo/ | See the hotel section above |
Localized prefixes such as /zh-CN/ work the same as /en-US/. Any other Klook link is skipped with a warning in the log instead of silently searching something else. When the URL list is left untouched, URL mode now reads the three example links above (an activity, a keyword search and a city page) instead of only the activity.
Collect public reviews
Collect public reviews:
{"operation": "reviews","mode": "url","urls": ["https://www.klook.com/en-US/activity/41352-tokyo-skytree/"],"maxItems": 20}
Reviews always use the activity URLs, even if Mode is still set to Search. No mode change is needed. The detail-enrichment option does not apply to reviews.
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/klook-activities-scraper").call(run_input={"operation": "activities", "mode": "search", "query": "Tokyo", "maxItems": 20})for record in client.dataset(run["defaultDatasetId"]).iterate_items():print(record["title"], record["price"], record["currency"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/klook-activities-scraper').call({ operation: 'activities', mode: 'search', query: 'Tokyo', 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.
Send results into your apps (MCP connectors)
Authorize a connector under Apify Settings > Integrations, then select it in mcpConnectors. For Notion, also provide notionParentPageUrl. Each exported item is a condensed, human-readable summary. Nested information may be shortened; the complete record remains in the Apify dataset. maxNotifyListings limits export only. Leave connectors empty to skip this step.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
operation | string | "activities" | Choose activities, reviews, categories, destinations, home, suggestions, deals, esim, car_rentals, airport_transfers, dining or hotels. |
mode | string | "search" | Keyword search or pasted URLs. Reviews always use activity URLs. |
query | string | "Tokyo" | Keyword for activities or suggestions, or a hotel destination/property; ignored in URL mode. |
currency | string | "USD" | Display currency where supported. |
urls | array | Tokyo Skytree activity URL | Activity, keyword-search or hotel URLs. Reviews require activity URLs; Hotels requires hotel links. |
checkIn | string | "30 days" | Hotels only. YYYY-MM-DD or a relative value such as 30 days. Defaults to 30 days from today. |
checkOut | string | "empty" | Hotels only. Leave empty for two nights after check-in. A stay must be 1-30 nights. |
adults | integer | 2 | Hotels only. Total adult guests across all rooms, with at least one adult per room. |
rooms | integer | 1 | Hotels only. Number of rooms needed for the guest party. |
childrenAges | array | [] | Hotels only. One age from 0 to 17 per child, up to 10 children. The child count comes from this list. |
hotelSort | string | "recommended" | Hotels only. Use Klook's hotel sort order. Live quoted prices may not be strictly ordered. |
starRatings | array | [] | Hotels only. Leave empty for all star ratings. |
minHotelRating | string | "0" | Hotels only. Minimum guest review score on the 0-5 scale. |
minNightlyPrice | integer | 0 | Hotels only. Minimum price in the selected currency, including taxes and fees. Zero means no minimum. |
maxNightlyPrice | integer | 0 | Hotels only. Maximum price in the selected currency, including taxes and fees. Zero means no maximum. |
freeCancellation | boolean | false | Hotels only. Request offers matching the free-cancellation filter. Deadlines and terms vary by offer. |
breakfastIncluded | boolean | false | Hotels only. Request offers that include breakfast. |
searchQueries | array | empty | Activities and other keyword searches. Several keywords in one run; overrides query when set. Results are de-duplicated across keywords. |
cityIds | array | empty | Keep only activities in these Klook city IDs (the number after /city/ in a Klook city page link). Applied to the pages read, so pair it with a keyword for that city. |
sortBy | string | "default" | Activities. most_reviewed, price_low_high, price_high_low or rating. Klook search has no sort option, so the pages (up to maxPages) are read first and then ordered. |
language | string | "en_US" | Locale of titles and text, for example ja_JP or zh_CN. |
fetchDetails | boolean | true | Enrich activity search results. Direct activity URLs always read details. |
maxItems | integer | 20 | Run-wide output cap, from 1 to 500. |
maxPages | integer | 0 | Page limit per search or review source. Empty or 0 uses the built-in hard limit of 50 pages; values above 50 are capped at 50. Stops earlier at Max items or the end of results. |
resumeFromRunId | string | empty | Previous run or dataset ID whose records should be skipped. |
incrementalMode | boolean | false | Compare records with persistent state and return NEW or UPDATED records. |
stateKey | string | empty | Optional recurring campaign name; otherwise derived from the operation, mode, query or URLs, currency and detail setting. |
emitUnchanged | boolean | false | Also emit UNCHANGED records during incremental runs. |
ignoreFieldsForChanges | array | empty | Extra field names (any depth) to leave out of change detection, on top of the built-in excluded fields. Incremental mode only. |
proxyConfiguration | object | Apify Proxy enabled | Apify Proxy connection settings. |
mcpConnectors | array | empty | Optional connector names for summary export. |
notionParentPageUrl | string | empty | Parent page for Notion export. |
maxNotifyListings | integer | 50 | Maximum records sent to each connector; does not change the dataset cap. |
Operation scope
Hotels returns one offer card per property with the requested stay and guest context, star rating, review score, nightly price description, images and availability. priceDisplay carries Klook's own formatted price text for the offer; priceCondition carries Klook's raw discount-type value for that price, unlabeled, when the site provides one. A returned rate is not a booking guarantee. Hotel results do not include an additional activity-detail enrichment charge.
Categories, destinations and home return discovery links rather than activity details. Suggestions uses the query to return matching discovery links. Popular destinations can vary with the connection's location. The eSIM, dining, car rental and airport transfer operations search matching listings. Car rental and transfer records are discovery listings, not date-specific availability or booking quotes.
Resume and recurring updates
Use resumeFromRunId to skip records already returned by a particular run or dataset. Baselines saved by earlier versions keep working: unchanged records stay unchanged, and a record whose old baseline only held a digest is reported as UPDATED with changedFields set to unknown_legacy_baseline when it really changed. Use incrementalMode for repeated runs of the same search: the first run returns NEW records, and later runs return NEW or UPDATED records by default. Enable emitUnchanged to include records that match the saved state. Change detection compares every output field except these, which stay in the output but never make a row UPDATED: detailStatus, sourceMode, operation, booked, image URL lists and scraped_at; the snake_case twins (activity_id, activity_url, sell_price, price_from, price_to, city_name, country_name, image_url, review_count, booked_count), because the source fields they copy (price, marketPrice, reviewCount, url, location, country) are compared; and latitude, longitude and cityId, which are derived or volatile. UPDATED rows carry changedFields, the names of the fields that differ. Add more names to ignoreFieldsForChanges (matched at any depth) to exclude further noisy fields. Baselines saved by earlier versions keep working: unchanged records are not re-reported as UPDATED after the upgrade. Hotel state also includes resolved stay dates, guests, sort and filters. Relative dates move as days pass; use fixed stay dates to monitor the same stay. Keep the same search and detail settings between recurring runs, or set a separate stateKey for each campaign. This actor does not emit disappearance records.
Output Example
This fictional example shows an enriched activity search record. Optional values may be empty or absent when Klook does not provide them.
Sample shape: values are illustrative placeholders, not from a live record.
{"id": "000000","activityId": "000000","recordType": "activity","title": "Example observation deck admission","url": "https://www.klook.com/en-US/activity/000000-example/","price": 25.0,"currency": "USD","marketPrice": 30.0,"rating": 4.5,"reviewCount": 100,"location": "Example city","country": "Example country","address": "100 Example Street","category": "Attractions","description": "Example admission description.","cancellationPolicy": "Example cancellation terms.","imageUrls": ["https://example.com/activity.jpg"],"promotions": ["Example offer"],"booked": "100+ booked","detailStatus": "complete","operation": "activities","sourceMode": "search","changeType": "NEW"}
An additional charge applies only to successfully enriched activity search records saved in the dataset. Failed or skipped enrichment, unchanged records suppressed by incremental mode, and direct activity URL lookups do not incur this extra charge.
If optional enrichment is unavailable, the listing is retained. detailStatus is complete when enrichment succeeded, or unavailable when the details could not be read (including when Klook answered with incomplete details or another activity's details). After repeated failures, further enrichment is skipped, so later records may have no detailStatus. If a pasted activity URL's details cannot be read, the run stops with an error; records already saved stay in the dataset.
Max items is a cap, not a guaranteed count. A source returning no records causes the run to fail visibly. Resume and incremental runs can legitimately return zero records when all inspected records were already collected or are unchanged.
Plan Requirement
An Apify account is enough to run this actor, and no residential proxy is needed. The data requests (search, activity details, reviews, hotels) were measured to be served over a plain Apify datacenter connection, so the default proxy settings start there. Klook's ordinary web pages are a different matter: they refuse automated visits on datacenter and residential connections alike, which is why the actor reads Klook's data endpoints instead of page HTML.
The connection is chosen in this order, and only a refused proxy tunnel moves the run to the next step. An ordinary site-side block or timeout just retries on a fresh exit of the same tier:
- Your own proxy settings (the default is the Apify datacenter pool).
- An Apify residential check, used only to learn whether your plan includes residential proxies.
- Backup connections run by the actor, used only when the earlier ones are unavailable.
Choosing your own proxy groups, country or URLs disables the backup connections and uses only your selection. If a backup connection was needed, the log says so:
Served over the backup connection (the default connection was unavailable).
On an Apify free plan, which does not include residential proxies, the log shows a boxed warning:
The selected connection is unavailable to this run. Apify free plans do not include residential proxies. Continuing on a backup connection; some pages may still be unavailable.
FAQ
How much does it cost?
You pay per record returned to the dataset (the result event), plus one detail-enrichment event for each activity search result successfully enriched with details, and the platform's actor-start event once per run, scaled by the memory the run starts with. The Pricing tab shows the current rates. Use Max items to cap the cost of any run.
Is it legal to scrape Klook?
This actor collects only publicly available Klook listings, prices and reviews. You are responsible for how you use the data: follow Klook's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Prices and availability change quickly and are not a booking guarantee.
Can I get only new or changed records on a schedule?
Yes. Schedule the actor from the Schedules tab, turn on Incremental monitoring, and keep the same operation, mode, query or URLs, currency and detail setting between runs, or set a State key to name the campaign yourself. New and updated records are returned by default; turn on Emit unchanged to also receive records that matched the saved state.
Why does Reviews still need an activity URL if Mode is set to Search?
Reviews always read the pasted activity URLs, no matter what Mode is set to; a keyword typed into Search mode is ignored for this operation. Paste one or more activity URLs into the URLs field when collecting reviews.
Why did my run fail instead of returning an empty dataset?
If every source returned zero records, the run fails with a clear message so "no results" is never confused with "nothing could be read". Resume and incremental runs can still legitimately return zero new records when everything inspected was already collected or unchanged.
What do the run failure messages mean?
A run that loaded no usable page ends with one of three messages instead of an empty dataset:
- The proxy connection was refused for this account (your plan does not include proxy access, or the proxy URLs you entered have invalid credentials). A paid plan or valid proxy URLs fix it.
- No results: residential proxies are unavailable on this run (free plan), and the backup connection could not load the requested Klook pages. Upgrade or supply your own proxy URLs, then try again.
- Could not load any results page (the requests failed), so nothing was collected. This is a connection problem, not an empty search. Try again later.
What are the dataset views?
The Output tab offers Results (all records), Activities, Reviews, Hotels, Catalog and discovery (categories, destinations, home and suggestions), and Changes (incremental), which lists the changeType and changedFields of NEW and UPDATED rows.
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the MCP connectors field to send a summary of the collected records into Notion or another connected app.
๐ Want more travel data?
Pair this actor with these related scrapers from the same team:
| ๐จ Expedia Hotels Scraper Scrape Expedia.com hotel listings and reviews for any destination. Extract prices... | ๐จ Trip.com Hotels, Rooms & Reviews Scraper Pull structured hotel listings from trip.com with prices, room types, amenities... |
| ๐จ Wego Scraper Scrape Wego hotels by city or search URL. Get rates, providers, booking links... | ๐จ Yanolja Scraper Scrape Yanolja (NOL), Korea's largest accommodations marketplace, by region or URL. Every... |
| ๐จ Traveloka Hotel Scraper Scrape Traveloka hotels across Singapore, Malaysia, Indonesia, Thailand, Vietnam and the... | ๐จ Hostelworld Scraper Scrape Hostelworld hostels, hotels, guesthouses, B&Bs, apartments and campsites by city... |
๐ Browse all abotapi scrapers
๐ฌ Support
- ๐ Found a bug or a missing field? Open a ticket on the Issues tab. 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.