# HRS Hotel Reviews Scraper - Ratings, Replies & Scores (`sian.agency/hrs-hotel-reviews-scraper`) Actor

Scrape HRS hotel reviews with guest text, 12 category scores, stay dates, traveller type and the hotel's own reply. Search a city or paste hotel URLs. No key needed.

- **URL**: https://apify.com/sian.agency/hrs-hotel-reviews-scraper.md
- **Developed by:** [SIÁN OÜ](https://apify.com/sian.agency) (community)
- **Categories:** Travel, AI, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.64 / 1,000 hotel 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## HRS Hotel Reviews Scraper — Guest Ratings, Scores & Replies 🏨

[![SIÁN Agency Store](https://img.shields.io/badge/Store-SI%C3%81N%20Agency-1AE392)](https://apify.com/sian.agency?fpr=sian) [![Booking.com Scraper](https://img.shields.io/badge/Store-Booking.com%20Scraper-003580)](https://apify.com/sian.agency/booking-com-scraper?fpr=sian) [![Tripadvisor Hotel Scraper](https://img.shields.io/badge/Store-Tripadvisor%20Hotel%20Scraper-34E0A1)](https://apify.com/sian.agency/tripadvisor-hotel-scraper?fpr=sian) [![Agoda Hotel Scraper](https://img.shields.io/badge/Store-Agoda%20Hotel%20Scraper-5392F9)](https://apify.com/sian.agency/agoda-hotel-scraper?fpr=sian)

#### 🎉 One row per review — with all twelve of HRS's category scores and the hotel's own reply

##### Built for hospitality teams, revenue managers and analysts working the German-speaking corporate travel market

### 🔎 What is the HRS Hotel Reviews Scraper — and when should you use it?

The **HRS Hotel Reviews Scraper** turns guest reviews, category scores and hotel replies from HRS into clean, structured rows you can filter, export and feed straight into a spreadsheet, database or AI agent. No account, no portal API key, no browser automation to maintain.

**Use it when you need:** HRS guest reviews, one row per review. Each row carries the guest's 1-10 score, what they liked and what they disliked as separate fields, and the hotel's own published reply split into its answer to praise and its answer to criticism. Twelve category scores ride along: value, ambience, cleanliness, reception, staff, breakfast, restaurant, wellness, room size, room layout, beds and bathroom. So do the stay's check-in and check-out dates, HRS's own traveller segment and age bracket, and the language the review was written in. Every row repeats the hotel's overall average, its total rating count and its recommendation rate. Hotels can be given as HRS URLs, bare numeric ids, or plain hotel names, and a city name returns that city's hotels with their aggregate ratings.

**Use something else when:** you need reviews from a leisure booking site rather than the German corporate travel platform. Use [Booking.com Scraper](https://apify.com/sian.agency/booking-com-scraper?fpr=sian) for the same properties on Booking.com, with reviews, calendar pricing, photos and policies. Use [Tripadvisor Hotel Scraper](https://apify.com/sian.agency/tripadvisor-hotel-scraper?fpr=sian) for leisure-side hotel reviews and travel data, where HRS skews corporate. This actor covers HRS only. It returns the reviews HRS publishes with written text; the score-only ratings behind a hotel's headline count are not published individually by HRS and are reported as a count rather than as rows.

### 🤖 Use with AI agents

Already connected to the [Apify MCP server](https://mcp.apify.com)? Just ask for this Actor by name: sian.agency/hrs-hotel-reviews-scraper

**Your agent can pay for its own runs.** This Actor is eligible for [agentic payments](https://docs.apify.com/platform/actors/publishing/monetize), so an agent can discover it, run it and settle the bill over [x402](https://www.x402.org/) (USDC on Base) or [Skyfire](https://www.skyfire.xyz/) — without an Apify account or API token of its own. Billing is the same either way: per successful row, never for errors.

Otherwise copy this prompt into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```text
I want HRS guest reviews with their category scores and hotel replies using the Apify Actor `sian.agency/hrs-hotel-reviews-scraper`.

Use it when I need: HRS guest reviews, one row per review. Each row carries the guest's 1-10 score, what they liked and what they disliked as separate fields, and the hotel's own published reply split into its answer to praise and its answer to criticism. Twelve category scores ride along: value, ambience, cleanliness, reception, staff, breakfast, restaurant, wellness, room size, room layout, beds and bathroom. So do the stay's check-in and check-out dates, HRS's own traveller segment and age bracket, and the language the review was written in. Every row repeats the hotel's overall average, its total rating count and its recommendation rate. Hotels can be given as HRS URLs, bare numeric ids, or plain hotel names, and a city name returns that city's hotels with their aggregate ratings.

Don't use it when: you need reviews from a leisure booking site rather than the German corporate travel platform — use booking-com-scraper or tripadvisor-hotel-scraper instead.

How to call it: choose an `operation` — `reviews` for one row per guest review, `search` for a city's hotels with their aggregate ratings, `hotelProfile` for the full property record; put hotels in `hotels` as an HRS URL like https://www.hrs.com/en/hotel/519245, a bare id like `519245`, or the hotel's name; put cities in `places` as a name like "Munich" or an HRS destination URL; narrow reviews to one guest segment with `travellerType` (`ALLHRS`, `BUSINESS`, `PRIVATE`, `YOUNG_COUPLE`, `MATURE_COUPLE`, `FAMILY_SMALL_CHILDREN`, `FAMILY_OLDER_CHILDREN`, `GROUP`, `CONFERENCE`); take only what is new with `reviewsFrom` as a YYYY-MM-DD date; cap spend with `maxReviewsPerHotel` and `maxHotelsPerPlace`; drop the property's answers with `includeHotelReplies`.

Start with this input:
{
  "operation": "reviews",
  "hotels": [
    "https://www.hrs.com/en/hotel/519245",
    "10369"
  ],
  "travellerType": "BUSINESS",
  "maxReviewsPerHotel": 200
}

Ask me which hotels or which city you want reviews for, and whether you want every traveller segment or only business guests, then run the Actor and summarise the results as a table.
```

**Things you can ask your agent for:**

- *Pull every HRS review for our four Munich properties since January and tell me which complaint comes up most in the negative comments.*
- *Search Cologne on HRS, take the 40 hotels with the most ratings, and rank them by their breakfast score.*
- *Get the business-traveller reviews for these three competitor hotels and work out how often each one actually answers a bad review.*

Machine-readable API, MCP config and OpenAPI definition for this Actor are published at [apify.com/sian.agency/hrs-hotel-reviews-scraper.md](https://apify.com/sian.agency/hrs-hotel-reviews-scraper.md).

### 📋 Overview

**Reading HRS reviews by hand is slow work.** The site shows a star rating and a count; the reviews themselves sit behind a lazy-loaded panel, three at a time, with a Read all button. This actor gives you the whole published history as rows.

**What you get:**

- ✅ **One row per review, not a nested blob**: filter by date, segment or category with a query rather than a script
- ⚡ **Whole histories in one pass**: 100 hotels' full review sets come back in about four seconds
- 🎯 **Twelve category scores per review**: HRS's own, not sentiment we inferred from the text
- 💰 **$3.00 per 1,000 reviews**: 31% under the other per-review HRS actor at Bronze
- 💎 **Both sides of the conversation**: the guest's praise and criticism, and the hotel's answer to each
- ✨ **Start from a city, not an id**: type "Munich" and get its hotels with their ratings, then read their reviews

***

### ✨ Features

- ⭐ **Full published review history**: every written review HRS holds for a property, newest first
- 🧳 **HRS's own traveller segments**: business, private, group, conference, and the couple and family types
- 📊 **Twelve category scores**: value, ambience, cleanliness, reception, staff, breakfast, restaurant, wellness, room size, room layout, beds and bathroom
- 💬 **Hotel replies**: split into the answer to praise and the answer to criticism
- 📅 **Stay dates on every row**: check-in and check-out, alongside the date the review was posted
- 🔎 **City search**: a place name returns up to 1,000 hotels with their aggregate rating and review count
- 🏨 **Full property profiles**: address, coordinates, chain, contact email and phone, amenities, room counts and Green Stay sustainability data
- 🗓️ **Incremental runs**: a cutoff date keeps only what is new, so a schedule does not re-bill the archive
- 🌍 **Name lookup in any language**: "München" and "Munich" both resolve, through HRS's own search box

***

### 🎬 Quick Start

Pick an operation, paste hotels or a city, press Start. Results land in a dataset you can export as JSON, CSV or Excel. Nothing to configure and nothing to install.

```bash
curl -X POST "https://api.apify.com/v2/acts/sian.agency~hrs-hotel-reviews-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"operation": "reviews", "hotels": ["https://www.hrs.com/en/hotel/519245"]}'
```

***

### 🚀 Getting Started (3 Simple Steps)

#### Step 1: Choose what to scrape

Leave it on **Hotel reviews** for review rows. Switch to **Hotel search by city** if you do not have hotel ids yet, or **Hotel profiles** for the property record.

#### Step 2: Name your hotels or your city

Paste HRS hotel URLs, bare ids, or hotel names, one per line. For a city search, type the place instead: "Munich", "Wien", "Zürich".

#### Step 3: Press Start

Narrow the run first if you want to: a traveller segment, a cutoff date, a cap per hotel.

**That's it. Within a minute or two you'll have:**

- Every published review for your hotels, newest first
- Twelve category scores and a hotel reply on each row
- The property's overall average and recommendation rate alongside each review

***

### 📥 Input Configuration

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `operation` | string | No | `reviews`, `search` or `hotelProfile`. Defaults to `reviews`. |
| `hotels` | array | No | HRS hotel URLs, bare ids, or hotel names. Read by `reviews` and `hotelProfile`. |
| `places` | array | No | City or region names, or HRS destination URLs. Read by `search`. |
| `maxReviewsPerHotel` | integer | No | Cap on reviews taken per hotel. Default 200. |
| `maxHotelsPerPlace` | integer | No | Cap on hotels taken per city. Default 100, HRS's own ceiling is 1,000. |
| `travellerType` | string | No | HRS guest segment to filter reviews by. Default `ALLHRS`. |
| `reviewsFrom` | string | No | Keep only reviews on or after this `YYYY-MM-DD` date. |
| `onlyWithText` | boolean | No | Drop score-only reviews. Default `false`. |
| `includeHotelReplies` | boolean | No | Keep the hotel's answers. Default `true`. |

**Example: reviews for two hotels**

```json
{
  "operation": "reviews",
  "hotels": ["https://www.hrs.com/en/hotel/519245", "10369"],
  "maxReviewsPerHotel": 200
}
```

**Example: a city's hotels, then its reviews**

```json
{
  "operation": "search",
  "places": ["Munich", "Vienna"],
  "maxHotelsPerPlace": 200
}
```

**Example: business reviews only, since a date**

```json
{
  "operation": "reviews",
  "hotels": ["Radisson Blu Hotel Bremen"],
  "travellerType": "BUSINESS",
  "reviewsFrom": "2026-01-01"
}
```

***

### 📤 Output

Results are saved to the Apify dataset with **40+ fields** on a review row, including:

| Field | Type | Description |
|-------|------|-------------|
| `reviewId` | number | HRS's stable id for the review, which you can use to de-duplicate across runs |
| `hotelName` | string | The property, as HRS names it |
| `hotelUrl` | string | Direct link to the hotel on hrs.com |
| `ratingValue` | number | This guest's overall score, 1-10 |
| `positiveComment` | string | What the guest liked, in their own words |
| `negativeComment` | string | What the guest disliked, in their own words |
| `hotelReplyPositive` | string | The hotel's answer to the praise |
| `hotelReplyNegative` | string | The hotel's answer to the criticism |
| `recommendsHotel` | boolean | Whether the guest would recommend the property |
| `travellerType` | string | HRS's guest segment for this review |
| `reviewerAgeGroup` | string | The guest's age bracket |
| `reviewDate` | string | When the review was submitted |
| `arrivalDate` / `departureDate` | string | The stay being reviewed |
| `language` / `locale` | string | The language the review is written in |
| `scoreBreakfast`, `scoreQualityOfBeds`, … | number | Twelve category scores, 1-10 |
| `hotelRatingValue` | number | The property's overall average |
| `hotelReviewCount` | number | How many ratings HRS holds for the property |
| `hotelRecommendationRate` | number | Share of guests who recommend it |

**Example review row:**

```json
{
  "_rowType": "review",
  "reviewId": 318486994,
  "hotelId": 519245,
  "hotelName": "Motel One München-Deutsches Museum",
  "hotelUrl": "https://www.hrs.com/en/hotel/519245",
  "ratingValue": 7.5,
  "recommendsHotel": true,
  "comfortRating": "GOOD",
  "negativeComment": "Für mehrtägigen Aufenthalt Zimmer zu klein.\nAnbindung an öffentliche Verkehrsmittel eher schlecht.",
  "travellerType": "MATURE_COUPLE",
  "reviewerAgeGroup": "OVER_59",
  "reviewDate": "2026-03-30T17:10:13.102Z",
  "arrivalDate": "2026-03-25T00:00:00Z",
  "departureDate": "2026-03-29T00:00:00Z",
  "language": "deu",
  "locale": "de",
  "scorePricePerformance": 7,
  "scoreHotelTidiness": 8,
  "scoreReceptionFriendliness": 9,
  "scoreBreakfast": 7,
  "scoreRoomSize": 5,
  "scoreQualityOfBeds": 8,
  "hotelRatingValue": 8.4,
  "hotelReviewCount": 40,
  "hotelRecommendationRate": 95,
  "hotelCity": "Munich",
  "hotelCountry": "DE",
  "hotelStars": 3,
  "status": "success"
}
```

A hotel row from the search operation carries the property's address, coordinates, star rating, room counts, amenity codes and its aggregate scores split into business and private travellers.

***

### 💼 Use Cases & Examples

#### 1. Reputation monitoring for business-travel hotels

**A revenue manager watching what corporate guests say about their own properties.**

**Input:** your hotel URLs, a cutoff date, run on a weekly schedule
**Output:** every new review with its scores and your team's replies
**Use:** the corporate guest voice, separated from the leisure noise the big review sites mix it with

#### 2. Reply-rate and response auditing

**A group operations lead checking whether properties actually answer criticism.**

**Input:** your estate's hotel ids, `includeHotelReplies` on
**Output:** each review with the reply to praise and the reply to criticism as separate fields
**Use:** measure reply rate on negative reviews per property, and read the tone your teams use

#### 3. Category benchmarking across a city

**An asset manager working out where a property loses to the street.**

**Input:** a city search, then reviews for the hotels it returns
**Output:** twelve category scores on every review across every competitor
**Use:** rank the street on breakfast alone, or find where your beds sit below the local median

#### 4. Traveller-segment analysis

**A commercial director sizing up a weekday versus weekend product.**

**Input:** the same hotels run once per `travellerType`
**Output:** scores split by business, private, group, conference and the family segments
**Use:** a property scoring 8.4 with business guests and 9.6 with private ones is telling you something specific

#### 5. Training and evaluation sets for review models

**An ML engineer who needs labelled non-English review text.**

**Input:** a broad city search, then reviews across everything it finds
**Output:** review text with praise and criticism already separated, plus a score and twelve sub-scores
**Use:** a labelled sentiment set that needs no annotation pass, and it is largely German

#### 6. Hotel lead lists for the DACH market

**A sales team building a prospect list of German, Austrian and Swiss properties.**

**Input:** a city search, then `hotelProfile` on the ids it returns
**Output:** name, address, coordinates, chain, contact email, phone, room counts and amenities
**Use:** a filterable list of properties with their actual guest standing attached

#### 7. Sustainability and Green Stay screening

**A corporate travel manager filtering a city on more than price.**

**Input:** `hotelProfile` for a city's hotels
**Output:** HRS Green Stay enrolment and champion status alongside the guest rating
**Use:** shortlist properties that clear both a sustainability bar and a satisfaction bar

***

### 🔗 Integration Examples

#### JavaScript/Node.js

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('sian.agency/hrs-hotel-reviews-scraper').call({
  operation: 'reviews',
  hotels: ['https://www.hrs.com/en/hotel/519245'],
  maxReviewsPerHotel: 200,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

#### Python

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')

run = client.actor('sian.agency/hrs-hotel-reviews-scraper').call(
    run_input={
        'operation': 'reviews',
        'hotels': ['https://www.hrs.com/en/hotel/519245'],
        'travellerType': 'BUSINESS',
    }
)

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

#### cURL

```bash
curl -X POST 'https://api.apify.com/v2/acts/sian.agency~hrs-hotel-reviews-scraper/runs?token=YOUR_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"operation": "search", "places": ["Munich"], "maxHotelsPerPlace": 100}'
```

#### Automation Workflows (N8N / Zapier / Make)

1. **Trigger**: a weekly schedule
2. **HTTP Request**: call the Actor with your hotel list and last week's date in `reviewsFrom`
3. **Process**: filter rows where `ratingValue` is below your threshold
4. **Action**: post them to Slack, or open a ticket per unanswered negative review

***

### 📊 Performance & Pricing

#### FREE Tier (Try It Now)

- **25 rows** per run, with full feature access, every field, same quality
- No credit card required
- Enough to see a real hotel's reviews before you commit

#### PAID Tier (Production Ready)

- **Unlimited** rows per run
- Whole cities in a single run
- Pay per result: you are charged for rows returned, never for an input that failed

💰 **$3.00 per 1,000 reviews** at the Bronze tier, falling to $2.64 on Gold and above. That is 31% under the other per-review HRS actor at Bronze, and 12% under it at Gold, where their price also drops. Hotel rows from the search and profile operations are $2.50 per 1,000, falling to $2.20.

🔗 [View current pricing](https://apify.com/sian.agency/hrs-hotel-reviews-scraper?fpr=sian)

***

### ❓ Frequently Asked Questions

**Q: Do I need an API key, a login or a proxy?**
A: No. Paste hotels or a city and press Start.

**Q: How do I find a hotel id if I only know the name?**
A: Type the name. Plain text is resolved through HRS's own search box, so "Radisson Blu Hotel Bremen" finds the same property the website would. You can also run the search operation on a city and take the ids from its output.

**Q: Why does a hotel show 51 ratings but return 33 reviews?**
A: HRS separates score-only ratings from written reviews. The number on the hotel page counts every rating a guest submitted; only the ones with written text are published for the public to read, and those are what you get. Every row carries the full rating count too, so you can see both figures side by side.

**Q: What language are the reviews in?**
A: Whatever the guest wrote in, which on German properties is mostly German. Nothing is translated, because a translated field would be our guess rather than the guest's words, but every row carries the language and locale codes so you can route text to a translation step of your own.

**Q: Can I get only new reviews on a schedule?**
A: Yes. Set **Only reviews since** to your last run's date and you keep only reviews written on or after it, so you pay for what is new rather than re-billing the archive.

**Q: Does it return reviewer profiles?**
A: It returns the display name where the guest chose to publish one, which is about 43% of reviews, plus their traveller type and age bracket. HRS's response carries no profile link, avatar or review history, so no such column is shipped.

**Q: What is the URL with a city name and `d-` in it?**
A: That is a destination page, not a hotel. `https://www.hrs.com/en/hotel/munich/d-70801` redirects to a city listing and carries no reviews. Put it in **Cities and areas** and use the search operation; the hotels field rejects it with a note rather than quietly returning a city.

**Q: How many hotels can one city return?**
A: Up to 1,000, which is HRS's own ceiling rather than ours. Munich returns 688, every hotel it has; Berlin, Vienna and Paris all reach the cap.

**Q: What output formats are available?**
A: JSON, CSV and Excel, exported straight from the Apify dataset, or read over the API.

***

### 🐛 Troubleshooting

**A hotel returns no rows and the message mentions written reviews**

- The property has ratings but nothing written. Run the hotel-profile operation instead; it returns the score breakdown by traveller type.

**My input was skipped as a destination page**

- The URL is a city listing. Move it to **Cities and areas** and switch the operation to Hotel search.

**A hotel name did not resolve**

- Paste the hotel URL from hrs.com instead, or run Hotel search on its city and take the id from the output.

**A cutoff date returns nothing**

- Nothing new has been written since. Clear **Only reviews since**, or move it further back.

**The run stopped at 25 rows**

- That is the free-tier cap. Add credits or a payment method in Apify Console → Billing for unlimited rows.

***

### ⚖️ Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the **GDPR** in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

HRS and hrs.com are trademarks of HRS GmbH. This actor is not affiliated with, endorsed by, or sponsored by HRS.

***

### 🤝 Support

[![Telegram Support](https://img.shields.io/badge/Telegram-Support%20Group-0088cc?logo=telegram)](https://t.me/+vyh1sRE08sAxMGRi)

**Join our active support community**

- For issues or questions, open an issue on the [actor's issues board](https://apify.com/sian.agency/hrs-hotel-reviews-scraper/issues)
- Check the [SIÁN Agency Store](https://apify.com/sian.agency?fpr=sian) for more automation tools
- 📧 <apify@sian-agency.online>

***

**Built by [SIÁN Agency](https://www.sian-agency.online)** | **[More Tools](https://apify.com/sian.agency?fpr=sian)**

# Actor input Schema

## `operation` (type: `string`):

⭐ **HOTEL REVIEWS** — one row per guest review for the hotels you list: score, what the guest liked and disliked, twelve category scores, and the hotel's reply.

🔎 **HOTEL SEARCH BY CITY** — a city's hotels with their aggregate rating. Use it to find hotel ids you do not have.

🏨 **HOTEL PROFILES** — the full property record: address, chain, contact details, amenities, and the rating split by traveller type.

💡 **TIP:** search a city first, then run reviews on the ids it returns.

## `hotels` (type: `array`):

🏨 **USED BY:** hotel reviews and hotel profiles. One hotel per line, in any of these forms:

- An HRS hotel URL: `https://www.hrs.com/en/hotel/519245` (any language)
- A bare hotel id: `519245`
- The hotel's name: `Radisson Blu Hotel Bremen`

⚠️ A `/hotel/<city>/d-<id>` link is a city page, not a hotel. It is rejected with a note — put it in **Cities and areas** and use the search operation.

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

🔢 Stop after this many reviews for each hotel. HRS returns a hotel's whole published review history in one response, so this is a billing cap rather than a paging control.

💡 **TIP:** the deepest property we measured carried 155 written reviews, so the default of 200 takes everything for almost every hotel. Newest reviews come first, so a lower number gives you the latest.

## `travellerType` (type: `string`):

🧳 Filter reviews to one kind of guest, using HRS's own segmentation rather than a keyword guess. Business is the largest segment on most German properties.

⚠️ Picking a segment narrows the result set considerably — a Munich hotel with 117 reviews returns 49 for Business and 14 for Mature couple. Leave it on **All travellers** unless you specifically want the split.

## `reviewsFrom` (type: `string`):

📅 Keep only reviews written on or after this date, as `YYYY-MM-DD`. Leave it empty for the full history.

💡 **TIP:** on a schedule, set it to your last run's date and you pay only for what is new. Dates are HRS's own review timestamps, recorded in Europe/Berlin time.

## `onlyWithText` (type: `boolean`):

✍️ Drop reviews that carry scores but no written comment.

ℹ️ Every review HRS publishes on the web already has text — the score-only ratings sit behind the aggregate and are not returned — so this changes almost nothing in practice. It is here for pipelines that want the guarantee in writing.

## `includeHotelReplies` (type: `boolean`):

💬 Keep the hotel's own answer to each review.

📊 Roughly 39% of reviews carry a reply to the positive half and 28% to the negative half, so reply rate is itself a useful signal. Switch this off for a leaner dataset when you only want guest voice.

## `places` (type: `array`):

📍 **USED BY:** hotel search.

One place per line:

- A city or region name in any language: `Munich`, `München`, `Wien`, `Zürich`
- An HRS destination URL: `https://www.hrs.com/en/destination/70801`

🔎 Names are resolved through HRS's own location lookup, so the place you get is the place the website would give you.

## `maxHotelsPerPlace` (type: `integer`):

🔢 How many hotels to take from each city search.

ℹ️ HRS caps its own result set at 1000 hotels per city, so that is the ceiling here too. Hotels come back in HRS's own recommendation order, so a lower number gives you the ones the site itself puts first.

## Actor input object example

```json
{
  "operation": "reviews",
  "hotels": [
    "https://www.hrs.com/en/hotel/519245",
    "10369",
    "Radisson Blu Hotel Bremen"
  ],
  "maxReviewsPerHotel": 200,
  "travellerType": "ALLHRS",
  "reviewsFrom": "2026-01-01",
  "onlyWithText": false,
  "includeHotelReplies": true,
  "places": [
    "Munich",
    "Vienna"
  ],
  "maxHotelsPerPlace": 100
}
```

# Actor output Schema

## `hrsReviews` (type: `string`):

Every row this run returned — reviews with their scores and replies, or hotels with their ratings.

## `scrapingSummary` (type: `string`):

HTML summary showing successful and failed results with key metrics

# 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 = {
    "operation": "reviews",
    "hotels": [
        "https://www.hrs.com/en/hotel/519245",
        "10369",
        "Radisson Blu Hotel Bremen"
    ],
    "maxReviewsPerHotel": 200,
    "travellerType": "ALLHRS",
    "reviewsFrom": "",
    "onlyWithText": false,
    "includeHotelReplies": true,
    "places": [
        "Munich",
        "Vienna"
    ],
    "maxHotelsPerPlace": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("sian.agency/hrs-hotel-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 = {
    "operation": "reviews",
    "hotels": [
        "https://www.hrs.com/en/hotel/519245",
        "10369",
        "Radisson Blu Hotel Bremen",
    ],
    "maxReviewsPerHotel": 200,
    "travellerType": "ALLHRS",
    "reviewsFrom": "",
    "onlyWithText": False,
    "includeHotelReplies": True,
    "places": [
        "Munich",
        "Vienna",
    ],
    "maxHotelsPerPlace": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("sian.agency/hrs-hotel-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 '{
  "operation": "reviews",
  "hotels": [
    "https://www.hrs.com/en/hotel/519245",
    "10369",
    "Radisson Blu Hotel Bremen"
  ],
  "maxReviewsPerHotel": 200,
  "travellerType": "ALLHRS",
  "reviewsFrom": "",
  "onlyWithText": false,
  "includeHotelReplies": true,
  "places": [
    "Munich",
    "Vienna"
  ],
  "maxHotelsPerPlace": 100
}' |
apify call sian.agency/hrs-hotel-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sian.agency/hrs-hotel-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/zFYjq0N09GtxyVYX3/builds/qyksnAHA9mgNrBMVF/openapi.json
