# HolidayCheck Scraper \[$0.9💰] | Reviews | Owner Replies (`ahmed_jasarevic/holidaycheck-scraper`) Actor

Extract HolidayCheck hotel reviews, per-criteria ratings, owner replies and hotel summaries for reputation monitoring and market research. German-language review data from holidaycheck.de, .at and .ch - no API key required.

- **URL**: https://apify.com/ahmed\_jasarevic/holidaycheck-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## HolidayCheck Scraper — Hotel Reviews, Ratings & Owner Reply Data

HolidayCheck Scraper extracts full guest review histories, per-criteria ratings, owner replies, photos and hotel summaries from [holidaycheck.de](https://www.holidaycheck.de) (.de, .at, .ch) — the largest German-speaking hotel review platform, with 10+ million hotel ratings — for hotel reputation monitoring, DACH market research and guest feedback analysis. No API key and no browser needed: reviews are parsed directly from the public page data.

### Hotel Reputation Monitoring, Market Research & Guest Feedback Analysis

- **Hotel reputation monitoring** — track new reviews, rating changes and owner replies for your property, chain or client portfolio on a daily basis.
- **DACH hotel market research & competitive benchmarking** — compare per-criteria scores (service, location, food, room, sport) across competing hotels in Germany, Austria and Switzerland.
- **Guest feedback & sentiment analysis** — every review row includes topic-level sentiment (positive/neutral/negative) with the exact guest quotes behind it, ready for NLP pipelines.
- **Hotel review datasets for analytics SaaS & dashboards** — build structured review databases (titles, full texts, ratings, travel dates) that feed BI tools, review widgets and hospitality software.
- **Travel agency & tour operator supplier monitoring** — keep an eye on the hotels you sell, by season and traveller type (couple, family, single, friends).
- **Hospitality research & tourism studies** — collect German-language review corpora with reviewer age groups and rating distributions for academic analysis.

### Why Scrape HolidayCheck Reviews Instead of Using an API?

HolidayCheck offers a partner XML API, but it is only available to approved partners with a partner token and covers a limited field set. This actor needs **no official API key and no partner agreement**: it reads the data HolidayCheck already serves publicly on each hotel page and returns much richer fields — full review texts, per-criteria ratings, owner replies, topic sentiment with quotes, photo URLs and aggregated rating facets.

### How HolidayCheck Scraper Works

HolidayCheck is an isomorphic React app that embeds its complete server-side state (`window.__FLUXIBLE_STATE__`) in every served HTML page. This actor fetches the hotel review page, parses that state blob (no browser rendering, no CAPTCHA solving, no login) and maps the three data stores into clean rows:

1. **HotelStore** → hotel profile, aggregate rating, per-aspect-group ratings, contact data, geo coordinates.
2. **HotelReviewStore** → up to 10 reviews per page with titles, texts, criteria ratings, reviewer meta, owner comments and media.
3. **ReviewFacetsStore** → aggregated breakdowns by traveller type, age group, season, rating distribution and room type.

Pagination (`?p=2`, `?p=3`, ...) runs automatically until your review limit is reached. `got-scraping` sends a browser-like TLS fingerprint that passes HolidayCheck's Akamai bot protection on most runs — no proxy needed for typical jobs.

### Configure Hotel URLs and Review Limits

| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
| `startUrls` | array | ✅ Yes | — | HolidayCheck hotel URLs: review pages (`/hr/bewertungen-{slug}/{uuid}`), hotel info pages (`/hi/{slug}/{uuid}`), short review URLs (`/hr/{uuid}`) or bare hotel UUIDs. |
| `maxReviewsPerHotel` | integer | No | `100` | Max reviews per hotel. `0` = all available reviews for the hotel. |
| `maxItems` | integer | No | `1000` | Max dataset rows (reviews + hotel summaries). `0` = unlimited, bounded by the crawl request cap. |
| `includeHotelSummary` | boolean | No | `true` | Push one summary row per hotel (aggregate ratings, contact info, facets) to the separate *summaries* dataset. |
| `maxConcurrency` | integer | No | `3` | Pages fetched in parallel (1–20). Raise to 10–20 when proxy is enabled. |
| `requestDelayMs` | integer | No | `1200` | Base delay between requests. Effective rate ≈ concurrency ÷ delay. |
| `proxy` | object | No | off | Apify proxy configuration. Off by default; residential proxy recommended for large production runs. |

### Extracted HolidayCheck Review Data

Output is split into two datasets:

**Default dataset — one row per guest review:**

| Field | Description |
|---|---|
| `rating01` | Internal HolidayCheck quality score (0–1 scale) |
| `rating16` | Computed public-facing rating (1–6 scale) |
| `criteriaRatings` | Per-criteria scores (GENERAL\_SERVICE, GENERAL\_LOCATION, GASTRONOMY, PRICE\_PERFORMANCE, ROOM\_CONDITION, ...) |
| `recommendation` / `proofedReservation` | Recommends the hotel / verified booking flags |
| `entryDate` / `travelDate` | Review publication and travel dates |
| `traveledWith` / `originalLocale` | Traveller type and review language |
| `reviewer` | First name, age group, review count (public reviewer meta) |
| `ownerReply` | Hotel owner reply text and date, when present |
| `topics` | Topic-level sentiment (1 positive / 0 neutral / -1 negative) with extracted quotes |
| `photos` | Uploaded photo IDs, titles and CDN URLs |
| `text` / `title` | Full review text (when provided by the reviewer) and title |

**Summaries dataset — one row per hotel:** `hotelId`, `name`, `stars`, `rating`, `recommendation`, `reviewCount`, `pictureCount`, `videoCount`, `address`, `phone`, `email`, `geo`, `location`, `ratingPerAspectGroup`, `reviewCalculations`, `facilities`, `descriptions`, `latestAward`, `reviewFacets`, `scrapedAt`.

### Example Scrape Configuration

```json
{
  "startUrls": [
    {
      "url": "https://www.holidaycheck.de/hr/bewertungen-welcome-hotel-marburg/6b587da3-8bf9-36e1-9fa1-1166d588f4ec"
    }
  ],
  "maxReviewsPerHotel": 100,
  "maxItems": 1000,
  "includeHotelSummary": true
}
```

### Example Review Output

```json
{
  "recordType": "REVIEW",
  "reviewId": "c615a24d-...",
  "hotelId": "6b587da3-8bf9-36e1-9fa1-1166d588f4ec",
  "hotelName": "Welcome Hotel Marburg",
  "title": "Empfehlenswert",
  "text": "Ich hatte ein schönes Zimmer mit Klimaanlage...",
  "rating01": 0.8,
  "rating16": 4.8,
  "criteriaRatings": {
    "GENERAL_LOCATION": 1,
    "GENERAL_SERVICE": 0.8,
    "GASTRONOMY": 1
  },
  "traveledWith": "SINGLE",
  "recommendation": true,
  "proofedReservation": true,
  "entryDate": "2026-08-04T10:11:12.000Z",
  "travelDate": "2026-07-01T00:00:00.000Z",
  "reviewer": {
    "firstName": "Brigitte",
    "ageGroup": "FROM_61_TO_65",
    "hotelReviewCount": 1
  },
  "ownerReply": {
    "text": "Liebe Brigitte, vielen Dank...",
    "date": "2026-08-21T00:00:00.000Z"
  },
  "topics": [
    { "id": "SERVICE", "name": "Service", "sentiment": 1, "quotes": ["..."] }
  ],
  "photos": [
    {
      "id": "0590791d-...",
      "title": "Sonstiges",
      "url": "https://media-cdn.holidaycheck.com/w_768,h_432,c_fill,q_auto,f_auto/ugc/images/0590791d-..."
    }
  ],
  "reviewUrl": "https://www.holidaycheck.de/hr/...",
  "scrapedAt": "2026-09-01T08:00:00.000Z"
}
```

### Integrations & Automation

- **Apify API** — run the actor from any codebase (`apify-client` for JS/TS and Python, or the REST API) and stream results to your own systems.
- **Webhooks** — get notified the moment a run finishes so new reviews flow straight into your reputation workflow.
- **Apify MCP server** — call this actor from AI agents (Claude, GPT, any MCP client) to fetch review data on demand.
- **Scheduling** — for **daily reputation monitoring**, schedule a run each morning with a small `maxReviewsPerHotel` on your own hotels; for **weekly market research**, re-run competitor sets and diff the ratings. Recurring runs also improve the actor's visibility in the Apify Store recommender.

### Related Actors

- [Holidaycheck.de Reviews Scraper](https://apify.com/shahidirfan/Holidaycheck-de-Reviews-Scraper) — the most-used HolidayCheck review actor on the Apify Store.
- [Hotel Review Aggregator](https://apify.com/h_reviews/hotel-review-aggregator) — one dataset across TripAdvisor, Booking.com, Google Maps and more for multi-platform reputation coverage.
- [HolidayCheck Reviews Scraper](https://apify.com/one_house/holidaycheck-reviews-scraper) — HolidayCheck reviews and owner replies by hotel URL or UUID.
- [TripAdvisor Reviews Scraper](https://apify.com/theagents/tripadvisor-reviews) — high-volume TripAdvisor reviews for international coverage.
- [Booking.com Reviews Scraper](https://apify.com/voyager/booking-reviews-scraper) — Booking.com guest reviews for OTA review tracking.

### Competitive Positioning

| Capability | This actor | one\_house / holidaycheck-reviews-scraper | shahidirfan / Holidaycheck-de-Reviews-Scraper |
|---|---|---|---|
| Accepts bare hotel UUIDs | ✅ (review URL, info URL, short URL or UUID) | ✅ (separate `hotelIds` input) | ❌ (URLs only) |
| Downloadable hotel-summary dataset | ✅ separate `summaries` dataset via API | ❌ summary stored in key-value store | — |
| Runs without a proxy on typical jobs | ✅ (TLS fingerprint; proxy optional) | ⚠️ residential recommended against 403s | proxy config available |

*Comparison based on the public input schemas and READMEs of these actors at research time. Verify before choosing.*

### FAQ

#### Why use this actor instead of the official HolidayCheck API?

The official HolidayCheck API is a partner XML API: it requires an approved partner account and partner token, and it exposes a limited field set. This actor needs no API key and no partner agreement, returns data HolidayCheck publishes publicly on hotel pages, and adds fields the partner API does not cover for typical consumers — full review texts, per-criteria ratings, owner replies, topic sentiment with quotes, photos and rating facets.

#### What are the alternatives to this actor?

Platform-side alternatives are HolidayCheck's partner XML API (partner-gated) and manual CSV export (not offered by HolidayCheck). Other Apify actors cover HolidayCheck reviews (e.g. one\_house, shahidirfan) or other German-relevant platforms such as Booking.com. For multi-platform hotel reputation data, combine this actor with the [Hotel Review Aggregator](https://apify.com/h_reviews/hotel-review-aggregator).

#### Can I get ALL reviews of a hotel, not just a sample?

Yes. Set `maxReviewsPerHotel: 0` to fetch every review HolidayCheck has for the hotel (still bounded by `maxItems` and the platform's crawl cap).

#### Does it work for holidaycheck.at and holidaycheck.ch?

Yes. The actor works for the German-speaking HolidayCheck portals (.de, .at, .ch). Past the review URL or a hotel UUID on any of these, and the result is the same structured data.

#### Does the actor need a proxy?

Usually not. `got-scraping`'s browser-like TLS fingerprint passes HolidayCheck's Akamai Bot Manager on most runs. For large production runs from shared platform IPs, enable the Apify proxy — residential is recommended.

#### How are HolidayCheck ratings scaled?

HolidayCheck stores a quality score on a 0–1 internal scale. This actor returns both `rating01` (internal 0–1) and `rating16` (the public-facing 1–6 scale), plus per-criteria ratings on the 0–1 scale — no manual conversion needed.

#### Why are two datasets returned?

Reviews and hotel summaries have different shapes, so they live in separate datasets: the default dataset holds one row per guest review, and the `summaries` dataset holds one aggregated row per hotel (rating, per-criteria scores, contact info, review facets). Read both to pair review-level and hotel-level data.

#### How do hotels use owner replies in reputation management?

Responding to reviews is a core part of hotel reputation management. This actor includes the owner reply text and date on each review row, so you can monitor which reviews have been answered, spot unanswered negative feedback, and track reply coverage over time.

### SEO Keywords

holidaycheck scraper, holidaycheck api, holidaycheck reviews data, holidaycheck.de reviews, hotel review scraper, hotel reviews dataset, hotel reputation monitoring, hotel guest feedback analysis, hotel sentiment analysis, german hotel reviews, hotel market research dach, hotel competitive benchmarking, hotelbewertungen scrapen, hotelbewertungen auswerten, hotelbewertungen exportieren, hotel owner review responses, hospitality review analytics, hotel rating data, holidaycheck alternative, hotel quality score data

### For AI Agents & LLM Apps

**Purpose:** One run returns structured rows for any HolidayCheck hotel — every guest review as a dataset row, plus one aggregated hotel-summary row per hotel (separate `summaries` dataset).

**Minimal working input** (only the required field):

```json
{
  "startUrls": [
    { "url": "https://www.holidaycheck.de/hr/bewertungen-welcome-hotel-marburg/6b587da3-8bf9-36e1-9fa1-1166d588f4ec" }
  ]
}
```

**Full-history variant** (all reviews + hotel summary):

```json
{
  "startUrls": [
    { "url": "https://www.holidaycheck.de/hr/bewertungen-welcome-hotel-marburg/6b587da3-8bf9-36e1-9fa1-1166d588f4ec" }
  ],
  "maxReviewsPerHotel": 0,
  "maxItems": 5000,
  "includeHotelSummary": true
}
```

**Output fields (review rows):** `reviewId`, `hotelId`, `hotelName`, `title`, `text`, `rating01`, `rating16`, `criteriaRatings`, `traveledWith`, `recommendation`, `proofedReservation`, `entryDate`, `travelDate`, `originalLocale`, `reviewer` (firstName, ageGroup, hotelReviewCount, hasPublicProfile), `ownerReply` (text, date), `topics` (id, name, sentiment, quotes), `additional`, `photos` (id, title, description, url), `reviewUrl`, `scrapedAt`.

**Output fields (summary rows, separate dataset):** `hotelId`, `name`, `stars`, `rating`, `recommendation`, `reviewCount`, `pictureCount`, `videoCount`, `address`, `phone`, `email`, `geo`, `location`, `ratingPerAspectGroup`, `reviewCalculations`, `facilities`, `descriptions`, `latestAward`, `reviewFacets`, `scrapedAt`.

**Behaviors an agent should know:**

- `startUrls` is required and accepts review URLs (`/hr/...`), hotel info URLs (`/hi/...`), short URLs (`/hr/{uuid}`) or a bare hotel UUID.
- `maxReviewsPerHotel` (default `100`) — set `0` to fetch the hotel's full review history.
- `maxItems` (default `1000`) caps total dataset rows (reviews + summaries); `0` allows more but the crawl is capped at 1000 page requests.
- With `includeHotelSummary: true` (default), one SUMMARY row per hotel lands in the **separate `summaries` dataset** — read both storages.
- Rating scales: `rating01` is HolidayCheck's internal 0–1 score; `rating16` is the computed public 1–6 scale; per-criteria ratings in `criteriaRatings` are 0–1.
- Free (non-paying) runs are limited to 10 review rows; hotel summary rows are free.
- Use the Apify proxy (`proxy.useApifyProxy: true`, residential groups) for large multi-hotel runs to reduce blocking.

**Billing:** pay-per-result — $0.0009 per review row plus a small per-start event (BRONZE tier); hotel summary rows free; free tier covers 10 review rows per run.

### Legal & Compliance Disclaimer

This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by HolidayCheck AG. It accesses only publicly available HolidayCheck pages — no login, no CAPTCHA solving, no bypass of access controls. Users are responsible for complying with HolidayCheck's Terms of Service and applicable data-protection law (GDPR for EU data). The output can include reviewer first names and age groups and hotel business contact details that are published publicly; such personal data must not be used for unsolicited commercial outreach in violation of applicable law (e.g. GDPR, CAN-SPAM, TCPA).

# Actor input Schema

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

HolidayCheck hotel URLs to scrape. Accepts review pages (https://www.holidaycheck.de/hr/bewertungen-{slug}/{uuid}), hotel info pages (/hi/...), short review URLs (/hr/{uuid}) or bare hotel UUIDs.

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

Maximum number of reviews to scrape per hotel. Set 0 to fetch all available reviews (bounded by Max items).

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

Maximum number of dataset rows (reviews + hotel summaries) to produce. Set 0 for unlimited (bounded by the crawl request cap).

## `includeHotelSummary` (type: `boolean`):

Push one summary row per hotel with aggregate rating, per-criteria ratings, contact info and review facets.

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

Number of pages fetched in parallel. Higher = faster but increases the chance of being blocked without a proxy. With Apify proxy enabled you can safely go up to 10-20.

## `requestDelayMs` (type: `integer`):

Base delay before each request to avoid rate-limiting. The effective request rate is (concurrency / delay). Lower = faster, higher = safer.

## `proxy` (type: `object`):

Select proxies to be used by your crawler.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.holidaycheck.de/hr/bewertungen-welcome-hotel-marburg/6b587da3-8bf9-36e1-9fa1-1166d588f4ec"
    }
  ],
  "maxReviewsPerHotel": 100,
  "maxItems": 1000,
  "includeHotelSummary": true,
  "maxConcurrency": 3,
  "requestDelayMs": 1200,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `reviews` (type: `string`):

All scraped guest reviews (one row per review).

## `summaries` (type: `string`):

One hotel summary row per hotel (aggregate ratings, contact info, facets).

# 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": [
        {
            "url": "https://www.holidaycheck.de/hr/bewertungen-welcome-hotel-marburg/6b587da3-8bf9-36e1-9fa1-1166d588f4ec"
        }
    ],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/holidaycheck-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": [{ "url": "https://www.holidaycheck.de/hr/bewertungen-welcome-hotel-marburg/6b587da3-8bf9-36e1-9fa1-1166d588f4ec" }],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/holidaycheck-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": [
    {
      "url": "https://www.holidaycheck.de/hr/bewertungen-welcome-hotel-marburg/6b587da3-8bf9-36e1-9fa1-1166d588f4ec"
    }
  ],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call ahmed_jasarevic/holidaycheck-scraper --silent --output-dataset

```

## MCP server setup

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