# HRS Hotel & Reviews Scraper — Hotels, Ratings & Guest Reviews (`haketa/hrs-scraper`) Actor

Scrape hotels and guest reviews from HRS.com. For each hotel get name, star rating, address, coordinates, amenities and the guest score, plus detailed reviews with reviewer type, date, comments, the hotel response and per-category ratings. Export European hotel data as JSON, CSV or Excel.

- **URL**: https://apify.com/haketa/hrs-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Travel, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## HRS Hotel & Reviews Scraper — Hotels, Ratings & Guest Reviews

Collect **hotels and guest reviews from HRS.com** as clean, structured data. For every hotel you get name, star rating, address, coordinates, amenities and the **guest rating** — plus detailed **guest reviews** with reviewer type, date, positive/negative comments, the hotel's response and **per‑category scores** (cleanliness, price/performance, breakfast, beds, service and more).

Built for **travel and hospitality analysts, hotel revenue managers, market researchers, review‑intelligence and data teams** who need European hotel and review data without copying pages by hand.

***

### ✨ Why use this scraper

- **Hotels + reviews together** — each record is a full hotel profile with its embedded guest reviews.
- **Rich per‑category ratings** — every review breaks the score down into cleanliness, price/performance, ambiance, friendliness, breakfast, bed quality, room size, sanitary facilities and service.
- **Hotel intelligence** — star rating, guest score, total review count, amenities, coordinates and address for benchmarking and mapping.
- **Reviewer context** — reviewer name, traveller type (business/leisure), date, language and whether they recommend the hotel — plus the hotel's official response.
- **Bulk or targeted** — scrape specific hotels by URL/ID, or auto‑discover hotels across HRS.
- **7 languages** — pull hotel pages and review text in English, German, Spanish, French, Italian, Dutch or Polish.
- **Clean, typed output** — numbers as numbers, reviews as arrays — ready for spreadsheets, databases and BI tools.
- **Export anywhere** — JSON, CSV, Excel, HTML or via the Apify API and integrations.

***

### 🚀 Quick start

1. Paste one or more **hotel URLs or IDs** (e.g. `https://www.hrs.com/en/hotel/393` or `393`) — or leave empty to auto‑discover hotels.
2. Keep **Include guest reviews** on.
3. Set **Maximum hotels** and click **Start**.

Each hotel comes back as one clean record with its reviews.

***

### 📥 Input

| Field | Type | Description |
|---|---|---|
| **Hotel URLs or IDs** (`hotelUrls`) | array | HRS hotel URLs or numeric IDs. Empty = auto‑discover from the sitemap. |
| **Include guest reviews** (`includeReviews`) | boolean | Add the detailed reviews embedded on each hotel page. |
| **Max reviews per hotel** (`maxReviewsPerHotel`) | integer | Cap reviews per hotel. Empty = all embedded. |
| **Language** (`language`) | select | en, de, es, fr, it, nl, pl. |
| **Maximum hotels** (`maxItems`) | integer | Cap hotels (also caps discovery). |
| **Concurrency** (`maxConcurrency`) | integer | Hotel pages fetched in parallel. |
| **Proxy configuration** (`proxyConfiguration`) | object | Apify Proxy recommended (datacenter is enough). |

#### Example 1 — specific hotels

```json
{
  "hotelUrls": ["393", "14311", "https://www.hrs.com/en/hotel/10520"],
  "includeReviews": true
}
```

#### Example 2 — auto‑discover hotels

```json
{
  "maxItems": 500,
  "includeReviews": true
}
```

#### Example 3 — German pages, hotels only

```json
{
  "hotelUrls": ["393"],
  "language": "de",
  "includeReviews": false
}
```

***

### 📤 Output

Each hotel is one dataset item. Example (trimmed):

```json
{
  "hotelId": 393,
  "name": "Hotel Vignette Collection BRISTOL BERLIN by IHG",
  "stars": 5,
  "url": "https://www.hrs.com/en/hotel/393",
  "language": "en",
  "street": "Kurfürstendamm 27",
  "city": "Berlin",
  "postalCode": "10719",
  "country": "DEU",
  "latitude": 52.50,
  "longitude": 13.33,
  "rating": 8.5,
  "reviewCount": 195,
  "bestRating": 10,
  "worstRating": 1,
  "amenities": ["AIRCONDITIONROOM", "NOSMOKING", "ROOMSAFE", "SPA", "HOTELBAR"],
  "images": ["https://foto.hrsstatic.com/..."],
  "reviewsExtracted": 11,
  "reviews": [
    {
      "reviewerName": "Alexander B.",
      "travellerType": "BUSINESS",
      "date": "2025-11-02T20:43:45.621Z",
      "locale": "en",
      "overallRating": 5.7,
      "positiveComment": "…",
      "negativeComment": "…",
      "hotelResponse": "Thank you for your feedback …",
      "recommends": false,
      "categoryRatings": {
        "hotelTidiness": 10,
        "pricePerformanceRatio": 8,
        "hotelAmbiance": 3,
        "friendlinessOfReception": 5,
        "breakfastService": 9,
        "qualityOfBeds": 6,
        "roomConfiguration": 5,
        "roomSize": 5,
        "sanitaryFacilities": 8,
        "serviceOfHotelEmployees": 5
      }
    }
  ],
  "scrapedAt": "2026-08-28T10:00:00.000Z"
}
```

#### Field reference

**Hotel**

| Field | Description |
|---|---|
| `hotelId` | HRS hotel ID. |
| `name`, `stars` | Hotel name and HRS star rating. |
| `url`, `language` | Hotel page URL and language. |
| `street`, `city`, `postalCode`, `region`, `country` | Address. |
| `latitude`, `longitude` | Coordinates. |
| `rating`, `reviewCount` | Guest rating (out of 10) and number of reviews. |
| `bestRating`, `worstRating` | Rating scale. |
| `amenities` | Amenity codes (WiFi, parking, spa, air‑con …). |
| `images` | Hotel photo URLs. |

**Review** (inside `reviews[]`)

| Field | Description |
|---|---|
| `reviewerName` | Reviewer name (often first name + initial or "Anonymous"). |
| `travellerType` | `BUSINESS`, `LEISURE`, etc. |
| `date`, `locale` | Review date and language. |
| `overallRating` | Overall score for the stay. |
| `positiveComment`, `negativeComment` | What the guest liked / disliked. |
| `hotelResponse` | The hotel's official reply. |
| `recommends` | Whether the guest recommends the hotel. |
| `categoryRatings` | Per‑category scores (cleanliness, price/performance, breakfast, beds, service …). |

> **Note on reviews:** HRS shows the most relevant reviews with text on each hotel page (typically up to ~10–20). Many HRS ratings are scores without text; those are reflected in `rating` and `reviewCount`.

***

### 💡 Use cases

- **Hotel revenue & market managers** — benchmark your property's rating and per‑category scores against competitors in the same city.
- **Review intelligence** — analyse what guests praise and complain about, by category and traveller type.
- **Travel & hospitality research** — build datasets of European hotels with ratings, amenities and locations.
- **Reputation monitoring** — track a hotel group's ratings and responses over time.
- **Data & ML teams** — collect structured hotel + review data for models and dashboards.

***

### 🎯 Tips for best results

- **Target review‑rich hotels** — larger city hotels have more text reviews per page; small properties may have only ratings.
- **Pick a language** — review text and hotel info come back in the language you choose.
- **Turn reviews off for speed** — set **Include guest reviews** off when you only need hotel profiles and ratings.
- **Filter after export** — pull broadly, then slice by `stars`, `rating`, `city` or `categoryRatings` in your spreadsheet or database.

***

### 🔌 Run it your way

- **Apify Console** — paste hotels and click Start.
- **API** — start runs and pull the dataset programmatically.
- **Scheduler** — refresh hotel ratings and reviews on a schedule.
- **Integrations** — push results to Google Sheets, Zapier, Make, webhooks, S3 and more.

***

### ❓ FAQ

**What data do I get per hotel?**
Hotel profile (name, stars, address, coordinates, amenities, images), the guest rating and review count, and the detailed guest reviews embedded on the page with per‑category scores.

**Do I need an account or API key?**
No. Just paste hotel URLs/IDs or let it auto‑discover.

**How many reviews per hotel?**
The reviews shown on each hotel page — typically up to ~10–20 with text. HRS ratings without text are summarised in `rating` and `reviewCount`.

**Can I scrape many hotels at once?**
Yes — leave the hotel list empty to auto‑discover hotels, capped by **Maximum hotels**.

**Which languages are supported?**
English, German, Spanish, French, Italian, Dutch and Polish.

**In what format is the data?**
Structured JSON by default, exportable to CSV, Excel, HTML and more.

**Can I run it on a schedule?**
Yes — use the Apify Scheduler, or start runs through the Apify API and its integrations.

***

### ⚖️ Legal & responsible use

This tool collects **publicly available** hotel and review information for legitimate business use such as market research, benchmarking and reputation analysis. You are responsible for how you use the data and for complying with all applicable laws and regulations, the website's terms, and data‑protection rules (including GDPR where relevant). Do not use the output to infringe intellectual‑property rights, to publish personal data unlawfully, or for any unlawful purpose. This scraper is not affiliated with, endorsed by, or connected to HRS; all trademarks belong to their respective owners.

***

#### Tags

`hrs` · `hrs scraper` · `hotel scraper` · `hotel reviews` · `guest reviews` · `hotel ratings` · `travel data` · `hospitality` · `europe hotels` · `review scraper` · `hotel data` · `booking` · `market research` · `reputation` · `hotel intelligence`

# Actor input Schema

## `hotelUrls` (type: `array`):

HRS hotel page URLs (e.g. https://www.hrs.com/en/hotel/393) or plain numeric hotel IDs. Leave empty to discover hotels automatically from the HRS sitemap.

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

Alternative way to pass HRS hotel URLs.

## `includeReviews` (type: `boolean`):

Add the detailed guest reviews embedded on each hotel page (reviewer, date, comments, per-category scores).

## `maxReviewsPerHotel` (type: `integer`):

Cap the number of reviews saved per hotel. Leave empty for all embedded reviews.

## `language` (type: `string`):

HRS site language for hotel pages and review text.

## `maxItems` (type: `integer`):

Stop after scraping this many hotels (also caps sitemap discovery).

## `maxConcurrency` (type: `integer`):

How many hotel pages to fetch in parallel.

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

Apify Proxy is recommended (datacenter is enough; residential is used as a fallback).

## Actor input object example

```json
{
  "hotelUrls": [
    "393",
    "https://www.hrs.com/en/hotel/162"
  ],
  "includeReviews": true,
  "language": "en",
  "maxItems": 100,
  "maxConcurrency": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "hotelUrls": [
        "https://www.hrs.com/en/hotel/393",
        "https://www.hrs.com/en/hotel/14311"
    ],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/hrs-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 = {
    "hotelUrls": [
        "https://www.hrs.com/en/hotel/393",
        "https://www.hrs.com/en/hotel/14311",
    ],
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/hrs-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 '{
  "hotelUrls": [
    "https://www.hrs.com/en/hotel/393",
    "https://www.hrs.com/en/hotel/14311"
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/hrs-scraper --silent --output-dataset

```

## MCP server setup

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