# Hostelworld Property Ratings & Price Finder (`xyrelith-data/hostelworld-property-ratings-and-price-finder`) Actor

Search Hostelworld hostels by city and dates, fetch specific property pages, or list top hostel cities, with ratings breakdown, prices, amenities, and location.

- **URL**: https://apify.com/xyrelith-data/hostelworld-property-ratings-and-price-finder.md
- **Developed by:** [Xyrelith Data](https://apify.com/xyrelith-data) (community)
- **Categories:** Travel, Automation, Developer tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Hostelworld Hostels, Rooms & Reviews Finder

Scrape **Hostelworld** city inventories, full property profiles, dated dorm and private prices, room rate plans and reviews in every language. Six modes cover destination search, pasted URLs or IDs, country city indexes, availability summaries, room-level rate rows and review exports. No login, cookies, API key or proxy configuration is required.

### What this actor does

- **Six modes:** `search`, `byUrl`, `topCities`, `availability`, `rooms` and `reviews`
- **Complete city inventories** with full pagination, so a 300-property city is no longer cut off at 30 rows
- **Dated pricing** for dorms and private rooms, including beds available and per-room rate plans
- **All-language reviews** with sort, date cutoff, score band, owner replies and reviewer metadata
- **Filters and sorting** by property type, rating, price, distance, free cancellation, price/rating/review count/distance order
- **Currency and language selection** across 80+ currencies and 19 Hostelworld locales
- **Empty fields are omitted** at every depth, so records never carry `null`, `""`, `[]` or `{}`

### Output per hostel (`recordType: "hostel"`)

Identity and location:

- `propertyId`, `slug`, `name`, `type`, `hostelworldUrl`
- `address`, `address1`, `address2`, `city`, `country`, `continent`, `district`, `districts[]`, `region`, `postalCode`
- `latitude`, `longitude`, `distanceToCenter` (km)

Ratings:

- `rating` — overall score on Hostelworld's 0–10 scale
- `ratingBreakdown` — atmosphere, cleanliness, facilities, location, security, staff and value for money, 0–10
- `ratingPercent`, `ratingBreakdownPercent` — the same scores on the raw 0–100 scale
- `ratingLabel`, `reviewCount`, `starRating`, `bestFor[]`

Prices:

- `pricePerNight`, `currencyCode`
- `lowestDormPricePerNight`, `lowestPrivatePricePerNight`, `averagePricePerNight`, `originalPricePerNight`, `discountPercent`
- `promotions[]`, `propertyPrices` — native-currency shared/private min, max and average
- `freeCancellation`, `freeCancellationUntil`, `depositPercentage`

Profile and policy:

- `description`, `hostelworldSays`, `directions`
- `amenities[]`, `facilitiesByCategory[]`, `policies[]`, `thingsToNote[]`, `paymentMethods[]`
- `checkinTime`, `checkoutTime`, `maxGuestsPerBooking`, `timesBookedToday`, `taxesIncluded`, `feesIncluded`

Media and availability:

- `imageUrl`, `imageUrls[]`, `imageCount`
- `dormAvailable`, `privateRoomAvailable`
- With dates: `checkInDate`, `nights`, `guests`, `bedsAvailable`, `dormTypesAvailable`, `privateTypesAvailable`, `cancellationOptions[]`, `vat`
- `scrapedAt`

### Output per room (`recordType: "room"`)

- `propertyId`, `name`, `hostelworldUrl`, `city`, `country`
- `checkInDate`, `nights`, `guests`
- `roomId`, `roomName`, `roomDescription`, `roomCategory` (`dorm` or `private`), `roomType`, `roomGrade`
- `capacity`, `ensuite`, `bedsAvailable`, `roomsAvailable`
- `ratePlanId`, `ratePlanType`, `ratePlanCount`, `paymentOption`, `paymentOptionId`, `isDefaultRatePlan`, `paymentOptions[]`, `cheapestPaymentOption`
- `pricePerNight`, `lowestPricePerNight`, `averagePricePerNight`, `originalPricePerNight`, `discountPercent`, `totalPrice`, `originalTotalPrice`, `currencyCode`
- `roomImages[]`, `scrapedAt`

Private-room prices are for the whole room; dorm prices are per bed. `pricePerNight` is the selected rate-plan price, while `lowestPricePerNight` is the room's advertised minimum and can be lower than every listed rate plan. The hostel row reports the city-wide lowest dorm bed price as `lowestDormPricePerNight`.

### Output per review (`recordType: "review"`)

- `propertyId`, `name`, `hostelworldUrl`, `city`, `country`
- `reviewId`, `reviewDate`, `reviewText`, `reviewLanguage`, `isMachineTranslated`, `ownerComment`
- `groupType`, `ageGroup`, `tripTypes[]`
- `ratingOverall`, `ratingValueForMoney`, `ratingSafety`, `ratingLocation`, `ratingStaff`, `ratingAtmosphere`, `ratingCleanliness`, `ratingFacilities` — review scores on a 0–100 scale
- `reviewerNickname`, `reviewerCountry`, `reviewerCountryCode`, `reviewerGender`, `reviewerNumberOfReviews`
- `scrapedAt`

### Output per city (`recordType: "city"`, mode `topCities`)

- `cityId`, `cityName`, `country`, `continent`
- `hostelworldUrl`, `imageUrl`
- `numberOfProperties`, `numberOfReviews`, `avgRating`
- `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `byUrl` / `topCities` / `availability` / `rooms` / `reviews` |
| `searchQueries` | array | – | City or destination names (search, availability, rooms, reviews) |
| `countries` | array | – | Country names for `topCities`, or to expand a search when no city is set |
| `propertyUrls` | array | – | Hostelworld property, city or search URLs |
| `propertyIds` | array | – | Numeric Hostelworld property IDs |
| `dateFrom` | string | – | Check-in date, `YYYY-MM-DD` |
| `dateTo` | string | – | Check-out date, `YYYY-MM-DD`; maximum 30 nights |
| `daysAhead` | integer | – | Check in this many days from today (alternative to `dateFrom`) |
| `numNights` | integer | `2` | Stay length when only `dateFrom` or `daysAhead` is set |
| `guests` | integer | `2` | Party size for availability and room prices |
| `currency` | string | `EUR` | Price currency (80+ ISO codes) |
| `language` | string | `en` | Hostelworld locale (19 options) |
| `propertyType` | string | `all` | `all` / `hostel` / `hotel` / `guesthouse` / `apartment` / `campsite` |
| `minRating` | number | – | Minimum overall rating on the 0–10 scale |
| `minPrice` | number | – | Minimum nightly price in the selected currency |
| `maxPrice` | number | – | Maximum nightly price in the selected currency |
| `maxDistanceKm` | number | – | Maximum distance from the city centre |
| `freeCancellationOnly` | boolean | `false` | Keep only properties with free-cancellation rates |
| `sortBy` | string | `relevance` | `relevance` / `priceLow` / `priceHigh` / `ratingHigh` / `reviewCount` / `distance` |
| `includeDetails` | boolean | `true` | Fetch full profiles (facilities, policies, images, directions) |
| `includeReviews` | boolean | `false` | Add review rows in search and byUrl modes |
| `reviewsPerProperty` | integer | `10` | Review cap per property |
| `reviewsSort` | string | `-date` | `-date` / `date` / `rating` / `-rating` |
| `allLanguages` | boolean | `true` | Include reviews in every language |
| `sinceDate` | string | – | Only reviews on or after this date, `YYYY-MM-DD` |
| `reviewRatingMin` | integer | – | Minimum review score on the 0–100 scale |
| `reviewRatingMax` | integer | – | Maximum review score on the 0–100 scale |
| `requireReviewText` | boolean | `false` | Drop score-only reviews |
| `roomCategory` | string | `all` | `all` / `dorm` / `private` |
| `maxItems` | integer | `50` | Hard cap on hostel rows (1–5000) |

### Examples

#### Example: search a city with dated prices

```json
{
  "mode": "search",
  "searchQueries": ["London"],
  "dateFrom": "2026-12-20",
  "dateTo": "2026-12-22",
  "guests": 2,
  "currency": "EUR",
  "minRating": 8,
  "sortBy": "priceLow",
  "maxItems": 20
}
```

#### Example: full profiles for pasted properties

```json
{
  "mode": "byUrl",
  "propertyUrls": [
    "https://www.hostelworld.com/hostels/p/88047/wombat-s-city-hostel-london/",
    "https://www.hostelworld.com/hostels/p/14348/palmers-lodge-swiss-cottage/"
  ],
  "includeDetails": true
}
```

#### Example: dated room and rate-plan rows

```json
{
  "mode": "rooms",
  "propertyIds": ["88047", "14348"],
  "dateFrom": "2027-02-10",
  "numNights": 2,
  "guests": 2,
  "currency": "GBP",
  "roomCategory": "private"
}
```

#### Example: all-language reviews since a date

```json
{
  "mode": "reviews",
  "searchQueries": ["Bangkok"],
  "reviewsPerProperty": 100,
  "reviewsSort": "-date",
  "allLanguages": true,
  "sinceDate": "2026-01-01",
  "requireReviewText": true,
  "maxItems": 5
}
```

#### Example: country city index

```json
{
  "mode": "topCities",
  "countries": ["Portugal"],
  "maxItems": 20
}
```

### Use cases

- **Hostel price comparison** — pull dated dorm and private prices for the same city and stay
- **Travel content and directories** — build city inventories with facilities, policies, images and geo data
- **Review analytics** — export multilingual review text with ratings, trip type, age group and country
- **Revenue and rate research** — compare room-level rate plans, discounts and cancellation terms
- **Market mapping** — measure hostel supply, ratings and review volume across countries and cities
- **App and dashboard feeds** — join flat hostel, room, review and city rows on `propertyId`

### FAQ

**Do I need a Hostelworld account, cookie or API key?**
No. The actor reads public Hostelworld data and works without any account, cookie, token or proxy setup.

**Why did my old `searchQuery` input keep working after the schema changed?**
Saved tasks that still send `searchQuery` are mapped to the first city in `searchQueries`, so old inputs continue to run.

**How many hostels can one city return?**
The full city inventory is fetched, not just the first page. `maxItems` is the only cap, up to 5,000 hostel rows.

**Why are there two rating scales?**
The legacy `rating` and `ratingBreakdown` fields stay on Hostelworld's 0–10 scale. `ratingPercent` and `ratingBreakdownPercent` expose the raw 0–100 values. Review scores are reported on 0–100.

**Do dates change the prices?**
Yes. With `dateFrom` and `dateTo` (or `daysAhead`), hostel rows carry that stay's lowest dorm and private prices, beds available and cancellation options. Without dates, listing prices are returned and availability fields are omitted.

**How do room rows differ from hostel rows?**
Hostel rows give one summary per property. Room rows give one row per room and rate plan, with capacity, ensuite flag, beds, room images, payment option and per-night plus total prices. Dorm prices are per bed; private-room prices are for the whole room. `lowestPricePerNight` shows the room's advertised minimum when a cheaper unlisted rate exists.

**Can I get reviews in languages other than English?**
Yes. `allLanguages` is on by default. Use `reviewsSort`, `sinceDate`, `reviewRatingMin`, `reviewRatingMax` and `requireReviewText` to narrow the export.

**Why is a field missing on some records?**
Hostelworld does not publish every field for every property. Missing values are omitted rather than filled with placeholders, so check for the field's presence.

**What happens when a property has no availability for my dates?**
The property is skipped in `rooms` mode. In other modes it is returned with its profile and sold-out availability flags, but without a dated price, and the run status explains the shortfall.

**Is this affiliated with Hostelworld?**
No. This is an independent third-party actor and is not operated by or affiliated with Hostelworld.

# Actor input Schema

## `mode` (type: `string`):

What to collect: city search, pasted URLs/IDs, a country city index, dated availability, room rate plans, or reviews.

## `searchQueries` (type: `array`):

City or destination names for search, availability, rooms and reviews. Example: London, Paris, Bangkok.

## `countries` (type: `array`):

Country names for topCities, or to expand a search when no city is given. Example: England, Thailand, Portugal.

## `propertyUrls` (type: `array`):

Hostelworld property, city or search URLs. Property URLs and IDs take priority over city queries in availability, rooms and reviews.

## `propertyIds` (type: `array`):

Numeric Hostelworld property IDs, for example 88047.

## `dateFrom` (type: `string`):

Check-in date in YYYY-MM-DD format. Required for room rows; optional for dated prices elsewhere.

## `dateTo` (type: `string`):

Check-out date in YYYY-MM-DD format. Nights are derived; maximum stay is 30 nights.

## `daysAhead` (type: `integer`):

Alternative to dateFrom for schedules: check in this many days from today.

## `numNights` (type: `integer`):

Stay length when only dateFrom or daysAhead is set.

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

Party size used for availability and room prices.

## `currency` (type: `string`):

Currency for every price field. Property-native price ranges are also returned in propertyPrices.

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

Language requested from Hostelworld for descriptions and labels.

## `propertyType` (type: `string`):

Keep only one accommodation type.

## `minRating` (type: `number`):

Only properties rated at or above this value on the 0-10 scale.

## `minPrice` (type: `number`):

Only properties at or above this nightly price in the selected currency.

## `maxPrice` (type: `number`):

Only properties at or below this nightly price in the selected currency.

## `maxDistanceKm` (type: `number`):

Only properties within this many kilometres of the city centre.

## `freeCancellationOnly` (type: `boolean`):

Keep only properties offering a free-cancellation rate.

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

Order of hostel rows. Ties are broken by property ID.

## `includeDetails` (type: `boolean`):

Fetch the full profile for every hostel: facilities, policies, images, directions and payment methods. Turn off for the cheapest city listing.

## `includeReviews` (type: `boolean`):

Also emit review rows for hostels found in search or byUrl.

## `reviewsPerProperty` (type: `integer`):

Maximum review rows per property for reviews mode or inline reviews.

## `reviewsSort` (type: `string`):

Hostelworld review sort order.

## `allLanguages` (type: `boolean`):

Include reviews in every language instead of English only.

## `sinceDate` (type: `string`):

Only reviews on or after this date (YYYY-MM-DD). Newest-first searches stop early.

## `reviewRatingMin` (type: `integer`):

Only reviews at or above this score on the 0-100 scale.

## `reviewRatingMax` (type: `integer`):

Only reviews at or below this score on the 0-100 scale.

## `requireReviewText` (type: `boolean`):

Drop score-only reviews without written text.

## `roomCategory` (type: `string`):

Filter room rows to dorms or private rooms.

## `maxItems` (type: `integer`):

Hard cap on hostel rows. Rooms and reviews use their own per-property caps.

## Actor input object example

```json
{
  "mode": "search",
  "searchQueries": [
    "London"
  ],
  "countries": [],
  "propertyUrls": [],
  "propertyIds": [],
  "numNights": 2,
  "guests": 2,
  "currency": "EUR",
  "language": "en",
  "propertyType": "all",
  "freeCancellationOnly": false,
  "sortBy": "relevance",
  "includeDetails": false,
  "includeReviews": false,
  "reviewsPerProperty": 10,
  "reviewsSort": "-date",
  "allLanguages": true,
  "requireReviewText": false,
  "roomCategory": "all",
  "maxItems": 3
}
```

# Actor output Schema

## `records` (type: `string`):

Dataset of hostel, room, review and city rows; use recordType to tell them apart.

# 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 = {
    "mode": "search",
    "searchQueries": [
        "London"
    ],
    "countries": [],
    "propertyUrls": [],
    "propertyIds": [],
    "numNights": 2,
    "guests": 2,
    "currency": "EUR",
    "language": "en",
    "propertyType": "all",
    "freeCancellationOnly": false,
    "sortBy": "relevance",
    "includeDetails": false,
    "includeReviews": false,
    "reviewsPerProperty": 10,
    "reviewsSort": "-date",
    "allLanguages": true,
    "requireReviewText": false,
    "roomCategory": "all",
    "maxItems": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("xyrelith-data/hostelworld-property-ratings-and-price-finder").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 = {
    "mode": "search",
    "searchQueries": ["London"],
    "countries": [],
    "propertyUrls": [],
    "propertyIds": [],
    "numNights": 2,
    "guests": 2,
    "currency": "EUR",
    "language": "en",
    "propertyType": "all",
    "freeCancellationOnly": False,
    "sortBy": "relevance",
    "includeDetails": False,
    "includeReviews": False,
    "reviewsPerProperty": 10,
    "reviewsSort": "-date",
    "allLanguages": True,
    "requireReviewText": False,
    "roomCategory": "all",
    "maxItems": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("xyrelith-data/hostelworld-property-ratings-and-price-finder").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 '{
  "mode": "search",
  "searchQueries": [
    "London"
  ],
  "countries": [],
  "propertyUrls": [],
  "propertyIds": [],
  "numNights": 2,
  "guests": 2,
  "currency": "EUR",
  "language": "en",
  "propertyType": "all",
  "freeCancellationOnly": false,
  "sortBy": "relevance",
  "includeDetails": false,
  "includeReviews": false,
  "reviewsPerProperty": 10,
  "reviewsSort": "-date",
  "allLanguages": true,
  "requireReviewText": false,
  "roomCategory": "all",
  "maxItems": 3
}' |
apify call xyrelith-data/hostelworld-property-ratings-and-price-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,xyrelith-data/hostelworld-property-ratings-and-price-finder"
        }
    }
}
```

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/Wc7czDKdh285Jqwnv/builds/n1EEZzCPiKhxMKNPf/openapi.json
