{
  "openapi": "3.0.1",
  "info": {
    "title": "Klook Scraper — Activities, Prices & Reviews",
    "description": "Scrape Klook activities, tours and attraction tickets by destination, keyword or URL: title, price, currency, rating, review count, category, location, highlights and URL, plus optional full details (policies, packages, images) and Klook reviews.",
    "version": "0.1",
    "x-build-id": "xTjvzVJRZLLd4lNAw"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/tortuga~klook-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-tortuga-klook-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/tortuga~klook-scraper/runs": {
      "post": {
        "operationId": "runs-sync-tortuga-klook-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/tortuga~klook-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-tortuga-klook-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "destinations": {
            "title": "Destinations",
            "type": "array",
            "description": "City, region or country names to get things to do for, e.g. \"Tokyo\", \"Bali\", \"Hong Kong\", \"Japan\". Each name is searched like the Klook search box (Recommended order, 20 activities per page).",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Free-text searches, e.g. \"sunset cruise\", \"universal studios singapore\", \"mount fuji day trip\". Combine with Destinations as you like; the same activity is never saved twice in a run.",
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Klook URLs. Activity pages (https://www.klook.com/activity/70672-shibuya-sky-tokyo/) return that activity with full details. Search pages (https://www.klook.com/search/result/?query=tokyo&sort=price&front_id=3) keep their query, sort order and filters (city_id, country_id, front_id, start_time, price_from, price_to, instant). City and country pages (https://www.klook.com/city/28-tokyo-things-to-do/) list that destination's activities. A language prefix such as /en-US/ or /zh-TW/ is fine.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "currency": {
            "title": "Currency",
            "pattern": "^[A-Za-z]{3}$",
            "type": "string",
            "description": "3-letter ISO code of the prices (USD, EUR, GBP, JPY, HKD, SGD, AUD, …). Klook converts its prices into the chosen currency itself; USD is the site's base currency and the most stable choice for comparisons and monitoring.",
            "default": "USD"
          },
          "language": {
            "title": "Language",
            "enum": [
              "en",
              "en-US",
              "en-GB",
              "en-SG",
              "en-AU",
              "zh-TW",
              "zh-HK",
              "zh-CN",
              "ja",
              "ko",
              "th",
              "vi",
              "id",
              "ms-MY",
              "de",
              "fr",
              "es",
              "it",
              "ru",
              "pt-BR"
            ],
            "type": "string",
            "description": "Klook site language for titles, categories, tags, details and reviews. Klook prices its activities per market (the visitor's country, see Proxy), so keep one language and one proxy country when you compare or monitor prices.",
            "default": "en"
          },
          "sortBy": {
            "title": "Sort by",
            "enum": [
              "most_relevant",
              "price",
              "participants",
              "publish_time",
              "review_score"
            ],
            "type": "string",
            "description": "Order of the search results, like the sort menu on klook.com. Leave empty for Recommended. A sort in a search URL wins for that URL."
          },
          "maxItems": {
            "title": "Max activities",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many activities in total (across all destinations, search terms and URLs; duplicates are removed). Reviews do not count towards this limit, they are capped per activity. Each search page holds 20 activities.",
            "default": 100
          },
          "maxPagesPerSearch": {
            "title": "Max pages per search",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Search pages read per destination, search term or search URL (20 activities each; at most 50 pages, because Klook caps a search at 1,000 results).",
            "default": 5
          },
          "includeDetails": {
            "title": "Include activity details",
            "type": "boolean",
            "description": "Also fetch every activity's detail record: description, highlights, good-to-know notes, address with coordinates, category path, cancellation and confirmation policy, voucher and ticket type, all images, booking options and the package list with per-package prices. One extra request and a small extra charge per activity (see pricing).",
            "default": false
          },
          "maxReviewsPerActivity": {
            "title": "Max reviews per activity",
            "minimum": 0,
            "type": "integer",
            "description": "Save up to this many of the newest customer reviews per activity as separate items (type \"review\"): rating, text, English translation when Klook provides one, language, reviewer name as shown, date, visit date, package, helpful votes and photos. 0 = no reviews. 20 reviews per request; Klook serves at most 2,000 per activity. Charged per review (see pricing).",
            "default": 0
          },
          "reviewsNewerThan": {
            "title": "Only reviews newer than",
            "type": "string",
            "description": "Only reviews newer than: a date (YYYY-MM-DD) or a period such as '7 days' or '24 hours'. Turns reviews on (20 per activity unless Max reviews per activity says otherwise). Reviews are read newest first and reading stops at the first page that is entirely older."
          },
          "onlyNewOrChanged": {
            "title": "Only new or changed items",
            "type": "boolean",
            "description": "Remember what earlier runs of this search returned and output only new items or items whose price/status changed. Use with a Schedule; unchanged items are not charged. With this on, Max activities is the number of activities checked each run (the watched window, e.g. the top 40 of a destination), so a run never digs deeper than the first one. Compared: price, rating and sold-out status. Klook shows one of several prices per request (with or without a platform promo, sometimes the cheapest unit), so the Actor remembers every price it has seen for an activity and reports a change only for a price never shown before (beyond 1 %); expect a few such reports in the first runs, then only real changes. Rating moves under 0.05 are ignored. With reviews on, only reviews not seen before are saved (also for unchanged activities, whose reviews are only requested when their review count moved).",
            "default": false
          },
          "monitoringKey": {
            "title": "Monitoring key",
            "type": "string",
            "description": "Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Klook's pages sit behind DataDome, which started denying Apify's RESIDENTIAL proxy group on 2026-11-05 as well as datacenter IPs, so Apify's Unblocker proxy (group UNBLOCKER) is now the default. Unblocker is billed to your Apify account per request attempt, about $0.0015 (10 units) on the free plan, including failed attempts; one search request returns a full page of up to 20 activities, so proxy cost stays well under the per-activity price. Unblocker picks its own exit country, so the proxy country can no longer be pinned here; Klook prices still depend on the visitor's country shown in the results. Plain datacenter or RESIDENTIAL proxies are cheaper if DataDome relaxes again.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "UNBLOCKER"
              ]
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}