# Kayak Hotel Reviews Scraper (`shahidirfan/kayak-hotel-reviews-scraper`) Actor

Extract hotel reviews, ratings, and guest feedback from Kayak effortlessly. Scrape pricing, amenities, images, and detailed reviews in bulk. Perfect for travel data analysis, market research, and competitive intelligence. Fast, reliable, and ready to scale.

- **URL**: https://apify.com/shahidirfan/kayak-hotel-reviews-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Travel, Developer tools, Automation
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Kayak Hotel Reviews Scraper

Extract hotel guest reviews from Kayak hotel detail pages in a clean, analysis-ready format. Collect review scores, sentiment text, source details, and author metadata at scale. Built for travel research, reputation tracking, and hospitality intelligence workflows.

### Features

- **Review Collection at Scale** — Collect large review batches with configurable result limits.
- **Rich Review Fields** — Capture scores, rating labels, positive and negative comments, author, and source.
- **Pagination Support** — Automatically retrieves additional review batches until your target count is reached.
- **Automatic URL Detection** — Detects hotel identity from long and short Kayak hotel URL formats.
- **Clean Dataset Output** — Removes empty fields to keep exports compact and usable.

### Use Cases

#### Reputation Monitoring
Track how guest sentiment changes over time for a specific property. Analyze rating shifts and recurring comment patterns.

#### Competitor Benchmarking
Collect review data from multiple hotels to compare quality signals, reviewer sentiment, and source distribution.

#### Hospitality Analytics
Feed review-level data into BI dashboards for score trends, complaint analysis, and category-level insights.

#### Travel Content Research
Use authentic guest feedback to support travel guides, destination comparisons, and accommodation recommendations.

---

### Input Parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `startUrl` | String | No | From `INPUT.json` | Full Kayak hotel details URL. |
| `results_wanted` | Integer | No | `20` | Maximum number of reviews to collect. |
| `page_size` | Integer | No | `10` | Number of reviews requested per batch. |
| `proxyConfiguration` | Object | No | `{ "useApifyProxy": false }` | Optional Apify Proxy settings. |

---

### Output Data

Each dataset item contains:

| Field | Type | Description |
|---|---|---|
| `review_index` | Integer | Order of review in collected output |
| `hotel_id` | String | Kayak hotel ID |
| `hotel_name` | String | Hotel name from URL |
| `hotel_url` | String | Kayak hotel details URL |
| `total_reviews_available` | Integer | Total review count available |
| `review_id` | String | Unique review identifier |
| `score` | Number | Numeric review score |
| `localized_score` | Number | Localized score value |
| `rating_category` | String | Localized rating category |
| `review_month_year` | String | Month and year of review |
| `author` | String | Review author |
| `positive_comment` | String | Positive feedback text |
| `negative_comment` | String | Negative feedback text |
| `review_source` | String | Review provider name |
| `review_source_logo_url` | String | Provider logo URL |
| `review_link` | String | Source review URL |
| `is_internal_review` | Boolean | Internal review flag |
| `sort_type` | String | Sort mode used |
| `scraped_at` | String | ISO timestamp when record was saved |

---

### Usage Examples

#### Basic Review Extraction

```json
{
    "startUrl": "https://www.kayak.com/hotels/Hilton-London-Gatwick-Airport,Gatwick-p492403-h54545-details/",
    "results_wanted": 20
}
````

#### Higher Volume Collection

```json
{
    "startUrl": "https://www.kayak.com/hotels/Hilton-London-Gatwick-Airport,Gatwick-p492403-h54545-details/",
    "results_wanted": 200,
    "page_size": 10
}
```

#### Minimal Input (Uses INPUT.json Fallback if URL Missing)

```json
{
    "results_wanted": 20
}
```

***

### Sample Output

```json
{
    "review_index": 1,
    "hotel_id": "54545",
    "hotel_name": "Hilton London Gatwick Airport",
    "hotel_url": "https://www.kayak.com/hotels/Hilton-London-Gatwick-Airport,Gatwick-p492403-h54545-details/",
    "total_reviews_available": 9014,
    "review_id": "94fhNp0BOkHXFcMyc0Uk",
    "score": 40,
    "localized_score": 40,
    "rating_category": "Okay",
    "review_month_year": "Mar 2026",
    "author": "Herbst",
    "positive_comment": "The restaurant that serves breakfast good.",
    "negative_comment": "Arriving and receptionist was incompetent. We were tired and it took ages.",
    "review_source": "Booking.com",
    "review_source_logo_url": "https://www.kayak.com/provider-logos/hotels/reviews/h/bookingLogo.png",
    "review_link": "https://www.kayak.com/out?...",
    "is_internal_review": false,
    "sort_type": "recent",
    "scraped_at": "2026-04-05T12:30:00.000Z"
}
```

***

### Tips for Best Results

#### Use Valid Hotel Detail URLs

- Start from a full Kayak hotel details page URL.
- Keep the URL format intact, including the hotel identifier segment.

#### Start Small, Then Scale

- Begin with `results_wanted: 20` to validate quickly.
- Increase gradually for large research runs.

#### Keep Filters Focused

- Use narrow filters when analyzing specific traveler segments.
- Leave filters blank to collect broad review coverage.

#### Improve Stability

- Enable proxy settings for repeated or larger runs.
- Re-run with adjusted filters if returned volume is lower than expected.

***

### Integrations

Connect your output to:

- **Google Sheets** — Review tracking and score analysis
- **Airtable** — Searchable review databases
- **Looker Studio** — Hospitality dashboards
- **Webhooks** — Push new data into internal systems
- **Make** — Workflow automation
- **Zapier** — App-to-app integrations

#### Export Formats

- **JSON** — Data pipelines and applications
- **CSV** — Spreadsheet workflows
- **Excel** — Business reporting
- **XML** — System integrations

***

### Frequently Asked Questions

#### Why did I receive fewer reviews than requested?

Available review volume depends on the hotel and applied filters. Reduce filter strictness or run with a higher limit.

#### Can I scrape reviews from any Kayak hotel page?

Yes, as long as you provide a valid Kayak hotel details URL.

#### Can I collect reviews from specific sources only?

The actor uses a built-in provider mix to keep output consistent.

#### Is duplicate data removed?

Yes. The actor de-duplicates reviews by review ID during a run.

#### Are empty fields included in output?

No. Empty values are removed for cleaner datasets.

***

### Support

For issues or feature requests, use the actor support channel in Apify Console.

#### Resources

- [Apify Documentation](https://docs.apify.com/)
- [Apify API Reference](https://docs.apify.com/api/v2)
- [Apify Scheduling](https://docs.apify.com/schedules)

***

### Legal Notice

This actor is intended for legitimate data collection and analysis. Users are responsible for ensuring compliance with applicable laws and website terms. Use responsibly and apply reasonable request volumes.

# Actor input Schema

## `startUrl` (type: `string`):

Full Kayak hotel details URL. Works with long and short Kayak hotel URL formats.

## `results_wanted` (type: `integer`):

Maximum number of reviews to save.

## `page_size` (type: `integer`):

How many reviews to request per API call.

## `proxyConfiguration` (type: `object`):

Use Apify Proxy for improved reliability.

## Actor input object example

```json
{
  "startUrl": "https://www.kayak.com/hotels/Hilton-London-Gatwick-Airport,Gatwick-p492403-h54545-details/",
  "results_wanted": 20,
  "page_size": 10,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.kayak.com/hotels/Hilton-London-Gatwick-Airport,Gatwick-p492403-h54545-details/",
    "results_wanted": 20,
    "page_size": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/kayak-hotel-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 = {
    "startUrl": "https://www.kayak.com/hotels/Hilton-London-Gatwick-Airport,Gatwick-p492403-h54545-details/",
    "results_wanted": 20,
    "page_size": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/kayak-hotel-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 '{
  "startUrl": "https://www.kayak.com/hotels/Hilton-London-Gatwick-Airport,Gatwick-p492403-h54545-details/",
  "results_wanted": 20,
  "page_size": 10
}' |
apify call shahidirfan/kayak-hotel-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Kayak Hotel Reviews Scraper",
        "description": "Extract hotel reviews, ratings, and guest feedback from Kayak effortlessly. Scrape pricing, amenities, images, and detailed reviews in bulk. Perfect for travel data analysis, market research, and competitive intelligence. Fast, reliable, and ready to scale.",
        "version": "1.0",
        "x-build-id": "VEABwBXoaz8fExV7Q"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/shahidirfan~kayak-hotel-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-shahidirfan-kayak-hotel-reviews-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/shahidirfan~kayak-hotel-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-shahidirfan-kayak-hotel-reviews-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/shahidirfan~kayak-hotel-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-shahidirfan-kayak-hotel-reviews-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": {
                    "startUrl": {
                        "title": "Kayak hotel details URL",
                        "type": "string",
                        "description": "Full Kayak hotel details URL. Works with long and short Kayak hotel URL formats."
                    },
                    "results_wanted": {
                        "title": "Maximum reviews",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of reviews to save.",
                        "default": 20
                    },
                    "page_size": {
                        "title": "Reviews per API page",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How many reviews to request per API call.",
                        "default": 10
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Use Apify Proxy for improved reliability.",
                        "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
                                    }
                                }
                            },
                            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
