HRS Hotel Reviews Scraper
Pricing
from $0.14 / 1,000 guest reviews
HRS Hotel Reviews Scraper
Extract public HRS guest reviews, comments, category ratings, traveler segments, and hotel summaries by hotel URL or ID. Fast HTTP output for reputation monitoring.
Pricing
from $0.14 / 1,000 guest reviews
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Collect current public HRS guest reviews and hotel rating summaries without a login.
Use HRS Hotel Reviews Scraper to turn HRS hotel URLs or numeric hotel IDs into structured review data for reputation monitoring, service-quality analysis, and competitor benchmarking.
The Actor uses fast HTTP requests rather than a browser by default. It separates review records from hotel-level summaries so analysts can export each entity cleanly.
What does HRS Hotel Reviews Scraper do?
The Actor visits public HRS hotel detail pages and extracts the review data that HRS currently exposes there.
For each hotel, it can return:
- 🗣️ current public guest-review records
- 👤 reviewer name and traveler type
- 📅 review timestamp and locale
- 💬 positive, negative, and combined review text
- ⭐ overall review score
- 👍 recommendation signal
- 📊 category-level scores such as cleanliness and value for money
- 🏨 aggregate hotel score and lifetime review count
- 👥 traveler-segment averages and recommendation ratios
- 🔗 canonical HRS source URL and scrape timestamp
HRS can show a lifetime aggregate count larger than the number of review records embedded on the current page. The Actor reports both values honestly and never invents unavailable historical records.
Who is it for?
Hotel groups
Monitor your properties and compare service categories across locations.
Reputation-management agencies
Schedule recurring collection and send normalized comments into sentiment or alerting workflows.
Travel-market analysts
Compare aggregate scores, recommendation ratios, and traveler segments across a hotel set.
Hospitality data teams
Feed typed HRS review records into warehouses, dashboards, notebooks, or language models.
Competitor-intelligence teams
Track visible rating changes for a stable list of competing properties.
Why use this HRS reviews extractor?
Manual copying is slow and loses structured context. This Actor preserves the relationship between a comment, its reviewer, its rating categories, and its hotel.
Key benefits include:
- ⚡ HTTP-first collection with low compute requirements
- 🔁 repeatable inputs for scheduled monitoring
- 🧹 normalized JSON fields across hotels
- 📦 separate
reviewsandsummariesdatasets - 🎯 inclusive date filtering for incremental jobs
- 🧩 direct integrations with Apify API, webhooks, Make, Zapier, and MCP
- 🛡️ fail-closed behavior when useful rating data disappears
What HRS URLs are supported?
Use public hotel detail URLs containing a numeric hotel ID.
https://www.hrs.com/en/hotel/391864https://www.hrs.de/de/hotel/391864
You can also provide the ID directly:
{"hotelIds": ["391864"]}
Locale variants are normalized to the canonical English HRS detail URL for consistent parsing. Search-result pages, booking URLs, and non-HRS URLs are rejected rather than guessed.
Input
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array | example hotel | Public HRS hotel detail URLs |
hotelIds | array | [] | Numeric HRS hotel IDs |
maxReviewsPerHotel | integer | 20 | Maximum currently exposed review records saved per hotel |
cutoffDate | string | none | Keep reviews on or after YYYY-MM-DD |
alwaysReturnSummary | boolean | true | Save a summary even when no review passes the cutoff |
proxyConfiguration | object | none | Optional Apify Proxy settings for rate-limited batches |
Provide at least one URL or hotel ID. Duplicate IDs are fetched only once per run.
Quick-start input
{"startUrls": [{ "url": "https://www.hrs.com/en/hotel/391864" }],"maxReviewsPerHotel": 20,"alwaysReturnSummary": true}
This low-cost input is also suitable for testing an integration.
Incremental monitoring input
Use cutoffDate when a scheduled workflow only needs recent reviews.
The boundary is inclusive.
{"hotelIds": ["391864"],"cutoffDate": "2026-05-01","maxReviewsPerHotel": 100,"alwaysReturnSummary": true}
If no current record meets the cutoff, the summary still provides aggregate rating evidence when alwaysReturnSummary is enabled.
Multiple-hotel input
{"startUrls": [{ "url": "https://www.hrs.com/en/hotel/391864" }],"hotelIds": ["64820", "65907"],"maxReviewsPerHotel": 20}
Hotels are processed conservatively and sequentially to reduce pressure on HRS. One invalid hotel does not discard valid output from other hotels. The run fails when every requested hotel fails extraction.
Review output fields
The default dataset contains one row per current public review.
| Field | Description |
|---|---|
hotelId | Numeric HRS hotel identifier |
hotelName | Hotel name shown by HRS |
reviewerName | Display name or Anonymous |
postedAt | ISO review timestamp |
travelerType | HRS traveler segment, such as BUSINESS |
locale | Review locale supplied by HRS |
positiveComment | Positive guest or hotel comment |
negativeComment | Negative guest or hotel comment |
reviewText | Combined non-empty comment text |
overallScore | Review score on HRS's 10-point scale |
recommended | Whether the reviewer recommends the hotel |
categoryRatings | Named per-review category scores |
sourceUrl | Canonical public hotel page |
scrapedAt | ISO extraction timestamp |
Hotel summary output fields
The summaries dataset contains one row per hotel.
| Field | Description |
|---|---|
hotelId | Numeric HRS hotel identifier |
hotelName | Hotel name |
aggregateScore | Current aggregate score |
aggregateReviewCount | Lifetime count displayed by HRS |
recommendationRatio | Overall percentage recommending the hotel |
categoryAverages | Hotel-wide category averages |
travelerSegments | Segment score and recommendation objects |
reviewsAvailableOnPage | Number of current review records embedded by HRS |
sourceUrl | Canonical public source |
scrapedAt | ISO extraction timestamp |
Example review record
{"hotelId": "391864","hotelName": "Hotel Brandenburger Tor Potsdam","reviewerName": "Jürgen B.","postedAt": "2026-05-29T11:14:44.207Z","travelerType": "BUSINESS","locale": "en","positiveComment": "Die zentrale Lage ist nahezu perfekt.","negativeComment": "","reviewText": "Die zentrale Lage ist nahezu perfekt.","overallScore": 8.4,"recommended": true,"categoryRatings": {"hotelTidiness": 9,"pricePerformanceRatio": 8},"sourceUrl": "https://www.hrs.com/en/hotel/391864","scrapedAt": "2026-07-24T06:24:46.171Z"}
Example hotel summary
{"hotelId": "391864","hotelName": "Hotel Brandenburger Tor Potsdam","aggregateScore": 9.1,"aggregateReviewCount": 70,"recommendationRatio": 95.7,"categoryAverages": {"hotelTidiness": 9,"pricePerformanceRatio": 8.7},"travelerSegments": [{"travelerType": "BUSINESS","averageScore": 9,"recommendationRatio": 92.7}],"reviewsAvailableOnPage": 2,"sourceUrl": "https://www.hrs.com/en/hotel/391864"}
How much does it cost to scrape HRS hotel reviews?
The provisional BRONZE-tier price is:
- $0.005 per run start
- $0.00022859 per review record
- $0.00045718 per hotel summary
Higher Apify subscription tiers receive lower per-event rates. You are charged for records actually saved, not the larger lifetime aggregate count shown by HRS. A one-hotel page exposing two reviews and one summary therefore uses three output events plus the start event. Always check the live pricing panel for the applicable tier price.
Scheduling a reputation monitor
- Create an Apify Task with stable HRS hotel IDs.
- Set a modest
maxReviewsPerHotel. - Add a daily or weekly schedule.
- Store the last successful date in your downstream system.
- Update
cutoffDatefor incremental collection, or deduplicate by hotel ID plus review timestamp. - Send the dataset webhook to your warehouse or alerting service.
A summary row is useful for detecting aggregate-score movement even when no new visible comment appears.
Data-quality tips
- Use hotel IDs as stable join keys; names can change.
- Preserve
sourceUrlfor audit trails. - Interpret category score
0as unavailable; the Actor omits unavailable aggregate categories. - Use
reviewsAvailableOnPageto distinguish current records fromaggregateReviewCount. - Treat traveler segments with no score and no recommendation ratio as unavailable; the Actor omits them.
- Schedule conservatively instead of repeatedly fetching the same hotel every few minutes.
- Test date cutoffs against UTC ISO timestamps in review output.
Integrations
Google Sheets
Export either dataset as CSV or connect an Apify dataset integration for a lightweight reputation tracker.
BigQuery or Snowflake
Load reviews as event-like rows and summaries as a hotel snapshot table keyed by hotelId and scrapedAt.
Make and Zapier
Trigger the Actor from a workflow, wait for completion, and route low scores or negative comments to an operations channel.
Slack or email alerts
Filter new review records by overallScore, recommended, or keywords before sending notifications.
Language-model workflows
Feed reviewText, traveler type, and category ratings into sentiment, topic, or root-cause classification prompts.
JavaScript API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/hrs-hotel-reviews-scraper').call({hotelIds: ['391864'],maxReviewsPerHotel: 20,alwaysReturnSummary: true,});console.log(run.status, run.datasetId);
Named dataset links are available in the Actor run's storage metadata.
Use the default reviews dataset and the summaries alias rather than assuming both entity types share one table.
Python API example
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/hrs-hotel-reviews-scraper').call(run_input={'hotelIds': ['391864'],'maxReviewsPerHotel': 20,'alwaysReturnSummary': True,})print(run['status'])
cURL API example
curl -X POST \'https://api.apify.com/v2/acts/automation-lab~hrs-hotel-reviews-scraper/runs?token=YOUR_APIFY_TOKEN' \-H 'Content-Type: application/json' \-d '{"hotelIds": ["391864"],"maxReviewsPerHotel": 20,"alwaysReturnSummary": true}'
Do not commit an Apify token to source control. Use environment secrets in production automation.
Use with Apify MCP
Connect AI clients through https://mcp.apify.com?tools=automation-lab/hrs-hotel-reviews-scraper.
Claude Code
$claude mcp add --transport http apify https://mcp.apify.com?tools=automation-lab/hrs-hotel-reviews-scraper
Claude Desktop, Cursor, and VS Code
Use the following MCP JSON in Claude Desktop, Cursor, or VS Code, then authorize your Apify account:
{"mcpServers": {"apify-hrs-reviews": {"url": "https://mcp.apify.com?tools=automation-lab/hrs-hotel-reviews-scraper"}}}
Example prompts:
- “Run the HRS hotel reviews scraper for hotel 391864 and summarize recurring service themes.”
- “Compare HRS category averages and recommendation ratios for these hotel IDs.”
- “Collect visible HRS reviews posted since the first day of this month.”
Start with one hotel before scaling a new MCP workflow.
Proxy behavior
Direct HTTP is the default because HRS currently serves useful anonymous server-rendered data. No proxy is required for ordinary small runs.
If HRS rate-limits a larger batch, configure Apify Proxy in the advanced input section. The Actor reuses a hotel-specific proxy session URL and limits request retries. A proxy cannot make an invalid hotel ID valid, and malformed inputs fail before network work begins.
Reliability and error handling
The Actor checks for HTTP success and useful HRS rating evidence. It does not mark challenge pages or empty HTML as successful extraction.
Invalid URL scopes are rejected. Malformed cutoff dates are rejected. Individual hotel failures are logged while valid hotels continue. If every requested hotel fails, the run exits non-zero so schedules and integrations can alert correctly.
Legal and ethical use
This Actor extracts data visible on public HRS hotel pages without authentication. Public availability does not remove your responsibility to follow applicable law, contractual terms, privacy requirements, and reasonable request rates.
Do not use the Actor to identify, harass, or profile individual reviewers. Avoid combining review data with sensitive personal information. Store only what your workflow needs and apply an appropriate retention policy.
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by HRS.
FAQ
Does it scrape every historical HRS review?
No. It saves review records that HRS currently embeds on the public hotel page and separately reports HRS's displayed lifetime aggregate count.
Why is aggregateReviewCount larger than reviewsAvailableOnPage?
The first is HRS's lifetime count; the second is the current set of detailed records publicly embedded in the fetched page. This is expected source behavior.
Can I use only a hotel ID?
Yes.
Add numeric strings or numbers to hotelIds.
Is a proxy required?
Not for the normal public route. Use optional proxy configuration only if your batch receives rate limiting.
Why did my cutoff return no review rows?
No currently exposed review may be on or after the selected date.
Keep alwaysReturnSummary enabled if you still need hotel-level evidence.
Why did the run fail with “No HRS hotel could be extracted”?
Check that each value is a numeric HRS hotel ID or a detail URL containing /hotel/<id>.
Also inspect logs for an HTTP block or a hotel page that no longer exposes rating data.
Can I combine URLs and IDs?
Yes. Duplicates resolve to one hotel request.
What score scale does HRS use?
HRS review and aggregate scores are represented on a 10-point scale on the source pages currently supported.
Related travel and review scrapers
Explore other Automation Lab Actors for adjacent workflows:
Choose an HRS-specific Actor when HRS hotel IDs, HRS traveler segments, and HRS category ratings are required. Use a broader travel Actor when your workflow starts from destinations or search-result discovery rather than known HRS hotel pages.
Support
When reporting a problem, include:
- the public HRS hotel URL or ID
- the run ID
- the approximate run time
- whether a proxy was enabled
- the expected and observed dataset alias
Do not include private credentials or unrelated personal data. A reproducible public hotel URL helps distinguish a source change from an input problem.