# Kayak Reviews Scraper (`knagymate/apify-kayak-reviews-scraper`) Actor

Extract hotel reviews and ratings from Kayak.com, including data from Booking, Priceline, Agoda, and HotelsCombined. Ideal for research, sentiment analysis, and travel analytics. Supports JSON/CSV export, pagination, and review filtering.

- **URL**: https://apify.com/knagymate/apify-kayak-reviews-scraper.md
- **Developed by:** [knagymate](https://apify.com/knagymate) (community)
- **Categories:** Travel, Automation, Developer tools
- **Stats:** 23 total users, 1 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $2.00 / 1,000 reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Fast Kayak Reviews Scraper

> **Fast Kayak Reviews Scraper** — quickly extract hotel reviews and ratings aggregated by Kayak.com (including reviews Kayak imports from Booking, Priceline, Agoda and HotelsCombined). Ideal for market research, reputation monitoring, data science, and travel analytics.

***

### Overview

Fast Kayak Reviews Scraper scrapes hotel reviews shown on Kayak.com and returns structured review records ready for analysis or export (JSON/CSV/Excel). Kayak often aggregates reviews from several partner sites — such as **Booking.com, Priceline, Agoda, and HotelsCombined** — and this actor captures the combined review stream presented on the hotel’s Kayak page.

This actor is a lightweight, high-performance scraper built to run on Apify or locally and is perfect if you need:

- Large-scale hotel review collection for a region or brand
- Reputation and sentiment analysis across different review sources
- Benchmarking competitors and tracking improvements over time
- Export-ready data for dashboards, machine learning, and BI tools

***

### Features

- Scrape reviews from any Kayak hotel page (desktop URL)
- Extract rating, rating category (e.g. Excellent, Very good), month/year, review id, provider (Booking, Priceline, Agoda, Hotelscombined, etc.), positives and negatives, and full metadata
- Return results sorted by the newest reviews when `cutoffDate` is provided (see **Cutoff / sort behaviour** below)
- Limit the maximum number of reviews scraped (`maxReviews`)
- Exportable output (JSON by default; easy to convert to CSV/Excel)
- Robust handling of pagination and dynamic content

***

### Quick example (input)

```json
{
  "hotelUrl": "https://www.kayak.com/Miami-Hotels-Miami-International-Airport-Hotel.61867.ksp",
  "sortBy": "recent",
  "maxReviews": 1000
}
```

### Quick example (single output record)

```json
{
  "id": "lDOSJZkB2qcuNaAeEJS-",
  "monthYear": "Sep 2025",
  "score": 80.0,
  "ratingCategory": "Excellent",
  "positiveComment": "Location",
  "negativeComment": "Restaurant is not part of the hotel",
  "siteName": "Booking.com"
}
```

***

### Input schema

- `hotelUrl` (string) — **required**. Full Kayak hotel page URL (desktop). Example: `https://www.kayak.com/Miami-Hotels-Miami-International-Airport-Hotel.61867.ksp`.
- `sortBy` (string) — optional. Sorting strategy. Supported values:
  - `recent` → **Most recent**
  - `scoreDesc` → **Highest rated**
  - `scoreAsc` → **Lowest rated**
  - `oldest` → **Oldest**
- `maxReviews` (integer) — optional. Maximum number of reviews to return. If you don't set this, the actor will scrape all available reviews.
- `cutoffDate` (string, ISO date) — optional. If set, the actor will only return reviews newer than or equal to the cutoff date and will always **force** the results to be returned starting from the **most recent** review (equivalent to `sortBy: "recent"`). See details below.

**Note:** If `cutoffDate` is provided, the actor will automatically set `sortBy` to "recent" internally to ensure results are returned in descending date order.

***

### Cutoff / sort behaviour

When `cutoffDate` is defined, results are always returned starting from the newest review and moving backwards in time (i.e. newest → older). This guarantees you will receive all reviews **on or after** the cutoff date without missing recent entries, regardless of the `sortBy` you passed. Practically:

- If `cutoffDate` is provided, `sortBy` is treated as `recent` for the run.
- The actor will paginate through reviews until either `maxReviews` is reached or reviews older than `cutoffDate` are encountered.

This design avoids missing recent reviews when you perform repeated incremental scrapes.

***

### Output schema (per review)

Each scraped review is returned as an object. Common fields include:

- `id` — string: unique review identifier
- `monthYear` — string: month and year for the stay or the review (e.g. `Sep 2025`)
- `score` — number: rating score (0–100 scale where Kayak or provider uses it)
- `ratingCategory` — string: rating label (e.g. `Excellent`, `Very good`)
- `positiveComment` — string: short extracted highlight for positive aspect
- `negativeComment` — string: short extracted highlight for negative aspect
- `siteName` — string: original provider label shown on Kayak (e.g. `Booking.com`, `Priceline`)
- `reviewText` — string: full review comment (when available)
- `reviewDate` — string: ISO date of the review (when available)
-

***

### Kayak review sources

Kayak aggregates reviews from multiple partner sites. The most common upstream sources you may see in the `siteName` field include:

- Booking.com
- Priceline
- Agoda
- HotelsCombined

The scraper captures whatever provider label Kayak surfaces on that hotel page.

***

### Usage

1. Provide the `hotelUrl` of the Kayak hotel page you want to scrape.
2. (Optional) Set `sortBy`, `maxReviews`, and/or `cutoffDate`.
3. Run the actor. Download results as JSON, or use Apify’s export to CSV/Excel.

**Tips:**

- For incremental crawls use `cutoffDate` to only fetch recent reviews. As Kayak returns only year/month, it is recommended to set the cutoff date to the first day of a month (e.g. `2024-09-01`).
- Keep `maxReviews` reasonable for a single run to avoid long runtimes and higher compute costs.
- If you need reviews for many hotels, run the actor in parallel for each hotel URL.

***

### When to use this scraper

- Build datasets of traveler feedback across brands and locations
- Run competitive analysis and UX benchmarking for hotel chains
- Feed data to sentiment analysis and topic extraction pipelines
- Monitor guest-reported issues (cleanliness, staff, location, facilities)

***

### Important notes & legal

- Kayak displays third-party reviews; ensure you comply with Kayak’s and upstream providers’ Terms of Service before using scraped data for commercial purposes.
- This actor is intended for lawful, ethical scraping and research. Avoid excessive scraping that may burden Kayak’s servers.

***

### Troubleshooting

- If the actor returns fewer reviews than expected, check whether the hotel page has filters, or Kayak requires a different locale to surface reviews.
- Some reviews may be hidden behind lazy-loading or require cookies; the actor handles common cases but edge cases can exist.

***

### Contact & contributions

If you find bugs, need additional fields, or want to contribute improvements, open an issue or pull request on the project repository. Pull requests with tests and updated README examples are appreciated.

### 🔗 Related projects

- [Fast Agoda Reviews Scraper](https://apify.com/knagymate/fast-agoda-reviews-scraper) — Scrape detailed hotel reviews directly from Agoda.com with reviewer info, stay details, and ratings.

# Actor input Schema

## `hotelUrl` (type: `string`):

URL of hotel to scrape reviews from.

## `sortBy` (type: `string`):

Sort the search results by the specified criteria.

## `maxReviews` (type: `integer`):

Maximum number of reviews to scrape.

## `cutoffDate` (type: `string`):

Scraper will return reviews newer than this date if it is provided.

## Actor input object example

```json
{
  "hotelUrl": "https://www.kayak.com/Miami-Hotels-Miami-International-Airport-Hotel.61867.ksp",
  "sortBy": "recent",
  "maxReviews": 1000
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxReviews": 1000,
    "cutoffDate": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("knagymate/apify-kayak-reviews-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "maxReviews": 1000,
    "cutoffDate": "",
}

# Run the Actor and wait for it to finish
run = client.actor("knagymate/apify-kayak-reviews-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxReviews": 1000,
  "cutoffDate": ""
}' |
apify call knagymate/apify-kayak-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=knagymate/apify-kayak-reviews-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/ZQjNUHmrfRy9kdTaE/builds/w3Dbmf1auX1GbKHsX/openapi.json
