Buchungen
Questi contenuti non sono ancora disponibili nella tua lingua.
Eine Buchung ist ein Gastaufenthalt auf einem einzelnen Stellplatz (site) für einen Datumsbereich. Die Buchungs-Endpunkte erlauben einer Integration, bestehende Buchungen aufzulisten, eine bestimmte abzurufen und neue Reservierungen im Status pending einzureichen, die ein Betreiber in der Admin-Konsole bestätigt.
Das öffentliche Buchungsobjekt ist eine bewusst kleine Projektion des internen Buchungsdatensatzes — die unten aufgeführten Felder sind der Vertrag, sie werden innerhalb von v1 nicht umbenannt, entfernt oder umtypisiert.
Buchungen auflisten
Abschnitt betitelt „Buchungen auflisten“GET /api/v1/public/bookings/Erforderlicher Geltungsbereich: bookings:read
Query-Parameter:
| Name | Typ | Standard | Beschreibung |
|---|---|---|---|
page | integer | 1 | Seitennummer, 1-indiziert |
page_size | integer | 50 | Einträge pro Seite (max. 200) |
status | string | — | Exakter Vergleich mit dem Buchungsstatuscode (siehe Buchungsstatus-Werte) |
check_in_from | date (YYYY-MM-DD) | — | Liefert Buchungen mit check_in_date >= dem Wert |
check_in_to | date (YYYY-MM-DD) | — | Liefert Buchungen mit check_in_date <= dem Wert |
Standardsortierung: created_at absteigend — neueste Buchungen zuerst. Den vollständigen Paginierungsvertrag finden Sie unter Paginierung und Filterung.
Antwort 200:
{ "count": 137, "next": "https://api.campone.ch/api/v1/public/bookings/?page=2", "previous": null, "results": [ { "id": 4821, "booking_reference": "B-7K2QXA", "guest_first_name": "Anna", "guest_last_name": "Müller", "guest_email": "anna.mueller@example.ch", "site_id": 312, "site_number": "A12", "check_in_date": "2026-07-14", "check_out_date": "2026-07-21", "num_adults": 2, "num_youth": 0, "num_children": 1, "status": "confirmed", "total_price": "385.00", "created_at": "2026-04-26T09:14:22.481Z" } ]}Antwortfelder (pro Ergebnis):
| Feld | Typ | Beschreibung |
|---|---|---|
id | integer | Primärschlüssel der Buchung, eindeutig innerhalb des Mandanten |
booking_reference | string | Lesbarer Referenzcode, der Gästen und auf Rechnungen angezeigt wird |
guest_first_name | string | Vorname des Gastes (kann bei alten Walk-in-Buchungen leer sein) |
guest_last_name | string | Nachname des Gastes (kann leer sein) |
guest_email | string | E-Mail des Gastes (kann leer sein) |
site_id | integer | ID des Stellplatzes, auf dem diese Buchung liegt |
site_number | string | Stellplatznummer wie auf dem Platzplan angezeigt (z. B. "A12") |
check_in_date | date (YYYY-MM-DD) | Anreisedatum |
check_out_date | date (YYYY-MM-DD) | Abreisedatum |
num_adults | integer | Anzahl der erwachsenen Gäste |
num_youth | integer | Anzahl der jugendlichen Gäste (Standard 0) |
num_children | integer | Anzahl der Kinder (Standard 0) |
status | string | Buchungsstatuscode — siehe Buchungsstatus-Werte |
total_price | decimal string (CHF) | Auf dem Server gespeicherter Gesamtbetrag. Bei über diese API erstellten Buchungen ist dies eine vorläufige Schätzung; siehe Häufige Stolpersteine |
created_at | datetime (ISO 8601, UTC) | Zeitpunkt, zu dem der Buchungsdatensatz angelegt wurde |
Fehler: 401, 403, 429. Die Antwortformen finden Sie unter Fehler und Statuscodes.
Beispiel (curl):
curl -H "Authorization: Bearer ck_a1b2c3d4XXXXXXXXXXXXXXXXXXXXXXXX" \ "https://api.campone.ch/api/v1/public/bookings/?check_in_from=2026-07-01&check_in_to=2026-07-31"Beispiel (Python):
import requests
r = requests.get( "https://api.campone.ch/api/v1/public/bookings/", headers={"Authorization": "Bearer ck_a1b2c3d4XXXXXXXXXXXXXXXXXXXXXXXX"}, params={"check_in_from": "2026-07-01", "check_in_to": "2026-07-31"},)r.raise_for_status()data = r.json()for booking in data["results"]: print(booking["booking_reference"], booking["site_number"], booking["status"])Eine Buchung abrufen
Abschnitt betitelt „Eine Buchung abrufen“GET /api/v1/public/bookings/{id}/Erforderlicher Geltungsbereich: bookings:read
Pfadparameter:
| Name | Typ | Beschreibung |
|---|---|---|
id | integer | Buchungs-ID, wie sie der Listen-Endpunkt liefert |
Antwort 200: Ein einzelnes Buchungsobjekt mit denselben Feldern wie ein results[]-Eintrag aus dem Listen-Endpunkt.
Fehler: 401, 403, 404 ({"detail": "not_found"}, wenn die Buchung nicht existiert oder zu einem anderen Mandanten gehört), 429.
Beispiel (curl):
curl -H "Authorization: Bearer ck_a1b2c3d4XXXXXXXXXXXXXXXXXXXXXXXX" \ "https://api.campone.ch/api/v1/public/bookings/4821/"Beispiel (Python):
import requests
r = requests.get( "https://api.campone.ch/api/v1/public/bookings/4821/", headers={"Authorization": "Bearer ck_a1b2c3d4XXXXXXXXXXXXXXXXXXXXXXXX"},)r.raise_for_status()booking = r.json()Eine Buchung anlegen
Abschnitt betitelt „Eine Buchung anlegen“POST /api/v1/public/bookings/Erforderlicher Geltungsbereich: bookings:write
Legt eine Buchung im Status pending mit source = "online" an. Ein Betreiber bestätigt sie in der Admin-Konsole; dieser Bestätigungsschritt rechnet zudem den Preis mit der Preisengine der Plattform neu.
Anfragekörper:
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
site_id | integer | ja | ID eines bestehenden Stellplatzes des aufrufenden Mandanten |
check_in_date | date (YYYY-MM-DD) | ja | Anreisedatum |
check_out_date | date (YYYY-MM-DD) | ja | Abreisedatum — muss nach check_in_date liegen |
num_adults | integer ≥ 0 | ja | Anzahl der erwachsenen Gäste |
num_youth | integer ≥ 0 | nein (Standard 0) | Anzahl der jugendlichen Gäste |
num_children | integer ≥ 0 | nein (Standard 0) | Anzahl der Kinder |
guest_first_name | string | nein | Vorname des Gastes |
guest_last_name | string | nein | Nachname des Gastes |
guest_email | string (email) | nein | E-Mail des Gastes |
Nicht aufgeführte Felder (status, total_price, booking_reference, created_at) werden serverseitig vergeben und ignoriert, falls sie gesendet werden.
Beispiel-Anfragekörper:
{ "site_id": 312, "check_in_date": "2026-07-14", "check_out_date": "2026-07-21", "num_adults": 2, "num_children": 1, "guest_first_name": "Anna", "guest_last_name": "Müller", "guest_email": "anna.mueller@example.ch"}Antwort 201: Die neu angelegte Buchung in derselben Form wie ein Listenergebnis. Bemerkenswerte Standardwerte des zurückgegebenen Objekts:
statusist"pending".booking_referencewird serverseitig erzeugt.total_priceist ein Platzhalter — siehe Häufige Stolpersteine.
Fehler:
| Status | Körper | Wann |
|---|---|---|
400 | {"detail": "site_not_found"} | site_id fehlt, ist fehlerhaft oder passt zu keinem Stellplatz des aufrufenden Mandanten |
400 | Feldbezogene Validierungsfehler | Im Körper fehlen Pflichtfelder oder Typ-/Bereichsprüfungen schlagen fehl — siehe Fehler und Statuscodes |
401, 403, 429 | — | Standardfehler für Authentifizierung und Drosselung |
Beispiel (curl):
curl -X POST https://api.campone.ch/api/v1/public/bookings/ \ -H "Authorization: Bearer ck_a1b2c3d4XXXXXXXXXXXXXXXXXXXXXXXX" \ -H "Content-Type: application/json" \ -d '{ "site_id": 312, "check_in_date": "2026-07-14", "check_out_date": "2026-07-21", "num_adults": 2, "num_children": 1, "guest_first_name": "Anna", "guest_last_name": "Müller", "guest_email": "anna.mueller@example.ch" }'Beispiel (Python):
import requests
r = requests.post( "https://api.campone.ch/api/v1/public/bookings/", headers={"Authorization": "Bearer ck_a1b2c3d4XXXXXXXXXXXXXXXXXXXXXXXX"}, json={ "site_id": 312, "check_in_date": "2026-07-14", "check_out_date": "2026-07-21", "num_adults": 2, "num_children": 1, "guest_first_name": "Anna", "guest_last_name": "Müller", "guest_email": "anna.mueller@example.ch", },)r.raise_for_status()booking = r.json()print(booking["booking_reference"], booking["status"])Buchungsstatus-Werte
Abschnitt betitelt „Buchungsstatus-Werte“Das Feld status verwendet einen dieser stabilen Codes:
| Code | Bedeutung |
|---|---|
pending | Wartet auf die Bestätigung des Betreibers. Standard für über diese API erstellte Buchungen. |
confirmed | Der Betreiber hat die Buchung angenommen. |
cancelled | Buchung wurde vor dem Aufenthalt storniert. |
completed | Aufenthalt ist beendet und ausgecheckt. |
no_show | Gast ist nie angereist. |
Behandeln Sie jeden Wert ausserhalb dieser Liste als unbekannt und verzweigen Sie nicht darauf — in einer zukünftigen Minor-Version können weitere Codes hinzukommen.
Häufige Stolpersteine
Abschnitt betitelt „Häufige Stolpersteine“total_price aus POST ist ein Platzhalter. Wird eine Buchung über die öffentliche API angelegt, wird total_price als base_price_per_night × Nächte aus dem Stellplatz berechnet und auf dem Datensatz abgelegt. Saisonpreise, Auslastungsmodifikatoren, Kurtaxe, Zusatzleistungen oder weitere Regeln, die die Preisengine bei der Bestätigung anwendet, werden dabei nicht berücksichtigt. Wer den endgültigen Betrag braucht, liest die Buchung erneut, sobald der Betreiber sie bestätigt hat (der status ist dann nicht mehr pending), oder ruft die zugehörige Rechnung über GET /api/v1/public/invoices/ ab.
Mandantenisolation auf site_id. Eine site_id aus einem Mandanten ist für den Schlüssel eines anderen Mandanten bedeutungslos — Stellplatz-IDs sind je Mandant gültig, eine fremde ID liefert 400 site_not_found, keinen mandantenübergreifenden Hinweis. Details siehe Fehler und Statuscodes.
Keine Idempotenz-Schlüssel in v1. Ein POST nach einem Netzwerk-Timeout zu wiederholen kann doppelte Buchungen erzeugen. Liefert ein Anlage-Aufruf keine saubere Antwort, fragen Sie zuerst den Listen-Endpunkt ab (mit check_in_from / check_in_to und Abgleich der Gastdaten), bevor Sie erneut absenden.