Klook Scraper at a glance
Klook Scraper is a ready-to-run Apify actor from abotapi for collecting web data. Its documented output includes id, recordtype, operation, activityid and title, which you can export as JSON, CSV or Excel or read through the Apify API. It costs $1.90 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify.
- Runs on
- Apify cloud: console, API, schedules and integrations
- Data type
- Web data
- Pricing
- $1.90 per 1,000 results (Free plan), from $1.20 on paid plans
- Output
- Documented below · JSON, CSV, Excel
- Inputs
- 32 options
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.
What Klook Scraper can do
- 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.
Choose what to collect
These inputs let you configure Klook Scraper - Activities, Tours & Attractions. Open the actor on Apify to enter your values and review the current options.
| Input | What it controls |
|---|---|
modestring · required | Search by keyword or read pasted Klook URLs. Reviews always use the activity URLs, regardless of this setting. |
operationstring | Choose activities, public reviews, catalog navigation, suggestions, or a themed listing search. Home returns homepage links; deals returns listings with promotions or reduced prices. Car rentals and airport transfers return discovery listings, not date-specific quotes. Reviews always use the activity URLs; no mode change is needed. Hotels searches properties for your selected stay and guests. |
querystring | Keyword for activity search and suggestions, or a hotel city, area or property name. Ignored in URL mode and for categories, destinations and home. |
searchQueriesarray | Run several keyword searches in one run (overrides "Search query" when set). Results are de-duplicated across queries. |
cityIdsarray | Keep only activities in these Klook city IDs (the number after /city/ in a Klook city page link). Applied to the pages read, so combine with a keyword that matches the city. |
sortBystring | Klook search has no sort option, so results are ordered after the pages (up to Max pages) are read. |
currencystring | Three-letter display currency when supported by the page. |
Show 25 more inputs
| Input | What it controls |
|---|---|
languagestring | Locale for titles and text, for example en_US, ja_JP, zh_CN, ko_KR. |
urlsarray | Activity, keyword search or city page URLs. City pages are read as a keyword search for the city name. Reviews require an activity URL. Search URLs preserve the query and start page; other URL filters are not supported. Hotels accepts hotel property, hotel city and hotel search URLs. Hotel stay dates and guests in a URL take precedence over form values. |
checkInstring | Hotels only. YYYY-MM-DD or a relative value such as 30 days. Defaults to 30 days from today. |
checkOutstring | Hotels only. Leave empty for two nights after check-in. A stay must be 1-30 nights. |
adultsinteger | Hotels only. Total adult guests across all rooms, with at least one adult per room. |
roomsinteger | Hotels only. Number of rooms needed for the guest party. |
childrenAgesarray | Hotels only. One age from 0 to 17 per child, up to 10 children. The child count comes from this list. |
hotelSortstring | Hotels only. Use Klook's hotel sort order. Live quoted prices may not be strictly ordered. |
starRatingsarray | Hotels only. Leave empty for all star ratings. |
minHotelRatingstring | Hotels only. Minimum guest review score on the 0-5 scale. |
minNightlyPriceinteger | Hotels only. Minimum price in the selected currency, including taxes and fees. Zero means no minimum. |
maxNightlyPriceinteger | Hotels only. Maximum price in the selected currency, including taxes and fees. Zero means no maximum. |
freeCancellationboolean | Hotels only. Request offers matching the free-cancellation filter. Deadlines and terms vary by offer. |
breakfastIncludedboolean | Hotels only. Request offers that include breakfast. |
fetchDetailsboolean | Add description, address, images and cancellation information to activity listings. Does not apply to reviews or catalog navigation. An additional charge applies only to successfully enriched records saved in the dataset. |
maxItemsinteger | Maximum number of records returned. Applies to every operation. |
maxPagesinteger | Maximum search pages to read. Empty or 0 uses the built-in hard limit of 50 pages per source; stops earlier at Max items or the end of results. |
resumeFromRunIdstring | Skip activity IDs already present in a previous run or dataset. |
incrementalModeboolean | Return only new or changed records for the same state key. Compared: every output field (price, rating, review count, availability, title, location, hotel rates and so on). Excluded by default (kept in the output, never make a row UPDATED): detailStatus, sourceMode, operation, booked, image URL lists, and scraped_at; the snake_case twin fields (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 as derived or volatile values. UPDATED rows list the differing fields in changedFields. |
stateKeystring | Name for shared recurring-run state. Leave empty to derive it from operation, query or URLs, and currency. |
emitUnchangedboolean | Return records that have not changed during incremental monitoring. |
ignoreFieldsForChangesarray | Extra field names to leave out when deciding whether a record changed, matched at any depth (for example reviewCount). Added to the built-in excluded fields. Only applies when incremental monitoring is on. |
mcpConnectorsarray | Optional connector names for downstream export. |
notionParentPageUrlstring | Optional parent page for Notion export. |
maxNotifyListingsinteger | Maximum records sent to each optional connector. |
Fields in the output
The documented dataset includes the fields below. Availability can depend on the source page and selected mode.
ididrecordTyperecordTypeoperationoperationactivityIdactivityIdtitletitleurlurldescriptiondescriptionpricepricemarketPricemarketPricecurrencycurrencyratingratingreviewCountreviewCountShow 34 more fields
locationlocationcountrycountryaddressaddresscategorycategoryimageUrlsimageUrlscancellationPolicycancellationPolicypromotionspromotionsauthorauthordatedatelanguagelanguagetranslatedTexttranslatedTextsourceModesourceModechangeTypechangeTypechangedFieldschangedFieldsdetailStatusdetailStatushotelIdhotelIdstarRatingstarRatingpriceDisplaypriceDisplaypriceDescriptionpriceDescriptionpriceConditionpriceConditionratingMaxratingMaxreviewCountTextreviewCountTextlocationDescriptionlocationDescriptionlatitudelatitudelongitudelongitudeavailableavailableavailabilityTextavailabilityTextfeaturesfeaturescheckIncheckIncheckOutcheckOutadultsadultsroomsroomschildrenAgeschildrenAgesactivity_idactivity_idExample output
An example from this actor’s documentation. Values are illustrative; this is not a fresh live result.
{
"id": "000000",
"activityId": "000000",
"recordType": "activity",
"title": "Example observation deck admission",
"url": "https://www.klook.com/en-US/activity/000000-example/",
"price": 25,
"currency": "USD",
"marketPrice": 30,
"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"
}Ways to use this data
- 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.
Before you run
Start with a small input and check the resulting records against your expected fields. Source content and actor options can change; the current Apify listing is the reference for availability and pricing.
Questions about this actor
What data does Klook Scraper return?
The documented output for Klook Scraper includes id, recordtype, operation, activityid, title, url, description and price. Availability of each field depends on the source page and the selected mode.
How much does Klook Scraper cost?
It costs $1.90 per 1,000 results on the Apify Free plan and from $1.20 on paid plans, with smaller per-run or optional feature charges listed on Apify. The Apify listing shows the current rate for every plan.
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 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.
