# Kiwi Hotel Reviews Scraper (`shahidirfan/kiwi-hotel-reviews-scraper`) Actor

Scrape Kiwi hotel reviews, guest ratings, review scores, comments, traveler feedback, and hotel details at scale. Extract structured accommodation review data for travel research, sentiment analysis, hotel monitoring, market insights, and analytics.

- **URL**: https://apify.com/shahidirfan/kiwi-hotel-reviews-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 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/actors/running/actors-in-store.md#pay-per-usage

## 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

### What does Kiwi Hotel Reviews Scraper do?

Kiwi Hotel Reviews Scraper collects public guest reviews from one Kiwi Hotels property page and saves each review as a structured dataset record. Paste a Kiwi Hotels hotel URL such as `https://hotels.kiwi.com/Hotel/2643919/en`, or enter a numeric hotel ID, then choose the review order and result limit.

Each record contains review information only: the written review, reviewer name, score, review date, stay dates, review source, length of stay, and review-level rating summaries. Hotel listing details such as address, star rating, coordinates, images, and facilities are not collected. Use the data for hospitality research, reputation monitoring, guest experience analysis, competitor benchmarking, and sentiment workflows.

### Why use Kiwi Hotel Reviews Scraper?

- **Collect guest feedback in a usable format** - Save one review per dataset item instead of copying comments manually.

- **Keep review context with every record** - Include the hotel ID and source URL alongside each guest review.

- **Choose the review order** - Request the most relevant, newest, highest-scoring, or lowest-scoring reviews first.

- **Control the collection size** - Set a maximum number of reviews and a page limit for predictable runs.

- **Clean exports** - Empty and unavailable values are omitted from each item rather than written as `null`.

- **Automation ready** - Schedule repeat runs, connect webhooks, export datasets, or access results through the Apify API.

### What data can you extract from Kiwi Hotels?

| Field                     | Description                                                        |
| ------------------------- | ------------------------------------------------------------------ |
| `hotel_id`                | Kiwi Hotels property identifier.                                   |
| `hotel_url`               | Kiwi Hotels property URL used for the run.                         |
| `review_id`               | Unique review identifier.                                          |
| `reviewer_name`           | Reviewer name displayed by the source.                             |
| `reviewer_score`          | Numeric score given by the reviewer.                               |
| `review_text`             | Written guest review.                                              |
| `review_date`             | Review publication date and time.                                  |
| `review_language`         | Language code of the review.                                       |
| `review_source`           | Provider associated with the review.                               |
| `check_in`                | Guest stay check-in date when published.                           |
| `check_out`               | Guest stay check-out date when published.                          |
| `length_of_stay`          | Calculated number of nights when both stay dates are available.    |
| `hotel_average_rating`    | Average rating returned for the review collection.                 |
| `hotel_reviews_available` | Number of written reviews available from Kiwi’s review collection. |
| `hotel_reviews_by_rating` | Review totals grouped by rating.                                   |
| `sorting`                 | Review order used for the run.                                     |
| `language`                | Language requested for the run.                                    |
| `source_url`              | Input URL supplied for the run.                                    |
| `source`                  | Source website name.                                               |

Fields are omitted when Kiwi Hotels does not provide a value for a particular review.

### How to scrape Kiwi Hotel reviews

1. Open Kiwi Hotel Reviews Scraper on Apify.
2. Paste one public Kiwi Hotels hotel detail URL into **Hotel URL**.
3. Optionally provide a numeric **Hotel ID**. If both are supplied, the explicit hotel ID is used.
4. Choose a review order, result limit, page limit, and language.
5. Run the Actor and review the dataset preview.
6. Download the results as JSON, CSV, Excel, XML, or another supported format.

The scraper supports the standard Kiwi Hotels detail URL form, trailing slashes, different locale segments, URL query parameters, and URLs that contain `hotelId` or `hotelid` in the query string.

### Input Parameters

| Parameter        | Type    | Required | Default               | Description                                                           |
| ---------------- | ------- | -------- | --------------------- | --------------------------------------------------------------------- |
| `hotel_url`      | String  | No       | Kiwi sample hotel URL | One Kiwi Hotels property detail URL. This is the recommended input.   |
| `hotel_id`       | String  | No       | -                     | Numeric Kiwi Hotels property ID. It can be used without a URL.        |
| `sorting`        | String  | No       | `relevancy`           | Review order: `relevancy`, `recency`, `rating_desc`, or `rating_asc`. |
| `results_wanted` | Integer | No       | `20`                  | Maximum number of unique reviews to save.                             |
| `max_pages`      | Integer | No       | `10`                  | Maximum review pages to request.                                      |
| `language`       | String  | No       | `en`                  | Language code requested for the review results.                       |

### Usage Examples

#### Collect reviews from a hotel URL

Use the supplied property URL and save the first 20 unique reviews:

```json
{
    "hotel_url": "https://hotels.kiwi.com/Hotel/2643919/en",
    "sorting": "relevancy",
    "results_wanted": 20,
    "max_pages": 3
}
```

#### Run with a hotel ID

Use a numeric ID when a property URL is not available:

```json
{
    "hotel_id": "2643919",
    "sorting": "recency",
    "results_wanted": 50,
    "max_pages": 5
}
```

### Sample Output

Example dataset item from the supplied hotel URL:

```json
{
    "hotel_id": "2643919",
    "hotel_url": "https://hotels.kiwi.com/Hotel/2643919/en",
    "source_url": "https://hotels.kiwi.com/Hotel/2643919/en",
    "source": "hotels.kiwi.com",
    "review_id": "2643919_872496512",
    "reviewer_name": "Muhammad Shahid",
    "reviewer_score": 10,
    "review_text": "Great and convenient place to stay.",
    "review_date": "2026-05-13 14:09:11",
    "review_language": "en",
    "review_source": "EXP",
    "check_in": "2026-01-15",
    "check_out": "2026-01-18",
    "length_of_stay": 3,
    "hotel_average_rating": 7.4736843,
    "hotel_reviews_available": 19,
    "hotel_reviews_by_rating": {
        "2": 2,
        "4": 2,
        "6": 1,
        "8": 8,
        "10": 6
    },
    "sorting": "relevancy",
    "language": "en"
}
```

### Tips for best results

- **Start with the complete property URL** - It makes it easy to confirm the hotel identity before the run.
- **Use a small result limit first** - Test with 10 or 20 reviews, then increase `results_wanted` for a larger collection.
- **Set a suitable page limit** - Use `max_pages` as a safety boundary when requesting more reviews.
- **Select the order that matches your task** - Use `recency` for recent feedback, `rating_desc` for positive examples, and `rating_asc` for complaints or low-score analysis.
- **Expect property-specific availability** - Some hotels publish fewer written reviews than others.
- **Check the dataset preview** - Confirm the property ID and review fields before adding the data to a report or monitoring workflow.

### Integrations and export formats

- **Google Sheets** - Compare scores, stay dates, and recurring guest comments in a spreadsheet.
- **Airtable** - Organize reviews by property, source, score, or date.
- **Webhooks** - Trigger downstream processing after each completed run.
- **Make or Zapier** - Send new review datasets to alerts, dashboards, or internal tools.
- **Apify API** - Start runs and retrieve dataset records programmatically.
- **JSON, CSV, Excel, and XML** - Export the data for analysis, reporting, or system integration.

### Frequently Asked Questions

#### Can I collect reviews from one hotel at a time?

Yes. The Actor is designed for one Kiwi Hotels property per run and returns one dataset item for each unique review.

#### Can I use a hotel ID instead of a URL?

Yes. Enter a numeric `hotel_id`. The Actor builds the property context from that ID and uses the corresponding hotel detail URL in the output.

#### Which review sorting options are available?

The supported options are `relevancy`, `recency`, `rating_desc`, and `rating_asc`. The first returns the source's most relevant order, while the other options prioritize publication date or score.

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

The Actor saves up to `results_wanted`, but the source may publish fewer reviews for the selected hotel or language. It also stops at `max_pages`.

#### Why can the hotel page show more reviews than the dataset?

The hotel profile can show an aggregate review count that is higher than the number of written review rows available through Kiwi’s review feed. The Actor follows the feed’s pagination cursor and collects every written review row it exposes, including its provider label. For example, a property may report 2,536 aggregate reviews while the review feed currently exposes 19 written rows across multiple providers. The Actor stops when the feed reports no next page instead of creating incomplete records.

#### Are empty fields included in the dataset?

No. Values that are empty, unavailable, or null are omitted from each dataset item, keeping exports compact and easier to process.

#### Can I export the results to CSV or Excel?

Yes. Apify datasets can be downloaded as JSON, CSV, Excel, XML, and other supported formats.

#### Can I schedule review collection?

Yes. Create an Apify schedule to run the Actor hourly, daily, weekly, or at another interval that fits your monitoring workflow.

#### Is it legal to collect Kiwi Hotels review data?

Public data collection may be subject to applicable laws, privacy requirements, and Kiwi Hotels terms. You are responsible for confirming that your intended use is permitted and for handling reviewer information responsibly.

### Related Actors

- [Trip.com Hotel Reviews Scraper](https://apify.com/shahidirfan/trip-com-hotel-reviews-scraper) - Collect hotel reviews and guest feedback from Trip.com.
- [Kayak Hotel Reviews Scraper](https://apify.com/shahidirfan/kayak-hotel-reviews-scraper) - Collect review scores, comments, authors, and source information from Kayak.
- [Expedia Hotels Scraper](https://apify.com/shahidirfan/expedia-hotels-scraper) - Collect hotel listings, prices, ratings, availability, and review counts from Expedia.

### Support

For issues, missing fields, or feature requests, use the Issues tab on the Actor page and include the input URL, run ID, and a short description of the result. Public hotel pages can change, so reporting the affected property helps keep the Actor reliable.

### Legal Notice

This Actor is intended for legitimate collection of publicly available Kiwi Hotels review information. Users are responsible for complying with applicable laws, privacy rules, Kiwi Hotels terms of service, and any restrictions that apply to their intended use of the data.

# Actor input Schema

## `hotel_url` (type: `string`):

A Kiwi Hotels property URL, for example https://hotels.kiwi.com/Hotel/2643919/en.

## `hotel_id` (type: `string`):

Numeric Kiwi hotel ID. When supplied, it takes priority over the ID in Hotel URL.

## `sorting` (type: `string`):

Order in which reviews are returned.

## `language` (type: `string`):

Language code requested from Kiwi Hotels.

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

Maximum number of unique reviews to save.

## `max_pages` (type: `integer`):

Safety limit for paginated review requests.

## Actor input object example

```json
{
  "hotel_url": "https://hotels.kiwi.com/Hotel/2643919/en",
  "sorting": "relevancy",
  "language": "en",
  "results_wanted": 20,
  "max_pages": 3
}
```

# 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 = {
    "hotel_url": "https://hotels.kiwi.com/Hotel/2643919/en",
    "sorting": "relevancy",
    "language": "en",
    "results_wanted": 20,
    "max_pages": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/kiwi-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 = {
    "hotel_url": "https://hotels.kiwi.com/Hotel/2643919/en",
    "sorting": "relevancy",
    "language": "en",
    "results_wanted": 20,
    "max_pages": 3,
}

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

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

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

```

## CLI example

```bash
echo '{
  "hotel_url": "https://hotels.kiwi.com/Hotel/2643919/en",
  "sorting": "relevancy",
  "language": "en",
  "results_wanted": 20,
  "max_pages": 3
}' |
apify call shahidirfan/kiwi-hotel-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,shahidirfan/kiwi-hotel-reviews-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/IxfzqbUeSSDtTdWDM/builds/3qcVl6aBcmj4qptSg/openapi.json
