# Campercontact Motorhome Stopover & Reviews Scraper (`gtforgedata/campercontact-motorhome-stopover-scraper`) Actor

Extract motorhome stopover locations, reviews and ratings from Campercontact. 70,000+ camper pitches across Europe, with reviews in the original language and machine translations in 6 languages.

- **URL**: https://apify.com/gtforgedata/campercontact-motorhome-stopover-scraper.md
- **Developed by:** [GTForge Data](https://apify.com/gtforgedata) (community)
- **Categories:** Travel, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 location scrapeds

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/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

## Campercontact Motorhome Stopover & Reviews Scraper

Extract **motorhome and campervan stopover locations with their reviews** from
[Campercontact](https://www.campercontact.com) — **70,000+ camper pitches, aires and
campsites across Europe**, the reference directory for motorhome travellers.

Built for campsite and aire operators, motorhome rental fleets, tourism boards, travel
apps and route-planning products.

### What makes this data unusual

Campercontact publishes each review **twice**: in the reviewer's original language *and*
machine-translated into the page language. This actor returns **both** — `originalText`
with its `language` tag, and `text` in your chosen locale.

That means you can run sentiment analysis on a Dutch reviewer's actual words while still
serving a German-language dashboard, without paying for a translation pass.

### What you get

Per location:

| Field | Detail |
|---|---|
| Profile | name, site code, type (camper pitch / campsite / aire), status, claimed flag |
| Description | in 6 languages (`de`, `en`, `es`, `fr`, `it`, `nl`) |
| Address | street, city, postcode, province, country |
| Rating | 0–5 native, plus a normalised 0–5 for cross-source comparison |
| Reviews | rating, translated text, **original text**, original language, author, ISO date, pinned flag, operator reply |
| Photos | user-submitted image URLs |

### Use cases

- **Reputation monitoring** for aire and campsite operators
- **Route and POI enrichment** for motorhome navigation and travel apps
- **Market mapping** — 70,000 stopovers with coordinates, type and rating
- **Multilingual sentiment analysis** using original-language review text
- **Competitive benchmarking** across a region or country

### Input

| Field | Meaning |
|---|---|
| `venueUrls` | Specific location pages to scrape |
| `discoverAll` | Ignore the list and sweep the entire catalogue from the sitemap |
| `maxVenues` | Bound the run (default 100) |
| `includeReviews` | Off = profiles + ratings only, at lower cost |
| `outputMode` | `venue` (nested), `review` (flat rows), or `both` |
| `locale` | `en`, `de`, `fr`, `it`, `nl` |

```json
{
  "venueUrls": [
    "https://www.campercontact.com/en/germany/bavaria/spiegelau/197472/ferienanlage-rademacher"
  ],
  "includeReviews": true,
  "locale": "en"
}
```

### Output

```json
{
  "source": "campercontact",
  "venueId": "197472",
  "name": "Ferienanlage Rademacher",
  "type": "camperplace",
  "address": { "city": "Spiegelau", "country": "Germany", "postalCode": "94518" },
  "aggregate": { "rating": { "native": 5, "nativeScale": 5, "normalised": 5 }, "count": 1 },
  "reviews": [
    {
      "reviewId": "fe6cf904-4af2-4248-b11a-6ed4bf85c7e1",
      "rating": { "native": 5, "nativeScale": 5, "normalised": 5 },
      "text": "A lovely little campsite in a quiet location. It has a washroom...",
      "originalText": "Een heerlijk klein campinkje op een rustige locatie...",
      "language": "nl",
      "author": { "name": "Pedrosa" },
      "publishedAt": "2026-08-06T11:35:38.472Z",
      "isPinned": false,
      "managerReply": null
    }
  ],
  "attributes": {
    "descriptionTranslations": { "de": "...", "en": "...", "fr": "...", "it": "...", "nl": "..." },
    "photoUrls": ["https://images.campercontact.com/media/photos/location/..."]
  }
}
```

### Pricing

Pay per event — you pay for what you extract, with no monthly rental:

| Event | When |
|---|---|
| `actor-start` | Once per run, per GB of memory (covers platform compute) |
| `venue-scraped` | Per location profile returned |
| `review-scraped` | Per individual review returned |

Turning `includeReviews` off charges only `venue-scraped`.

### How this actor behaves

Campercontact's robots.txt declares a sitemap and sets **no crawl restrictions**. This
actor still rate-limits itself to one request per 400 ms per host and reads only public
location pages. Discovery uses the site's own published sitemap rather than guessing URLs.

Newly added locations often have no reviews yet; those return a profile with
`totalReviewCount: 0` rather than an error.

### Support

Open an issue on the actor page. Bug reports with the location URL attached get fixed fastest.

# Actor input Schema

## `venueUrls` (type: `array`):

Campercontact location pages, e.g. https://www.campercontact.com/en/germany/bavaria/spiegelau/197472/ferienanlage-rademacher. Leave empty and enable 'Scrape all locations' to sweep the catalogue.

## `discoverAll` (type: `boolean`):

Ignore the URL list and enumerate every location from Campercontact's sitemap (70,000+). Use with 'Max locations' to bound the run.

## `maxVenues` (type: `integer`):

Upper bound on locations processed in one run.

## `includeReviews` (type: `boolean`):

Include individual reviews. Turn off for a cheaper run that returns only location profiles and ratings.

## `outputMode` (type: `string`):

'venue' = one row per location with reviews nested. 'review' = one flat row per review. 'both' = location row followed by its review rows.

## `locale` (type: `string`):

Content language. Reviews always include the original text as well as the translation into this language.

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

Parallel location fetches. Higher is faster but less polite to the source.

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

Extra politeness delay per request. The actor always enforces its own minimum regardless of this value.

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

Optional. Campercontact serves plain HTML with no bot management, so a proxy is normally unnecessary and only adds cost.

## `minReviewCount` (type: `integer`):

Skip locations with fewer than this many reviews. Catalogue sweeps hit a long tail of listings with no reviews at all — skipped locations are NOT charged. Leave at 0 to return everything.

## Actor input object example

```json
{
  "venueUrls": [
    "https://www.campercontact.com/en/germany/bavaria/spiegelau/197472/ferienanlage-rademacher"
  ],
  "discoverAll": false,
  "maxVenues": 100,
  "includeReviews": true,
  "outputMode": "venue",
  "locale": "en",
  "maxConcurrency": 5,
  "requestDelayMs": 400,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "minReviewCount": 0
}
```

# 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 = {
    "venueUrls": [
        "https://www.campercontact.com/en/germany/bavaria/spiegelau/197472/ferienanlage-rademacher"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gtforgedata/campercontact-motorhome-stopover-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 = { "venueUrls": ["https://www.campercontact.com/en/germany/bavaria/spiegelau/197472/ferienanlage-rademacher"] }

# Run the Actor and wait for it to finish
run = client.actor("gtforgedata/campercontact-motorhome-stopover-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "venueUrls": [
    "https://www.campercontact.com/en/germany/bavaria/spiegelau/197472/ferienanlage-rademacher"
  ]
}' |
apify call gtforgedata/campercontact-motorhome-stopover-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=gtforgedata/campercontact-motorhome-stopover-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/npDIY3cnHVE46tjg2/builds/iXliHRul2ONavWjfP/openapi.json
