Zoover Reviews Scraper avatar

Zoover Reviews Scraper

Pricing

from $2.50 / 1,000 reviews

Go to Apify Store
Zoover Reviews Scraper

Zoover Reviews Scraper

Scrapes every review from any Zoover accommodation page, plus the full accommodation record — rating, per-aspect scores, address, coordinates, facilities, images and awards. Includes an automatic Cloudflare bypass.

Pricing

from $2.50 / 1,000 reviews

Rating

0.0

(0)

Developer

Reviewly

Reviewly

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Zoover Reviews Scraper — Export Every Hotel Review from Zoover to JSON, CSV or Excel

Paste a Zoover accommodation URL, get every review as clean, structured data — full text, scores out of 10, per-aspect ratings, traveller type, dates and photos. No coding, no login, no blocked requests.

  • All reviews, not just page 1 — the scraper paginates to the last review automatically
  • Built-in bot-protection bypass — Zoover sits behind Cloudflare; this Actor handles it for you
  • Rich accommodation data included — rating, star rating, aspect scores, address, GPS, phone, email, website, facilities, photos and awards
  • Incremental runs — set a target date and only pull reviews newer than your last run
  • Works on every Zoover market — 🇳🇱 .nl 🇧🇪 .be 🇩🇪 .de 🇫🇷 .fr 🇪🇸 .es 🇮🇹 .it 🇬🇧 .co.uk
  • Export anywhere — JSON, CSV, Excel, XML, or straight to your app via the Apify API

📌 What This Actor Does

Zoover Reviews Scraper is an Apify Actor — a ready-made cloud scraper — that turns any Zoover accommodation page into a structured dataset.

Zoover is one of Europe's largest travel review platforms, with millions of guest reviews for hotels, apartments, campsites and resorts. That review data is public, but it is locked inside a JavaScript site protected by Cloudflare: copy-pasting is slow, and a normal web scraping script gets blocked within seconds.

This Actor solves both problems. You give it a URL like:

https://www.zoover.nl/a/167199/w-suites-by-estia

…and it returns the complete accommodation profile plus every guest review attached to it, ready for analysis in a spreadsheet, a BI tool, or an AI model.

Who it's for

You are…You use it to…
Hotel & campsite ownersTrack your own reputation, read every complaint, benchmark against nearby competitors
Hospitality & revenue managersCompare aspect scores (hygiene, location, price/quality) across a whole portfolio
Market researchers & analystsBuild datasets on European travel sentiment by region, season or traveller type
Data scientists & AI teamsFeed real, multilingual review text into sentiment analysis, LLM fine-tuning or RAG
Marketers & agenciesMine authentic guest quotes for landing pages, ads and social proof
Lead generation teamsExtract accommodation contact details (phone, email, website) for outreach lists
DevelopersSkip weeks of anti-bot work and call a stable API endpoint instead

✨ Key Features

  • Complete review extraction — title, full review text, score out of 10, per-aspect scores, reviewer name, verified badge, traveller type, publish date, stay date, likes, photos and owner replies.
  • Full accommodation record in the same item — you don't need a second scraper for hotel details.
  • Cloudflare handled automatically — a real hardened browser earns the clearance, then requests continue on the same IP. You never see a CAPTCHA.
  • Automatic IP rotation on blocks — if an exit IP is refused, the Actor rotates and retries (up to 8 times) before giving up.
  • Multi-URL runs — scrape a whole list of accommodations in a single run.
  • Review limits — cap reviews per accommodation to keep test runs cheap.
  • Date cut-off for incremental scraping — perfect for daily or weekly monitoring.
  • Locale-aware — the scraper matches the language and country of the Zoover domain you give it, so you get the reviews exactly as travellers wrote them.
  • Never loses partial data — if the site cuts a run short, everything collected up to that point is still saved.
  • Clean, predictable schema — the same fields every run, so your pipeline never breaks.

🧠 Why This Actor Is Different

Most "review scrapers" break on Zoover for one of three reasons. Here's how this one is built differently:

Common problemHow this Actor handles it
Cloudflare blocks the request (403, "Just a moment…")A real, anti-fingerprint Firefox browser passes the device check, then hands the session to a fast HTTP client — no CAPTCHA service, no manual cookies
Scrapers grab only the first 6–10 reviewsUses Zoover's own cursor pagination to walk the entire review list to the end
Reviews arrive as messy HTML textData comes from Zoover's structured review API, so scores, dates and aspects are typed values, not scraped strings
Hotel details need a second runAccommodation profile and reviews land in a single dataset item
Slow, browser-heavy scraping of every pageThe browser is used once to unlock access; every review batch after that is a lightweight request — far faster and cheaper than a full browser crawl
Runs die halfway and lose everythingPartial results are always pushed; blocked IPs are rotated and retried automatically

In short: browser-grade access with API-grade speed and data quality.


⚙️ Input Configuration

You can configure the run in the visual Input form, or with JSON via the API.

Input fields

FieldTypeRequiredDefaultDescription
startUrlsArray✅ YesZoover accommodation URLs to scrape. Sub-pages (photos, prices, reviews tabs) are accepted and automatically normalised to the main page.
maxReviewsIntegerNo0Max reviews per accommodation. 0 = all of them. Great for cheap test runs.
targetDateString (ISO date)NoStop when reviews get older than this date, e.g. 2025-01-01. Zoover returns newest first, so this is the cheapest way to run incrementally.
reviewsPageSizeIntegerNo25How many reviews to request per API call (1–100). Bigger batches = fewer requests = faster runs. Falls back to 6 automatically if a batch is refused.
proxyConfigurationObjectNoApify Residential, NLProxy settings. Residential proxies are strongly recommended — see tips below.

Example input (single hotel, everything)

{
"startUrls": [
{ "url": "https://www.zoover.nl/a/167199/w-suites-by-estia" }
],
"maxReviews": 0,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"],
"apifyProxyCountry": "NL"
}
}

Example input (multiple hotels, incremental daily run)

{
"startUrls": [
{ "url": "https://www.zoover.nl/a/167199/w-suites-by-estia" },
{ "url": "https://www.zoover.de/a/123456/hotel-beispiel" }
],
"targetDate": "2026-07-01",
"reviewsPageSize": 50,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

💡 Tips for best results

  1. Match the proxy country to the domain. Scraping zoover.nl? Use NL. zoover.de? Use DE. A German page loaded from a US IP looks suspicious and gets challenged more often.
  2. Always use residential proxies. Datacenter IPs are refused far more frequently on Cloudflare-protected pages.
  3. Start with maxReviews: 10 to validate the output format before running a full portfolio.
  4. Give the run 4 GB of memory. The Actor launches a real browser to unlock access; less memory makes runs slower and flakier.
  5. Use targetDate for monitoring. Set it to the date of your last successful run and each new run pulls only what's new.

📤 Output Format

The Actor pushes one dataset item per accommodation URL. Each item contains the full accommodation record and a nested reviews array.

Download it as JSON, CSV, Excel, XML or HTML, or fetch it from the Apify API:

https://api.apify.com/v2/datasets/{DATASET_ID}/items?format=json

💡 Exporting to CSV? Apify flattens nested fields automatically (reviews/0/text, reviews/1/text, …). If you want one row per review, use the "unwind" option on the export and set it to reviews.

Sample output (abridged)

{
"zooverId": "90757553-66d5-4596-af34-7f47f7fb0867",
"heliosId": 167199,
"giataId": 19913,
"name": "W Suites by Estia",
"url": "https://www.zoover.nl/a/167199/w-suites-by-estia",
"type": "Appartement",
"isBookable": true,
"merchandisingLabel": "best_reviewed",
"rating": 9.1,
"ratingScale": 10,
"starRating": 4,
"reviewCount": 198,
"ratingsPerAspect": {
"childFriendly": { "rating": 9.15, "count": 198 },
"hygiene": { "rating": 9.26, "count": 198 },
"interior": { "rating": 8.68, "count": 198 },
"location": { "rating": 9.20, "count": 198 },
"priceQuality": { "rating": 9.05, "count": 198 },
"space": { "rating": 8.86, "count": 198 }
},
"totalReviewsAvailable": 198,
"ratingDistribution": [
{ "score": 10, "count": 113 },
{ "score": 9, "count": 47 },
{ "score": 8, "count": 19 }
],
"travelPartyDistribution": [
{ "travelParty": "COUPLE", "count": 84 },
{ "travelParty": "FAMILY_WITH_OLDER_CHILDREN", "count": 44 },
{ "travelParty": "FRIENDS", "count": 40 }
],
"country": "Griekenland",
"countryCode": "GR",
"region": "Kreta",
"city": "Stalis",
"address": { "street": "El.Venizelou Street", "zipcode": "GR-70007" },
"coordinates": { "latitude": 35.288956, "longitude": 25.446648 },
"breadcrumb": [
{ "name": "Griekenland", "type": "COUNTRY", "url": "https://www.zoover.nl/griekenland" },
{ "name": "Kreta", "type": "REGION", "url": "https://www.zoover.nl/griekenland/kreta" }
],
"phone": "+30 6945713100",
"email": "info@example.com",
"website": "https://wsuites.gr/",
"description": "W Suites by Estia ligt centraal in Stalida, nog geen 300 meter van het zandstrand…",
"images": ["https://storage.googleapis.com/images_trvl-portfolio-prod/…/f519a265.webp"],
"facilities": [
{ "group": "building-information", "name": "number-of-apartments", "value": "12" }
],
"features": ["childrens_pool", "pool", "airco", "pets_allowed", "wifi"],
"awards": [
{ "year": 2025, "awardType": "gold", "rank": 241, "regionAward": false }
],
"cheapestOffer": { "price": 296.25, "lengthOfStay": 5 },
"scrapedAt": "2026-08-08T09:12:44.108Z",
"reviews": [
{
"reviewId": 80111,
"accommodationId": "90757553-66d5-4596-af34-7f47f7fb0867",
"accommodationName": "W Suites by Estia",
"accommodationUrl": "https://www.zoover.nl/a/167199/w-suites-by-estia",
"title": "super gezellig verblijf gehad",
"text": "Warm welkom door Ans wat erg fijn was. Klein maar fijn appartement. Alles schoon…",
"textLength": 837,
"language": "nl",
"score": 9,
"scoreScale": 10,
"aspects": {
"childFriendly": 10,
"hygiene": 10,
"interior": 8,
"location": 8,
"priceQuality": 8,
"space": 8
},
"reviewerName": "Ilse",
"reviewerVerified": true,
"traveledWith": "FAMILY_WITH_OLDER_CHILDREN",
"publishedAt": "2026-08-02T09:37:46.475Z",
"updatedAt": "2026-08-02T09:37:52.024Z",
"travelDate": "2026-07-01T00:00:00.000Z",
"likes": 0,
"images": [],
"replies": [],
"parentType": "accommodation"
}
]
}

Accommodation fields

FieldTypeDescription
zooverIdStringZoover's internal UUID for the accommodation — the stable primary key
heliosIdNumberThe numeric ID visible in the page URL
giataId / goalIdNumberIndustry IDs, handy for matching against other travel datasets
nameStringAccommodation name
url / canonicalUrlStringThe page scraped
typeStringProperty type (hotel, apartment, campsite…), in the site's language
isBookableBooleanWhether Zoover sells this property
merchandisingLabelStringZoover badge, e.g. best_reviewed
ratingNumberOverall guest rating out of 10
ratingScaleNumberAlways 10 — so your charts never guess
starRatingNumberOfficial star classification
reviewCountNumberReview count shown on the page
totalReviewsAvailableNumberReview count reported by the review API (the number available to scrape)
ratingsPerAspectObjectAverage score + count per aspect (hygiene, location, price/quality, space, interior, child-friendly)
ratingDistributionArrayHow many reviews gave each score 1–10
travelPartyDistributionArrayReview counts by traveller type (couple, family, friends, business, single)
country, countryCode, region, cityStringLocation
addressObjectstreet, zipcode
coordinatesObjectlatitude, longitude
breadcrumbArrayCountry → region → city hierarchy with Zoover URLs
phone, email, websiteStringPublic contact details, when the property publishes them
socialLinksObjectSocial profiles, when available
descriptionStringFull property description
descriptionSectionsArrayThe same description split into titled sections
imagesArrayPhoto URLs
facilitiesArrayStructured facility list (group, name, value)
features / distanceFeaturesArrayAmenity tags (wifi, pool, airco…) and distance-based tags
awardsArrayZoover awards by year with rank and type
cheapestOfferObjectLowest advertised price and lengthOfStay, when shown
priceRangeStringPrice range, when published
scrapedAtISO dateWhen the record was collected
reviewsArrayEvery review collected (see below)

Review fields

FieldTypeDescription
reviewIdNumberZoover's review ID — use with accommodationId to deduplicate across runs
accommodationId, accommodationName, accommodationUrlStringParent property, repeated on each review so the array works standalone
titleStringReview headline
textStringFull review text, in the language the guest wrote it
textLengthNumberCharacter count — useful for filtering out one-liners
languageStringReview language code (nl, de, fr…)
scoreNumberGuest score out of 10
scoreScaleNumberAlways 10
aspectsObjectPer-aspect scores given by this guest
reviewerNameStringDisplay name as shown publicly on Zoover
reviewerVerifiedBooleanWhether Zoover marks the reviewer as verified
reviewerLevelStringZoover's internal reviewer level token
traveledWithStringCOUPLE, FAMILY_WITH_YOUNG_CHILDREN, FRIENDS, BUSINESS, SINGLE
publishedAtISO dateWhen the review was posted
updatedAtISO dateLast edit
travelDateISO dateMonth of the actual stay (Zoover collects month precision)
likesNumberHelpful votes
imagesArrayGuest photos (id, url, status, createdAt)
repliesArrayOwner responses (text, userName, publishedAt)
parentTypeStringWhat the review is attached to, e.g. accommodation

▶️ How to Use

Option 1 — In the Apify Console (no code)

  1. Open the Actor in Apify Store and click Try for free.
  2. Paste your Zoover URLs into Start URLs — one per line, or click Add for each.
  3. (Optional) Set Max reviews to 10 for a quick test run.
  4. (Optional) Under Advanced, pick a proxy country matching the site (NL for zoover.nl).
  5. Click Start.
  6. When the run finishes, open the Dataset tab and Export as CSV, Excel or JSON.

That's it — no installation, no browser automation, no proxy setup.

Option 2 — Schedule it

Use Schedules in Apify to run the Actor every day or week, with targetDate set to keep runs incremental. Add a webhook to push new reviews into Slack, a database, or your own API the moment a run completes.

Option 3 — Call it from your code

curl -X POST "https://api.apify.com/v2/acts/YOUR~zoover-reviews-scraper/runs?token=YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startUrls": [{ "url": "https://www.zoover.nl/a/167199/w-suites-by-estia" }],
"maxReviews": 100
}'
// Node.js — apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('YOUR~zoover-reviews-scraper').call({
startUrls: [{ url: 'https://www.zoover.nl/a/167199/w-suites-by-estia' }],
targetDate: '2026-01-01',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].reviews.length, 'reviews');
# Python — apify-client
from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("YOUR~zoover-reviews-scraper").call(run_input={
"startUrls": [{"url": "https://www.zoover.nl/a/167199/w-suites-by-estia"}],
"maxReviews": 500,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["name"], len(item["reviews"]))

The Actor also works with Zapier, Make, n8n, LangChain and any tool that speaks the Apify API.


📈 Use Cases

1. Reputation monitoring for hotels and campsites

Schedule a daily run with targetDate set to yesterday. Every new review lands in your dataset within hours — pipe it to Slack so your front-desk team can respond the same day instead of a week later.

2. Competitor benchmarking

Feed 20 competitor URLs into one run and compare ratingsPerAspect side by side. You'll see exactly where you win (location) and where you lose (price/quality) — with the review text explaining why.

3. AI sentiment analysis and LLM training data

Review text arrives clean, typed, and tagged with score, aspect, traveller type and stay date. Drop it straight into a sentiment model, a topic classifier, or an LLM summarisation pipeline. Multilingual out of the box.

4. Travel market research

Scrape accommodations across a region and analyse ratingDistribution and travelPartyDistribution by destination or season — the kind of dataset that normally costs thousands to license.

5. Lead generation for travel-tech and hospitality suppliers

Every accommodation record carries public contact details — phone, email, website, address and GPS — alongside rating and review volume. Build a targeted prospect list of, say, every 3-star property in Crete rated below 7.5 that clearly needs help with guest experience.

6. Marketing content and social proof

Filter for score >= 9 and long textLength, and you have a library of genuine, quotable guest praise for landing pages, ads and review widgets.


🛠️ Advanced Tips

Speed

  • Raise reviewsPageSize to 50 or 100: fewer round-trips means faster runs. The Actor automatically falls back to a safe batch size if the site refuses a large one.
  • Getting the page unlocked takes up to ~90 seconds per URL; after that, reviews stream quickly. Long review lists are therefore much cheaper per review than short ones.

Reliability

  • Use Apify Residential proxies and set the country to match the Zoover domain. This is the single biggest factor in run success.
  • Allocate 4 GB memory to the run.
  • If a proxy IP is blocked, the Actor rotates and retries automatically up to 8 times — no action needed.

Scaling to hundreds of properties

  • Split large URL lists across several runs (e.g. 20–30 URLs each) so a single problem URL never holds up the batch.
  • Use Apify Schedules to spread runs across the day rather than one giant run.
  • Deduplicate downstream on reviewId + accommodationId; those two are stable across runs.

Cost control

  • Use maxReviews while testing.
  • Use targetDate in production so you never re-scrape reviews you already have.

❓ FAQ & Troubleshooting

Is scraping Zoover legal? This Actor collects only publicly available information — the same content any visitor sees without logging in. It does not access private data or bypass any login. You are responsible for using the data in line with applicable laws (including GDPR when handling reviewer names) and Zoover's terms. For personal data, scrape only what you have a lawful basis to process.

Do I need a Zoover account or API key? No. No login, no cookies, nothing to configure.

Which Zoover websites are supported? zoover.nl, zoover.be, zoover.de, zoover.fr, zoover.es, zoover.it and zoover.co.uk. The Actor automatically matches the language and locale of the domain you provide.

What URL should I paste? Any accommodation page, e.g. https://www.zoover.nl/a/167199/w-suites-by-estia. Tab URLs (photos, prices, reviews) work too — they're normalised automatically. Destination and search pages are not supported; give it the accommodation page itself.

"Unrecognised Zoover URL" in the log. The URL isn't an accommodation page. Open the property on Zoover and copy the URL that contains /a/<number>/<name>.

The run says the site blocked every connection. This means every proxy IP tried was refused. Fix it by: (1) enabling Apify Residential proxies, (2) setting the proxy country to match the domain, and (3) re-running — IP availability varies through the day. Datacenter proxies and no-proxy runs will fail often.

I got fewer reviews than the reviewCount on the page. Check totalReviewsAvailable in the output — that's the number the review API actually serves, and it can be lower than the headline count (some reviews are ratings without text). Also check whether maxReviews or targetDate capped the run.

Reviews aren't in English. Correct — reviews are returned exactly as guests wrote them, with a language field on each. This preserves data fidelity. Translate downstream (e.g. with an LLM or a translation API) if you need one language.

Can I get one row per review instead of one row per hotel? Yes. On the dataset Export screen, use the unwind option with the field reviews, or set ?unwind=reviews on the API export URL.

How do I run this daily without duplicates? Set targetDate to your last run date and deduplicate on reviewId.

How long does a run take? Unlocking access takes up to ~90 seconds per URL, then reviews are fetched in batches. A property with a few hundred reviews typically completes in a couple of minutes.

Why does it need so much memory? The Actor launches a real browser to pass the site's protection check. 4 GB keeps that fast and stable.

Can I get more detailed logs when something goes wrong? Yes — switch the input editor to JSON and add "debug": true. The run log will then show every internal step (proxy rotation, HTTP status codes, protection handling), which is exactly what to attach to a support request.

What does it cost? You are charged per review scraped, plus standard Apify platform usage. Use maxReviews for cheap test runs.


📞 Support

Questions, bug reports or feature requests are welcome — I actively maintain this Actor.

  • 💬 Issues tab in Apify Console — the fastest way to report a problem with a specific run. Please include the run ID and the URL you scraped.
  • 📧 Email: me@ahmedhrid.com
  • 🛠️ Custom scraping work: need another review platform, a different data shape, or a private integration? Get in touch — custom Actors are available on request.

If a website change ever breaks the scraper, report it and it will be fixed quickly.


Zoover scraper · Zoover reviews scraper · Zoover API · hotel reviews scraping · travel review data · web scraping Apify actor · guest review extraction · hotel data scraping · leads scraping for hospitality · accommodation data export · review sentiment dataset · scrape hotel reviews to CSV


Not affiliated with, endorsed by, or connected to Zoover. All trademarks belong to their respective owners.