# Hostelworld Reviews Scraper (`knagymate/hostelworld-reviews-scraper`) Actor

Scrape Hostelworld hostel reviews at scale. Extract guest comments, hotelier replies, reviewer country, group type, age range, per-category ratings, review dates, and hostel-level rating summaries. Supports multiple URLs, date cutoff filtering, and review caps. Clean JSON output, AI- and ETL-ready.

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

## Pricing

from $3.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 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

## Hostelworld Reviews Scraper

Scrape structured **Hostelworld hostel reviews and rating data** with an Apify Actor built for travel analytics, hospitality intelligence, and SEO workflows.

This project collects guest review records from Hostelworld hostel pages and returns clean JSON output with:
- review metadata (review date, reviewer profile fields, country, group type, age range)
- guest review comments and hotelier replies
- detailed category ratings per review
- hostel-level aggregated rating summary

---

### Why this scraper

- Built for **Hostelworld review scraping** with stable property ID resolution from hostel URLs.
- Supports multiple hostels in one run via `startUrls`.
- Optional date filtering with `cutoffDate` for incremental scraping.
- Configurable cap using `maxReviewsPerHotel`.
- Can return a `summary` record even when no review passes filters (`alwaysReturnSummary`).
- Output is AI-ready and analytics-friendly for ETL pipelines.

---

### Supported Hostelworld URLs

Use standard Hostelworld hostel detail URLs, for example:

```text
https://www.hostelworld.com/hostels/p/321952/slo-nice/
````

The Actor extracts the property ID and requests review data from Hostelworld's review endpoints.

***

### Input schema

| Field | Type | Required | Default | Description |
|---|---|---:|---:|---|
| `startUrls` | `array` | Yes | - | Hostelworld hostel URLs to process |
| `maxReviewsPerHotel` | `integer` | No | `100` | Maximum number of returned review records per hostel |
| `cutoffDate` | `string` (`YYYY-MM-DD`) | No | - | Keep reviews on/after this date |
| `alwaysReturnSummary` | `boolean` | No | `true` | Push a summary record when no review record is returned |

***

### Example input

```json
{
  "startUrls": [
    { "url": "https://www.hostelworld.com/hostels/p/321952/slo-nice/" }
  ],
  "maxReviewsPerHotel": 100,
  "cutoffDate": "2025-01-01",
  "alwaysReturnSummary": true
}
```

***

### Output format

The Actor stores results in the default Apify dataset.

Output field documentation is provided in the generated output section based on `DATASET_SCHEMA`.

***

### Example output item (`recordType: review`)

```json
{
  "recordType": "review",
  "reviewId": "16488489",
  "reviewDate": "2026-05-14 00:00:00",
  "reviewerName": "a4JUFwkDnj7R36pm",
  "reviewerCountry": "England",
  "reviewerGroupType": "FEMALE",
  "reviewerAgeRange": "25-30",
  "reviewerComment": "Good location, and it was great that every bed had its own plugs, shelf, hooks, etc, but the beds and bathrooms were so separate that it really didn’t create a communal feel and people didn’t even really say hello to each other. In each bathroom there is a QR code to report issues that’ll be ‘fixed in 15 minutes’ - this is a very short time so I don’t expect that, but I reported a cleanliness issue in the morning and it was still the same that evening. Most other things were clean though!",
  "hotelierComment": "Thank you for taking the time to share your feedback with us.\n\nWe’re happy to hear that you appreciated our location and the comfort and practicality of the beds with their individual plugs, shelves, and hooks. We designed these spaces to give guests both comfort and privacy during their stay.\n\nWe also appreciate your honest comments regarding the social atmosphere and the cleanliness issue you reported.",
  "ratings": {
    "overall": 7.7,
    "valueForMoney": 6.0,
    "security": 10.0,
    "location": 10.0,
    "staff": 8.0,
    "atmosphere": 6.0,
    "cleanliness": 6.0,
    "facilities": 8.0
  },
  "hotelSummary": {
    "propertyId": "321952",
    "startUrl": "https://www.hostelworld.com/hostels/p/321952/slo-nice/",
    "numberOfReviews": 341,
    "ratings": {
      "overall": 9.2,
      "valueForMoney": 8.8,
      "security": 9.7,
      "location": 9.4,
      "staff": 9.5,
      "atmosphere": 8.8,
      "cleanliness": 9.3,
      "facilities": 8.8
    }
  }
}
```

***

### How to use on Apify

1. Open the Actor on Apify.
2. Add one or more Hostelworld hostel URLs to `startUrls`.
3. Optionally set `maxReviewsPerHotel` and `cutoffDate`.
4. Run the Actor and export results from the dataset.

***

If this Actor helps your workflow, a rating on Apify is appreciated.

# Actor input Schema

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

Hostel detail page URLs on Hostelworld to scrape reviews from.

## `maxReviewsPerHotel` (type: `integer`):

Maximum number of reviews to scrape per hostel

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

Only keep reviews on or after this date (YYYY-MM-DD). Leave empty to scrape all available reviews.

## `alwaysReturnSummary` (type: `boolean`):

Whether to always return a summary of hostel reviews, even if no reviews were found.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.hostelworld.com/hostels/p/321952/slo-nice/"
    }
  ],
  "maxReviewsPerHotel": 100,
  "cutoffDate": "2025-01-01",
  "alwaysReturnSummary": true
}
```

# 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 = {
    "startUrls": [
        {
            "url": "https://www.hostelworld.com/hostels/p/321952/slo-nice/"
        }
    ],
    "maxReviewsPerHotel": 100,
    "alwaysReturnSummary": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("knagymate/hostelworld-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 = {
    "startUrls": [{ "url": "https://www.hostelworld.com/hostels/p/321952/slo-nice/" }],
    "maxReviewsPerHotel": 100,
    "alwaysReturnSummary": True,
}

# Run the Actor and wait for it to finish
run = client.actor("knagymate/hostelworld-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 '{
  "startUrls": [
    {
      "url": "https://www.hostelworld.com/hostels/p/321952/slo-nice/"
    }
  ],
  "maxReviewsPerHotel": 100,
  "alwaysReturnSummary": true
}' |
apify call knagymate/hostelworld-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Hostelworld Reviews Scraper",
        "description": "Scrape Hostelworld hostel reviews at scale. Extract guest comments, hotelier replies, reviewer country, group type, age range, per-category ratings, review dates, and hostel-level rating summaries. Supports multiple URLs, date cutoff filtering, and review caps. Clean JSON output, AI- and ETL-ready.",
        "version": "0.0",
        "x-build-id": "jlUX6gpPED1Zmu8Ez"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/knagymate~hostelworld-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-knagymate-hostelworld-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/knagymate~hostelworld-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-knagymate-hostelworld-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/knagymate~hostelworld-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-knagymate-hostelworld-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",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Hostel URLs",
                        "type": "array",
                        "description": "Hostel detail page URLs on Hostelworld to scrape reviews from.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxReviewsPerHotel": {
                        "title": "Maximum number of reviews per hostel",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of reviews to scrape per hostel",
                        "default": 100
                    },
                    "cutoffDate": {
                        "title": "Cutoff date",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Only keep reviews on or after this date (YYYY-MM-DD). Leave empty to scrape all available reviews."
                    },
                    "alwaysReturnSummary": {
                        "title": "Always return a summary",
                        "type": "boolean",
                        "description": "Whether to always return a summary of hostel reviews, even if no reviews were found.",
                        "default": true
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
