# Kiwi Hotels Scraper 🏨 (`shahidirfan/kiwi-hotels-scraper`) Actor

Extract Kiwi.com hotel listings with prices, ratings, property details, locations, amenities, availability, and booking information. Ideal for hotel price monitoring, travel research, market analysis, accommodation datasets, and travel intelligence at scale.

- **URL**: https://apify.com/shahidirfan/kiwi-hotels-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 Hotels Listing Scraper do?

Kiwi Hotels Listing Scraper collects structured hotel listing data from Kiwi Hotels search pages. Provide a Hotels search URL at the top of the input form, or enter a location when you want the Actor to find the destination for you. The dataset includes hotel names, addresses, coordinates, ratings, reviews, descriptions, images, prices, stay dates, highlights, and direct property links.

Use the results for hotel market research, travel comparison, accommodation monitoring, destination analysis, price tracking, and travel planning workflows.

### Why use Kiwi Hotels Listing Scraper?

- **Search-page focused** - Collects a set of hotel listings instead of targeting a single property.
- **Simple inputs** - Start with a Kiwi Hotels search URL, location, dates, and guest count.
- **Useful property data** - Capture names, addresses, coordinates, ratings, review counts, descriptions, images, facilities, and highlights.
- **Price context** - Save minimum and median listed rates, price ranges, currency, and stay dates when available.
- **Pagination support** - Continue through multiple listing pages up to the configured limit.
- **Clean records** - Empty and null values are removed before records are written to the dataset.
- **Automation ready** - Schedule runs, connect webhooks, export datasets, or use Apify integrations.

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

| Field                             | Description                                                       |
| --------------------------------- | ----------------------------------------------------------------- |
| `hotel_id`                        | Kiwi property identifier                                          |
| `hotel_name`                      | Hotel or accommodation name                                       |
| `url`                             | Direct Kiwi Hotels property URL                                   |
| `location`                        | Displayed address or area                                         |
| `city`                            | City containing the property                                      |
| `country`                         | Country code or country name                                      |
| `latitude`, `longitude`           | Property coordinates when available                               |
| `description`                     | Short property description                                        |
| `star_rating`                     | Published star rating                                             |
| `review_count`                    | Number of reviews                                                 |
| `guest_rating`                    | Guest rating breakdown                                            |
| `price_min`                       | Minimum listed rate                                               |
| `price_median`                    | Median listed rate                                                |
| `price_min_user_currency`         | Minimum rate converted to the search currency                     |
| `price_range`                     | Regular displayed price range                                     |
| `currency`                        | Currency used by the search                                       |
| `check_in`, `check_out`           | Search stay dates                                                 |
| `check_in_time`, `check_out_time` | Property arrival and departure times                              |
| `imageURIs`                       | Property image URLs                                               |
| `facilities`                      | Kiwi facility identifiers                                         |
| `highlights`                      | Property highlights such as pools, parking, or nearby attractions |
| `source_url`                      | Listing search URL used for the run                               |
| `search_position`                 | Position in the paginated search                                  |

The dataset also keeps additional non-empty property information when Kiwi Hotels provides it, which helps preserve useful details beyond the main table fields.

### How to use Kiwi Hotels Listing Scraper

1. Open the Actor in Apify Console.
2. Paste a Kiwi Hotels listing search URL into **Hotels search URL**.
3. Optionally enter a location, check-in date, check-out date, and number of guests.
4. Set the maximum results and maximum pages.
5. Run the Actor and open the dataset preview.
6. Export the records as JSON, CSV, Excel, XML, or another supported format.

The URL should be a listing search page, for example:

```text
https://hotels.kiwi.com/Hotel/Search?placeId=24399
```

Search settings already included in the URL are preserved, so a URL copied from Kiwi Hotels can be used directly.

### Input Parameters

| Parameter        | Type    | Required | Default           | Description                                                     |
| ---------------- | ------- | -------- | ----------------- | --------------------------------------------------------------- |
| `url`            | String  | No       | Dubai example URL | Kiwi Hotels listing search URL. This is the recommended input.  |
| `location`       | String  | No       | Dubai             | City, area, or Kiwi place ID used when the URL has no location. |
| `checkIn`        | String  | No       | -                 | Check-in date in `YYYY-MM-DD` format.                           |
| `checkOut`       | String  | No       | -                 | Check-out date in `YYYY-MM-DD` format.                          |
| `guests`         | Integer | No       | `2`               | Number of guests for the search.                                |
| `results_wanted` | Integer | No       | `20`              | Maximum number of unique hotel listings to save.                |
| `max_pages`      | Integer | No       | `10`              | Maximum listing pages to request.                               |

### Usage Examples

#### Search from a Kiwi Hotels URL

Collect listings from the supplied destination search page:

```json
{
    "url": "https://hotels.kiwi.com/Hotel/Search?placeId=24399",
    "results_wanted": 20,
    "max_pages": 2
}
```

#### Search by location and stay details

Use a city name when you do not have a search URL:

```json
{
    "location": "Toronto",
    "checkIn": "2026-11-10",
    "checkOut": "2026-11-12",
    "guests": 2,
    "results_wanted": 50,
    "max_pages": 2
}
```

#### Continue through a larger result set

Increase the result and page limits for market research or comparison work:

```json
{
    "url": "https://hotels.kiwi.com/Hotel/Search?placeId=24399",
    "checkIn": "2026-10-18",
    "checkOut": "2026-10-19",
    "guests": 3,
    "results_wanted": 100,
    "max_pages": 4
}
```

### Sample Output

```json
{
    "hotel_id": "1554098",
    "hotel_name": "The Meydan Hotel Dubai",
    "url": "https://hotels.kiwi.com/Hotel/1554098/en?checkIn=2026-10-18&checkOut=2026-10-19&currency=USD&language=en&rooms=2",
    "location": "The Meydan Hotel, Meydan Racecourse, Nad Al Sheba, P.O. Box 9305, Meydan, Dubai, United Arab Emirates",
    "city": "Dubai",
    "country": "AE",
    "latitude": 25.15787,
    "longitude": 55.3012,
    "description": "Luxurious hotel with outdoor pool, business center, and fine dining, located near Meydan Racecourse in Dubai.",
    "star_rating": 5,
    "review_count": 8645,
    "guest_rating": {
        "cleanliness": 9.5,
        "overall": 9,
        "service": 9.31
    },
    "price_min": 232,
    "price_median": 320,
    "currency": "USD",
    "check_in": "2026-10-18",
    "check_out": "2026-10-19",
    "check_in_time": "15:00",
    "check_out_time": "12:00",
    "imageURIs": [
        "https://img.fih.io/image/raw/regular/provider_partition=eps/soG_2jc4tRTolKv7P94f7gbT4Fcay3gjToMXdzZJjyE=.webp"
    ],
    "highlights": [
        {
            "concise": "Rooftop pool",
            "theme": "wellness"
        }
    ],
    "source_url": "https://hotels.kiwi.com/Hotel/Search?placeId=24399",
    "search_position": 1,
    "source": "hotels.kiwi.com"
}
```

### Tips for best results

- Use a complete listing search URL copied from Kiwi Hotels whenever possible.
- Use a smaller result limit for the first run, then increase it for scheduled collection.
- Set both stay dates when price information for a particular stay is important.
- Check `search_position` when comparing results across runs.
- Review several records because some property fields are only published for certain listings.

### Integrations

- **Apify datasets** - Download JSON, CSV, Excel, XML, and other formats.
- **Google Sheets** - Send hotel listings to spreadsheets for comparison.
- **Webhooks** - Trigger a workflow when a run completes.
- **Make or Zapier** - Connect hotel data to no-code workflows.
- **Apify API** - Retrieve dataset items from your own applications.

### Frequently Asked Questions

#### Can I scrape a single hotel with this Actor?

This Actor is designed for Kiwi Hotels listing searches. Use a search URL or location to collect multiple accommodation listings rather than a single-property detail workflow.

#### Can I use a location without a URL?

Yes. Enter a city or area in `location`. The Actor resolves the location and collects the matching listing results.

#### Can I use my own Kiwi Hotels search settings?

Yes. Paste the full listing search URL. Search settings included in that URL are preserved during collection.

#### How many results can I collect?

Set `results_wanted` to the number of unique listings you need and use `max_pages` as a safety limit for pagination. The Actor stops when either limit is reached or the source has no more results.

#### Can I export the dataset?

Yes. Apify supports JSON, CSV, Excel, XML, and other export formats, and the dataset can also be accessed programmatically.

#### Why are some fields missing?

Kiwi Hotels does not publish every field for every property. Missing values are omitted from that record instead of being written as null values.

#### Is collecting Kiwi Hotels data legal?

You are responsible for complying with Kiwi Hotels terms, applicable laws, privacy requirements, and any restrictions that apply to your intended use of the data.

### Related Actors

No hotel-focused Actor could be verified on the Shahid Irfan public profile during this update. No unrelated Actor is linked here to avoid sending users to an irrelevant workflow.

### Support

For issues, feature requests, or changes in the source data, use the Issues tab on the Actor page and include the input URL and a short description of the result.

### Legal Notice

This Actor is intended for legitimate collection of publicly available hotel listing information. Users are responsible for using the data responsibly and complying with Kiwi Hotels terms, applicable laws, and privacy rules.

# Actor input Schema

## `url` (type: `string`):

A Kiwi Hotels listing search URL, such as https://hotels.kiwi.com/Hotel/Search?placeId=24399. URL search options are preserved.

## `location` (type: `string`):

City, area, or numeric Kiwi place ID. Used when the search URL does not already specify a location.

## `checkIn` (type: `string`):

Optional check-in date in YYYY-MM-DD format. Overrides the URL value when supplied.

## `checkOut` (type: `string`):

Optional check-out date in YYYY-MM-DD format. Overrides the URL value when supplied.

## `guests` (type: `integer`):

Number of guests used for the listing search.

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

Maximum number of unique hotel listings to save.

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

Maximum result pages to request for the listing search.

## Actor input object example

```json
{
  "url": "https://hotels.kiwi.com/Hotel/Search?placeId=24399",
  "location": "Dubai",
  "guests": 2,
  "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 = {
    "url": "https://hotels.kiwi.com/Hotel/Search?placeId=24399",
    "location": "Dubai",
    "guests": 2,
    "results_wanted": 20,
    "max_pages": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/kiwi-hotels-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 = {
    "url": "https://hotels.kiwi.com/Hotel/Search?placeId=24399",
    "location": "Dubai",
    "guests": 2,
    "results_wanted": 20,
    "max_pages": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/kiwi-hotels-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 '{
  "url": "https://hotels.kiwi.com/Hotel/Search?placeId=24399",
  "location": "Dubai",
  "guests": 2,
  "results_wanted": 20,
  "max_pages": 3
}' |
apify call shahidirfan/kiwi-hotels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,shahidirfan/kiwi-hotels-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/KZPTXaDLc651KhbnF/builds/dNxL9K0UeuaZ8JuKJ/openapi.json
