Skip to content

Customers

A customer is a guest who has registered an account on the tenant’s guest portal — the self-service site where guests check in, view their invoices, and manage their profile. Walk-in guests and bookings made on a guest’s behalf are not customers and do not appear here; they live on the booking record itself (guest_first_name, guest_last_name, guest_email).

GET /api/v1/public/customers/

Required scope: customers:read

Query parameters:

NameTypeDefaultDescription
pageinteger1Page number, 1-indexed
page_sizeinteger50Items per page (max 200)

No filter parameters are available in v1. Default order: date_joined descending — most recently registered first. See Pagination and filtering for the full pagination contract.

Response 200:

{
"count": 412,
"next": "https://api.campone.ch/api/v1/public/customers/?page=2",
"previous": null,
"results": [
{
"id": 9087,
"email": "anna.mueller@example.ch",
"first_name": "Anna",
"last_name": "Müller",
"phone_number": "+41 79 123 45 67",
"date_joined": "2026-04-21T18:02:11.314Z"
}
]
}

Response fields (per result):

FieldTypeDescription
idintegerCustomer primary key, unique within the tenant
emailstringCustomer email address (used for login)
first_namestringCustomer first name
last_namestringCustomer last name
phone_numberstringCustomer phone number (may be empty)
date_joineddatetime (ISO 8601, UTC)When the customer registered the guest-portal account

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/customers/?page=1"

Example (Python):

import requests
r = requests.get(
"https://api.campone.ch/api/v1/public/customers/",
headers={"Authorization": "Bearer ck_a1b2c3d4XXXXXXXXXXXXXXXXXXXXXXXX"},
params={"page": 1, "page_size": 50},
)
r.raise_for_status()
data = r.json()
for customer in data["results"]:
print(customer["email"], customer["first_name"], customer["last_name"])

Only registered guest-portal accounts are returned. Operators, staff, and tenant administrators are filtered out. Walk-in guests recorded only via a booking’s guest_* fields are also not surfaced here — there is no account to enumerate.

No bookings are joined. This endpoint returns customer records only. To see what a given customer has booked, list bookings and match by guest_email client-side. A customer_id foreign key on the booking object is on the roadmap but not in v1.

Personal data is in scope of nDSG. Customer rows contain personal data (name, email, phone). Process them according to your data-protection obligations — see the operator-facing nDSG page for the platform’s compliance posture.