# Zoover.nl Scraper — Holiday Park & Hotel Reviews (`studio-amba/zoover-scraper`) Actor

Scrape holiday-park, camping, and hotel reviews from zoover.nl: review text, rating score, aggregate rating, star rating, reviewer name, travel date, and destination. No login or cookies required.

- **URL**: https://apify.com/studio-amba/zoover-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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/platform/actors/running/actors-in-store#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

## Zoover.nl Scraper

Extract holiday-park, camping and hotel reviews from zoover.nl, the Dutch travel review platform used by campsites, holiday parks, and hotel chains across Europe.

### Why use this actor?

zoover.nl has no public API. This actor reads each accommodation's own `#accommodation-schema` JSON-LD block — the same structured data zoover.nl embeds for search engines — so you get review text, ratings, and traveler details without depending on the site's client-side search or brittle CSS selectors. Useful for reputation monitoring, competitor benchmarking for holiday parks and camping chains, or feeding a broader European travel-review dataset.

### How to scrape Zoover.nl data

1. Set `searchQuery` to a destination, region, or accommodation/chain name in Dutch or the local language (e.g. `Landal`, `Roompot`, `Center Parcs`, `Winterberg`, `Toscane`). Leave it empty to default to `Landal`, a large chain with reliably populated reviews.
2. Set `maxResults` for the maximum number of reviews to return.
3. Run the actor. It downloads zoover.nl's own accommodation sitemap (32,000+ listings), matches it against your query, then visits each matching accommodation page and pulls up to 6 of its most recent reviews.
4. Each review becomes one row in the output dataset: review text, rating score, aggregate rating, star rating, reviewer name, travel date, and destination.
5. Export the dataset as JSON, CSV, or connect it via API to your own pipeline.

There is no login, no cookie banner to dismiss, and no anti-bot wall — every page tested returns a clean response.

### A note on zoover.nl's own data

- Not every accommodation on zoover.nl has reviews — campsites and hotels with none are skipped automatically while the actor visits up to 5x `maxResults` accommodations looking for populated ones.
- zoover.nl rates on a 1-10 scale for its aggregate rating, not the more common 1-5 — see `entityRatingScale` on each row.
- `searchQuery` matches loosely against the sitemap's own URL slugs (substring and per-word), so both an exact chain name (`Landal`) and a multi-word query (`Landal Winterberg`) work.

### Input

| Field | Type | Required | Description |
|-------|------|----------|--------------|
| `searchQuery` | String | No | Destination, region, or accommodation/chain name (e.g. `Landal`, `Roompot`, `Winterberg`, `Toscane`, `Center Parcs`). Defaults to `Landal`. |
| `maxResults` | Integer | No | Maximum number of reviews to return (default: 30). |
| `proxyConfiguration` | Object | No | Apify proxy configuration. This site has no anti-bot protection, so the automatic default works fine. |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `reviewId` | String | `"a1b2c3d4e5f6-0"` |
| `entityName` | String | `"Landal Miggelenberg"` |
| `entityId` | String | null | zoover.nl's internal accommodation ID |
| `entityUrl` | String | null | The accommodation's zoover.nl page |
| `url` | String | Same as `entityUrl` — the page the review was scraped from |
| `reviewTitle` | String | null | `"Heerlijke rust"` |
| `reviewText` | String | null | Full review text |
| `ratingScore` | Number | null | `9` (this review's own score) |
| `entityRating` | Number | null | `8.4` (accommodation's aggregate rating) |
| `entityRatingScale` | String | null | `"1-10"` |
| `entityStars` | Number | null | `4` |
| `reviewerName` | String | null | `"Familie de Vries"` |
| `entryDate` | String | null | ISO 8601, when the review was published |
| `traveledWith` | String | null | `"Gereisd met partner"` |
| `destination` | String | null | `"Beekbergen"` |
| `country` | String | null | `"Nederland"` |
| `language` | String | `"nl"` |
| `scrapedAt` | String | ISO timestamp of the scrape |

### Example output

```json
{
    "reviewId": "a1b2c3d4e5f6-0",
    "entityName": "Landal Miggelenberg",
    "entityUrl": "https://www.zoover.nl/a/123456/landal-miggelenberg",
    "url": "https://www.zoover.nl/a/123456/landal-miggelenberg",
    "reviewTitle": "Heerlijke rust",
    "reviewText": "Prachtig park, goed onderhouden en veel te doen voor de kinderen.",
    "ratingScore": 9,
    "entityRating": 8.4,
    "entityRatingScale": "1-10",
    "entityStars": 4,
    "reviewerName": "Familie de Vries",
    "entryDate": "2026-06-14T00:00:00.000Z",
    "traveledWith": "Gereisd met partner",
    "destination": "Beekbergen",
    "country": "Nederland",
    "language": "nl",
    "scrapedAt": "2026-08-06T09:11:00.000Z"
}
```

### Cost estimate

This actor makes one request per accommodation page (plus one sitemap fetch per run) and pulls up to 6 reviews per page, making it a low-cost scraper per review — well under $0.01 per 30 reviews in Apify compute alone.

### Limitations

- zoover.nl's own client-side accommodation search is not used — this actor matches against the site's own sitemap instead, so results depend on the sitemap being current.
- Not every accommodation has reviews; the actor skips those automatically rather than returning empty rows.
- A run's usage cost only settles after the run reports SUCCEEDED — checking cost mid-run under-reports actual spend.
- Data is scraped from the public website and may change without notice.

### FAQ

**Does this actor need a login or API key?**
No. zoover.nl's review pages and sitemap are public; no account or API key is required.

**Why do some searches return fewer reviews than `maxResults`?**
Not every accommodation on zoover.nl has reviews. The actor visits up to 5x `maxResults` accommodations to find enough populated ones, capped at 150 visits per run — a very narrow or unpopular `searchQuery` can still come up short.

**Can I get reviews for a specific accommodation instead of a destination?**
Yes — set `searchQuery` to the accommodation or chain name (e.g. `Landal Miggelenberg`) instead of a region.

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs, deduplication, delta detection, and delivery to your inbox, Google Sheets, or API — maintenance included. We can also build a custom version with your exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email <hello@studioamba.dev> for a free data sample. We maintain 300+ European web scrapers and answer within one business day.

# Actor input Schema

## `searchQuery` (type: `string`):

A destination, region, or accommodation/chain name in Dutch or the local language (e.g. 'Landal', 'Roompot', 'Winterberg', 'Toscane', 'Center Parcs'). Matched against zoover.nl's own accommodation directory. Defaults to 'Landal'.

## `maxResults` (type: `integer`):

Maximum number of reviews to return. The actor visits matching accommodations (up to 5x this number, to skip ones with no reviews) and collects up to 6 of the most recent reviews per accommodation.

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

Apify proxy configuration. This site has no anti-bot protection (verified live 2026-08-06) — residential is not required but recommended for reliability at scale.

## Actor input object example

```json
{
  "searchQuery": "Landal",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchQuery": "Landal",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/zoover-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 = {
    "searchQuery": "Landal",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/zoover-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 '{
  "searchQuery": "Landal",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call studio-amba/zoover-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/zoover-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/zPlF5xZuifTMaBQbB/builds/BsAfa6ksU03QcHXj3/openapi.json
