Sites
A site is a single pitch on the campsite — a numbered parcel that a guest can book. Each site has a type (tent pitch, motorhome pitch, mobile home, etc.), a base nightly price, and a maximum occupancy.
The sites endpoint exposes a read-only catalogue. Use it to look up the pitch IDs that POST /api/v1/public/bookings/ expects, or to mirror a tenant’s pitch inventory into another system.
List sites
Section titled “List sites”GET /api/v1/public/sites/Required scope: sites:read
Query parameters:
| Name | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number, 1-indexed |
page_size | integer | 50 | Items per page (max 200) |
No filter parameters are available in v1. Default order: site_number ascending — natural campsite layout order. See Pagination and filtering for the full pagination contract.
Response 200:
{ "count": 84, "next": "https://api.campone.ch/api/v1/public/sites/?page=2", "previous": null, "results": [ { "id": 312, "site_number": "A12", "name": "Seeblick Standard", "max_occupants": 4, "base_price_per_night": "55.00", "status": "active", "site_type_id": 7, "site_type_name": "Wohnmobil" } ]}Response fields (per result):
| Field | Type | Description |
|---|---|---|
id | integer | Pitch primary key. Use this as site_id when creating a booking |
site_number | string | Pitch number as displayed on the campsite map (e.g. "A12") |
name | string | Operator-assigned descriptive name (may be empty) |
max_occupants | integer | Maximum total occupants the pitch is rated for |
base_price_per_night | decimal string (CHF) | Operator-set base price. Final guest pricing depends on season, occupancy, and tourist tax — this is a starting figure, not a final quote |
status | string | Operational status of the pitch (active, inactive, etc.) |
site_type_id | integer | ID of the site type this pitch belongs to |
site_type_name | string | Human-readable site type name (e.g. "Wohnmobil", "Zelt", "Mobilheim") |
Errors: 401, 403, 429. See Errors and status codes for the response shapes.
Example (curl):
curl -H "Authorization: Bearer ck_a1b2c3d4XXXXXXXXXXXXXXXXXXXXXXXX" \ "https://api.campone.ch/api/v1/public/sites/?page=1&page_size=200"Example (Python):
import requests
r = requests.get( "https://api.campone.ch/api/v1/public/sites/", headers={"Authorization": "Bearer ck_a1b2c3d4XXXXXXXXXXXXXXXXXXXXXXXX"}, params={"page": 1, "page_size": 200},)r.raise_for_status()data = r.json()for site in data["results"]: print(site["site_number"], site["site_type_name"], site["base_price_per_night"])Common gotchas
Section titled “Common gotchas”Pitch IDs are tenant-scoped. A site_id returned by one tenant’s key has no meaning for another tenant. If you store IDs in a downstream system, key them by tenant.
base_price_per_night is not the booked price. It is the operator-configured starting price for the pitch and ignores seasonal pricing, occupancy adjustments, and tourist tax. Use it for catalogue display, not for billing reconciliation. The actual billed amount is on the matching invoice — see the invoices endpoint.
No availability data here. This endpoint returns the static pitch catalogue. To know whether a pitch is free for a given date range, list bookings on the same pitch and intersect the date ranges client-side. A dedicated availability endpoint is on the roadmap.