Skip to content

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.

GET /api/v1/public/sites/

Required scope: sites:read

Query parameters:

NameTypeDefaultDescription
pageinteger1Page number, 1-indexed
page_sizeinteger50Items 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):

FieldTypeDescription
idintegerPitch primary key. Use this as site_id when creating a booking
site_numberstringPitch number as displayed on the campsite map (e.g. "A12")
namestringOperator-assigned descriptive name (may be empty)
max_occupantsintegerMaximum total occupants the pitch is rated for
base_price_per_nightdecimal 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
statusstringOperational status of the pitch (active, inactive, etc.)
site_type_idintegerID of the site type this pitch belongs to
site_type_namestringHuman-readable site type name (e.g. "Wohnmobil", "Zelt", "Mobilheim")

Errors: 401, 403, 429. See Errors and status codes for the response shapes.

Example (curl):

Terminal window
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"])

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.