# HRS Reviews Scraper ⭐ (`shahidirfan/hrs-reviews-scraper`) Actor

Extract HRS hotel reviews, ratings, guest feedback, review dates, traveler insights, and hotel details at scale. Get structured, analysis-ready data for hospitality research, reputation monitoring, sentiment analysis, competitor tracking, and travel intelligence.

- **URL**: https://apify.com/shahidirfan/hrs-reviews-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Categories:** Travel, Automation, Other
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.99 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

### What does HRS Reviews Scraper do?

HRS Reviews Scraper collects structured hotel reviews, detailed category scores, guest comments, hotel replies, traveler details, and property metadata from HRS hotel URLs. Add one or more public HRS detail links, choose a traveler filter, set the number of reviews you need, and receive an analysis-ready dataset.

The Actor is built for hospitality teams, travel researchers, reputation managers, analysts, and data teams that need HRS guest feedback without manual copying. Results can be downloaded as JSON, CSV, Excel, XML, or connected to another workflow through Apify.

### Why use HRS Reviews Scraper?

- **Complete guest feedback** - Collect positive and negative comments, hotel responses, recommendation signals, and overall scores.
- **Detailed rating breakdowns** - Compare room quality, cleanliness, reception, staff service, breakfast, value, beds, wellness, and other published categories.
- **Traveler segmentation** - Focus on business travelers, private travelers, couples, groups, or families with older children.
- **Hotel context** - Add hotel name, star category, city, country, address, and coordinates to every review.
- **Clean records** - Empty and null values are omitted, while meaningful zero and false values are retained.
- **Duplicate protection** - Repeated hotel URLs and review records are automatically deduplicated.
- **Automation-ready output** - Schedule runs, export datasets, use webhooks, or connect results to dashboards and data pipelines.

### What HRS review data can you extract?

| Field | Type | Description |
|---|---|---|
| `hotel_id` | Number | Numeric HRS hotel identifier |
| `hotel_name` | String | Published hotel name |
| `hotel_status` | String | Current hotel status when available |
| `stars` | Number | HRS star category |
| `city` | String | Hotel city |
| `district` | String | Hotel district when published |
| `country` | String | Hotel country |
| `country_code` | String | Two-letter country code |
| `street` | String | Street address |
| `postal_code` | String | Postal code |
| `latitude` | Number | Hotel latitude |
| `longitude` | Number | Hotel longitude |
| `source_url` | String | Original HRS URL supplied in the input |
| `booking_id` | Number | Public booking reference attached to the review |
| `reviewer_name` | String | Guest display name when published |
| `locale` | String | Review locale |
| `language` | String | Review language code |
| `traveler_type` | String | Business, private, couple, group, or family classification |
| `traveler_age_group` | String | Published traveler age group |
| `arrival_date` | String | Stay arrival timestamp |
| `departure_date` | String | Stay departure timestamp |
| `review_date` | String | Review publication timestamp |
| `average_rating` | Number | Overall score for the individual review |
| `recommended` | Boolean | Whether the guest recommends the hotel |
| `comfort` | String | Published comfort label |
| `positive_comment` | String | Guest's positive feedback |
| `negative_comment` | String | Guest's critical feedback |
| `hotel_positive_response` | String | Hotel reply to positive feedback |
| `hotel_negative_response` | String | Hotel reply to critical feedback |
| `rating_votes` | Object | Detailed category scores for the review |
| `filter` | String | Traveler filter used for the run |
| `filtered_average_rating` | Number | Aggregate score for the selected traveler segment |
| `filtered_ratings_count` | Number | Aggregate rating count for the selected segment |
| `filtered_recommendation_rate` | Number | Recommendation percentage for the selected segment |
| `category_averages` | Object | Average detailed scores for the selected segment |
| `super_category_averages` | Object | Average room, staff, gastronomy, and general hotel scores |

Fields that HRS does not publish for a particular review are not added to that dataset item.

### How to use HRS Reviews Scraper

1. Open the Actor in Apify Console.
2. Add one or more HRS hotel detail URLs in **HRS hotel URLs**.
3. Choose a traveler type in **Filter by traveler type**.
4. Set **Results wanted** and **Maximum pages per hotel**.
5. Configure a proxy only when your workflow requires one.
6. Click **Start** and open the dataset when the run finishes.

### Input parameters

| Parameter | Type | Required | Default | Description |
|---|---|---:|---|---|
| `startUrls` | Array | No | Sample HRS hotel URL | One or more HRS hotel detail URLs containing an `hn`, `hotelId`, or numeric hotel identifier. `INPUT.json` is used only when runtime input is empty. |
| `filter_by` | String | No | `ALLHRS` | Traveler segment: `ALLHRS`, `BUSINESS`, `PRIVATE`, `YOUNG_COUPLE`, `MATURE_COUPLE`, `GROUP`, or `FAMILY_OLDER_CHILDREN` |
| `results_wanted` | Integer | No | `20` | Maximum number of review records to save across all URLs |
| `max_pages` | Integer | No | `5` | Maximum number of 20-review output pages to process per hotel |
| `proxyConfiguration` | Object | No | Direct connection | Optional Apify Proxy or custom proxy settings |

`results_wanted` is the global result limit. For example, a value of `50` saves at most 50 reviews even when several hotel URLs are supplied. `max_pages` is a per-hotel safety cap, with 20 reviews in each logical page.

### Usage examples

#### Collect 20 reviews from one HRS hotel

Use the default traveler filter and collect the newest 20 available review records:

```json
{
  "startUrls": [
    "https://www.hrs.com/en/detail?hn=699596"
  ],
  "filter_by": "ALLHRS",
  "results_wanted": 20,
  "max_pages": 5
}
```

#### Collect business traveler reviews

Limit the dataset to feedback classified as business travel:

```json
{
  "startUrls": [
    "https://www.hrs.com/en/detail?hn=699596"
  ],
  "filter_by": "BUSINESS",
  "results_wanted": 50,
  "max_pages": 3
}
```

#### Collect reviews from multiple localized HRS URLs

Combine supported HRS links in one run and stop when the global result limit is reached:

```json
{
  "startUrls": [
    "https://www.hrs.com/en/detail?hn=699596",
    "https://www.hrs.de/de/detail?hotelId=699596"
  ],
  "filter_by": "PRIVATE",
  "results_wanted": 30,
  "max_pages": 2,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

Duplicate hotel IDs in the same run are processed once.

### Sample output

```json
{
  "hotel_id": 699596,
  "hotel_name": "Titanic Chaussee Berlin",
  "hotel_status": "OPEN",
  "stars": 4,
  "city": "Berlin",
  "country": "Federal Republic of Germany",
  "country_code": "DE",
  "street": "Chausseestr. 30",
  "postal_code": "10115",
  "latitude": 52.5323,
  "longitude": 13.38143,
  "source_url": "https://www.hrs.com/en/detail?hn=699596",
  "booking_id": 301170742,
  "locale": "de",
  "language": "deu",
  "traveler_type": "PRIVATE",
  "traveler_age_group": "UP_TO_59",
  "arrival_date": "2024-09-20T00:00:00Z",
  "departure_date": "2024-09-22T00:00:00Z",
  "review_date": "2024-09-23T14:21:19.149Z",
  "average_rating": 8.9,
  "recommended": true,
  "comfort": "NICE",
  "positive_comment": "Very good value for money.",
  "negative_comment": "Some communication could be improved.",
  "rating_votes": {
    "FRIENDLINESS_OF_RECEPTION": 9,
    "HOTEL_TIDINESS": 9,
    "QUALITY_OF_BEDS": 10,
    "PRICE_PERFORMANCE_RATIO": 9
  },
  "filter": "ALLHRS",
  "filtered_average_rating": 9.2,
  "filtered_ratings_count": 281,
  "filtered_recommendation_rate": 96.8
}
```

### Tips for best results

- Use a full public HRS detail URL with a visible numeric hotel identifier.
- Start with 20 results while testing a new hotel or filter.
- Select `ALLHRS` for the widest review coverage.
- A narrow traveler filter may return fewer reviews than `results_wanted` because the hotel may not have more matching feedback.
- Increase `max_pages` when requesting more than 100 reviews from one hotel.
- Check the dataset preview before scheduling a large recurring run.
- Report a URL that no longer works through the Actor's Issues tab so support can review it.

### Integrations and exports

- **Google Sheets** - Send review records to a shared analysis sheet.
- **CSV and Excel** - Download structured records for reporting and BI work.
- **JSON and XML** - Use machine-readable output in data pipelines.
- **Webhooks** - Notify another service when a run completes.
- **Make and Zapier** - Connect HRS reviews to no-code automations.
- **Apify API** - Start runs and retrieve datasets from your own application.
- **Schedules** - Refresh hotel feedback daily, weekly, or monthly.

### Frequently asked questions

#### Which HRS URLs are supported?

Public `hrs.com` and `hrs.de` hotel URLs are supported when they contain an `hn`, `hotelId`, `hotelIds`, numeric path, or numeric slug identifier. Localized paths, missing `https://`, copied whitespace or brackets, HTML-encoded ampersands, fragments, and percent-encoded URLs are normalized automatically.

#### Can I scrape several hotels in one run?

Yes. Add multiple entries to `startUrls`. The Actor deduplicates repeated hotel IDs and applies `results_wanted` across the complete run.

#### Why did a traveler filter return fewer results than requested?

The hotel has fewer published reviews for that segment. Use `ALLHRS` or another traveler type for broader coverage.

#### Are empty fields included in the dataset?

No. Null, undefined, and empty-string values are removed from each record. Valid zero scores and boolean values remain available.

#### Can I export HRS reviews to CSV or Excel?

Yes. Open the run dataset and choose CSV, Excel, JSON, XML, or another supported Apify export format.

#### Can I schedule recurring HRS review collection?

Yes. Use Apify schedules to run the Actor at your preferred interval and send results through integrations or webhooks.

#### Is it legal to collect HRS reviews?

Collecting public web data can be lawful, but requirements vary by jurisdiction and use case. You are responsible for following applicable laws, HRS terms, privacy rules, and data-use restrictions.

### Related Actors

- [Booking Reviews Scraper](https://apify.com/shahidirfan/booking-reviews-scraper)
- [Expedia Reviews Scraper](https://apify.com/shahidirfan/expedia-reviews-scraper)
- [Tiket Hotel Reviews Scraper](https://apify.com/shahidirfan/tiket-hotel-reviews-scraper)
- [Tripadvisor Reviews Scraper](https://apify.com/shahidirfan/tripadvisor-reviews-scraper)

### Support

For broken URLs, missing fields, filter questions, or feature requests, use the Issues tab on the Actor page. Include a public HRS hotel URL and a short description of the expected result.

### Legal notice

This Actor is intended for legitimate collection and analysis of publicly available hotel review data. Users are responsible for respecting applicable laws, contractual terms, privacy obligations, database rights, and the rights of review authors. Do not use the output for harassment, discrimination, or unlawful profiling.

# Actor input Schema

## `startUrls` (type: `array`):

One or more HRS hotel URLs or hotel IDs. Messy, encoded, localized, and copied links are normalized automatically.

## `filter_by` (type: `string`):

Return all reviews or only reviews from a selected traveler group.

## `results_wanted` (type: `integer`):

Maximum number of review records to save across all supplied URLs.

## `max_pages` (type: `integer`):

Maximum number of 20-review output pages to process for each hotel.

## `proxyConfiguration` (type: `object`):

Optional proxy settings for network routing. Direct requests work for the default QA URL.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.hrs.com/en/detail?hn=699596"
  ],
  "filter_by": "ALLHRS",
  "results_wanted": 20,
  "max_pages": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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 = {
    "startUrls": [
        "https://www.hrs.com/en/detail?hn=699596"
    ],
    "filter_by": "ALLHRS",
    "results_wanted": 20,
    "max_pages": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/hrs-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 = {
    "startUrls": ["https://www.hrs.com/en/detail?hn=699596"],
    "filter_by": "ALLHRS",
    "results_wanted": 20,
    "max_pages": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/hrs-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 '{
  "startUrls": [
    "https://www.hrs.com/en/detail?hn=699596"
  ],
  "filter_by": "ALLHRS",
  "results_wanted": 20,
  "max_pages": 5
}' |
apify call shahidirfan/hrs-reviews-scraper --silent --output-dataset

```

## MCP server setup

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