HRS Hotel Reviews Scraper - Ratings, Replies & Scores
Pricing
from $2.64 / 1,000 hotel reviews
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Ü
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
HRS Hotel Reviews Scraper — Guest Ratings, Scores & Replies 🏨
🎉 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
| 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
{"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:
| 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:
{"_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 ApifyClientclient = 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)
- Trigger: a weekly schedule
- HTTP Request: call the Actor with your hotel list and last week's date in
reviewsFrom - Process: filter rows where
ratingValueis below your threshold - 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.
❓ 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.
HRS and hrs.com are trademarks of HRS GmbH. This actor is not affiliated with, endorsed by, or sponsored by HRS.
🤝 Support
Join our active support community
- For issues or questions, open an issue on the actor's issues board
- Check the SIÁN Agency Store for more automation tools
- 📧 apify@sian-agency.online
Built by SIÁN Agency | More Tools