Klook API: Search activities
Finds Klook activities, tickets, tours and passes in a city, with ratings, booking counts, prices and booking policies. Keyword matches are ranked by Klook and may include related activities.
Unofficial. Not affiliated with or endorsed by Klook.
Inputs
Values from the run on Oct 23, 2026, shown under Output.
- City, required
city City to search, for example Singapore.
Singapore
- Sort optional
sort How to order results, for example popularity.
price_low_to_high
One of
popularity,price_low_to_high,rating. Defaultpopularity.- Query optional
query What to look for, for example Universal Studios. Leave blank for any activity.
(default)
- Currency optional
currency Three-letter price currency, for example USD.
USD (default)
Exactly 3 characters.
- Max Results optional
max_results Maximum number of activities, for example 20.
25
Whole number from 1 to 50. Default
20.
Input as JSON
{ "city": "Singapore", "sort": "price_low_to_high", "max_results": 25}Output
{ "activities": []}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"klook.com/search_activities","input":{"city":"Singapore","sort":"price_low_to_high","max_results":25}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "klook.com/search_activities" , "input": { "city": "Singapore", "sort": "price_low_to_high", "max_results": 25 }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "klook.com/search_activities" , "input": { "city": "Singapore", "sort": "price_low_to_high", "max_results": 25 } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run klook.com/search_activities# with {"city":"Singapore","sort":"price_low_to_high","max_results":25}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "city" ], "properties": { "city": { "type": "string", "description": "City to search, for example Singapore." }, "sort": { "enum": [ "popularity", "price_low_to_high", "rating" ], "type": "string", "default": "popularity", "description": "How to order results, for example popularity." }, "query": { "type": "string", "default": "", "description": "What to look for, for example Universal Studios. Leave blank for any activity." }, "currency": { "type": "string", "default": "USD", "maxLength": 3, "minLength": 3, "description": "Three-letter price currency, for example USD." }, "max_results": { "type": "integer", "default": 20, "maximum": 50, "minimum": 1, "description": "Maximum number of activities, for example 20." } }}Output schema
{ "type": "object", "required": [ "activities" ], "properties": { "activities": { "type": "array", "items": { "type": "object", "required": [ "title", "category", "rating", "review_count", "number_booked", "starting_price", "currency", "original_price", "instant_confirmation", "free_cancellation", "link", "activity_id" ], "properties": { "link": { "type": "string" }, "title": { "type": "string" }, "rating": { "type": [ "number", "null" ] }, "category": { "type": [ "string", "null" ] }, "currency": { "type": "string" }, "activity_id": { "type": "integer", "x-fous-developer": true }, "review_count": { "type": [ "integer", "null" ] }, "number_booked": { "type": [ "string", "null" ] }, "original_price": { "type": [ "number", "null" ] }, "starting_price": { "type": [ "number", "null" ] }, "free_cancellation": { "type": "boolean" }, "instant_confirmation": { "type": "boolean" } }, "additionalProperties": false } } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
klook.com/search_activities- Returns
- title, category, rating, review count, bookings, prices, cancellation and confirmation policies, link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method klook.com/search_activities with the inputs above.
Ask your agent
- Find cheapest theme park tickets in Osaka sorted by price, show 10 results in JPY
- What are the top rated day tours in Bangkok with review counts and booking policies?
- I need a list of popular museum passes in Paris ranked by bookings, priced in EUR
- Show me highly rated boat cruises in Hong Kong with cancellation policies, max 15 results
- Looking on klook.com for Universal Studios tickets in Singapore, sorted by rating, prices in SGD
See more
Finds GetYourGuide tours, tickets and activities in a city, optionally matching words, available on a day, sorted by popularity, price or rating, with prices, ratings and booking features.
getyourguide.com/search_activitiesFinds tours and experiences in a city on Viator, with optional keywords, date, currency and sorting. Prices are starting prices.
viator.com/search_toursFinds available Agoda stays in a city for your dates, with prices before taxes and fees, star and guest ratings, and free-cancellation status.
agoda.com/search_hotelsCompares Kayak hotel nightly rates across booking sites for a city or neighborhood and stay dates (two adults, one room).
kayak.com/search_hotelsLists Tripadvisor's ranked things to do in a city from the first results page, for all attractions or one category (tours, museums, sights and landmarks, nature and parks), with rating, review count, category, and the description or neighbourhood when shown.
tripadvisor.com/list_top_attractionsFinds available hostels, hotels and guesthouses on Hostelworld in a city for given dates, with per-night dorm and private room prices, ratings, facilities and booking links.
hostelworld.com/search_hostelsFinds hotels in a city on Trip.com for given dates, with prices, guest ratings, reviews and booking links. Only the initial public listing is read, so large limits may return fewer hotels.
trip.com/search_hotelsFinds Expedia hotels in a destination for given dates, with public USD prices, reviews, property class, refund status and links. Nightly prices are per room; totals include all requested rooms, taxes and fees.
expedia.com/search_hotels