HRS Hotel Reviews Scraper avatar

HRS Hotel Reviews Scraper

Pricing

from $0.14 / 1,000 guest reviews

Go to Apify Store
HRS Hotel Reviews Scraper

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

Stas Persiianenko

Maintained by Community

Actor 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 reviews and summaries datasets
  • 🎯 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/391864
https://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

FieldTypeDefaultDescription
startUrlsarrayexample hotelPublic HRS hotel detail URLs
hotelIdsarray[]Numeric HRS hotel IDs
maxReviewsPerHotelinteger20Maximum currently exposed review records saved per hotel
cutoffDatestringnoneKeep reviews on or after YYYY-MM-DD
alwaysReturnSummarybooleantrueSave a summary even when no review passes the cutoff
proxyConfigurationobjectnoneOptional 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.

FieldDescription
hotelIdNumeric HRS hotel identifier
hotelNameHotel name shown by HRS
reviewerNameDisplay name or Anonymous
postedAtISO review timestamp
travelerTypeHRS traveler segment, such as BUSINESS
localeReview locale supplied by HRS
positiveCommentPositive guest or hotel comment
negativeCommentNegative guest or hotel comment
reviewTextCombined non-empty comment text
overallScoreReview score on HRS's 10-point scale
recommendedWhether the reviewer recommends the hotel
categoryRatingsNamed per-review category scores
sourceUrlCanonical public hotel page
scrapedAtISO extraction timestamp

Hotel summary output fields

The summaries dataset contains one row per hotel.

FieldDescription
hotelIdNumeric HRS hotel identifier
hotelNameHotel name
aggregateScoreCurrent aggregate score
aggregateReviewCountLifetime count displayed by HRS
recommendationRatioOverall percentage recommending the hotel
categoryAveragesHotel-wide category averages
travelerSegmentsSegment score and recommendation objects
reviewsAvailableOnPageNumber of current review records embedded by HRS
sourceUrlCanonical public source
scrapedAtISO 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

  1. Create an Apify Task with stable HRS hotel IDs.
  2. Set a modest maxReviewsPerHotel.
  3. Add a daily or weekly schedule.
  4. Store the last successful date in your downstream system.
  5. Update cutoffDate for incremental collection, or deduplicate by hotel ID plus review timestamp.
  6. 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 sourceUrl for audit trails.
  • Interpret category score 0 as unavailable; the Actor omits unavailable aggregate categories.
  • Use reviewsAvailableOnPage to distinguish current records from aggregateReviewCount.
  • 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 os
from apify_client import ApifyClient
client = 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.

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.

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.