# Hipcamp Campsite Listings Scraper (`devilscrapes/hipcamp-campsite-listings-scraper`) Actor

Scrape Hipcamp's US regional discover pages into structured campsite rows — private land, public campgrounds, and public land — with price, rating, geo, and capacity fields. We handle blocks, retries, and fingerprint rotation for you.

- **URL**: https://apify.com/devilscrapes/hipcamp-campsite-listings-scraper.md
- **Developed by:** [DevilScrapes](https://apify.com/devilscrapes) (community)
- **Categories:** Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## Hipcamp Campsite Listings Scraper

**💰 $1.25 / 1 000 results**  ·  pay only for results  ·  no credit card to try

*We do the dirty work so your dataset stays clean.* 😈

Scrape Hipcamp's US regional discover pages into structured campsite rows — private land, public campgrounds, and public land — with price, rating, geo, and capacity fields per listing.

</div>

***

### 🎯 What this scrapes

Hipcamp is the largest US marketplace for private-land camping, public campgrounds, and public-land stays, and its scraper field is thin: the sole name-matched rival, `lexis-solutions/hipcamp-scraper`, runs with just 4 users. This Actor turns Hipcamp's regional discover pages into normalized rows — private land, public campgrounds, and public land in one shape — with USD nightly price, rating percentage, review count, capacity, geo-coordinates, and accommodation types per listing, so hosts running competitor/pricing intel and travel-data buyers don't have to hand-parse Hipcamp's own page markup.

### 🔥 What we handle for you

- 🛡️ **Browser fingerprint rotation** — `curl-cffi` impersonates real Chrome / Firefox / Safari TLS handshakes, rotated across requests, so the target sees a browser, not Python.
- 🌐 **Proxy session rotation** via Apify Proxy — fresh session and exit IP on every block, always pinned to the US (`US`) since Hipcamp inventory is US-only.
- 🔁 **Retries with exponential backoff** on `408 / 429 / 5xx` — up to 5 attempts per region, `Retry-After` honoured.
- 🧱 **Region-level fault isolation** — one blocked or unreadable region is skipped and logged, never crashes the run.
- 🧊 **Clean, typed dataset rows** — Pydantic-validated, ISO-8601 timestamps, deduped by `listing_id`/`url` across all three listing types.
- 💰 **Pay-Per-Event pricing** — you only pay for results that hit your dataset. No data, no charge.

### 💡 Use cases

- **Outdoor-stay host competitor intel** — benchmark nightly pricing, ratings, and capacity against nearby private-land and campground listings in your region.
- **Travel-data aggregation** — feed normalized US campsite inventory into a broader outdoor-travel dataset alongside other lodging sources.
- **Campsite-availability data buyers** — pull current listing counts, accommodation types, and geo-coordinates per region for market-coverage analysis.
- **Market-entry research** — compare private-land, public-campground, and public-land supply and pricing across multiple US states/cities in one run.

### ⚙️ How to use it

1. Click **Try for free** at the top of the page.
2. Fill in the input form — most fields have sensible defaults.
3. Click **Start**. Output streams into the run's dataset.
4. Export from **Storage → Dataset** as JSON, CSV, or Excel — or fetch via the API.

### 📥 Input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `regions` | `array` | **yes** | \[{'state': 'Texas', 'city': 'Austin'}] | US regions to scrape, 1-10 items. Each item: { state (required, e.g. 'Texas'), city (optional, e.g. 'Austin') }.… |
| `maxListingsPerRegion` | `integer` | no | 20 | Caps rows per region. Leave unset for everything the discover page returns (roughly 40-45 combined listings). |
| `proxyConfiguration` | `object` | no | {'useApifyProxy': True, 'apifyProxyGroups': \['RESIDENTIAL'], 'apifyProxyCountry': 'US'} | Defaults to the RESIDENTIAL proxy group pinned to the US — Hipcamp inventory is US-only, so a random exit country risks… |

#### Example input

```json
{
  "regions": [
    {
      "state": "Texas",
      "city": "Austin"
    }
  ],
  "maxListingsPerRegion": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

### 📤 Output

Every row is one dataset item.

| Field | Type | Notes |
|---|---|---|
| `listing_id` | `string` | node.id (fallback maskedId/uuid). |
| `listing_type` | `string` | 'private\_land', 'public\_campground', or 'public\_land'. |
| `name` | `string` | node.name (fallback parkName). |
| `url` | `string` | node.url/hasMap, absolutized against https://www.hipcamp.com. |
| `city` | `['string', 'null']` | node.cityName. |
| `state` | `['string', 'null']` | node.stateName. |
| `state_abbr` | `['string', 'null']` | node.stateAbbrvName. |
| `country_code` | `['string', 'null']` | node.countryCode. |
| `latitude` | `['number', 'null']` | node.coordinate.latitude / JSON-LD geo.latitude. |
| `longitude` | `['number', 'null']` | node.coordinate.longitude / JSON-LD geo.longitude. |
| `price_per_night_usd` | `['number', 'null']` | minPricePerNight.amount / pricePerNight.amount. |
| `price_display` | `['string', 'null']` | .format field / JSON-LD priceRange. |
| `rating_percentage` | `['number', 'null']` | recommendsPercentage. |
| `rating_count` | `['integer', 'null']` | recommendsCount / JSON-LD aggregateRating.ratingCount. |
| `total_campsites_count` | `['integer', 'null']` | totalCampsitesCount / campsitesCount. |
| `summary` | `['string', 'null']` | summary (fallback tileSummary). |
| `accommodation_types` | `['array', 'null']` | allAccommodationKeys. |
| `is_star_host` | `['boolean', 'null']` | isStarHost (private-land only). |
| `distance_miles` | `['number', 'null']` | distance, US locale, unconverted. |
| `image_url` | `['string', 'null']` | coverPhoto.filename / topPhotos\[0] / JSON-LD image. |
| `scraped_at` | `string` | ISO 8601 UTC row-creation timestamp. |

#### Example output

```json
{
  "listing_id": "7rvhj6kr",
  "listing_type": "private_land",
  "name": "Texas Urban Hideout",
  "url": "https://www.hipcamp.com/en-US/land/texas-urban-hideout-7rvhj6kr",
  "city": "Austin",
  "state": "Texas",
  "state_abbr": "TX",
  "country_code": "US",
  "latitude": 30.2672,
  "longitude": -97.7431,
  "price_per_night_usd": 72.0,
  "price_display": "$72",
  "rating_percentage": 98.0,
  "rating_count": 41,
  "total_campsites_count": 3,
  "summary": "Private land tucked into East Austin, walkable to downtown.",
  "accommodation_types": [
    "house"
  ],
  "is_star_host": true,
  "distance_miles": 4.2,
  "image_url": "https://cdn.hipcamp.com/...jpg",
  "scraped_at": "2026-08-24T18:03:11Z"
}
```

### 💰 Pricing

Pay-Per-Event — you pay only when these events fire:

| Event | USD | What it is |
|---|---:|---|
| `actor-start` | $0.05 | One-off warm-up charge per run |
| `result-row` | $0.0012 | Per unique dataset item |

Example: 1 000 results at the rates above ≈ **$1.25**. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.

### 🚧 Limitations

v0.1 covers each region's discover-page snapshot only (~40-45 combined listings per region) — not a metro's full inventory, and not listing detail pages (amenities, galleries, host bios, review text, availability calendars). Booking/availability/reservation data and non-US regions are out of scope.

### ❓ FAQ

**Do I need a Hipcamp account or API key?**

No. This Actor scrapes Hipcamp's own publicly listed discover pages — no login, no API key.

**Does this cover a region's full inventory?**

No. Hipcamp's discover page is curated — roughly 40-45 combined listings per region, even when the site reports thousands of total listings. There's no pagination parameter on this page; broaden coverage with more regions (up to 10 per run), not paging.

**What regions can I scrape?**

Any US state, optionally narrowed to a city — pass free-text names like 'Texas' or 'Los Angeles' and the Actor slugifies them internally. Hipcamp inventory is US-only.

**What happens if a region has no matches?**

The run still succeeds with zero rows for that region and a status message naming what was searched — a real search that matched nothing is not a failure.

### 💬 Your feedback

Spotted a bug, hit a weird edge case, or need a new field? Open an
issue on the Actor's **Issues** tab on Apify Console — we ship
fixes weekly and we read every report.

***

<div align="center">

Built by **[Devil Scrapes](https://apify.com/DevilScrapes)** 😈 — a small fleet of
opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

</div>

# Actor input Schema

## `regions` (type: `array`):

US regions to scrape, 1-10 items. Each item: { state (required, e.g. 'Texas'), city (optional, e.g. 'Austin') }. Free-text US names — the Actor slugifies them internally.

## `maxListingsPerRegion` (type: `integer`):

Caps rows per region. Leave unset for everything the discover page returns (roughly 40-45 combined listings).

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

Defaults to the RESIDENTIAL proxy group pinned to the US — Hipcamp inventory is US-only, so a random exit country risks locale/currency drift.

## Actor input object example

```json
{
  "regions": [
    {
      "state": "Texas",
      "city": "Austin"
    }
  ],
  "maxListingsPerRegion": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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 = {
    "regions": [
        {
            "state": "Texas",
            "city": "Austin"
        }
    ],
    "maxListingsPerRegion": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/hipcamp-campsite-listings-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 = {
    "regions": [{
            "state": "Texas",
            "city": "Austin",
        }],
    "maxListingsPerRegion": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/hipcamp-campsite-listings-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 '{
  "regions": [
    {
      "state": "Texas",
      "city": "Austin"
    }
  ],
  "maxListingsPerRegion": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call devilscrapes/hipcamp-campsite-listings-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,devilscrapes/hipcamp-campsite-listings-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/KD3jaJ7cDNJYKCJNl/builds/AuIVh7T1IlHnGVsDr/openapi.json
