# Hostelworld Reviews Scraper — Hostel Guest Reviews (`kestrel/hostelworld-reviews-scraper`) Actor

Every Hostelworld review of any hostel: the 0-100 overall score with its seven sub-ratings, the guest's text, the owner's reply, group type, age band, trip type and nationality. Give Hostelworld URLs or property ids. No key, no browser, no login — Hostelworld's own public JSON API. Pay per review.

- **URL**: https://apify.com/kestrel/hostelworld-reviews-scraper.md
- **Developed by:** [Tedj MEABIOU](https://apify.com/kestrel) (community)
- **Categories:** Travel, AI, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 review rows

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/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 Reviews Scraper — Hostel Guest Reviews

This **hostelworld reviews scraper** turns any hostel on Hostelworld into structured **hostel guest reviews**: the 0-100 overall score with its seven sub-ratings, the guest's own words, the hostel's public reply, who was travelling and where they came from. Point it at Hostelworld URLs or property ids and it returns every review the site lists, newest first — **hostel reviews** as rows you can filter, chart and diff, not a page you have to read. Because it reads Hostelworld's own public JSON API there is no browser, no login and no key, so **budget travel reviews** arrive at a few hundred rows a second and **review monitoring** on a daily schedule costs cents.

Last verified working: 2026-08-29.

### What does the Hostelworld reviews scraper do?

It reads one endpoint that Hostelworld's own property pages call, walks its pagination for you and flattens each record into a row:

- The **0-100 score** every Hostelworld guest gives, plus the seven sub-scores behind it — value, safety, location, staff, atmosphere, cleanliness, facilities — and the same overall score converted to the 0-5 star scale everyone else uses.
- The review **text**, its language and whether Hostelworld machine-translated it.
- The **owner reply**, when the hostel answered.
- **Who was travelling**: solo male or female, couple, all-female group, all-male group, mixed group; the age band (18-24, 25-30, 31-40, 41+); and the trip type (a gap year, a weekend away, a round-the-world trip, a college break, a regular vacation).
- The reviewer's nickname, nationality and how many reviews they have written.
- A free per-hostel context row: name, type, city, country, coordinates, aggregate **hostel ratings**, facilities, and the share of reviewers who came solo, as a couple or in a group.

Every filter runs before billing, so a run that keeps only the complaints pays only for the complaints.

### Hostelworld reviews by URL or property id

Two ways in, and neither costs a lookup request:

- **`startUrls`** — any Hostelworld property page. The modern form is `https://www.hostelworld.com/hostels/p/15529/home-lisbon-hostel/`; the older `https://www.hostelworld.com/pwa/hosteldetails.php/Home-Lisbon-Hostel/Lisbon/15529` works too. Every URL form Hostelworld serves carries the numeric id, so the actor never has to load a page to find it. A Hostelworld URL that somehow has no id is read once for the id its page carries.
- **`propertyIds`** — the bare number, e.g. `15529`. This is what an earlier run's `property_id` column gives you, so a saved list of hostels re-runs with no resolution at all.

A URL, its older URL form and its bare id are recognised as the same hostel: one of them is scraped and the rest come back as free `duplicate` status rows.

### Hostelworld negative reviews without paying for the happy ones

Hostels live and die on a handful of recurring complaints — the 4 a.m. door, the shower queue, the locker that will not close. Set `reviewsSort` to *Lowest rated first* and `maxRating` to 70 and the worst reviews arrive on page one and nothing else is charged. `minRating` is the other end of the same 0-100 scale if you want to study what a hostel is loved for. Both filters run in the actor before the charge, so **hostelworld negative reviews** cost exactly what they weigh.

### Hostel review data for operators, OTAs and analysts

- **Hostel operators**: read the reviews your competitors get, by sub-score. `sub_ratings` tells you whether you are losing on cleanliness or on atmosphere, which are very different fixes.
- **Hostel reputation management**: watch the last 30 days across a portfolio with `sinceDate: "30 days"` and alert on anything under 70.
- **OTAs and metasearch**: `hostel review data` for supply pages, with a rating you can normalise (`rating_5`) against Booking's 1-10 or TripAdvisor's 1-5.
- **Researchers and analysts**: **backpacker reviews** carry a group type, an age band and a nationality, which almost no other review source publishes. That is a demand-side dataset, not just sentiment.
- **AI teams**: a clean, dated, per-property corpus for **hostel sentiment analysis** and RAG over **hostel guest feedback**.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `startUrls` | array | `[]` | Hostelworld property URLs. Any form; the id is read from the URL. |
| `propertyIds` | array | `[]` | Hostelworld's numeric property ids, e.g. `15529`. |
| `maxReviewsPerProperty` | integer | `100` | `0` = every review the hostel has. `N` = the first `N` in the chosen order. The main cost control. |
| `reviewsSort` | string | `-date` | `-date` newest first, `date` oldest first, `rating` lowest rated first, `-rating` highest rated first. |
| `minRating` | integer | `0` | Keep only reviews scoring at or above this on the 0-100 scale. `0` = no floor. |
| `maxRating` | integer | `0` | Keep only reviews scoring at or below it. `0` = no ceiling. `70` is a complaints feed. |
| `requireText` | boolean | `false` | Drop score-only reviews before billing. |
| `groupTypes` | array | `[]` | Keep only `MALE`, `FEMALE`, `COUPLE`, `ALLFEMALEGROUP`, `ALLMALEGROUP`, `MIXEDGROUP` or `FAMILY`. Friendly spellings (`solo_female`, `mixed_group`) work. |
| `sinceDate` | string | `""` | `YYYY-MM-DD` or relative (`30 days`, `2 weeks`, `6 months`). |
| `includePropertyRow` | boolean | `true` | Emit the free per-hostel context row. |
| `sessions` | integer | `2` | Parallel proxy sessions (egress IPs). |
| `perIp` | number | `1` | Requests per second per session. |
| `proxyConfiguration` | object | Apify datacenter | Datacenter proxy is enough; residential works and costs more. |

#### Example: a daily complaints feed for one hostel

```json
{
  "propertyIds": ["15529"],
  "reviewsSort": "rating",
  "maxRating": 70,
  "requireText": true,
  "sinceDate": "30 days",
  "maxReviewsPerProperty": 0,
  "includePropertyRow": true,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

Lowest-rated first, nothing above 70 charged, nothing older than a month kept. On a quiet month this bills a handful of rows.

#### Example: the full corpus of a competitor set

```json
{
  "startUrls": [
    "https://www.hostelworld.com/hostels/p/15529/home-lisbon-hostel/",
    "https://www.hostelworld.com/pwa/hosteldetails.php/Yes-Lisbon-Hostel/Lisbon/45010"
  ],
  "maxReviewsPerProperty": 0,
  "reviewsSort": "-date",
  "includePropertyRow": true,
  "sessions": 4,
  "perIp": 1
}
```

Every review both hostels have, newest first, plus a free context row each.

#### Example: what solo female travellers say

```json
{
  "propertyIds": ["15529", "12000"],
  "groupTypes": ["solo_female"],
  "maxReviewsPerProperty": 500,
  "minRating": 0,
  "maxRating": 0,
  "requireText": true,
  "sinceDate": "12 months"
}
```

`groupTypes` is applied in the actor — Hostelworld's API has no server-side filter for it — so the pages are still read and the rows you did not want are simply never charged.

### Output

Three row types share one dataset, told apart by `type`, with dataset views for each.

#### Review rows (`type: "review"`, charged)

| Field | Meaning |
|---|---|
| `review_id` | Hostelworld's numeric review id |
| `property_id`, `property_name`, `property_url` | Which hostel the review is about |
| `review_date` | Publication date, `YYYY-MM-DD` |
| `text` | The review itself (Hostelworld's `notes`); `null` when the guest scored without writing |
| `language`, `machine_translated` | The language served and whether it was machine-translated |
| `rating` | Overall score, 0-100 |
| `rating_5` | The same score on the 0-5 star scale, e.g. `94` → `4.7` |
| `sub_ratings` | `{value, safety, location, staff, atmosphere, cleanliness, facilities}`, each 0-100 |
| `owner_comment` | The hostel's public reply, if any |
| `group_type` | `MALE`, `FEMALE`, `COUPLE`, `ALLFEMALEGROUP`, `ALLMALEGROUP`, `MIXEDGROUP`, `FAMILY` |
| `age_group` | `18-24`, `25-30`, `31-40`, `41+` |
| `trip_types` | `REGULARVACATION`, `WEEKENDAWAY`, `GAPYEAR`, `RTWTRIP`, `COLLEGEBREAK`, `OTHER` |
| `reviewer_id`, `reviewer_nickname`, `reviewer_gender` | Who wrote it (`Anonymous` when they hid the name) |
| `reviewer_country`, `reviewer_country_code`, `reviewer_reviews`, `reviewer_image` | Where they are from, how many reviews they have written, their avatar |
| `liked`, `disliked`, `recommended` | Legacy split-review fields; Hostelworld no longer fills them, so they are almost always `null` |
| `target`, `fetched_at` | The input value this row came from, and when it was read |

#### Hostel rows (`type: "property"`, free)

`property_id`, `property_name`, `property_type` (`HOSTEL`, `GUESTHOUSE`, `HOTEL`, …), `star_rating`, `city`, `country`, `region`, `address`, `latitude`, `longitude`, `rating` and `rating_5` (the hostel's aggregate), `sub_ratings`, `total_ratings` (every score, text or not), `currency`, `lowest_price_per_night`, `best_for`, `facilities`, `description`, `positive_count`, `negative_count`, `solo_percentage`, `couples_percentage`, `groups_percentage`, `reviews_listed`, `reviews_fetched`, `property_url`.

#### Status rows (`type: "status"`, free)

One per target: `target`, `property_id`, `property_name`, `status` (`ok`, `no_reviews`, `not_found`, `duplicate`, `error`), `reviews` delivered, `filtered` (dropped before billing), `pages` read, `total` Hostelworld lists, `duplicates`, `error`.

A refusal is always `status: "error"` with the reason. A hostel with no reviews is `no_reviews` with `total: 0`, and an unknown or deactivated property id is `not_found`. The scraper never reports an empty hostel when it was really blocked — Hostelworld's API has no silent-empty answer, so neither does this actor.

The run also writes a `SUMMARY` record to the key-value store with the delivered, filtered and charged counts and the HTTP stats.

### How much does it cost?

$0.003 per review row. Hostel rows, status rows, duplicate targets, unknown ids and every review a filter dropped are free. A thousand reviews is $3; a daily 30-day watch over ten hostels is usually a few cents a day. Compute is included in the event price.

### Hostelworld reviews scraper in Python, JavaScript, curl, n8n, Make or an AI agent

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("kestrel/hostelworld-reviews-scraper").call(run_input={
    "propertyIds": ["15529"],
    "maxReviewsPerProperty": 200,
    "reviewsSort": "-date",
})
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
reviews = [r for r in rows if r["type"] == "review"]
print(len(reviews), "reviews", sum(r["rating"] for r in reviews) / len(reviews))
```

JavaScript (Node):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('kestrel/hostelworld-reviews-scraper').call({
    startUrls: ['https://www.hostelworld.com/hostels/p/15529/home-lisbon-hostel/'],
    maxReviewsPerProperty: 0,
    maxRating: 70,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((r) => r.type === 'review').length);
```

curl:

```bash
curl -X POST "https://api.apify.com/v2/acts/kestrel~hostelworld-reviews-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"propertyIds":["15529"],"maxReviewsPerProperty":50,"reviewsSort":"-date"}'
```

Add `&format=csv` to that URL and you have **hostelworld reviews csv** without writing any code — the same route to download hostelworld reviews as Excel, JSON or XML.

**n8n**: the Apify node runs this actor and hands the dataset to the next step. **Make**: the Apify module does the same, so a low score can raise a Slack message or open a ticket. **MCP and AI agents**: Apify's MCP server exposes the actor as a tool, so an assistant can fetch **hostelworld property reviews** on demand and answer questions about a hostel without a scraping pipeline of its own.

### Is it legal to scrape Hostelworld reviews?

This actor reads only what Hostelworld publishes to anyone: the same public JSON its own property pages fetch, with no key, no login and no account. It never touches private data or anything behind a paywall. Public data collection of this kind is generally lawful in the EU, the UK and the US, and the reviews themselves are published statements. What you do afterwards is your responsibility: reviewer nicknames and nationalities are personal data under the GDPR, so treat them accordingly, keep republication within fair use, and check Hostelworld's terms for your own use case. This is not legal advice.

### Limits and honest notes

- **One language.** Hostelworld serves a single machine-translated English set. It accepts a `languages` parameter and then ignores it, so this actor deliberately offers no language filter rather than one that does nothing. `language` and `machine_translated` are on every row so you can see exactly what you got.
- **`liked`, `disliked` and `recommended` are legacy.** Hostelworld's schema still carries them; the data no longer fills them. They are kept so nothing is lost if the site starts writing them again.
- **`groupTypes`, `minRating`, `maxRating`, `requireText` and `sinceDate` are actor-side.** The API has no server-side filter, so the pages are read and the rows are then dropped before billing.
- **Page size is capped at 50** by the API, which is what the actor asks for.
- **`sinceDate` only stops paging early on a date sort.** With `-date` a run stops as soon as a whole page predates the cut; with a rating sort the dates are not ordered, so the filter still applies but every page is read.
- **Scores are 0-100, not 1-5.** `rating_5` is there for joins with other review sources.

### FAQ

#### Does it need a Hostelworld API key or login?

No. This is **hostelworld reviews without an api key**: the endpoint is public and unauthenticated, and the actor sends no cookie, token or `Origin` header.

#### Can I download Hostelworld reviews as CSV or Excel?

Yes. Every Apify dataset exports to CSV, Excel, JSON, XML or JSONL from the run's Storage tab or the API, and the `run-sync-get-dataset-items` call above takes `&format=csv` directly.

#### How do I get only the bad reviews?

Set `reviewsSort` to `rating` and `maxRating` to about 70. The worst arrive first and everything above the ceiling is filtered before it is charged.

#### Can I get Hostelworld reviews by property id instead of URL?

Yes — that is `propertyIds`, and it is the fastest path because nothing has to be resolved. Get **hostelworld reviews by property id** straight from an earlier run's `property_id` column.

#### How many reviews can one hostel return?

All of them. A busy city hostel carries one to three thousand; the actor pages through the lot at 50 per request and stops on its own at the end of the list.

#### Does it include the hostel's reply?

Yes — `owner_comment`. **Hostelworld owner replies** are common on hostels that manage their reputation and absent on the ones that do not, which is itself a signal.

#### Can I scrape Hostelworld reviews without an API of my own?

Yes. That is what this actor is: no infrastructure, no proxies to buy, no browser to keep alive. Run it from the Console, the API, a schedule or an agent.

#### Is the reviewer data really that detailed?

Yes. Group type, age band, trip type and nationality come from Hostelworld itself, which is why **backpacker reviews** here support demand analysis and not only sentiment.

#### What do bulk hostel reviews cost?

$0.003 each, filters applied first. **Bulk hostel reviews** across a fifty-hostel city at 200 reviews per hostel is 10,000 rows, or $30.

#### Can I use it for hostel sentiment analysis?

Yes. `text` is clean, `review_date` is exact and `rating` gives you a numeric label to train or evaluate against, per hostel and per group type.

### Review monitoring across a portfolio: hostel guest feedback every morning

Schedule the actor daily with `sinceDate: "2 days"` and every hostel you care about in `propertyIds`. Newest-first order means it reads one page per hostel and stops, so the run is quick and cheap. Push the dataset into a warehouse and you have **hostel guest feedback** as a time series: score by week, sub-score by week, complaint volume by group type. A **hostel review scraper** that returns nothing new on a quiet day costs nothing on a quiet day.

#### Guest feedback data that keeps its structure

Every row carries every key, so a run with no owner replies still has an `owner_comment` column and your loader never sees a shifting schema. Rows are typed, dates are ISO, scores are integers.

#### What this does not do

It does not book, price or check availability, and it does not read a city listing page — give it hostels, not searches. A Hostelworld scraper for rates and availability is a different job; pair this one with a prices actor.

#### Choosing an order

`-date` for monitoring, `rating` for complaint triage, `-rating` for marketing copy, `date` when you want the oldest reviews a hostel ever received.

### Related scrapers

Hostelworld is one window on a property's reputation. These read the others, with the same row discipline:

- [Booking.com Reviews Scraper](https://apify.com/kestrel/booking-reviews-scraper) — the same job on Booking's 1-10 scale, with liked/disliked split out.
- [TripAdvisor Reviews Scraper](https://apify.com/kestrel/tripadvisor-reviews-scraper) — 1-5 bubbles, six sub-ratings and up to 30 site languages.
- [Airbnb Reviews Scraper](https://apify.com/kestrel/airbnb-reviews-scraper) — the short-let side of the same market.
- [Agoda Reviews Scraper](https://apify.com/kestrel/agoda-reviews-scraper) — the Asia-heavy OTA, with separate positives and negatives and the hotel's reply, by hotel name, URL or id.
- [Free Hotel Review Checker](https://apify.com/kestrel/hotel-reputation-checker) — the Hostelworld score next to Booking.com, Agoda, Tripadvisor, Google and Despegar for the same property, one row per site, free — run it first to see which site's text is worth reading.
- [Google Hotels Prices Scraper](https://apify.com/kestrel/google-hotels-prices) — what the same properties charge: every booking site's rate for a stay as its own row, for the price behind the score.

Together they cover the budget-travel stack: run the review scrapers over one city and you can compare what the same traveller says about a hostel bed, a hotel room and a spare room.

# Changelog

This Actor's version history is a separate document: https://apify.com/kestrel/hostelworld-reviews-scraper/changelog.md

# Actor input Schema

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

Hostelworld property pages, e.g. https://www.hostelworld.com/hostels/p/15529/home-lisbon-hostel/ or the older https://www.hostelworld.com/pwa/hosteldetails.php/Home-Lisbon-Hostel/Lisbon/15529 — every URL form Hostelworld serves carries the numeric property id, so no page has to be loaded first. Any query string is fine.

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

Hostelworld's numeric property ids, e.g. 15529 — the number in /hostels/p/<id>/ and the last path segment of a hosteldetails.php URL, and what an earlier run's property\_id gives you. The fastest path: no lookup at all.

## `maxReviewsPerProperty` (type: `integer`):

0 = every review the hostel has (Hostelworld pages them 50 at a time; a busy hostel runs to a few thousand). N = the first N in the order below. The main cost control.

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

The order Hostelworld returns reviews in. -date = newest first (the default, and the only order in which sinceDate can stop paging early), date = oldest first, rating = lowest rated first (a complaints feed), -rating = highest rated first. These four are the only values the API really honours — anything else is silently served as newest first.

## `minRating` (type: `integer`):

Hostelworld scores each review 0-100 (100 = perfect); every row also carries the same score on the 0-5 scale as rating\_5. 0 = no floor. 90 keeps only the raves. Filtered reviews are never charged.

## `maxRating` (type: `integer`):

The other end of the same 0-100 overall score: 0 = no ceiling, 70 gives a complaints feed. Combine with reviewsSort = lowest rated first so the worst reviews arrive on page one. Filtered reviews are never charged.

## `requireText` (type: `boolean`):

Drop score-only reviews (an empty notes field) before billing. Hostelworld reviews nearly always carry a sentence or two, so this rarely removes much.

## `groupTypes` (type: `array`):

Keep only reviews from these group types: MALE and FEMALE (solo travellers), COUPLE, ALLFEMALEGROUP, ALLMALEGROUP, MIXEDGROUP, FAMILY. Friendly spellings work too (solo\_female, female\_group, mixed\_group). Empty = all. Hostelworld's API has no server-side filter for this, so the filter runs here in the actor — the pages are still read, the filtered reviews are simply never charged.

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

YYYY-MM-DD, or relative so schedules never go stale: "30 days", "2 weeks", "6 months". With the default newest-first order the run stops reading once a whole page predates the date, so a daily schedule reads one page per hostel. Empty = no date limit.

## `includePropertyRow` (type: `boolean`):

Also emit one free row per hostel with its name, type, city, country, address, coordinates, star rating, the aggregate 0-100 ratings, total ratings, facilities, what it is best for and its lowest nightly price. The hostel record is read either way — it is what gives review rows their hostel name and URL — and is never charged.

## `sessions` (type: `integer`):

How many proxy sessions (egress IPs) run in parallel. More is faster; each is paced separately.

## `perIp` (type: `number`):

Pace for each session. Hostelworld's API answered 10 of 10 requests at 1 req/s from a single datacenter IP with no throttling at all; 1-2 is comfortable.

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

Apify Proxy with the datacenter group is enough: the API answers plain HTTP requests from datacenter ranges with no key, no auth and no bot gate. Residential works too and costs more. Keep the default.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.hostelworld.com/hostels/p/15529/home-lisbon-hostel/"
  ],
  "propertyIds": [],
  "maxReviewsPerProperty": 100,
  "reviewsSort": "-date",
  "minRating": 0,
  "maxRating": 0,
  "requireText": false,
  "groupTypes": [],
  "sinceDate": "",
  "includePropertyRow": true,
  "sessions": 2,
  "perIp": 1,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per guest review, plus per-hostel context and status rows. Charged rows are billed as delivered; property and status rows are always free.

## `summary` (type: `string`):

One JSON record with the counts this run delivered and charged, its error and duplicate tallies, and its HTTP stats.

# 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": [
        "https://www.hostelworld.com/hostels/p/15529/home-lisbon-hostel/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kestrel/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": ["https://www.hostelworld.com/hostels/p/15529/home-lisbon-hostel/"] }

# Run the Actor and wait for it to finish
run = client.actor("kestrel/hostelworld-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 '{
  "startUrls": [
    "https://www.hostelworld.com/hostels/p/15529/home-lisbon-hostel/"
  ]
}' |
apify call kestrel/hostelworld-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kestrel/hostelworld-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/f2MTe77tgope2advg/builds/A04JzNftgPPKCZMCK/openapi.json
