---
title: "Get Campground"
method: GET
path: "/api/v1/parks/campgrounds/{campground_id}"
tags: ["parks"]
---

# Get Campground

`GET /api/v1/parks/campgrounds/{campground_id}`

## 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/v1/parks/campgrounds/{campground_id}`
- Auth: none declared

Get a specific campground by ID.

This endpoint is public and does not require authentication.

## Path parameters

- `campground_id` string, required

## Response `200`

Successful Response

- CampgroundResponse: Schema for campground response.
  - `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

## 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)
