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.
List invoices
Section titled “List invoices”GET /api/v1/public/invoices/Required scope: invoices: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: 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):
| Field | Type | Description |
|---|---|---|
id | integer | Invoice primary key, unique within the tenant |
invoice_number | string | Operator-visible invoice number (typically YYYY-NNNNNN) |
booking_id | integer or null | ID of the booking this invoice belongs to. null for invoices not tied to a specific booking (e.g. POS-only invoices) |
total_chf | decimal string (CHF) | Total invoiced amount in Swiss francs, including all line items and tourist tax |
status | string | Invoice 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_at | datetime (ISO 8601, UTC) | When the invoice was created |
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/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"])Common gotchas
Section titled “Common gotchas”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.