HRS Hotel Extractor avatar

HRS Hotel Extractor

Pricing

from $2.99 / 1,000 results

Go to Apify Store
HRS Hotel Extractor

HRS Hotel Extractor

HRS hotel scraper that extracts live hotel listings, nightly rates, star ratings, and guest scores for any city, so SEO and travel teams can track competitor pricing and build hotel datasets without copying results by hand.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

Kawsar

Kawsar

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

HRS Hotel Extractor: Scrape HRS Hotel Listings, Prices, and Ratings

HRS hotel scraper that extracts hotel listings, live nightly rates, star ratings, and guest scores from HRS for any city you search. Give it a destination and a date range and it returns a structured dataset: names, addresses, coordinates, prices, amenities, and direct hotel links. City names are resolved for you, so Berlin works the same as a numeric HRS location ID.

The actor runs a real Chromium session, scrolls the page the way a visitor would, then reads the same hotel data the HRS results page renders. You get the full result set rather than whatever happened to be on screen.

Use cases

  • Hotel price monitoring: track nightly rates across a city on a schedule and catch competitor price moves early
  • SEO content generation: build hotel landing pages and city guides from real listing data, star ratings and amenities included
  • Revenue management research: compare your property against every bookable hotel in the market for the same dates
  • Travel affiliate sites: populate a hotel directory with names, photos, coordinates, and links, no manual entry
  • Market analysis: measure hotel supply, chain penetration, and star distribution across dozens of cities in one run
  • Sustainability reporting: pull green certification classes and per-night carbon estimates for corporate travel policies

Input

ParameterTypeDefaultDescription
destinationsarray(required)City names or numeric HRS location IDs, one per line. Names are resolved automatically.
checkInDatestringtomorrowArrival date as YYYY-MM-DD. Left empty, it points at tomorrow so scheduled runs stay valid.
nightsinteger1Length of stay used to price every hotel.
checkOutDatestringderivedDeparture date as YYYY-MM-DD. Overrides nights when set.
roomTypestringSINGLEROOMSINGLEROOM, DOUBLEROOM, THREEBEDROOM, or FOURBEDROOM.
adultsPerRoominteger1Adults sharing each room.
roomCountinteger1Number of rooms requested.
languagestringenOutput language for names and amenity labels.
includeUnavailablebooleanfalseKeep hotels with no bookable rate for wider market coverage.
maxItemsinteger100Cap on hotels saved across all destinations.
timeoutSecsinteger300Total run budget in seconds.
requestTimeoutSecsinteger60Per-search timeout in seconds.
proxyConfigurationobjectDatacenter (Anywhere)Proxy type and location for requests. Supports Datacenter, Residential, Special, and custom proxies. Optional.

Example input

{
"destinations": ["Berlin", "Munich", "Paris"],
"checkInDate": "2026-09-10",
"nights": 2,
"roomType": "DOUBLEROOM",
"adultsPerRoom": 2,
"roomCount": 1,
"language": "en",
"maxItems": 300,
"proxyConfiguration": { "useApifyProxy": true }
}

What data does this actor extract?

Results land in a dataset, one row per hotel. Here is a real record, trimmed for length:

{
"hotelId": 875998,
"hotelName": "Capri by Fraser Berlin",
"hotelUrl": "https://www.hrs.com/en/hotel/875998",
"stars": 4,
"ratingScore": 9.1,
"reviewCount": 15,
"recommendationRate": 80,
"street": "Scharrenstraße 22",
"zipCode": "10178",
"city": "Berlin",
"district": "Berlin",
"countryCode": "DEU",
"latitude": 52.513894,
"longitude": 13.405057,
"distanceToCityCenterKm": 2.0,
"cityCenterName": "Alexanderplatz",
"distanceToRailwayKm": 5.0,
"distanceToAirportKm": 12.0,
"chainName": "Frasers Hospitality",
"roomTypeOffered": "DOUBLEROOM",
"totalPrice": 545.0,
"totalPriceNet": 502.0,
"pricePerNight": 272.5,
"currency": "EUR",
"breakfastIncluded": true,
"breakfastPrice": 19.5,
"availableRooms": 16,
"amenities": ["CITY", "BUSINESS", "PARKING", "AIRCONDITION", "RESTAURANT"],
"parkingAvailable": true,
"wifiInRoom": true,
"nonSmokingHotel": true,
"constructionYear": 2017,
"greenStayCertified": true,
"greenEfficiencyClass": "A",
"carbonPerNightKg": 8.85,
"checkInDate": "2026-09-10",
"checkOutDate": "2026-09-12",
"nights": 2,
"scrapedAt": "2026-08-08T12:04:11.905+00:00"
}
FieldTypeDescription
hotelIdintegerStable HRS identifier, useful as a join key across runs
hotelNamestringHotel name in the selected language
hotelUrlstringDirect link to the hotel page
starsintegerHRS star classification, 1 to 5
ratingScorenumberAverage guest rating out of 10
reviewCountintegerNumber of guest reviews behind the average
recommendationRatenumberShare of reviewers who recommend the hotel
street, zipCode, city, districtstringPostal address parts
countryCode, countryAlpha2stringISO country codes
latitude, longitudenumberCoordinates in decimal degrees
locationId, locationNameinteger, stringHRS location the hotel sits in
distanceToCityCenterKmnumberDistance to the city centre
cityCenterNamestringReference point used as the centre
distanceToRailwayKmnumberDistance to the nearest station
distanceToAirportKmnumberDistance to the nearest airport
chainName, brandNamestringChain and brand, empty for independents
hotelStatusstringOperating status reported by HRS
roomTypeOfferedstringRoom category the rate applies to
totalPrice, totalPriceNetnumberGross and net total for the whole stay
pricePerNightnumberGross rate per night and room
wasPricePerNightnumberPrevious rate, handy for spotting discounts
priceWithBreakfastnumberStay total with breakfast included
currencystringCurrency for every price in the record
breakfastIncludedbooleanWhether breakfast is in the quoted rate
breakfastPricenumberBreakfast cost when charged separately
availableRoomsintegerRooms still bookable at that rate
amenities, hotelTypesarrayAmenity and property classification codes
paymentTypesarrayAccepted payment methods
receptionServicesarrayReception hours and language coverage
parkingAvailable, freeParking, evChargingAvailablebooleanParking and charging facts
wifiInRoom, freeWifibooleanIn-room internet availability and cost
nonSmokingHotelbooleanWhether the whole property is non-smoking
restaurantCount, conferenceRoomCountintegerOn-site restaurants and meeting rooms
singleRoomCount, doubleRoomCountintegerRoom inventory by type
constructionYearintegerYear built or last rebuilt
greenStayCertified, greenEfficiencyClassboolean, stringSustainability certification and class
carbonPerNightKgnumberEstimated carbon per occupied room night
thumbnailUrlstringHotel photo hosted by HRS
checkInDate, checkOutDate, nightsstring, integerStay the rate was priced for
searchDestinationstringYour input value that produced the row
searchResultsUrlstringHRS results page for the same search
scrapedAtstringUTC extraction timestamp, ISO 8601

How it works

  1. Opens a Chromium session on the HRS site and declines non-essential cookies.
  2. Auto-scrolls the page until deferred content has loaded, the same way a visitor moves through it.
  3. Resolves each destination you entered into an HRS location and picks the closest match by relevance score.
  4. Runs the hotel search for your dates, room type, and occupancy from inside that browser session.
  5. Flattens every hotel into one row and writes it to the dataset. If a destination fails, it is logged and the run carries on.

Tips for better results

  • Add a region when a city name is ambiguous. Paris and Paris Texas resolve to different places.
  • Large cities return several hundred hotels for one date range. Raise maxItems before sweeping capitals.
  • Turn on includeUnavailable when you want full market coverage rather than only bookable inventory. Price fields stay empty for sold-out hotels.
  • Three-bed and four-bed rooms are rare across the inventory. Single and double rooms return far more hotels.
  • Schedule daily runs on the same dates to build a rate history you can chart.

FAQ

How do I find the HRS location ID for a city? You do not need one. Type the city name and the actor resolves it, then logs the location it matched so you can confirm the choice.

How many hotels can one run return? A single city search commonly returns 250 to 500 bookable hotels. The maxItems cap defaults to 100 and goes up to 1000 per run across every destination you list.

Can I get prices in a specific currency? Prices come back in the currency the hotel quotes, given in the currency field on every row. Convert afterwards if you need one reporting currency.

Does it work outside Germany? Yes. Coverage spans HRS inventory worldwide, including Paris, London, and New York.

Why are some fields empty for a hotel? Smaller and independent properties often have no reviews, no chain, and no sustainability audit on file. Those fields come back empty rather than guessed.

Do I need a proxy? Not for typical use. Add a proxy if you run large sweeps or hit rate limits, and switch to Residential if datacenter IPs get blocked.

Integrations

Connect HRS Hotel Extractor with other apps and services using Apify integrations. You can integrate with Make, Zapier, Slack, Airbyte, GitHub, Google Sheets, Google Drive, and many more. You can also use webhooks to trigger actions whenever results are available.

Point the HRS hotel scraper at a city, pick your dates, and you have a hotel dataset with live prices and ratings you can query or publish the same day.