HolidayCheck Hotel Reviews Scraper avatar

HolidayCheck Hotel Reviews Scraper

Pricing

from $0.49 / 1,000 results

Go to Apify Store
HolidayCheck Hotel Reviews Scraper

HolidayCheck Hotel Reviews Scraper

Extracts the full guest review history for any hotel on HolidayCheck (.de/.at/.ch) by hotel URL, including per-topic sentiment and rating facets.

Pricing

from $0.49 / 1,000 results

Rating

0.0

(0)

Developer

Ibnu Adzim

Ibnu Adzim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Extracts the full guest review history for any hotel listed on HolidayCheck (holidaycheck.de, .at, or .ch) — just give it the hotel page link.

Why use this actor

  • No account, no login, and no API key needed — works on public hotel pages only.
  • Returns every guest review up to your chosen limit, not just the first page: review title, the guest's own recommendation, travel date, party type, room type, tour operator, and whether the stay was a verified booking.
  • Includes HolidayCheck's structured detail you can't get from a plain review list: per-topic sentiment with the exact quotes behind it (location, parking, food, cleanliness, service…) and the guest's individual answers to HolidayCheck's rating questionnaire.
  • Each hotel also gets a summary row with the star rating, average score, recommendation rate, address and contact details, plus the full rating histogram and traveller-type/season/age-group breakdowns.
  • Stable JSON that drops straight into a spreadsheet, database, or analysis pipeline.
  • Every hotel you submit gets at least one output row — including a clear diagnostic reason on the rare rows that couldn't be fetched, so nothing silently disappears from your results.

How it works

  1. You give the actor one or more HolidayCheck hotel page links (or bare hotel IDs).
  2. For each hotel, it reads the hotel profile and then pages through that hotel's review history until it reaches your limit or runs out of reviews.
  3. Results are streamed to your dataset as they finish, with automatic retries when HolidayCheck is temporarily unresponsive.
  4. You export the finished dataset as JSON, CSV, or Excel straight from the Apify Console — no scrapers, browsers, or blocks to babysit.

Input

{
"hotelUrls": [
"https://www.holidaycheck.de/hr/bewertungen-centrovital-hotel-berlin/454268e5-f1bb-304e-a92d-d4c994ae43c6"
],
"maxReviewsPerHotel": 300,
"maxConcurrency": 3,
"proxyConfiguration": { "useApifyProxy": false }
}
FieldTypeDescription
hotelUrlsarray of stringsHolidayCheck hotel page URLs (.de, .at or .ch). Both the reviews tab (/hr/...) and the hotel-info tab (/hi/...) work, and a bare hotel ID such as 454268e5-f1bb-304e-a92d-d4c994ae43c6 is also accepted.
maxReviewsPerHotelintegerStop after this many reviews per hotel. HolidayCheck serves 10 reviews per page, so a hotel with 1,000+ reviews needs 100+ page reads — hence the default cap. Set to 0 to fetch every review. Default 300.
maxConcurrencyintegerHow many hotels to process at the same time. Default 3.
proxyConfigurationobjectProxy settings. Off by default; Residential is recommended for large production runs.

Output

Each hotel produces one summary row plus one review row per guest review. Real examples from a live run:

Summary row (recordType: "SUMMARY") — truncated:

{
"_input": "https://www.holidaycheck.de/hr/bewertungen-centrovital-hotel-berlin/454268e5-f1bb-304e-a92d-d4c994ae43c6",
"_source": "S1-fluxible-state",
"_scrapedAt": "2026-08-10T18:14:28Z",
"recordType": "SUMMARY",
"reviewUrl": "https://www.holidaycheck.de/hr/454268e5-f1bb-304e-a92d-d4c994ae43c6",
"totalReviewCount": 1089,
"indexedReviewsCount": 71,
"hotelId": "454268e5-f1bb-304e-a92d-d4c994ae43c6",
"name": "centrovital Hotel Berlin",
"stars": 4.5,
"rating": 4.975282211088373,
"recommendation": 0.8662317836962519,
"reviewCount": 1089,
"pictureCount": 444,
"phone": "+49 30 818750",
"email": "info@centrovital-berlin.de",
"address": "Brauereihof 6\r\n13585\r\nBerlin\r\nBerlin\r\nDeutschland",
"geo": { "type": "Point", "coordinates": [13.2108027, 52.5467968] },
"reviewFacets": {
"season": { "spring": { "count": 236 }, "summer": { "count": 301 }, "autumn": { "count": 289 }, "winter": { "count": 263 } },
"traveledWith": { "COUPLE": { "count": 571 }, "SINGLE": { "count": 288 }, "FAMILY": { "count": 133 }, "FRIENDS": { "count": 95 } },
"ratingRounded": { "1": { "count": 10 }, "2": { "count": 18 }, "3": { "count": 42 }, "4": { "count": 105 }, "5": { "count": 446 }, "6": { "count": 468 } }
}
}

Review row (recordType: "REVIEW") — truncated:

{
"_input": "https://www.holidaycheck.de/hr/bewertungen-centrovital-hotel-berlin/454268e5-f1bb-304e-a92d-d4c994ae43c6",
"_source": "S1-fluxible-state",
"_scrapedAt": "2026-08-10T18:14:28Z",
"recordType": "REVIEW",
"id": "495fa2b2-4da6-442a-a3da-99c11aba7ec2",
"title": "Gutes Konzept, aber mittlerweile verbesserungswürdig",
"traveledWith": "COUPLE",
"user": {
"id": "ab40ab36-6411-3183-be4d-dec0d334f972",
"firstName": "Uwe",
"ageGroup": "FROM_61_TO_65",
"hasPublicProfile": true,
"hotelReviewCount": 260
},
"entryDate": 1780910793000,
"travelDate": 1780272000000,
"hotel": { "id": "454268e5-f1bb-304e-a92d-d4c994ae43c6", "name": "centrovital Hotel Berlin" },
"originalLocale": "de",
"recommendation": true,
"proofedReservation": false,
"additional": { "costPerformance": "ACCEPTABLE", "roomType": null, "roomView": null },
"topics": [
{
"id": "LOCATION_AND_SURROUNDING",
"name": "Lage und Umgebung",
"sentiment": 1,
"quotes": [
"Es handelt sich um ein ans ich schönes Hotel an den Spandauer Seen gelegen auf einem alten Brauerei - Gelände.",
"Die öffentlichen Verkehrsmittel fahren fast direkt vor der Tür und man ist auch schnell an der U-Bahn."
]
},
{ "id": "PARKING", "name": "Parken", "sentiment": -1, "quotes": ["Parkplätze sind jedoc …"] },
"… 16 more"
],
"contributions": {
"ROOM_SIZE": { "value": "1", "text": "Zimmergröße", "inputType": "RATING", "rating": { "sentiment": 1 } },
"PUBLIC_TRANSPORT": { "value": "YES", "text": "ÖPNV-Erreichbar", "inputType": "CHOICES" },
"SERVICE_OPINION": { "value": "Personal war freundlich und hilfsbereit, jedoch …", "text": "Erfahrungen mit dem Service", "inputType": "TEXT" }
},
"hasMedia": true,
"mediaList": ["… 13 items"]
}

When the input isn't a recognisable HolidayCheck hotel link, the actor still emits one row for that input with a clear reason:

{
"_input": "https://example.com/nope",
"_source": "none",
"_scrapedAt": "2026-08-10T18:14:28Z",
"recordType": "ERROR",
"_error": "invalid_input",
"_errorDetail": "Expected a holidaycheck.de/.at/.ch hotel URL containing a hotel UUID (e.g. https://www.holidaycheck.de/hr/bewertungen-<slug>/<uuid>) or a bare hotel UUID."
}
FieldTypeDescription
_inputstringThe hotel URL or ID you submitted.
_sourcestringWhich internal strategy produced this row. "none" on a failed row.
_scrapedAtstringUTC timestamp of when this row was produced.
recordTypestring"SUMMARY", "REVIEW", or "ERROR".
totalReviewCountintegerHow many reviews this hotel has in total (summary row).
reviewFacetsobjectRating histogram plus season / traveller-type / age-group / room-type breakdowns (summary row).
idstringHolidayCheck's stable ID for this review — safe to de-duplicate on.
titlestringThe review headline written by the guest.
recommendationbooleanWhether the guest recommends the hotel.
proofedReservationbooleanWhether HolidayCheck verified the stay against a real booking.
travelDate / entryDateintegerWhen the guest travelled / posted, as Unix milliseconds.
topicsarrayPer-topic sentiment (1, 0, -1) with the exact quotes from the review that produced it.
contributionsobjectThe guest's individual answers to HolidayCheck's rating questionnaire, keyed by question.
mediaListarrayPhotos the guest uploaded with the review.
_errorstringPresent only on rows that couldn't be fetched, e.g. invalid_input, fetch_failed.
_errorDetailstringHuman-readable detail for the error, present only alongside _error.
(all other fields)On a successful row, every field HolidayCheck publishes for that hotel/review is passed through unchanged.

Notes / limits

  • HolidayCheck is a German-language site: review text, titles, and topic names come back in German (the review's own language is reported in originalLocale).
  • Reviews are served 10 per page, so a hotel with 1,000+ reviews is a long run. Keep maxReviewsPerHotel at a sensible cap unless you really need the whole history.
  • Reviewer names are first names only — that is all HolidayCheck publishes.
  • The same hotel ID works on all three country sites (.de/.at/.ch) and returns the same reviews; the actor keeps whichever host you submitted.
  • A partial_* error row means pagination stopped partway through a hotel after already returning some real reviews — you still get what was fetched, plus a diagnostic explaining why it stopped early.

Other actors in this collection

ActorWhat it returns
Priceline Hotel Reviews ScraperGuest reviews for hotels listed on Priceline.com
Agoda Reviews ScraperGuest reviews for hotels listed on Agoda.com
Booking.com Reviews ScraperGuest reviews for hotels listed on Booking.com
Trip.com Reviews ScraperGuest reviews for hotels listed on Trip.com
Orbitz Hotel Reviews ScraperGuest reviews for hotels listed on Orbitz.com
Viator Reviews ScraperGuest reviews for tours/activities listed on Viator
GetYourGuide Reviews ScraperGuest reviews for tours/activities listed on GetYourGuide