---
title: "List Park Campgrounds V5"
method: GET
path: "/api/v5/parks/{park_id}/campgrounds"
tags: ["parks-v5"]
---

# List Park Campgrounds V5

`GET /api/v5/parks/{park_id}/campgrounds`

## Request

- Base URL: `https://api.alert.camp` (the document declares no server; this is the origin it was published from)
- URL: `https://api.alert.camp/api/v5/parks/{park_id}/campgrounds`
- Auth: none declared

List a park's campgrounds (v5 — **full surface**, incl. Ontario Parks
Daily Vehicle Permit day use).

Current mobile master calls this, paired with ``/api/v9/parks``.  v4 plus
every booking category gated at v9 (``min_parks_api_version``).  Public,
no auth.

## Path parameters

- `park_id` string, required

## Query parameters

- `active_only` boolean: Only return active campgrounds

## Response `200`

Successful Response

- CampgroundListResponse: Schema for list of campgrounds response.
  - `campgrounds` CampgroundResponse[], required
    - `id` string, required
    - `park_id` string, required
    - `name` string, required
    - `name_en` string, nullable, required
    - `description` string, nullable, required
    - `url` string, nullable, required
    - `is_active` boolean, required
    - `latitude` number, nullable
    - `longitude` number, nullable
    - `max_watched_sites` integer, nullable: Max sites ONE alert may watch in this campground, narrowing the tier's sites-per-alert limit. null = tier limit only.
    - `max_sites_per_night` integer, nullable: Max sites one ROUTE NIGHT may offer here. null = no limit.
    - `has_roofed_sites` boolean: Whether any zone in this campground contains roofed accommodation sites.
    - `has_canoe_sites` boolean: Whether any zone in this campground contains canoe-camping sites.
    - `has_backcountry_sites` boolean: Whether any zone in this campground contains backcountry sites.
    - `has_site_map` boolean: Whether THIS campground has a photo-overlay site map, so the picker can route to it per campground instead of per platform. Maps are sparse within a provider — Recreation.gov has exactly one (Yosemite's permit trailheads, from the NPS wilderness map) against 92,467 mapless sites — so `Platform.has_site_map` is the wrong unit and a per-park override would only restate what the map rows already say. Defaults False, so a client that ignores it behaves exactly as before.
    - `has_day_use_sites` boolean: Whether any zone in this campground contains day-use sites (Parks Canada parking time slots, Banff shuttle departures). Defaults False, so builds that predate the activity are unaffected — the v1 campgrounds route hides day-use-only campgrounds from them entirely.
    - `seasons` SeasonSpan[]: Distinct operating seasons among this campground's active sites — usually one, occasionally several (a campground can open its loops on different dates). Empty when no site publishes a season. Data only: the server does not act on it, and a client that ignores it behaves exactly as before.
      - `start` string, required: Season start as "MM-DD".
      - `end` string, required: Season end as "MM-DD".
    - `has_unknown_season` boolean: Whether ANY active site here has no published season. Most providers publish none at all (Aspira, UseDirect, and every Recreation.gov site not yet swept), and unknown must never read as closed. Defaults TRUE so a client treats the campground as always open unless told otherwise — the safe direction, since the only use for this is warning that dates can never match.
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
  - `total` integer, required
  - `park_id` string, nullable: Park ID if filtered by park

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/alert/apis/alertcamp.md) · [All operations](https://skmtc.dev/alert/apis/alertcamp/llms.txt) · [OpenAPI document](https://skmtc.dev/alert/apis/alertcamp/revisions/864c8c9ef833?raw)
