# Skyscanner Hotels Review Scraper (`shahidirfan/skyscanner-hotels-review-scraper`) Actor

Extract Skyscanner hotel reviews, guest ratings, feedback, scores, and property insights at scale. Collect structured hotel review data for travel research, sentiment analysis, reputation monitoring, market intelligence, and hospitality analytics.

- **URL**: https://apify.com/shahidirfan/skyscanner-hotels-review-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Travel, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### Skyscanner Hotels Review Scraper

Collect public traveller reviews from Skyscanner hotel pages and turn them into a clean, analysis-ready dataset. Add one or more hotel URLs, choose how reviews should be sorted or filtered, and receive structured review records that can be exported as JSON, CSV, Excel, XML, or RSS.

The Actor is designed for hospitality research, reputation monitoring, competitive benchmarking, travel content analysis, and recurring data workflows. Every dataset item represents one unique review. Empty and unavailable fields are omitted, so downstream tools do not need to clean columns filled with null values.

### Features

- **Multiple hotel URLs**: Process one or more public Skyscanner hotel detail pages in a single run.
- **Flexible sorting**: Collect recommended, newest, highest-rated, or lowest-rated reviews first.
- **Traveller rating filters**: Focus on excellent, good, average, or below-average feedback.
- **Guest type filters**: Select reviews from families, couples, solo travellers, business travellers, groups, or other guests.
- **Language and locale controls**: Request translated labels in your preferred locale and narrow results by review language.
- **Provider filtering**: Select reviews supplied by Tripadvisor, Expedia, Hotels.com, or Trip.com.
- **Topic filters**: Find reviews about rooms, service, cleanliness, location, transport, food, WiFi, pools, parking, and other common hotel topics.
- **Photo-only reviews**: Request reviews that include traveller images.
- **Pagination controls**: Set both the desired total number of results and a page limit per hotel.
- **Duplicate-safe output**: Duplicate hotel inputs and repeated review records are automatically removed.
- **Clean datasets**: Null values, empty strings, empty arrays, and empty objects are excluded from saved records.
- **Production controls**: Built-in retries, proxy support, clear run summaries, and safe limits make the Actor suitable for scheduled jobs.

### Use cases

#### Hotel reputation monitoring

Track recent guest feedback for a property and identify changes in ratings, service comments, room quality, cleanliness, or facilities. Schedule the Actor to build regular snapshots for an internal dashboard.

#### Competitive benchmarking

Collect comparable review datasets for competing hotels in the same market. Compare review volume, ratings, guest segments, providers, and recurring topics without manually copying reviews from individual pages.

#### Guest sentiment research

Export review text for sentiment analysis, topic classification, summarization, or qualitative research. Filters can isolate a specific traveller segment or subject before the data enters your analysis pipeline.

#### Travel content and market intelligence

Research what guests value in a destination, hotel category, or property type. Review text can support editorial planning, destination guides, service audits, and market reports.

#### Operations and service improvement

Focus on low-rated feedback or a subject such as rooms, bathrooms, meals, or transport. Teams can use this narrower dataset to prioritize recurring operational issues.

### Input

Open the Actor input form, add at least one Skyscanner hotel URL, and adjust only the controls you need.

| Field                | Type    | Required | Default             | Description                                                                                                                 |
| -------------------- | ------- | -------- | ------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | Array   | Yes      | Sample hotel URL    | One or more public Skyscanner hotel detail URLs. Tracking parameters are accepted and removed from the saved canonical URL. |
| `sortBy`             | String  | No       | `recommended`       | Review order: `recommended`, `rating_high_to_low`, `rating_low_to_high`, or `most_recent`.                                  |
| `locale`             | String  | No       | `en-GB`             | Locale for translated review content and labels, such as `en-GB`, `en-US`, `es-ES`, or `de-DE`.                             |
| `travellerRating`    | String  | No       | `all`               | Rating group: `all`, `rating_excellent`, `rating_good`, `rating_average`, or `rating_below_average`.                        |
| `reviewLanguage`     | String  | No       | `all`               | Keep all review languages or enter a locale such as `en-GB`.                                                                |
| `guestType`          | String  | No       | `all`               | Traveller group: `all`, `family`, `business`, `solo`, `group`, `couple`, or `other`.                                        |
| `provider`           | String  | No       | `all`               | Review provider: `all`, `e_ct` for Trip.com, `h_h1` for Hotels.com, `h_xp` for Expedia, or `h_vs` for Tripadvisor.          |
| `tags`               | Array   | No       | `[]`                | Optional topics such as `with_images`, `location`, `room`, `service`, `clean`, `meal`, `wifi`, or `pool`.                   |
| `results_wanted`     | Integer | No       | `20`                | Maximum number of unique reviews saved across all hotel URLs.                                                               |
| `max_pages`          | Integer | No       | `5`                 | Maximum review pages processed per hotel. Each page contains up to 10 reviews.                                              |
| `proxyConfiguration` | Object  | No       | Apify Proxy enabled | Apify Proxy or custom proxy configuration for reliable production runs.                                                     |

#### Basic run

Collect up to 20 recommended reviews from one hotel:

```json
{
    "startUrls": [
        {
            "url": "https://www.skyscanner.com/hotels/united-states/new-york-hotels/doubletree-by-hilton-new-york-downtown/ht-204222293"
        }
    ],
    "results_wanted": 20,
    "max_pages": 5
}
```

#### Recent English reviews

Collect the newest English reviews, with an explicit locale for labels and translated content:

```json
{
    "startUrls": [
        {
            "url": "https://www.skyscanner.com/hotels/united-states/new-york-hotels/doubletree-by-hilton-new-york-downtown/ht-204222293?adults=2&rooms=1"
        }
    ],
    "sortBy": "most_recent",
    "locale": "en-GB",
    "reviewLanguage": "en-GB",
    "results_wanted": 50,
    "max_pages": 8
}
```

#### Family reviews with photos

Collect family traveller reviews that include images, with the highest ratings first:

```json
{
    "startUrls": [
        {
            "url": "https://www.skyscanner.com/hotels/united-states/new-york-hotels/doubletree-by-hilton-new-york-downtown/ht-204222293"
        }
    ],
    "sortBy": "rating_high_to_low",
    "reviewLanguage": "en-GB",
    "guestType": "family",
    "tags": ["with_images"],
    "results_wanted": 30,
    "max_pages": 5
}
```

### Output

Results are stored in the run's default dataset. Each item contains the hotel context, review content, rating, traveller information, source provider, and collection timestamp. A field is included only when the source publishes a meaningful value.

| Field                  | Type    | Description                                                      |
| ---------------------- | ------- | ---------------------------------------------------------------- |
| `hotelId`              | String  | Skyscanner hotel identifier extracted from the input URL.        |
| `hotelUrl`             | String  | Canonical public hotel URL without tracking parameters.          |
| `totalReviewCount`     | Integer | Total review count published for the hotel.                      |
| `availableReviewCount` | Integer | Number of reviews available after filters are applied.           |
| `reviewDetailLink`     | String  | Provider review details URL when available.                      |
| `partnerReviewId`      | String  | Unique review identifier supplied by the review provider.        |
| `title`                | String  | Review headline when published.                                  |
| `review`               | String  | Full review text.                                                |
| `rating`               | Number  | Traveller rating on a five-point scale.                          |
| `locale`               | String  | Review locale.                                                   |
| `guestType`            | String  | Traveller group associated with the review.                      |
| `country`              | String  | Reviewer country when published.                                 |
| `checkinDate`          | String  | Stay or check-in date when published.                            |
| `reviewDate`           | String  | Review publication date label.                                   |
| `translationType`      | String  | Indicates whether the content is source text or translated.      |
| `translated`           | Boolean | Whether translated content is available.                         |
| `provider`             | Object  | Review provider identifier, name, and available branding fields. |
| `logo`                 | String  | Rating or provider logo URL when available.                      |
| `images`               | Array   | Traveller review images when available.                          |
| `replies`              | Array   | Hotel or provider replies when available.                        |
| `scrapedAt`            | String  | ISO timestamp recording when the item was collected.             |

#### Sample dataset item

```json
{
    "hotelId": "204222293",
    "hotelUrl": "https://www.skyscanner.com/hotels/united-states/new-york-hotels/doubletree-by-hilton-new-york-downtown/ht-204222293",
    "totalReviewCount": 1516,
    "availableReviewCount": 1516,
    "partnerReviewId": "1072172077",
    "title": "Would Definitely Return",
    "review": "Had a most enjoyable stay with my teenage daughter. Lovely room, comfortable beds, and good subway links close by.",
    "rating": 5,
    "locale": "en-GB",
    "guestType": "Family traveller",
    "reviewDate": "Comment: 8 Aug 2026",
    "translationType": "TRANSLATION_TYPE_SOURCE",
    "translated": true,
    "provider": {
        "id": "h_vs",
        "name": "Tripadvisor"
    },
    "scrapedAt": "2026-08-20T07:15:17.658Z"
}
```

### Tips for reliable results

- Start with 20 results and the default filters to confirm that the hotel URL is correct.
- Increase `results_wanted` and `max_pages` together. A five-page cap can return at most about 50 reviews per hotel before filters and deduplication.
- If filters produce fewer results than requested, the hotel may have only a small number of matching reviews.
- Use `most_recent` for monitoring workflows and rating sorting for positive or negative feedback analysis.
- Keep Apify Proxy enabled for scheduled and higher-volume production runs.
- When processing multiple hotels, `results_wanted` is the overall dataset limit, while `max_pages` applies separately to each hotel.
- The same hotel supplied through multiple URL variants is processed once.

### Integrations and automation

Connect the resulting dataset to Google Sheets, Make, Zapier, Slack, webhooks, cloud storage, or your own application. You can run the Actor from Apify Console, on a schedule, through the Apify API, with the official JavaScript or Python client, or from the command line.

Common workflows include daily review monitoring, weekly competitor reports, sentiment dashboards, alerting on low-rated feedback, and sending new review records into a warehouse or CRM.

### Frequently asked questions

#### Which URLs are supported?

Use public HTTPS Skyscanner hotel detail URLs containing an `ht-` hotel identifier. Full booking URLs with dates, rooms, traveller counts, and tracking parameters are supported. Localized Skyscanner domains are also accepted when the URL contains a valid hotel identifier.

#### Why did the run return fewer reviews than requested?

The selected hotel may have fewer matching reviews, filters may narrow the available set, the page cap may be reached, or the source may not return every review for the chosen locale and provider combination.

#### Are null values included?

No. Nulls and other empty values are removed recursively before a record is saved. Fields such as images, replies, country, title, or check-in date are omitted when unavailable.

#### Can I scrape more than one hotel?

Yes. Add multiple entries to `startUrls`. Duplicate hotel IDs are automatically consolidated. Remember that `results_wanted` limits the total output across the entire run.

#### Can I schedule recurring runs?

Yes. Use Apify schedules and optionally connect a webhook or integration to process the dataset after each successful run.

#### Does a review always contain a title, images, or a reply?

No. Providers publish different metadata. The Actor keeps all meaningful data that is available and omits unavailable fields.

### Related Actors

- [Tiket Hotel Reviews Scraper](https://apify.com/shahidirfan/tiket-hotel-reviews-scraper) for structured guest feedback from Tiket hotel pages.
- [Tripadvisor Reviews Scraper](https://apify.com/shahidirfan/tripadvisor-reviews-scraper) for Tripadvisor hotel review collection.
- [Expedia Reviews Scraper](https://apify.com/shahidirfan/expedia-reviews-scraper) for Expedia guest reviews and ratings.
- [Agoda Hotels Scraper](https://apify.com/shahidirfan/agoda-hotels-scraper) for Agoda property, pricing, availability, and review data.

### Legal and responsible use

This Actor collects publicly accessible information. You are responsible for using it in accordance with applicable laws, privacy requirements, contractual obligations, and the target website's terms. Avoid collecting personal data that you do not need, use reasonable run limits, and apply appropriate retention and security controls to exported datasets.

### Support

If a valid hotel URL stops returning expected results, open an issue on the Actor page. Include the input URL, a run ID, the filters used, and a short description of the expected outcome. Do not include passwords, tokens, proxy credentials, or other secrets.

# Actor input Schema

## `startUrls` (type: `array`):

One or more public Skyscanner hotel detail URLs containing an ht- hotel ID.

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

Choose the order in which reviews are collected.

## `locale` (type: `string`):

Locale used for translated review content and labels, for example en-GB or en-US.

## `travellerRating` (type: `string`):

Only collect reviews in the selected rating group.

## `reviewLanguage` (type: `string`):

Use all for every language, or enter a locale such as en-GB, es-ES, or de-DE.

## `guestType` (type: `string`):

Only collect reviews from the selected traveller group.

## `provider` (type: `string`):

Only collect reviews supplied by a selected provider.

## `tags` (type: `array`):

Optionally require reviews with photos or matching selected topics.

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

Maximum total number of unique reviews saved across all input URLs.

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

Safety cap for review pages requested from each hotel. Each page contains up to 10 reviews.

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

Use Apify Proxy or your own proxy URLs for reliable production runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.skyscanner.com/hotels/united-states/new-york-hotels/doubletree-by-hilton-new-york-downtown/ht-204222293"
    }
  ],
  "sortBy": "recommended",
  "locale": "en-GB",
  "travellerRating": "all",
  "reviewLanguage": "all",
  "guestType": "all",
  "provider": "all",
  "tags": [],
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.skyscanner.com/hotels/united-states/new-york-hotels/doubletree-by-hilton-new-york-downtown/ht-204222293"
        }
    ],
    "results_wanted": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/skyscanner-hotels-review-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 = {
    "startUrls": [{ "url": "https://www.skyscanner.com/hotels/united-states/new-york-hotels/doubletree-by-hilton-new-york-downtown/ht-204222293" }],
    "results_wanted": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/skyscanner-hotels-review-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 '{
  "startUrls": [
    {
      "url": "https://www.skyscanner.com/hotels/united-states/new-york-hotels/doubletree-by-hilton-new-york-downtown/ht-204222293"
    }
  ],
  "results_wanted": 20
}' |
apify call shahidirfan/skyscanner-hotels-review-scraper --silent --output-dataset

```

## MCP server setup

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