Aller au contenu

Buchungen

Ce contenu n’est pas encore disponible dans votre langue.

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.

GET /api/v1/public/bookings/

Erforderlicher Geltungsbereich: bookings:read

Query-Parameter:

NameTypStandardBeschreibung
pageinteger1Seitennummer, 1-indiziert
page_sizeinteger50Einträge pro Seite (max. 200)
statusstringExakter Vergleich mit dem Buchungsstatuscode (siehe Buchungsstatus-Werte)
check_in_fromdate (YYYY-MM-DD)Liefert Buchungen mit check_in_date >= dem Wert
check_in_todate (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):

FeldTypBeschreibung
idintegerPrimärschlüssel der Buchung, eindeutig innerhalb des Mandanten
booking_referencestringLesbarer Referenzcode, der Gästen und auf Rechnungen angezeigt wird
guest_first_namestringVorname des Gastes (kann bei alten Walk-in-Buchungen leer sein)
guest_last_namestringNachname des Gastes (kann leer sein)
guest_emailstringE-Mail des Gastes (kann leer sein)
site_idintegerID des Stellplatzes, auf dem diese Buchung liegt
site_numberstringStellplatznummer wie auf dem Platzplan angezeigt (z. B. "A12")
check_in_datedate (YYYY-MM-DD)Anreisedatum
check_out_datedate (YYYY-MM-DD)Abreisedatum
num_adultsintegerAnzahl der erwachsenen Gäste
num_youthintegerAnzahl der jugendlichen Gäste (Standard 0)
num_childrenintegerAnzahl der Kinder (Standard 0)
statusstringBuchungsstatuscode — siehe Buchungsstatus-Werte
total_pricedecimal 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_atdatetime (ISO 8601, UTC)Zeitpunkt, zu dem der Buchungsdatensatz angelegt wurde

Fehler: 401, 403, 429. Die Antwortformen finden Sie unter Fehler und Statuscodes.

Beispiel (curl):

Terminal-Fenster
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"])
GET /api/v1/public/bookings/{id}/

Erforderlicher Geltungsbereich: bookings:read

Pfadparameter:

NameTypBeschreibung
idintegerBuchungs-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):

Terminal-Fenster
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()
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:

FeldTypPflichtBeschreibung
site_idintegerjaID eines bestehenden Stellplatzes des aufrufenden Mandanten
check_in_datedate (YYYY-MM-DD)jaAnreisedatum
check_out_datedate (YYYY-MM-DD)jaAbreisedatum — muss nach check_in_date liegen
num_adultsinteger ≥ 0jaAnzahl der erwachsenen Gäste
num_youthinteger ≥ 0nein (Standard 0)Anzahl der jugendlichen Gäste
num_childreninteger ≥ 0nein (Standard 0)Anzahl der Kinder
guest_first_namestringneinVorname des Gastes
guest_last_namestringneinNachname des Gastes
guest_emailstring (email)neinE-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:

  • status ist "pending".
  • booking_reference wird serverseitig erzeugt.
  • total_price ist ein Platzhalter — siehe Häufige Stolpersteine.

Fehler:

StatusKörperWann
400{"detail": "site_not_found"}site_id fehlt, ist fehlerhaft oder passt zu keinem Stellplatz des aufrufenden Mandanten
400Feldbezogene ValidierungsfehlerIm Körper fehlen Pflichtfelder oder Typ-/Bereichsprüfungen schlagen fehl — siehe Fehler und Statuscodes
401, 403, 429Standardfehler für Authentifizierung und Drosselung

Beispiel (curl):

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

Das Feld status verwendet einen dieser stabilen Codes:

CodeBedeutung
pendingWartet auf die Bestätigung des Betreibers. Standard für über diese API erstellte Buchungen.
confirmedDer Betreiber hat die Buchung angenommen.
cancelledBuchung wurde vor dem Aufenthalt storniert.
completedAufenthalt ist beendet und ausgecheckt.
no_showGast 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.

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.