# Hostelworld Scraper - Hostels, Hotels, Prices, Reviews & Events (`abotapi/hostelworld-scraper`) Actor

Scrape Hostelworld hostels, hotels, guesthouses, B\&Bs, apartments and campsites by city, property URL or ID. Extract prices, ratings, rooms, facilities, full reviews, Linkups events and attendee details.

- **URL**: https://apify.com/abotapi/hostelworld-scraper.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.10 / 1,000 result rows

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/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 Scraper: Hostels, Hotels, Prices, Reviews & Events

Hostelworld Scraper turns Hostelworld into a clean travel data API. Search any city for hostels, hotels, guesthouses, B\&Bs, apartments or campsites, and get dorm and private-room prices, ratings, full guest reviews, Linkups events, who's going, room boards with bookable prices, facilities, policies and check-in times, by search, property URL or property ID, then export to JSON, CSV or Excel, or pull results straight into your app through the API.

### Why This Scraper?

- **Three ways in.** Search a city by name (in any property type), paste property or city-search URLs, or give numeric property IDs. No URL building needed.
- **One row, everything inside.** Each property carries its card data plus optional full details, the room board with per-night prices, its guest reviews and its Linkups events.
- **Reviews-only mode.** Flip `reviewsOnly` and the dataset holds nothing but review rows, full text, per-category ratings, traveller details and owner replies.
- **Linkups events.** Pub crawls, city walks and meetups hosted at each property, inside a date window you control.
- **Who's going.** The traveller nationality mix heading to each property, as shown on the site.
- **Sorted output.** Re-order listings by price, rating, review count or name, the website's own order is preserved on request.
- **Built for schedules.** Incremental mode returns only new and changed properties on recurring runs, and a refused run fails loudly instead of returning an empty dataset.

### Use Cases

- **Hostel and hotel market research:** track dorm and private prices, ratings and review volumes across cities and property types.
- **Revenue and competitor monitoring:** watch room boards, promotions and free-cancellation terms for a set of properties on a schedule.
- **Guest-experience analysis:** collect full review text with per-category ratings (staff, security, location, atmosphere, cleanliness, facilities, value) and owner replies.
- **Event-led travel tools:** surface Linkups events at hostels in the coming days, with participant counts.
- **Travel apps and AI agents:** feed clean JSON into your booking assistant, map app or MCP-connected workspace.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
| --- | --- |
| `type` | `"property"` (reviews-only runs emit `"review"` rows) |
| `propertyId` / `propertyName` | `703` / `"Circus Hostel"` |
| `propertyType` | `"HOSTEL"` (also `"HOTEL"`, `"GUESTHOUSE"`, …) |
| `propertyUrl` | Hostelworld page link |
| `city` / `country` / `continent` | `"Berlin"` / `"Germany"` / `"Europe"` |
| `address` / `addressFull` | `"Weinbergsweg 1a"` / `"Weinbergsweg 1a, 10119"` |
| `latitude` / `longitude` | `52.530147` / `13.401918` |
| `avgRating` / `numberReviews` | `9.26` / `8087` |
| `sharedMinPrice` / `privateMinPrice` | dorm / private from-price |
| `lowestDormPricePerNight` / `lowestPrivatePricePerNight` | bookable prices from the room board |
| `currency` | `"EUR"` |
| `checkInFrom` / `checkInUntil` / `latestCheckOut` | `0` / `23` / `"12:00"` |
| `depositPercentage` / `freeCancellation` | `15` / `true` |
| `cancellationPolicy` / `cancellationPoliciesList` | policy text and labelled list |
| `paymentMethods` / `facilities` / `rooms` | accepted cards, facility names, room board with prices |
| `description` / `hostelworldSays` / `directions` | full descriptive text |
| `peopleGoing` / `peopleGoingCount` | travellers heading there (nationality + avatar) |
| `events` / `eventsCount` | Linkups events: name, description, schedule, participants, price |
| `reviews` / `reviewsCount` / `reviewsSummary` | nested reviews, count and statistics |
| `badges` / `imageUrls` / `sustainability` | awards and free-WiFi badges, photo gallery, tier |
| `reviewsOnly` output rows | `reviewId`, `reviewDate`, `ratingOverall` (0-10), `ratingStaff`, `ratingSecurity`, …, `reviewText`, `ownerReply`, `reviewerNickname`, `reviewerNationality`, `travellerGroupType` |

Review rows are also exposed one-per-line in the **Reviews** output tab, and events in the **Events** tab, without any post-processing.

### How to Use

1. Pick a **mode**: `search` (by location) or `url` (paste property or city-search links). Property IDs work in both.
2. Choose the **property type** and the enrichment you need (details, reviews, events, who's going).
3. Set **Max items** to control run size and cost, then click **Start**.
4. Download the dataset as JSON, CSV or Excel, or read it through the API.

**Search a city for hostels:**

```json
{
  "mode": "search",
  "locations": ["Berlin"],
  "propertyType": "hostel",
  "maxItems": 20
}
```

**Hotels only, cheapest first, no reviews:**

```json
{
  "mode": "search",
  "locations": ["Lisbon"],
  "propertyType": "hotel",
  "sortBy": "price_low",
  "includeReviews": false,
  "maxItems": 50
}
```

**Paste property or city-search links:**

```json
{
  "mode": "url",
  "startUrls": [
    "https://www.hostelworld.com/hostels/p/703/circus-hostel/",
    "https://www.hostelworld.com/hostels/europe/germany/berlin/"
  ]
}
```

**Reviews only, top rated first:**

```json
{
  "mode": "url",
  "propertyIds": ["703"],
  "reviewsOnly": true,
  "reviewSort": "topRated",
  "maxReviewsPerProperty": 100,
  "maxItems": 100
}
```

All of these link shapes work in URL mode (one example of each is in the input's default):

- Property page: `https://www.hostelworld.com/hostels/p/703/circus-hostel/`
- Mobile share / deep link: `https://www.hostelworld.com/st/hostel/703/circus-hostel/`
- City search, any property type: `https://www.hostelworld.com/hostels/europe/germany/berlin/` or `https://www.hostelworld.com/hotels/europe/germany/berlin/`
- Paginated search: the same with `?page=2` (walk starts there and moves forward)

City-search links walk forward page by page; property links and IDs fetch just that property.

#### Run it from your code

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("abotapi/hostelworld-scraper").call(run_input={
    "mode": "search", "locations": ["Berlin"], "maxItems": 10,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["propertyName"], item["avgRating"], item["sharedMinPrice"])
```

JavaScript:

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('abotapi/hostelworld-scraper').call({
    mode: 'search', locations: ['Berlin'], maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the **Integrations** tab.

#### Resume and recurring updates

- **Resume** (`resumeFromRunId`) continues one interrupted run: paste its run or dataset ID and the actor skips everything already collected there, so you don't pay twice.
- **Incremental mode** (`incrementalMode`) is for scheduled runs over the same scope. Each property (or review, in reviews-only output) is classified `NEW`, `UPDATED` (with `changedFields`), `UNCHANGED` (suppressed and not billed unless `emitUnchanged` is on), `REAPPEARED` or `EXPIRED` (only after a run that scanned the whole scope, only with `emitExpired`, and capped by the run's remaining Max items so a tombstone wave can never overspend it). `stateKey` names or shares the stored state. **What drives `UPDATED`:** price, rating, review-count, description/details text, rooms, facilities, events and people changes. **What never does:** the availability flag, the booked-today counter, rotating image URLs and scrape timestamps, override or extend that with `ignoreFieldsForChanges`.

### Send results into your apps (MCP connectors)

Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step **after** the scrape: the Apify dataset is never changed.

**What gets written to the connector:** a condensed, human-readable **summary** of each record, not the full JSON. Each item becomes one entry with a **title** and its key fields flattened to plain text. The **complete record always stays in the Apify dataset**.

1. Authorize a connector once under **Apify → Settings → Integrations** (Notion, Linear, Airtable, or Apify).
2. Select it in the **"Pipe results into your apps"** input field. (If the picker is empty, you haven't authorized a connector yet.)
3. For **Notion**, also set `notionParentPageUrl` to the page where items should be created.

The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.

### Input Parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `mode` | string | `search` | `search` (by location) or `url` (paste links). |
| `locations` | array | `["Berlin"]` | Cities to search (search mode). |
| `propertyType` | string | `hostel` | `hostel`, `hotel`, `guesthouse`, `bed-and-breakfast`, `apartment`, `campsite` or `accommodation`. |
| `district` | string | (none) | Narrow the search to one district. |
| `sortBy` | string | `recommended` | `recommended`, `price_low`, `price_high`, `rating`, `reviews` or `name`. |
| `startUrls` | array | sample | Property or city-search URLs (url mode). |
| `propertyIds` | array | (none) | Numeric property IDs; works in both modes. |
| `maxItems` | integer | `20` | Stop after this many rows (properties, or reviews in reviews-only output). |
| `maxPages` | integer | `500` | Safety bound for search-page walking; listings stop at `maxItems` regardless. |
| `includeDetails` | boolean | `true` | Full details per property (billed per property). |
| `includeReviews` | boolean | `true` | Guest reviews (billed per review). |
| `maxReviewsPerProperty` | integer | `20` | Cap on reviews per property. |
| `reviewSort` | string | `newest` | `newest`, `oldest`, `topRated` or `lowestRated`. |
| `allLanguages` | boolean | `false` | Include machine-translated reviews in other languages. |
| `includeEvents` | boolean | `true` | Linkups events (billed per event). |
| `eventsDaysAhead` | integer | `7` | Days to look ahead for events. |
| `eventsPageSize` | integer | `8` | Cap on events per property. |
| `includePeople` | boolean | `true` | Who's going (nationality mix), included with details. |
| `reviewsOnly` | boolean | `false` | Output only review rows. |
| `currency` | string | `EUR` | ISO code prices are returned in. |
| `resumeFromRunId` | string | (none) | Continue one interrupted run. |
| `incrementalMode` | boolean | `false` | Return only new and changed rows on scheduled runs. |
| `stateKey` | string | (none) | Name or share an incremental-mode state. |
| `emitUnchanged` | boolean | `false` | Also return (and bill) unchanged rows. |
| `emitExpired` | boolean | `false` | Also return (and bill) rows that disappeared. |
| `ignoreFieldsForChanges` | array | (none) | Extra fields that must never mark a row `UPDATED`. |
| `proxy` | object | Apify Proxy | Connection settings; datacenter works out of the box. |
| `mcpConnectors` | array | (none) | Optional: send a summary of each record to apps you authorized under Integrations. |
| `notionParentPageUrl` | string | (none) | Notion connector only: page under which records are created. |
| `maxNotifyListings` | integer | `50` | Cap on items written to each connector per run. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "type": "property",
  "propertyId": 703,
  "propertyName": "Circus Hostel",
  "propertyType": "HOSTEL",
  "propertyUrl": "https://www.hostelworld.com/hostels/p/703/circus-hostel/",
  "city": "Berlin",
  "country": "Germany",
  "addressFull": "Weinbergsweg 1a, 10119",
  "latitude": 52.530147,
  "longitude": 13.401918,
  "avgRating": 9.26,
  "numberReviews": 8087,
  "sharedMinPrice": 21.24,
  "privateMinPrice": 149.44,
  "currency": "EUR",
  "checkInFrom": 0,
  "latestCheckOut": "12:00",
  "facilities": ["Free WiFi", "Luggage Storage", "Self-Catering Kitchen"],
  "rooms": [
    { "roomType": "4 Bed Mixed Dorm", "category": "dorms", "capacity": 4, "pricePerNight": 36.11 }
  ],
  "reviewsCount": 20,
  "reviews": [
    { "review_reviewId": "16686493", "review_ratingOverall": 5.1, "review_reviewText": "…", "review_ownerReply": null }
  ],
  "eventsCount": 6,
  "events": [
    { "eventId": 5487030, "name": "BVG Crawl", "totalParticipants": 12 }
  ],
  "peopleGoingCount": 30,
  "reviewsSummary": { "positiveCount": 251, "negativeCount": 5, "soloPercentage": 91.24 },
  "scrapedAt": "2026-10-07T12:00:00+00:00"
}
```

### Plan Requirement

The default connection (Apify datacenter) works out of the box: Hostelworld's own JSON gateway answers plain datacenter exits. If the default connection is refused, the actor automatically probes and fails over to a backup connection, tells you once when it does, and pins the results it could read. If every connection is refused, the run fails with a clear message instead of returning an empty result: a paid Apify plan (which includes proxy access) is required.

### FAQ

#### How much does it cost?

Listing rows themselves carry no per-row surcharge. You pay per property whose full details you switch on, per review collected, and per Linkups event found. The **Pricing** tab shows the current rates. Use **Max items** and the per-property caps to control the cost of any run.

#### Is it legal to scrape Hostelworld?

This actor collects only publicly available accommodation data. You are responsible for how you use it: follow Hostelworld's terms and the laws that apply to you, and get legal advice if you plan commercial redistribution. Prices and ratings are generally facts, but photos and review text may be subject to third-party rights.

#### Can I get only the reviews of a property?

Yes. Turn on **Output reviews only** (`reviewsOnly`) and the dataset contains nothing but review rows, each with the property's name, city and ratings denormalized onto it. Use it together with `reviewSort` and `maxReviewsPerProperty`.

#### Can I get only new or changed properties on a schedule?

Yes. Schedule the actor from the **Schedules** tab and turn on **Incremental mode**. Each run then returns only new and updated properties, and unchanged ones are not billed.

#### Why did my run fail instead of returning an empty dataset?

If the site refuses every request, the run stops with a clear message so "no matches" is never confused with "nothing could be read". Run it again in a few minutes. If only some sources could be read, you still get what was found.

#### Can I use it with AI agents or MCP?

Yes. Call it from any Apify integration or MCP client, and use the connector field to push results into Notion, Linear or Airtable.

### 🔗 Want more travel data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🏨 <a href="https://apify.com/abotapi/booking-com-scraper"><b>Booking.com Hotels, Prices and Reviews Scraper</b></a><br>Scrape booking.com hotels, apartments, villas and hostels. Search any destination with...</td><td>🏨 <a href="https://apify.com/abotapi/expedia-universal-scraper"><b>Expedia Hotels Scraper</b></a><br>From $1/1K. Scrape Expedia.com hotel listings and reviews for any destination. Extract...</td></tr>
<tr><td>🏨 <a href="https://apify.com/abotapi/vrbo-vacation-rentals-scraper"><b>Vrbo Scraper</b></a><br>Extract vacation rental data from Vrbo.com by location, region, coordinates, property...</td><td>🏨 <a href="https://apify.com/abotapi/airbnb-stays-reviews-scraper"><b>Airbnb Scraper</b></a><br>Scrape Airbnb stays by destination or link: nightly and total price, rating breakdown...</td></tr>
<tr><td>🏨 <a href="https://apify.com/abotapi/caterer-com-scraper"><b>Caterer.com Scraper</b></a><br>Scrape UK hospitality jobs from Caterer.com, including chef, hotel, restaurant, bar, and...</td><td>🏨 <a href="https://apify.com/abotapi/doc-to-markdown-mcp"><b>Doc To Markdown MCP Server</b></a><br>An MCP server that converts documents to clean Markdown. Convert PDFs, Word docs, Excel...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support & custom scrapers

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/hostelworld-scraper/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com> or message [Telegram @abotapi](https://t.me/abotapi).
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

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

Search mode finds hostels, hotels and other stays in the cities you name. URL mode accepts pasted property pages, or city search pages which the actor walks page by page.

## `locations` (type: `array`):

Cities to search, one per line. Examples: Berlin, Lisbon Portugal, Bangkok.

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

What to search for in the chosen cities.

## `district` (type: `string`):

Narrow the search to one district, e.g. kreuzberg in Berlin. Leave empty for the whole city.

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

Order in which properties from the search are returned.

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

Property pages (…/hostels/p/703/circus-hostel/), the mobile share form (…/st/hostel/703/…), or city search pages for any property type (…/hostels/europe/germany/berlin/, …/hotels/…, with or without ?page=N). Search pages walk forward page by page.

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

Optionally add numeric Hostelworld property IDs directly (the number in /p/703/). Works in both modes.

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

Maximum rows to save across the whole run (property rows, or review rows in reviews-only output). The run can return fewer when the site has fewer matches.

## `maxPages` (type: `integer`):

Advanced safety bound for search-page walking, 1-500 (leave empty for the internal bound; listings always stop at Max items first).

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

Fetch the full detail page for every listing: description, facilities, room board with prices, policies, check-in, payment methods, address and directions, photos, business registration. Charged per property.

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

Collect guest reviews with full text, per-category ratings, traveller details and owner replies. Charged per review.

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

Cap on reviews collected from each property.

## `reviewSort` (type: `string`):

Order of reviews returned for each property.

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

Include machine-translated reviews written in other languages, not just English.

## `includeEvents` (type: `boolean`):

Collect Linkups events (hostel gatherings: pub crawls, city walks, meetups) hosted at each property, inside Events window. Charged per event.

## `eventsDaysAhead` (type: `integer`):

How many days ahead to look for Linkups events.

## `eventsPageSize` (type: `integer`):

Cap on Linkups events collected from each property.

## `includePeople` (type: `boolean`):

Add the travellers heading to each property in the events window (nationality mix and avatars, as shown on the site).

## `reviewsOnly` (type: `boolean`):

When ON, the dataset holds ONLY review rows (one row per review with property fields denormalized) and property rows are not emitted. Max items then counts review rows.

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

ISO code prices are returned in.

## `proxy` (type: `object`):

Connection settings. The default Apify Proxy (datacenter) works out of the box; pick residential under Proxy groups for large or frequent runs.

## `resumeFromRunId` (type: `string`):

Optional run or dataset ID from a previous run: rows already collected there are skipped, so this run returns only the delta. Cannot be combined with an existing Incremental mode baseline for the same scope.

## `incrementalMode` (type: `boolean`):

Remember the last run for this exact scope (state key below) and return only NEW/UPDATED rows next time: changes to prices, ratings, reviews counts, details text, rooms, facilities, events or people drive UPDATED; the availability flag, booked-today counter, rotating image URLs and scrape timestamps never do (see Ignore fields below). UNCHANGED rows are neither saved nor charged.

## `stateKey` (type: `string`):

Optional name for the incremental baseline. Leave empty to key it automatically on this run's scope.

## `emitUnchanged` (type: `boolean`):

Incremental mode only: also save rows that did not change since the last run (classified UNCHANGED).

## `emitExpired` (type: `boolean`):

Incremental mode only: also save rows from the last run that this run could not find anymore (classified EXPIRED). Only when the full scope was scanned.

## `ignoreFieldsForChanges` (type: `array`):

Advanced. Field names that must never mark a row UPDATED in incremental mode (telemetry you do not care about). Availability flag, booked-today counter and scraped-at timestamp are already ignored by default.

## `mcpConnectors` (type: `array`):

Optionally send scraped rows into connected apps via Model Context Protocol connectors. Authorize a connector under Apify > Settings > API & Integrations, then select it here. Supported: Notion, Linear, Airtable, and Apify.

## `notionParentPageUrl` (type: `string`):

URL or id of the Notion page under which result pages are created. Required for Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on how many rows are written to each selected connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "locations": [
    "Berlin"
  ],
  "propertyType": "hostel",
  "sortBy": "recommended",
  "startUrls": [
    {
      "url": "https://www.hostelworld.com/hostels/p/703/circus-hostel/"
    },
    {
      "url": "https://www.hostelworld.com/st/hostel/703/circus-hostel/"
    },
    {
      "url": "https://www.hostelworld.com/hostels/europe/germany/berlin/"
    },
    {
      "url": "https://www.hostelworld.com/hotels/europe/germany/berlin/?page=2"
    }
  ],
  "propertyIds": [],
  "maxItems": 20,
  "includeDetails": true,
  "includeReviews": true,
  "maxReviewsPerProperty": 20,
  "reviewSort": "newest",
  "allLanguages": false,
  "includeEvents": true,
  "eventsDaysAhead": 7,
  "eventsPageSize": 8,
  "includePeople": true,
  "reviewsOnly": false,
  "currency": "EUR",
  "proxy": {
    "useApifyProxy": true
  },
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "ignoreFieldsForChanges": [],
  "maxNotifyListings": 50
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `reviews` (type: `string`):

No description

## `events` (type: `string`):

No description

## `property-details` (type: `string`):

No description

## `changes` (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 = {
    "mode": "search",
    "locations": [
        "Berlin"
    ],
    "propertyType": "hostel",
    "startUrls": [
        {
            "url": "https://www.hostelworld.com/hostels/p/703/circus-hostel/"
        },
        {
            "url": "https://www.hostelworld.com/st/hostel/703/circus-hostel/"
        },
        {
            "url": "https://www.hostelworld.com/hostels/europe/germany/berlin/"
        },
        {
            "url": "https://www.hostelworld.com/hotels/europe/germany/berlin/?page=2"
        }
    ],
    "propertyIds": [],
    "currency": "EUR",
    "proxy": {
        "useApifyProxy": true
    },
    "ignoreFieldsForChanges": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/hostelworld-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 = {
    "mode": "search",
    "locations": ["Berlin"],
    "propertyType": "hostel",
    "startUrls": [
        { "url": "https://www.hostelworld.com/hostels/p/703/circus-hostel/" },
        { "url": "https://www.hostelworld.com/st/hostel/703/circus-hostel/" },
        { "url": "https://www.hostelworld.com/hostels/europe/germany/berlin/" },
        { "url": "https://www.hostelworld.com/hotels/europe/germany/berlin/?page=2" },
    ],
    "propertyIds": [],
    "currency": "EUR",
    "proxy": { "useApifyProxy": True },
    "ignoreFieldsForChanges": [],
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/hostelworld-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 '{
  "mode": "search",
  "locations": [
    "Berlin"
  ],
  "propertyType": "hostel",
  "startUrls": [
    {
      "url": "https://www.hostelworld.com/hostels/p/703/circus-hostel/"
    },
    {
      "url": "https://www.hostelworld.com/st/hostel/703/circus-hostel/"
    },
    {
      "url": "https://www.hostelworld.com/hostels/europe/germany/berlin/"
    },
    {
      "url": "https://www.hostelworld.com/hotels/europe/germany/berlin/?page=2"
    }
  ],
  "propertyIds": [],
  "currency": "EUR",
  "proxy": {
    "useApifyProxy": true
  },
  "ignoreFieldsForChanges": []
}' |
apify call abotapi/hostelworld-scraper --silent --output-dataset

```

## MCP server setup

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