{
  "openapi": "3.0.1",
  "info": {
    "title": "Klook Activities Scraper: Tours, Tickets, Reviews & Price Drops",
    "description": "Scrape Klook tours, attraction tickets and activities by city, country or pasted link. Filter by price, rating and free cancellation, add packages, customer reviews and day-by-day calendar prices, and track price drops and sell-outs. Export JSON, CSV or Excel. No login or API key.",
    "version": "0.1",
    "x-build-id": "zzBV9dYmYmyx9d8MU"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/getascraper~klook-activities-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-getascraper-klook-activities-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/getascraper~klook-activities-scraper/runs": {
      "post": {
        "operationId": "runs-sync-getascraper-klook-activities-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/getascraper~klook-activities-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-getascraper-klook-activities-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 (city or country names)",
            "type": "array",
            "description": "Type city or country names such as Tokyo, Osaka, Bali or Japan and the Actor finds the matching Klook destination for you, no numeric IDs needed. Names that Klook does not recognise are reported in the run summary.",
            "default": [
              "Osaka"
            ],
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Optional keywords such as universal studios, snorkeling or food tour. When destinations are also set, each keyword is searched inside each destination; without destinations it searches all of Klook.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Klook links",
            "type": "array",
            "description": "Paste Klook links: activity pages, city or country destination pages, category list pages or search result links. Each link is turned into the matching activity list or a single activity.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "activityIds": {
            "title": "Activity IDs",
            "type": "array",
            "description": "Optional numeric Klook activity IDs, for example 46604. Handy for tracking a fixed set of activities in monitor mode.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "listingType": {
            "title": "Product type",
            "enum": [
              "all",
              "attractions",
              "tours"
            ],
            "type": "string",
            "description": "Klook lists attraction tickets and passes separately from tours and experiences. Pick one side or search both.",
            "default": "all"
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Optional category names such as Theme parks, Museums, Day trips or Food tours. Names are matched against Klook's own category list for the destination. Leave empty for all categories.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "availableOn": {
            "title": "Bookable on date",
            "type": "string",
            "description": "Only keep activities that can be booked for this date. Leave empty to skip the date check."
          },
          "minPrice": {
            "title": "Minimum price",
            "minimum": 0,
            "maximum": 1000000,
            "type": "number",
            "description": "Hide activities whose starting price is below this amount, in the currency chosen under Output and limits. 0 means no minimum.",
            "default": 0
          },
          "maxPrice": {
            "title": "Maximum price",
            "minimum": 0,
            "maximum": 1000000,
            "type": "number",
            "description": "Hide activities whose starting price is above this amount, in the currency chosen under Output and limits. 0 means no maximum.",
            "default": 0
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Keep only activities rated at least this many stars out of 5. 0 keeps everything, including activities with no reviews yet.",
            "default": 0
          },
          "minReviews": {
            "title": "Minimum number of reviews",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Keep only activities with at least this many reviews. Useful to skip brand-new listings.",
            "default": 0
          },
          "hideSoldOut": {
            "title": "Hide sold-out activities",
            "type": "boolean",
            "description": "Skip activities that Klook marks as sold out.",
            "default": false
          },
          "freeCancellationOnly": {
            "title": "Free cancellation only",
            "type": "boolean",
            "description": "Keep only activities that carry Klook's free cancellation label.",
            "default": false
          },
          "instantConfirmationOnly": {
            "title": "Instant confirmation only",
            "type": "boolean",
            "description": "Keep only activities that confirm the booking immediately.",
            "default": false
          },
          "requiredTags": {
            "title": "Required labels",
            "type": "array",
            "description": "Optional Klook labels an activity must show, for example Private tour, Hotel pick-up, Small group or English guided. Matching ignores upper and lower case and uses the language you picked.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "includeDetails": {
            "title": "Add full details and packages",
            "type": "boolean",
            "description": "Adds highlights, description, address and coordinates, photos, the list of packages with prices, inclusions, exclusions, meeting point, cancellation rules and a review summary to each activity. Slower, because several extra pages are read per activity.",
            "default": false
          },
          "maxPackagesPerActivity": {
            "title": "Packages to read per activity",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "How many packages (ticket or tour options) are read in depth for details and calendar prices. Raise it for activities with many options.",
            "default": 5
          },
          "includeReviews": {
            "title": "Add reviews",
            "type": "boolean",
            "description": "Delivers customer reviews as separate rows with the text, translation, star rating, date, language, photos and the operator's reply when there is one.",
            "default": false
          },
          "maxReviewsPerActivity": {
            "title": "Reviews per activity",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "The most reviews delivered for each activity. Klook exposes at most the latest 2000 reviews per activity.",
            "default": 20
          },
          "reviewSort": {
            "title": "Review order",
            "enum": [
              "newest",
              "relevant",
              "highest",
              "lowest"
            ],
            "type": "string",
            "description": "Newest first is best for tracking fresh feedback. Most relevant matches Klook's default order. In monitor mode reviews are always read newest first so only unseen ones are delivered.",
            "default": "newest"
          },
          "reviewsWithPhotosOnly": {
            "title": "Only reviews with photos",
            "type": "boolean",
            "description": "Keep only reviews that have traveler photos.",
            "default": false
          },
          "includeAvailability": {
            "title": "Add calendar prices",
            "type": "boolean",
            "description": "Adds a day-by-day price and stock calendar for each package, the cheapest date, the first bookable date and the days with no inventory. Activities without a date calendar (open-dated tickets) are marked as such.",
            "default": false
          },
          "availabilityDays": {
            "title": "Calendar length in days",
            "minimum": 1,
            "maximum": 180,
            "type": "integer",
            "description": "How many days the calendar covers, counting from today. If you picked a date under Filters, the calendar starts on that date instead.",
            "default": 30
          },
          "compareCurrencies": {
            "title": "Compare prices in other currencies",
            "type": "array",
            "description": "Optional list of currency codes such as JPY or EUR. Each activity gets its starting price in every listed currency next to the main one. One small extra request per currency and activity.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "monitorMode": {
            "title": "Monitor mode (changes only)",
            "type": "boolean",
            "description": "Only delivers activities that are new or changed since the last run of the same watchlist: price drops, price increases, sold out, back on sale and review count jumps. Unchanged activities are skipped, which also keeps the run cheap. Schedule it to track a market.",
            "default": false
          },
          "watchlistName": {
            "title": "Watchlist name",
            "type": "string",
            "description": "Name of the saved memory used by monitor mode. Use a different name for each separate list you track so their baselines do not mix.",
            "default": "default"
          },
          "minPriceChangePercent": {
            "title": "Smallest price change to report (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "number",
            "description": "Price moves smaller than this percentage are ignored. Currency rounding can move prices by a fraction of a percent.",
            "default": 1
          },
          "reviewJumpThreshold": {
            "title": "Review jump to report",
            "minimum": 1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Report an activity when its review count grows by at least this many reviews since the last run.",
            "default": 50
          },
          "maxResults": {
            "title": "Maximum activities to deliver",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "The run stops after this many activity rows. Review rows are counted separately by their own per-activity limit.",
            "default": 20
          },
          "maxActivitiesToScan": {
            "title": "Maximum activities to check",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "How many matching activities are looked at before the run stops. Filters and monitor mode skip activities, so this can be higher than the number delivered.",
            "default": 100
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "relevance",
              "popularity",
              "rating",
              "price_low_high",
              "newest",
              "price_high_low",
              "most_reviews"
            ],
            "type": "string",
            "description": "Relevance, most booked, highest rated and newest are sorted by Klook before collecting. Price and most reviews sorting read the whole checked pool (see the scan limit below) before delivering, so they take a little longer but are always exact.",
            "default": "relevance"
          },
          "currency": {
            "title": "Currency",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "AUD",
              "CAD",
              "NZD",
              "SGD",
              "HKD",
              "TWD",
              "JPY",
              "KRW",
              "CNY",
              "THB",
              "MYR",
              "IDR",
              "PHP",
              "VND",
              "INR",
              "AED",
              "CHF",
              "SEK",
              "NOK",
              "DKK",
              "TRY",
              "MOP",
              "MXN",
              "ZAR",
              "BRL",
              "PLN",
              "CZK",
              "HUF",
              "ILS",
              "SAR",
              "QAR",
              "KHR",
              "LAK",
              "LKR",
              "EGP"
            ],
            "type": "string",
            "description": "Currency for all prices and for the price filters.",
            "default": "USD"
          },
          "language": {
            "title": "Language",
            "enum": [
              "en_US",
              "en_GB",
              "en_AU",
              "en_CA",
              "en_SG",
              "en_HK",
              "en_IN",
              "en_MY",
              "en_NZ",
              "en_PH",
              "zh_CN",
              "zh_TW",
              "zh_HK",
              "ja_JP",
              "ko_KR",
              "th_TH",
              "vi_VN",
              "id_ID",
              "ms_MY",
              "fr_FR",
              "de_DE",
              "es_ES",
              "it_IT",
              "ru_RU"
            ],
            "type": "string",
            "description": "Language of titles, descriptions and translated review text. Klook shows market-specific offers, so the starting price can differ by language (for example tours with a Chinese or Korean guide).",
            "default": "en_US"
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Runs work without a proxy. If Klook starts refusing requests the Actor switches to Apify proxies on its own. Set your own proxy here only if you need a specific one.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}