Anmelden um den Slug und den veröffentlichbaren Schlüssel Ihrer Location in jedem Beispiel zu sehen.
Ihr Konto hat noch keine Location, die Beispiele behalten daher ihre Platzhalter. Abmelden
Angemeldet als · . Legen Sie in der Konsole einen veröffentlichbaren Schlüssel an und laden Sie die Seite neu, um ihn hier zu sehen. Abmelden
Angemeldet als · . Die Beispiele zeigen den veröffentlichbaren Schlüssel Ihrer Location. Abmelden
Entwicklerdokumentation
Buchungsablauf
Was das Widget von Anfang bis Ende tut – die vier API-Aufrufe in ihrer Reihenfolge, jeder Schritt für den Gast, optionale Anzahlung und Bestätigung.
Das Widget ist ein Client der öffentlichen API und nicht mehr: Es hält keinen Zustand auf unserer Seite, und jeder Bildschirm, den ein Gast sieht, ist das Ergebnis eines von vier Aufrufen. Diese Anleitung geht die Aufrufe in der Reihenfolge durch, in der sie passieren – was das Widget in jedem Schritt zeigt und sendet und was Ihre Seite beobachten kann und was nicht. Wenn Sie statt des Widgets eine eigene Oberfläche bauen, ist das die Abfolge, die Sie nachbilden.
Die vier Aufrufe, in ihrer Reihenfolge
| Wann | Aufruf | Wozu |
|---|---|---|
Direkt nach renderBookingWidget |
GET /api/venues/{venueSlug} |
Das Profil der Location: ihre bookingDurations (welche Dauern ein Gast wählen darf) und extras (kostenpflichtige Zusatzleistungen) |
| Wenn der Gast Zeiten abfragt | GET /api/venues/{venueSlug}/availability |
Die Slots des Tages für Typ, Datum, Personenzahl und Dauer |
| Mit der ersten Verfügbarkeitsabfrage | GET /api/venues/{venueSlug}/floor-plan |
Der Tischplan der Location, falls sie einen veröffentlicht hat – einmal geladen, nie blockierend |
| Wenn der Gast bestätigt | POST /api/venues/{venueSlug}/reservations |
Die Buchung selbst |
Jeder Aufruf trägt den übergebenen publishableKey als X-BookDinePlay-Key, und die API antwortet nur, wenn die Origin der Seite auf der Liste dieses Schlüssels steht (Origins). Das Widget legt nie einen Payment Intent an – siehe Anzahlungen.
Schritt für Schritt
Das Widget rendert fünf Schritte unter einer Fortschrittsleiste. Während die Verfügbarkeit lädt, zeigt der Schritt einen Ladezustand; während die Reservierung läuft, zeigt der Button „Confirming...“ und ist deaktiviert; die Aufrufe für Location und Tischplan zeigen nichts an. Eine fehlgeschlagene Anfrage zeigt ein rotes Banner über dem aktuellen Schritt und lässt den Gast, wo er war.
1. Was buchen
Eine Karte pro Typ aus resourceTypes. Die Wahl setzt zugleich die Standard-Buchungsdauer der Location für diesen Typ, sodass eine für Darts gewählte Dauer nie auf einen Restauranttisch übergeht. Bei einem einzigen Typ ist er vorausgewählt, der Schritt erscheint trotzdem.
2. Datum und Personenzahl
Ein Datum (heute oder später), eine Personenzahl von 1 bis 12 (Standard 2) und – nur wenn die Location Gäste für diesen Typ eine Dauer wählen lässt und mehr als eine anbietet – eine Auswahl „How long?“, vorbelegt mit dem Standard der Location. „See available times“ prüft das Datum und sendet die Verfügbarkeitsabfrage.
3. Freie Zeiten
Die von der API gelieferten Slots, nur die freien, jeweils mit Zeitspanne, Name der Ressource und einem „from“-Preis, wenn der Slot einen trägt. Ein Tag ohne freie Zeiten zeigt „No open times for this date and party size.“ und den Hinweis, ein anderes Datum oder eine kleinere Gruppe zu versuchen. Hat die Location einen Tischplan mit platzierten Ressourcen dieses Typs veröffentlicht und ist mindestens ein Slot frei, wählt der Gast stattdessen eine Uhrzeit und dann einen Tisch auf dem Plan; „List view“ wechselt zurück zur Liste. Die Wahl eines Slots und „Continue“ – oder das Antippen eines Tisches auf dem Tischplan – führt zu Schritt 4.
4. Kontaktdaten und die optionale Anzahlung
Name und E-Mail müssen ausgefüllt sein, damit der Button aktiv wird; Telefon und Notizen sind im Formular optional. Wo zutreffend, zeigt der Schritt zusätzlich eine Auswahl „Spiele pro Person“ (1–10) für einen Slot mit Preis pro Spiel und die Extras der Location für diesen Ressourcentyp mit je einer Menge. Zuletzt ein Kontrollkästchen – „Secure my spot with a deposit“ –, standardmäßig nicht angekreuzt. „Confirm reservation“ sendet die Reservierung.
5. Bestätigung
„Reservation confirmed“ – oder „Reservation received“, wenn die Reservierung als Pending zurückkam – mit der Referenz (BDP-XXXX), der Location, dem Was und Wann der Buchung, der Personenzahl, dem Namen, der Preisschätzung und, falls zutreffend, dem Anzahlungsbetrag. Die API hat dem Gast bis dahin Referenz und Status per E-Mail geschickt. „Make another booking“ setzt auf Schritt 1 zurück; Profil und Tischplan der Location bleiben erhalten und werden nicht erneut geladen.
Was das Widget sendet
Der Query-String der Verfügbarkeitsabfrage, gebildet aus den Schritten 1 und 2:
| Parameter | Wert |
|---|---|
date |
Das gewählte Datum, lokal für die Location, yyyy-MM-dd |
partySize |
Die gewählte Personenzahl |
resourceType |
Der gewählte Typ |
durationMinutes |
Nur wenn der Gast eine Dauer gewählt hat; sonst weggelassen, damit der Standard der Location für jede Ressource gilt |
Der Reservierungs-Body, gebildet aus dem gewählten Slot und Schritt 4. Jedes Feld ist immer vorhanden; was nicht zutrifft, ist null:
| Feld | Wert |
|---|---|
resourceType |
Der gewählte Typ |
resourceId |
Die resourceId des gewählten Slots, damit genau diese Ressource gebucht wird |
date |
Das gewählte Datum |
start |
Der start des Slots |
end |
Das end des Slots |
partySize |
Die gewählte Personenzahl |
games |
Spiele pro Person bei einem Slot mit Preis pro Spiel; sonst null |
durationMinutes |
Die gewählte Dauer, wenn die Auswahl angezeigt wurde; sonst null |
extras |
[{ "extraId": "…", "quantity": 1 }] für jedes Extra mit einer Menge über null; null, wenn keins |
customerName |
Der Name, getrimmt |
email |
Die E-Mail, getrimmt |
phone |
Die Telefonnummer, getrimmt; optional – ein leerer Wert gilt als nicht angegeben, 3–40 Zeichen, wenn angegeben |
notes |
Die Notizen, getrimmt; leere Zeichenkette, wenn leer |
depositOptIn |
true, wenn das Kontrollkästchen angekreuzt war |
{
"resourceType": "RestaurantTable",
"resourceId": "table-4a",
"date": "2026-10-16",
"start": "19:00",
"end": "21:00",
"partySize": 4,
"games": null,
"durationMinutes": null,
"extras": null,
"customerName": "Ada Lovelace",
"email": "ada@example.com",
"phone": "+49 30 1234567",
"notes": "",
"depositOptIn": false
}Was Ihre Seite beobachten kann
renderBookingWidget gibt die Widget-Instanz zurück – oder null, wenn es das Rendern verweigert hat (Wenn es nicht rendert). Das ist die ganze Schnittstelle: Das Widget löst keine DOM-Events aus, nimmt keine Callbacks entgegen, und die Felder der Instanz gehören nicht zum Vertrag. Um auf Ihrer Seite auf eine abgeschlossene Buchung zu reagieren – Analytics, eine Dankeseite, Ihr eigenes CRM –, bauen Sie mit window.BookDinePlay.createClient – dem Headless-Client, auf dem das Widget selbst läuft – einen eigenen Ablauf auf denselben vier Aufrufen (Eigene Formulare).
Anzahlungen
Das Ankreuzen sendet depositOptIn: true. Eine Anzahlung ist dann nur erforderlich, wenn die Location Anzahlungen aktiviert hat und die Ressource – oder der Standard der Location für Spielressourcen – einen Anzahlungsbetrag trägt; alle drei oder keins (Anzahlungen). Ist sie erforderlich, kommt die Reservierung als Pending mit depositRequired: true und einem depositAmount zurück; das Widget zeigt „Reservation received“ und die Anzahlungszeile, und die E-Mail an den Gast nennt den Status Pending. Das Widget zieht das Geld nicht ein: Die Location bestätigt die Buchung in ihrer Konsole, oder eine serverseitige Integration legt einen Payment Intent über depositAmount an. Ohne Anzahlung – Kästchen nicht angekreuzt oder Location nicht dafür eingerichtet – ist die Reservierung sofort Confirmed.
Wenn ein Aufruf fehlschlägt
- Profil oder Tischplan – das Widget macht ohne sie weiter: keine Extras, keine Dauerauswahl, die Liste statt des Plans.
- Verfügbarkeit – „We could not load available times. Please check your connection and try again.“ Der Gast bleibt in Schritt 2.
- Reservierung – „We could not confirm your reservation. Please review your details and try again.“ Der Gast bleibt in Schritt 4. Es ist dasselbe Banner für einen Validierungsfehler (400), einen inzwischen vergebenen Slot (409) und einen abgelehnten Schlüssel (401/403); der Netzwerk-Tab des Browsers zeigt den Problem-
type– Fehler erklärt jeden. - Eine überholte Anfrage – klickt der Gast erneut, bevor eine Antwort da ist, wird die frühere Anfrage abgebrochen und ihre Antwort ignoriert.
Nächste Schritte
- Azure Static Web Apps – das Widget auf eine Live-Seite bringen, von null bis zur eigenen Domain.
- Reservierungen – jedes Feld der Buchung, die das Widget anlegt, und die 409, die es bekommen kann.
- JavaScript-SDK – Optionen, Isolation und CSP-Regeln für die Seite, die es einbettet.