# PiNCAMP Campsite Reviews & Ratings Scraper (`gtforgedata/pincamp-campsite-reviews-scraper`) Actor

Extract campsite reviews, 10-dimension category ratings, amenities and geodata from PiNCAMP (pincamp.de), the ADAC campsite portal. 14,700+ European campsites.

- **URL**: https://apify.com/gtforgedata/pincamp-campsite-reviews-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 campsite 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

## PiNCAMP Campsite Reviews & Ratings Scraper

Extract **campsite reviews, ratings and profiles** from [PiNCAMP](https://www.pincamp.de) — the
ADAC campsite portal covering **14,700+ European campsites** across Germany, France, Italy, Denmark,
Croatia, the Netherlands and more.

Built for campsite operators, tourism boards, booking platforms and hospitality analysts who need
structured reputation data instead of a browser tab.

### What you get

Per campsite:

| Field | Detail |
|---|---|
| Profile | name, id, type, description, full postal address, latitude/longitude |
| Aggregate rating | native 1–10 score **and** a 0–5 normalisation for cross-source comparison |
| Category ratings | up to **10 sub-scores**: sanitary, pitch, maintenance, price/performance, shopping, catering, staff, wifi, mobile network, noise |
| Reviews | rating, headline, full text, author, language, date |
| Metadata | badges, awards, classifications, top attributes, bookability |

Reviews carry both a resolved ISO date and the exact text the site printed
(`"vor 3 Jahren"`), so nothing is lost to interpretation.

### Use cases

- **Reputation monitoring** — track a campsite's score and new reviews over time
- **Competitive benchmarking** — compare category sub-scores across a region
- **Market research** — amenity and pricing coverage across 14,700 sites
- **Lead lists** — campsite contact and location data by country or region
- **Text analytics** — clean structured review text for sentiment and topic analysis

### Input

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

```json
{
  "venueUrls": ["https://www.pincamp.de/campingplaetze/camping-village-heliopolis"],
  "includeReviews": true,
  "outputMode": "venue"
}
```

### Output

```json
{
  "source": "pincamp",
  "venueId": "camping-village-heliopolis",
  "name": "Camping Village Heliopolis",
  "url": "https://www.pincamp.de/campingplaetze/camping-village-heliopolis",
  "address": { "city": "Comacchio", "country": "Italien", "countryCode": "IT", "postalCode": "44022" },
  "geo": { "lat": 44.6912, "lon": 12.2331 },
  "aggregate": {
    "rating": { "native": 8.6, "nativeScale": 10, "normalised": 4.3 },
    "count": 133,
    "categories": { "sanitary": 8.1, "pitch": 8.4, "staff": 8.9, "wifi": 6.2, "noise": 7.5 }
  },
  "reviews": [
    {
      "reviewId": "85306f7e-1eef-4d08-810c-4b3e89e0295d",
      "rating": { "native": 8, "nativeScale": 10, "normalised": 4 },
      "title": "tolle Lage und viel zu bieten",
      "text": "hier wird wirklich viel geboten. 3 Spielplätze, Schwimmbad...",
      "language": "de",
      "author": { "name": "Jan" },
      "publishedAt": "2023-08-06T00:00:00.000Z",
      "publishedAtRaw": "vor 3 Jahren"
    }
  ],
  "reviewsTruncated": true,
  "totalReviewCount": 133
}
```

### 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 campsite profile returned |
| `review-scraped` | Per individual review returned |

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

### An honest note on review coverage

PiNCAMP's robots.txt disallows its internal `/api/` endpoints, which is where review
*pagination* lives. **This actor does not use disallowed endpoints.** It reads the
server-rendered campsite page, which carries the aggregate rating, all category
sub-scores, and the **most recent reviews** (typically 8).

Where a campsite has more reviews than were served on that page, the output sets
`reviewsTruncated: true` and `totalReviewCount` to the real total, so you always know
what you have. For reputation monitoring — where recent reviews are the signal — this
is the whole job. If you need complete historical archives, this actor is not that tool
and says so rather than quietly returning a partial set.

### Support

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

# Actor input Schema

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

PiNCAMP campsite pages to scrape, e.g. https://www.pincamp.de/campingplaetze/camping-vejlby-fed. Leave empty and enable 'Scrape all campsites' to sweep the whole catalogue.

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

Ignore the URL list and enumerate every campsite from PiNCAMP's sitemap (14,700+). Use with 'Max campsites' to bound the run.

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

Upper bound on campsites processed in one run.

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

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

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

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

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

Content language for the campsite page.

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

Parallel campsite 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. PiNCAMP serves plain HTML with no bot management, so a proxy is normally unnecessary and only adds cost.

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

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

## Actor input object example

```json
{
  "venueUrls": [
    "https://www.pincamp.de/campingplaetze/camping-village-heliopolis"
  ],
  "discoverAll": false,
  "maxVenues": 100,
  "includeReviews": true,
  "outputMode": "venue",
  "locale": "de",
  "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.pincamp.de/campingplaetze/camping-village-heliopolis"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gtforgedata/pincamp-campsite-reviews-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.pincamp.de/campingplaetze/camping-village-heliopolis"] }

# Run the Actor and wait for it to finish
run = client.actor("gtforgedata/pincamp-campsite-reviews-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.pincamp.de/campingplaetze/camping-village-heliopolis"
  ]
}' |
apify call gtforgedata/pincamp-campsite-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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