# KOA Campgrounds Scraper (`crawlerbros/koa-campgrounds-scraper`) Actor

Scrape the KOA campground directory (koa.com) - 500+ Kampgrounds of America parks across the USA and Canada. Search by keyword, browse by state or province, or fetch by URL. Get full campground details: address, phone, email, GPS coordinates, ratings, amenities, ways to stay, recreation, and hours.

- **URL**: https://apify.com/crawlerbros/koa-campgrounds-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Automation, Developer tools, Travel
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## KOA Campgrounds Scraper

Scrape **KOA (Kampgrounds of America)** — the largest system of privately owned campgrounds in North America, with 500+ parks across the **USA and Canada**. Search the KOA directory by keyword, browse every campground in a state or province, or fetch individual campgrounds by URL. Get full campground details: address, phone, email, GPS coordinates, KOA brand tier, camper ratings, amenities, ways to stay, recreation, local attractions, operating hours, and recent reviews.

### What this actor does

- **Three modes:** `search`, `browseByState`, `byUrl`
- **Full directory coverage:** every KOA campground in any of 46 US states and 10 Canadian provinces
- **Rich detail records:** descriptions, standard + unique amenities, ways to stay (RV sites / tent sites / lodging / extended stays), recreation items, local-area attractions with addresses and phones, operating hours, check-in/check-out times, and recent camper reviews
- **Filters:** state/province, amenity (pool, Wi-Fi, firewood, and more), minimum rating, keyword, max distance
- **Reliable access:** uses a modern Chrome fingerprint for direct access; optional proxy is engaged automatically only if a request gets blocked
- **Empty fields are omitted**

### Data source

The actor reads **koa.com** — Kampgrounds of America's official campground directory (US + Canada). Campground summaries come from KOA's public search endpoint; detail data is parsed from each campground's public profile page and photo/amenities pages. No login, cookies, or API keys are required.

### Limitations

- **Coverage:** KOA operates in 46 US states and 10 Canadian provinces; states/territories without a KOA park are not present in the state/province dropdown.
- **Amenity filter:** the amenity enum covers KOA's standardized amenity taxonomy (the 13 searchable amenity categories). Free-text amenities shown per campground (e.g. `FOOD TRUCK`, `Ladder Ball`) appear in `uniqueAmenities` but are not filterable.
- **Ratings:** `rating`/`reviewCount` come from KOA's published camper-rating widget; parks without a published rating omit these fields rather than showing a placeholder.
- **Seasonal amenity notes** (e.g. `Pool (5/23 - 9/3)`) are preserved verbatim in `standardAmenities`.
- **Access:** koa.com is protected by Cloudflare; the actor uses a modern Chrome TLS fingerprint. Plain `curl` may receive 403 responses even for photo URLs — the actor's fetches (including photo galleries) succeed with the browser-grade fingerprint.
- **Not affiliated:** this actor is a third-party tool and is not affiliated with or endorsed by KOA.

### Output per campground

- `campgroundId` — KOA campground ID (e.g. `43102`)
- `name`, `alias` — e.g. `Amarillo KOA Journey` / `amarillo`
- `segmentation` — KOA brand tier derived from the property name (`Journey` / `Holiday` / `Resort` / `Express`)
- `segmentCode` — the raw numeric segment code from the search API (search mode only; KOA's numeric codes are not stable brand names, so the label is derived from the name instead)
- `description`, `longDescription` — short intro and full profile text
- `rating`, `reviewCount` — camper rating and number of reviews
- `phoneNumber`, `emailAddress`
- `streetAddress`, `city`, `stateProvince`, `stateProvinceCode`, `postalCode`, `country`, `fullAddress`
- `latitude`, `longitude` — map coordinates
- `distanceMiles` — distance from the search location (mode=search)
- `amenities` — decoded amenity list (Pool, Wi-Fi, Fishing, …)
- `standardAmenities` — detail-page amenity list, including seasonal notes (e.g. `Pool (5/23 - 9/3)`)
- `uniqueAmenities` — list of `{name, description}` for unique on-site offerings
- `waysToStay` — e.g. `RV Sites`, `Tent Sites`, `Lodging`, `Extended Stays`
- `recreation` — on-site recreation items (pool, playground, corn hole, …)
- `localAttractions` — list of `{name, description, address, phoneNumber, website}` for nearby attractions
- `operatingHours` — list of `{day, hours}`
- `checkInCheckOut` — list of `{accommodation, checkIn, checkOut}`
- `openSeasons` — `Open All Year` or `Open Seasonally`
- `drivingDirections`
- `photoUrl` — primary photo; `photoUrls` — up to 15 gallery photos (when `includePhotos` is enabled)
- `recentReviews` — up to 10 recent `{date, text, reviewer, rating, source}` entries
- `sourceUrl`, `recordType: "campground"`, `scrapedAt`

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | `search` / `browseByState` / `byUrl` |
| `searchQuery` | string | `Texas` | Destination, city, state, or campground name (mode=search) |
| `state` | string | – | 56-state/province enum (mode=browseByState) |
| `campgroundUrls` | array | – | KOA campground page URLs (mode=byUrl) |
| `stateFilter` | string | – | Keep only campgrounds in this state/province |
| `amenity` | string | – | Keep only campgrounds with this amenity |
| `segmentation` | string | – | Keep only campgrounds in this KOA brand segment: `Holiday` / `Journey` / `Resort` |
| `containsKeyword` | string | – | Keep only campgrounds matching this text |
| `minRating` | number | `0` | Minimum camper rating (0–5) |
| `maxDistance` | string | – | Max distance from search location (5/50/100/250 miles) |
| `includeDetails` | boolean | `true` | Fetch full campground detail pages |
| `includePhotos` | boolean | `false` | Fetch photo gallery URLs |
| `maxItems` | int | `50` | Hard cap (1–1000) |
| `proxyConfiguration` | object | – | Optional proxy, engaged automatically on block |

#### Example: search campgrounds in Texas with a pool

```json
{
  "mode": "search",
  "searchQuery": "Texas",
  "amenity": "pool",
  "minRating": 4.5,
  "maxItems": 20
}
```

#### Example: browse an entire state

```json
{
  "mode": "browseByState",
  "state": "florida",
  "containsKeyword": "beach",
  "maxItems": 50
}
```

#### Example: browse a Canadian province

```json
{
  "mode": "browseByState",
  "state": "ontario",
  "includeDetails": true,
  "maxItems": 25
}
```

#### Example: fetch specific campgrounds by URL

```json
{
  "mode": "byUrl",
  "campgroundUrls": [
    "https://koa.com/campgrounds/amarillo/",
    "https://koa.com/campgrounds/austin-east/"
  ],
  "includePhotos": true
}
```

### Use cases

- **Trip planning databases** — build complete catalogs of KOA campgrounds with locations, amenities, and ratings
- **Travel content** — enrich destination guides with accurate campground details and local attractions
- **Campground analytics** — track ratings, brand tiers, and amenity coverage across regions
- **Route planning** — find KOA parks near a destination or along a route (max distance filter)
- **RV industry research** — study the KOA franchise network by state and province

### FAQ

**What is the data source?**
KOA's public website (koa.com) — the official campground directory of Kampgrounds of America. This actor is not affiliated with or endorsed by KOA.

**Which regions are covered?**
All KOA campgrounds in the USA (46 states) and Canada (10 provinces). KOA has no parks in the other states or territories.

**Do I need a proxy?**
No. The actor works without one and only engages a proxy automatically if a request is blocked.

**What is `segmentation`?**
KOA brands its campgrounds into three tiers: **Journey** (convenient highway stops), **Holiday** (destination parks with more amenities), and **Resort** (premium resorts with pools, spas, and activities).

**How fresh is the data?**
Campground profiles are scraped live on every run. Ratings and reviews reflect what KOA shows at scrape time.

**Why are some fields missing on some records?**
KOA does not publish every field for every campground (e.g. some parks list no unique amenities or local attractions). Fields that are unavailable are omitted rather than filled with placeholders.

**What does `openSeasons` mean?**
`Open All Year` parks operate year-round; `Open Seasonally` parks close during part of the year (KOA notes this per park).

**How many photos are returned?**
Up to 15 gallery photos per campground when `includePhotos` is enabled (primary photo is always included on detail records).

**Why did my run return 0 records?**
The filters may be too restrictive (e.g. a rare amenity combined with a high minimum rating). Try widening `maxDistance` or clearing filters.

# Actor input Schema

## `mode` (type: `string`):

What to fetch.

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

Destination, city, state, province, campground name, or keyword — e.g. `Texas`, `Amarillo`, `Yosemite`, `yellowstone`. Matched against KOA's campground directory.

## `state` (type: `string`):

Browse every KOA campground in this US state or Canadian province.

## `campgroundUrls` (type: `array`):

KOA campground page URLs, e.g. `https://koa.com/campgrounds/amarillo/`.

## `stateFilter` (type: `string`):

Only emit campgrounds in this state or province (mode=search / byUrl).

## `amenity` (type: `string`):

Only emit campgrounds offering this amenity (mode=search / byUrl).

## `segmentation` (type: `string`):

Only emit campgrounds in this KOA brand segment (mode=search / browseByState / byUrl).

## `containsKeyword` (type: `string`):

Only emit campgrounds whose name, city, state, or description contains this text (case-insensitive).

## `minRating` (type: `number`):

Only emit campgrounds with a camper rating at or above this value (0–5).

## `maxDistance` (type: `string`):

Maximum distance in miles from the search location.

## `includeDetails` (type: `boolean`):

Fetch each campground's detail page for descriptions, full amenities, recreation, local attractions, operating hours, and recent reviews.

## `includePhotos` (type: `boolean`):

Fetch each campground's photo gallery page and include up to 15 photo URLs.

## `maxItems` (type: `integer`):

Hard cap on emitted records.

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

Optional proxy. KOA generally does not require a proxy; if a request is blocked (403/429), the actor automatically retries it through this proxy.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "Texas",
  "campgroundUrls": [],
  "minRating": 0,
  "includeDetails": true,
  "includePhotos": false,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `campgrounds` (type: `string`):

Dataset containing all scraped KOA campgrounds.

# 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 = {
    "mode": "search",
    "searchQuery": "Texas",
    "campgroundUrls": [],
    "includeDetails": true,
    "includePhotos": false,
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/koa-campgrounds-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 = {
    "mode": "search",
    "searchQuery": "Texas",
    "campgroundUrls": [],
    "includeDetails": True,
    "includePhotos": False,
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/koa-campgrounds-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 '{
  "mode": "search",
  "searchQuery": "Texas",
  "campgroundUrls": [],
  "includeDetails": true,
  "includePhotos": false,
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call crawlerbros/koa-campgrounds-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawlerbros/koa-campgrounds-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/ukCiySuHqaFUa6IAM/builds/Wseu9dLsR0QQOsTvK/openapi.json
