Klook Reviews Scraper avatar

Klook Reviews Scraper

Pricing

from $2.00 / 1,000 reviews

Go to Apify Store
Klook Reviews Scraper

Klook Reviews Scraper

Scrape every review from any Klook activity — star ratings, review text, English translations, photos and booked package. Export to CSV, JSON or Excel.

Pricing

from $2.00 / 1,000 reviews

Rating

0.0

(0)

Developer

Reviewly

Reviewly

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Klook Reviews Scraper — Extract Every Klook Review in Seconds

Scrape all traveler reviews from any Klook activity page — ratings, full review text, English translations, reviewer photos, and package names — as clean JSON, CSV, or Excel.

  • Fast — a 4,500-review activity finishes in about 5 seconds
  • 🎯 Complete — gets every review, not just the first page
  • 🌍 Multilingual — original text plus Klook's English translation
  • 📸 Rich data — review photos, star ratings, dates, and booked package
  • 🔧 Zero setup — paste a Klook URL and run. No proxies or API keys needed

📌 What This Actor Does

Klook shows only a handful of reviews at a time, hidden behind endless "load more" clicks. There's no export button and no public API for the data.

This Apify Actor does the work for you. Give it a Klook activity URL and it returns every review as a structured dataset you can download as JSON, CSV, or Excel, or pull straight into your own app via API.

Who it's for

You are…You use it to…
Travel & tour operatorsTrack what customers say about your activities and your competitors'
Market researchersAnalyze traveler sentiment across attractions, cities, or regions
Data analysts & scientistsBuild review datasets for sentiment analysis, NLP, or dashboards
Agencies & consultantsProduce reputation reports for travel clients
DevelopersFeed review data into an app, a BI tool, or an AI pipeline

✨ Key Features

  • Complete review extraction — every review on the activity, not a capped sample
  • Original text + English translation — reviews come in many languages; you get both
  • Review photos — full-resolution image URLs travelers uploaded
  • Star ratings & dates — numeric 1–5 rating and an ISO timestamp for every review
  • Package names — see which ticket or option each reviewer actually booked
  • Date filtering — scrape only reviews newer than a chosen date, and stop early
  • Sorting & filtering — most relevant, newest, highest/lowest rated; photos-only or English-only
  • Bulk mode — pass many activity URLs in one run
  • Clean, flat output — one row per review, ready for Excel or pandas with no reshaping
  • Resilient — automatic retries so a temporary hiccup never silently truncates your data

🧠 Why This Actor Is Different

Most review scrapers drive a headless browser: slow, expensive, and fragile. This one talks to Klook's own review endpoint directly.

What that means for you:

This ActorTypical browser-based scraper
Speed~5s for 4,500 reviewsSeveral minutes
CostMinimal computeHigh — browsers are heavy
ProxiesNot requiredUsually residential proxies required
ReliabilityNo page layout to breakBreaks whenever the site redesigns

Three correctness details that quietly break naive scrapers — all handled here:

  1. Klook's "has more pages" flag is always true, even past the last page. A scraper that trusts it loops forever.
  2. Requesting a page number beyond the limit silently returns page 1 again instead of an error — so naive scrapers re-collect the same reviews and report inflated counts.
  3. Klook occasionally returns an empty page at random. Without retries, a run stops early and looks successful while missing thousands of reviews.

This Actor guards against all three and de-duplicates every review by ID, so your counts are real.


⚙️ Input Configuration

FieldTypeRequiredDefaultDescription
startUrlsArray✅ YesKlook activity URLs to scrape
maxReviewsIntegerNo0Max reviews per activity. 0 = all
targetDateStringNoOnly reviews published on/after this date
sortKeyStringNosort_most_relevantReview sort order
filterKeyStringNoallWhich reviews to include
proxyConfigurationObjectNoOptional proxy settings

startUrls

Any Klook activity URL works, including regional variants:

https://www.klook.com/activity/363-dream-world-bangkok/
https://www.klook.com/en-US/activity/363-dream-world-bangkok/
https://www.klook.com/activity/363-dream-world-bangkok/?some=param

You can also pass a bare activity ID ("363"). Duplicate or regional variants of the same activity are automatically merged, so you're never charged twice for the same data.

sortKey options

ValueMeaning
sort_most_relevantKlook's default relevance ranking
sort_review_time_descNewest first
sort_score_high_to_lowBest rated first
sort_score_low_to_highWorst rated first — great for finding complaints

filterKey options

ValueMeaning
allEvery review
only_photoOnly reviews containing photos
read_langOnly English-language reviews

Example input

Scrape everything:

{
"startUrls": [
{ "url": "https://www.klook.com/activity/363-dream-world-bangkok/" }
],
"maxReviews": 0
}

Only negative reviews from the last year, for a complaint analysis:

{
"startUrls": [
{ "url": "https://www.klook.com/activity/363-dream-world-bangkok/" }
],
"targetDate": "2026-01-01",
"sortKey": "sort_score_low_to_high"
}

Compare several activities at once:

{
"startUrls": [
{ "url": "https://www.klook.com/activity/363-dream-world-bangkok/" },
{ "url": "https://www.klook.com/activity/1000-universal-studios-singapore/" }
],
"maxReviews": 500
}

💡 Tips for best results

  • Start small. Set maxReviews: 20 on your first run to preview the data shape before scraping everything.
  • Use targetDate for recurring runs. Scheduling a weekly run with a recent targetDate collects only new reviews and finishes far faster.
  • Leave sortKey alone when using targetDate. The Actor automatically switches to newest-first so it can stop at your cutoff instead of fetching every page.
  • Skip the proxy. It isn't needed. Only enable it if you're running very large batches.

📤 Output Format

One row per review — no nested arrays to flatten, so CSV and Excel exports open ready to use.

Sample output

{
"activityId": 363,
"activitySlug": "dream-world-bangkok",
"activityUrl": "https://www.klook.com/activity/363-dream-world-bangkok/",
"activityRating": 4.6,
"activityReviewCount": 4557,
"activityRatingDesc": "Fantastic",
"reviewId": 19023109,
"authorName": "LAM ********",
"authorAvatar": "https://cdn.klook.com/upload/img200X200/zh_HK_02.png",
"rating": 5,
"ratingDesc": "Fantastic",
"publishedAt": "2026-08-03T11:14:58.000Z",
"text": "星期一遊人很少,幾乎都不用排隊,可以𣈱玩。",
"textTranslated": "There were very few visitors on Monday, so we hardly had to wait in line.",
"packageId": 157247,
"packageName": "Super Visa",
"likedCount": 0,
"hasReply": false,
"images": [
"https://cdn.klook.com/user_review/product/1949610/b57d8533.jpeg"
],
"scrapedAt": "2026-08-09T14:02:11.000Z"
}

Field reference

Activity fields (repeated on every row so each row stands alone)

FieldTypeDescription
activityIdNumberKlook's internal activity ID
activitySlugStringURL slug, e.g. dream-world-bangkok
activityUrlStringCanonical activity URL
activityRatingNumberOverall average rating, e.g. 4.6
activityReviewCountNumberTotal reviews Klook reports
activityRatingDescStringKlook's label, e.g. Fantastic

Review fields

FieldTypeDescription
reviewIdNumberUnique review ID — use this as your primary key
authorNameStringReviewer name as Klook displays it
authorAvatarStringAvatar image URL
ratingNumberStar rating, 15
ratingDescStringRating label, e.g. Fantastic
publishedAtStringISO 8601 publish timestamp
textStringReview in its original language
textTranslatedStringKlook's English translation
packageIdNumberID of the package the reviewer booked
packageNameStringPackage name, e.g. Super Visa
likedCountNumberHelpful votes the review received
hasReplyBooleanWhether the operator replied
imagesArrayFull-resolution photo URLs
scrapedAtStringWhen this row was collected

Note on names: Klook itself anonymizes many reviewers (Klook User, LAM ********). That masking comes from Klook — no real names are hidden or altered by this Actor.


▶️ How to Use

Option A — Apify Console (no code)

  1. Open the Actor in the Apify Store and click Try for free.
  2. Paste your Klook activity URL into the Klook activity URLs field.
  3. (Optional) Set Max reviews to 20 for a quick test run.
  4. Click Start.
  5. When it finishes, open the Storage → Dataset tab and Export as CSV, Excel, or JSON.

That's it — no proxy setup, no API key, no configuration.

Option B — API

Run it from your own code with the Apify client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('reviewly/klook-reviews-scraper').call({
startUrls: [
{ url: 'https://www.klook.com/activity/363-dream-world-bangkok/' },
],
maxReviews: 0,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Collected ${items.length} reviews`);
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("reviewly/klook-reviews-scraper").call(run_input={
"startUrls": [
{"url": "https://www.klook.com/activity/363-dream-world-bangkok/"}
],
"maxReviews": 0,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["rating"], item["text"][:80])

Option C — Scheduled monitoring

  1. Run the Actor once to confirm your settings.
  2. Open the Schedules tab in Apify and create a schedule (e.g. daily).
  3. Set targetDate to a recent date so each run collects only fresh reviews.
  4. Connect a webhook to push new reviews into Slack, a database, or a Google Sheet.

📈 Use Cases

1. Competitor reputation analysis

Scrape reviews for your activity and your three closest competitors. Compare average ratings, complaint themes, and review volume over time to see exactly where you're losing bookings.

2. Customer sentiment & AI analysis

Export thousands of reviews and run them through an LLM or sentiment model. Because you get both original text and English translations, you can analyze a global customer base in one language without a separate translation step.

3. Product & operations improvement

Sort by sort_score_low_to_high and pull only 1–2 star reviews. The packageName field shows which specific ticket option generates the most complaints, so fixes land where they matter.

Scrape reviews across many attractions in a destination to identify demand patterns, seasonality, and what travelers value most — useful for pricing, planning, and investment decisions.

5. Marketing content & social proof

Filter with only_photo to find your best photo-rich, 5-star reviews, then use them (with proper attribution) as testimonials and user-generated content for ads and landing pages.


🛠️ Advanced Tips

Speed. Runs are network-bound, so most activities finish in seconds. The main cost driver is total review count, not page count.

Incremental scraping. Rather than re-scraping everything, schedule runs with a rolling targetDate. Deduplicate on reviewId — it's stable across runs.

Bulk scraping. Pass many URLs in startUrls for a single run. If one URL is invalid, the Actor logs a warning and continues with the rest, so one bad link never kills the batch.

Proxies. Genuinely optional. Klook's review endpoint has no rate limiting in our testing. Enable Apify Proxy only if you're running unusually large or frequent batches.

Large activities. For activities with tens of thousands of reviews, use maxReviews to cap the run, or use sortKey variants to sample specific slices (best-rated, worst-rated, newest).


❓ FAQ & Troubleshooting

Does this need proxies or an API key? No. It works out of the box. Proxy configuration is available but not required.

Why doesn't the output include the activity's name? Klook serves the activity title only on its bot-protected HTML page. Fetching it would require a full headless browser, making every run dramatically slower and more expensive. Since activityId, activitySlug, and activityUrl identify the activity precisely, we deliberately left it out to keep runs fast and cheap. The slug is human-readable (dream-world-bangkok).

The run returned 0 reviews. What happened? Almost always the activity genuinely has no reviews yet. Open the URL in a browser to confirm. Also check the log for a Skipping "…": Unrecognised Klook activity URL warning, which means the URL wasn't an activity page.

Why is activityReviewCount higher than the rows I received? If you set maxReviews or targetDate, that's expected — those cap the run. Without them, the row count should match. activityReviewCount is Klook's own reported total.

Can I scrape Klook hotels or car rentals? Not currently. This Actor targets activity pages (/activity/...). Other Klook verticals use a different internal structure. Email us if you need one — it's a small extension.

Can I get the operator's reply to a review? No. Klook's endpoint exposes a hasReply flag but never the reply text itself, so it isn't available to scrape.

Are reviewer names anonymized? Klook anonymizes many names before serving them (Klook User, LAM ********). You get exactly what Klook displays publicly.

How do I get only recent reviews? Set targetDate (e.g. 2026-01-01). Leave sortKey at its default and the Actor automatically sorts newest-first so it stops as soon as it passes your cutoff.

Can I export to Excel or Google Sheets? Yes. In Storage → Dataset, export as CSV, XLSX, JSON, or HTML. The flat one-row-per-review format opens cleanly in any spreadsheet tool.

Is web scraping public review data legal? This Actor collects only publicly visible data and no personal login-protected information. You are responsible for complying with Klook's terms and applicable law (including GDPR) in your jurisdiction and use case. If in doubt, consult a lawyer.


📞 Support

Questions, bug reports, or a custom scraping need?

  • 📧 Email: me@ahmedhrid.com
  • 🐞 Issues: Use the Issues tab on the Actor's Apify Store page

When reporting a problem, please include the run ID and the input you used — it makes diagnosis much faster.

Need a scraper for another travel platform, or a custom data pipeline? Get in touch — custom Actors are available on request.


Keywords: Klook scraper, Klook reviews API, Klook data extraction, travel review scraper, Apify Actor, web scraping, tourism data, activity reviews, travel analytics, review sentiment analysis, competitor review monitoring.