HRS Hotel Reviews Scraper - Ratings, Replies & Scores avatar

HRS Hotel Reviews Scraper - Ratings, Replies & Scores

Pricing

from $2.64 / 1,000 hotel reviews

Go to Apify Store
HRS Hotel Reviews Scraper - Ratings, Replies & Scores

HRS Hotel Reviews Scraper - Ratings, Replies & Scores

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.

Pricing

from $2.64 / 1,000 hotel reviews

Rating

0.0

(0)

Developer

SIÁN OÜ

SIÁN OÜ

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

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

SIÁN Agency Store Booking.com Scraper Tripadvisor Hotel Scraper Agoda Hotel Scraper

🎉 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 for the same properties on Booking.com, with reviews, calendar pricing, photos and policies. Use Tripadvisor Hotel Scraper 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? 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, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — 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:

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.

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

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

FieldTypeRequiredDescription
operationstringNoreviews, search or hotelProfile. Defaults to reviews.
hotelsarrayNoHRS hotel URLs, bare ids, or hotel names. Read by reviews and hotelProfile.
placesarrayNoCity or region names, or HRS destination URLs. Read by search.
maxReviewsPerHotelintegerNoCap on reviews taken per hotel. Default 200.
maxHotelsPerPlaceintegerNoCap on hotels taken per city. Default 100, HRS's own ceiling is 1,000.
travellerTypestringNoHRS guest segment to filter reviews by. Default ALLHRS.
reviewsFromstringNoKeep only reviews on or after this YYYY-MM-DD date.
onlyWithTextbooleanNoDrop score-only reviews. Default false.
includeHotelRepliesbooleanNoKeep the hotel's answers. Default true.

Example: reviews for two hotels

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

Example: a city's hotels, then its reviews

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

Example: business reviews only, since a date

{
"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:

FieldTypeDescription
reviewIdnumberHRS's stable id for the review, which you can use to de-duplicate across runs
hotelNamestringThe property, as HRS names it
hotelUrlstringDirect link to the hotel on hrs.com
ratingValuenumberThis guest's overall score, 1-10
positiveCommentstringWhat the guest liked, in their own words
negativeCommentstringWhat the guest disliked, in their own words
hotelReplyPositivestringThe hotel's answer to the praise
hotelReplyNegativestringThe hotel's answer to the criticism
recommendsHotelbooleanWhether the guest would recommend the property
travellerTypestringHRS's guest segment for this review
reviewerAgeGroupstringThe guest's age bracket
reviewDatestringWhen the review was submitted
arrivalDate / departureDatestringThe stay being reviewed
language / localestringThe language the review is written in
scoreBreakfast, scoreQualityOfBeds, …numberTwelve category scores, 1-10
hotelRatingValuenumberThe property's overall average
hotelReviewCountnumberHow many ratings HRS holds for the property
hotelRecommendationRatenumberShare of guests who recommend it

Example review row:

{
"_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

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

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

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
  • 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


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

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.

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


🤝 Support

Telegram Support

Join our active support community


Built by SIÁN Agency | More Tools