Skip to content

Invoices

An invoice is a billing document the platform issues for a stay — a Swiss QR-Bill PDF that goes to the guest, plus the underlying line items the operator sees in the admin console. The invoices endpoint exposes a read-only summary of those documents for accounting and ERP integrations.

The public invoice object intentionally omits line items and the rendered PDF — it is a header view, not a full document export. Pulling the PDF or the line breakdown is on the roadmap.

GET /api/v1/public/invoices/

Required scope: invoices:read

Query parameters:

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

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

Response 200:

{
"count": 256,
"next": "https://api.campone.ch/api/v1/public/invoices/?page=2",
"previous": null,
"results": [
{
"id": 7714,
"invoice_number": "2026-000412",
"booking_id": 4821,
"total_chf": "412.50",
"status": "OFFEN",
"issued_at": "2026-04-26T09:18:03.992Z"
}
]
}

Response fields (per result):

FieldTypeDescription
idintegerInvoice primary key, unique within the tenant
invoice_numberstringOperator-visible invoice number (typically YYYY-NNNNNN)
booking_idinteger or nullID of the booking this invoice belongs to. null for invoices not tied to a specific booking (e.g. POS-only invoices)
total_chfdecimal string (CHF)Total invoiced amount in Swiss francs, including all line items and tourist tax
statusstringInvoice status code. One of OFFEN (open / unpaid), ERLEDIGT (settled / paid), STORNIERT (cancelled), PICKUP (awaiting in-person pickup / payment). German values are what the API returns verbatim
issued_atdatetime (ISO 8601, UTC)When the invoice was created

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

Example (Python):

import requests
r = requests.get(
"https://api.campone.ch/api/v1/public/invoices/",
headers={"Authorization": "Bearer ck_a1b2c3d4XXXXXXXXXXXXXXXXXXXXXXXX"},
params={"page": 1, "page_size": 100},
)
r.raise_for_status()
data = r.json()
for invoice in data["results"]:
print(invoice["invoice_number"], invoice["status"], invoice["total_chf"])

booking_id can be null. Invoices created from POS transactions, or invoices manually issued by an operator without a linked stay, do not have a booking. Handle the null case explicitly when you join invoices to bookings downstream.

The PDF is not exposed in v1. This endpoint returns invoice headers only. To download the QR-Bill PDF, operators export it from the admin console; a public PDF endpoint is on the roadmap.

Status values are German strings. The status field returns the raw enum value from the platform’s internal model: OFFEN, ERLEDIGT, STORNIERT, or PICKUP. Map them in your integration as: OFFEN = open / unpaid, ERLEDIGT = settled / paid, STORNIERT = cancelled, PICKUP = awaiting in-person pickup or payment. Treat any value outside this list as unknown — additional codes may be added in a future minor version.

Currency is always CHF. The platform serves Swiss campsites; total_chf is denominated in Swiss francs. There is no separate currency field in v1.