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
Fehler
Jeder Problem-Type, den die API bei einem abgelehnten Schlüssel sendet, seine Ursache, die Abhilfe – und die Probleme ohne Reason-Code.
Lehnt die API eine Anfrage wegen des Schlüssels ab, ist der type im Problem-Body https://bookdineplay.com/docs/api/errors/<reason>, und <reason> ist einer der neun Abschnitte auf dieser Seite. Folgen Sie der URL, landen Sie hier. Fünfundzwanzig weitere type-URLs landen ebenfalls hier: das Tarifproblem, die zwei Idempotenz-Probleme (gemeinsam für Reservierungsanlage, Event-Anmeldung, Ticket-Checkout und Gutschein-Checkout), die drei Probleme bei Event-Anmeldung und Erstattung, die zwei Probleme bei der Reservierungsstornierung, die zwölf Gutschein-Probleme sowie die fünf Abrechnungs-, Konto- bzw. Auszahlungsprobleme weiter unten. Jede andere Ablehnung – Validierung, eine fehlende Location, ein vergebener Slot – steht am Ende.
| Reason | Status | In einem Satz |
|---|---|---|
| missing-api-key | 401 | Kein Schlüssel bei einer Anfrage unter /api/venues/** |
| invalid-api-key | 401 | Der Schlüssel ist unbekannt oder wurde widerrufen |
| venue-mismatch | 403 | Der Schlüssel gehört zu einer anderen Location |
| origin-not-allowed | 403 | Veröffentlichbarer Schlüssel, Origin nicht auf seiner Liste |
| secret-key-from-browser | 403 | Geheimer Schlüssel mit Origin-Header gesendet |
| publishable-key-without-origin | 403 | Veröffentlichbarer Schlüssel ohne Origin-Header gesendet |
| app-key-from-browser | 403 | Der App-Schlüssel von BookDinePlay mit Origin-Header gesendet |
| platform-key-required | 403 | Der Schlüssel einer Location beim Location-Verzeichnis |
| rate-limited | 429 | Der App-Schlüssel von BookDinePlay hat sein Limit pro Schlüssel überschritten |
missing-api-key
401. Die Anfrage erreichte einen Endpunkt unter /api/venues/** ohne X-BookDinePlay-Key- und ohne Authorization: Bearer-Header. Meist wurde der Header auf der falschen Client-Instanz gesetzt oder ein Proxy hat ihn entfernt. Abhilfe: Senden Sie den Schlüssel bei jeder Anfrage – siehe Einen Schlüssel senden.
{
"type": "https://bookdineplay.com/docs/api/errors/missing-api-key",
"title": "Unauthorized",
"status": 401,
"detail": "An API key is required. Send it in the 'X-BookDinePlay-Key' header or an 'Authorization: Bearer' header.",
"traceId": "0HNOJ52B2L9BB"
}invalid-api-key
401. Ein Schlüssel wurde gesendet, aber kein aktiver Schlüssel passt dazu: Er wurde falsch abgetippt, in der Konsole unter Location → API-Schlüssel widerrufen oder rotiert, und der alte Wert ist noch im Einsatz. Abhilfe: Kopieren Sie den aktuellen Schlüssel aus der Konsole; beim Rotieren zuerst den neuen Schlüssel ausrollen, dann den alten widerrufen.
venue-mismatch
403. Der Schlüssel ist gültig, aber an eine andere Location gebunden als der {venueSlug} in der URL. Schlüssel gelten pro Location; eine Website, die mehrere Locations einbettet, braucht je einen Schlüssel (genau dafür gibt es das Attribut key des WordPress-Plugins). Abhilfe: Verwenden Sie den Schlüssel, der unter der aufgerufenen Location erstellt wurde.
origin-not-allowed
403. Ein veröffentlichbarer Schlüssel wurde von einem Origin gesendet, der nicht auf seiner Liste steht. Typische Ursachen: Die Website ist auf eine neue Domain umgezogen, www gegenüber der nackten Domain, http gegenüber https oder ein Staging-Host. Abhilfe: Tragen Sie den exakten Origin (Schema, Host und ggf. Port) unter Location → API-Schlüssel ein oder ergänzen Sie für die lokale Entwicklung ein Port-Wildcard :* – siehe Origins.
{
"type": "https://bookdineplay.com/docs/api/errors/origin-not-allowed",
"title": "Forbidden",
"status": 403,
"detail": "This origin is not on the API key's list of allowed origins.",
"traceId": "0HNOJ52B2L9BD"
}secret-key-from-browser
403. Ein geheimer Schlüssel (bdp_sk_…) kam zusammen mit einem Origin-Header an, den nur Browser senden. Ein geheimer Schlüssel im Browser ist ein veröffentlichtes Geheimnis, daher wird die Anfrage sofort abgelehnt statt bedient. Abhilfe: Widerrufen Sie diesen Schlüssel jetzt, erstellen Sie einen veröffentlichbaren Schlüssel für den Browser und behalten Sie geheime Schlüssel auf dem Server.
publishable-key-without-origin
403. Ein veröffentlichbarer Schlüssel (bdp_pk_…) kam ohne Origin-Header an. Veröffentlichbare Schlüssel sind durch ihre Origin-Liste geschützt, und ohne Origin gibt es nichts zu prüfen. So sieht ein serverseitiger Aufruf mit einem veröffentlichbaren Schlüssel aus. Abhilfe: Verwenden Sie auf dem Server einen geheimen Schlüssel; kommt der Aufruf wirklich aus einem Browser, wird der Origin-Header automatisch ergänzt – fehlt er, kam die Anfrage nicht von einem Browser.
app-key-from-browser
403. Der App-Schlüssel von BookDinePlay (bdp_ak_…, siehe Der App-Schlüssel von BookDinePlay) kam zusammen mit einem Origin-Header an. Der App-Schlüssel gehört zu den nativen Apps von BookDinePlay aus den Stores, die keinen Origin senden; ein Browser, der ihn vorzeigt, ist nicht die App, und der Schlüssel erreicht jede Location – daher wird die Anfrage sofort abgelehnt. Abhilfe: Verwenden Sie im Browser den veröffentlichbaren Schlüssel Ihrer eigenen Location.
platform-key-required
403. Der eigene Schlüssel einer Location (bdp_pk_… oder bdp_sk_…) wurde an GET /api/venues gesendet, das Location-Verzeichnis. Das Verzeichnis listet andere Locations auf, und dafür ist der Schlüssel einer einzelnen Location nicht gedacht; nur die eigenen Apps von BookDinePlay rufen es auf. Abhilfe: Rufen Sie stattdessen die Routen Ihrer eigenen Location auf, /api/venues/{venueSlug}/….
rate-limited
429. Den App-Schlüssel von BookDinePlay teilen sich alle Installationen der Apps aus den Stores, daher hat er ein festes Zeitfenster-Limit pro Schlüssel. Der Retry-After-Header sagt, wie viele Sekunden zu warten ist. Für die Schlüssel einer Location gilt dieses Limit nicht. Abhilfe: Die angegebene Zeit warten und erneut versuchen – nicht in einer engen Schleife wiederholen.
{
"type": "https://bookdineplay.com/docs/api/errors/rate-limited",
"title": "Too Many Requests",
"status": 429,
"detail": "Too many requests. Please wait a minute and try again.",
"traceId": "0HNOJ52B2L9BE"
}Tarif- und Berechtigungsprobleme
Keine Schlüsselprobleme: Der Tarif des Mandanten deckt nicht ab, was die Anfrage braucht.
feature-not-in-plan
403. Kommt bei der Operator-API vor (eine Ressource vom Spieltyp anlegen oder bearbeiten, den Raumplan öffnen, Mitarbeiter verwalten oder Events verwalten, wenn der Tarif sie nicht enthält), bei POST /reservations für einen Ressourcentyp, den der Tarif des Mandanten nicht anbietet, bei der öffentlichen Route POST /events/{eventSlug}/registrations, wenn der Tarif der Location keine Events enthält – die Event-Liste antwortet bei einem solchen Tarif mit [] und das Detail mit 404, sodass nur ein Gast, der noch eine Event-URL hat, dieses Problem erreicht –, sowie bei POST /payment-intents, wenn der Tarif keine Online-Zahlungen oder Anzahlungen enthält. Die Checkout-Route für bezahlte Tickets antwortet damit nie: Fehlt der Ticketverkauf im Tarif, fällt das unter ticket-sales-not-enabled, sodass ein Gast nie erfährt, welche der drei Ursachen zutrifft. Das Buchungs-Widget selbst löst feature-not-in-plan nie aus, weil die Verfügbarkeit Ressourcentypen, die ein Starter-Tarif nicht erlaubt, bereits weglässt. requiredPlan nennt den Tarif (Pro oder Premium), der die Funktion freischaltet. Abhilfe: den Tarif des Mandanten hochstufen – in der Konsole unter Ihr Tarif oder über PUT /api/admin/tenants/{id}.
{
"type": "https://bookdineplay.com/docs/api/errors/feature-not-in-plan",
"title": "Feature not in plan",
"status": 403,
"detail": "This feature requires the Pro plan or higher.",
"requiredPlan": "Pro",
"traceId": "0HNOJ52B2L9BE"
}Welcher Tarif was freischaltet – damit Sie der Location sagen können, worauf sie hochstufen muss. requiredPlan nennt immer einen davon:
| Funktion | Freigeschaltet ab |
|---|---|
| Spielressourcen – Billard, Darts, Shuffleboard, Bowlingbahnen, Eventflächen | Pro |
| Tisch- und Spielbestellungen, Raumpläne, Mitarbeiter, Gästenachrichten | Pro |
| Veranstaltungen – veröffentlichen, kostenlose Anmeldung, personalisierte Tickets, Einlasskontrolle | Pro |
| Online-Zahlungen und Anzahlungen | Premium |
| Online-Ticketverkauf für kostenpflichtige Veranstaltungen | Premium |
| Mehr als eine Location unter demselben Konto | Premium |
Was die Tarife kosten, steht auf der Preisseite.
Probleme bei der Event-Anmeldung
Ebenfalls keine Schlüsselprobleme: Das Anmeldefenster des Events, der Stand des Online-Ticketverkaufs oder die Erstattungsregel einer bezahlten Anmeldung lehnt eine gültige Anfrage ab. Die ersten beiden kommen von POST /api/venues/{venueSlug}/events/{eventSlug}/registrations und der Ticket-Checkout-Route; das dritte kommt von der eigenen Storno-Route des Gasts.
registration-closed
409. Das Anmeldefenster ist geschlossen. reason nennt den Grund, und das Event-Detail meldet denselben Wert in registration.reason, noch bevor Sie es versuchen:
reason |
Bedeutung | Was anzeigen |
|---|---|---|
closed |
Das closesAt der Location ist vorbei |
„Die Anmeldung ist geschlossen“ |
sold-out |
Keine Tickets mehr übrig; das Problem ergänzt remaining: 0 |
„Ausverkauft“ – und das Detail neu lesen, denn eine Stornierung gibt Plätze frei |
past |
Das Event hat bereits begonnen | „Diese Veranstaltung hat bereits begonnen“ |
not-open |
Das Event nimmt keine Anmeldungen (Modus None) oder wurde abgesagt |
Der eigene Status des Events |
Eine Anmeldung kann mit sold-out abgelehnt werden, obwohl das eben gelesene Detail noch Plätze zeigte: Ein anderer Gast hat die letzten dazwischen genommen. Nehmen Sie das Problem als Wahrheit und das Detail als Hinweis. Der JavaScript-Client hebt reason und remaining auf den Fehler (Fehler); das .NET-SDK stellt sie als Reason und Remaining an BookDinePlayApiException bereit (.NET-SDK).
{
"type": "https://bookdineplay.com/docs/api/errors/registration-closed",
"title": "Registration closed",
"status": 409,
"detail": "Registration for this event has closed.",
"reason": "closed",
"traceId": "0HNOK3A31C71T"
}ticket-sales-not-enabled
409. Das Event ist Paid, und die Location kann gerade keine Tickets online verkaufen. Das ist die eine Antwort für drei verschiedene Ursachen – der Tarif des Mandanten enthält keinen Ticketverkauf, der Tarif enthält ihn, aber das Stripe-Connect-Auszahlungskonto der Location ist noch nicht Enabled, oder das Event selbst ist nicht Paid – absichtlich zu einem Problem zusammengefasst, damit ein Gast nie erfährt, welche davon zutrifft; die Location sieht den genauen Grund stattdessen in der Konsole (die Karte Abrechnung → Auszahlungen, oder der Hinweis im Event-Editor). Bei der Anmeldung gilt das nur, solange das Anmeldefenster des Events offen ist – ein bezahltes Event mit geschlossenem Fenster antwortet zuerst mit registration-closed, genau wie ein kostenloses Event; die Checkout-Route antwortet unabhängig vom Fenster so. Abhilfe: nichts auf Ihrer Seite – zeigen Sie eine allgemeine „gerade nicht verfügbar“-Meldung, wie es das Events-Widget tut, und überlassen Sie den Verkauf den anderen Kanälen der Location.
{
"type": "https://bookdineplay.com/docs/api/errors/ticket-sales-not-enabled",
"title": "Ticket sales not enabled",
"status": 409,
"detail": "Online ticket sales are not enabled for this venue yet.",
"traceId": "0HNOK3A31C71U"
}refund-not-available
409. Ein Gast wollte eine bezahlte Anmeldung über seinen eigenen Storno-Link stornieren, aber die Erstattungsregel des Events erlaubt gerade keine Online-Erstattung – die Location hat „keine Online-Erstattung“ eingestellt, oder das Erstattungsfenster (hoursBeforeStart vor Beginn) ist bereits vorbei. Die Anmeldung bleibt unverändert: Nichts wird storniert und keine Zahlung angefasst, der Gast kann die Location also weiterhin direkt fragen. GET /api/registrations/{cancelToken} meldet dasselbe schon vorab als canCancel: false mit einem erklärenden cancelNote, sodass eine Integration nicht erst stornieren muss, um es herauszufinden. Abhilfe: nichts auf Ihrer Seite – zeigen Sie den Hinweis und verweisen Sie den Gast an die Location; erstatten kann von hier aus nur die Location (aus der Teilnehmerliste des Events) oder der BookDinePlay-Support.
{
"type": "https://bookdineplay.com/docs/api/errors/refund-not-available",
"title": "Refund not available",
"status": 409,
"detail": "Diese Anmeldung kann nicht online erstattet werden. Bitte wenden Sie sich direkt an die Location.",
"traceId": "0HNOK3A31C71X"
}reservation-cancellation-not-allowed
409. Ein Gast wollte eine Buchung über seinen eigenen Storno-Link stornieren, aber die Storno-Richtlinie der Location erlaubt gerade keine Online-Stornierung – die Location hat die Selbststornierung durch Gäste komplett abgeschaltet, oder die Frist (hoursBeforeStart vor Beginn der Buchung) ist bereits abgelaufen. Die Reservierung bleibt unverändert: Nichts wird storniert. GET /api/reservations/{cancelToken} meldet dasselbe schon vorab als canCancel: false mit einem erklärenden cancelNote, sodass eine Integration nicht erst stornieren muss, um es herauszufinden. Abhilfe: nichts auf Ihrer Seite – zeigen Sie den Hinweis und verweisen Sie den Gast direkt an die Location.
{
"type": "https://bookdineplay.com/docs/api/errors/reservation-cancellation-not-allowed",
"title": "Reservation cancellation not allowed",
"status": 409,
"detail": "Diese Buchung kann nicht mehr online storniert werden. Bitte wenden Sie sich direkt an die Location.",
"traceId": "0HNOK3A31C71Y"
}reservation-deposit-not-refundable
409. Ein Gast wollte eine Buchung über seinen eigenen Storno-Link stornieren, aber die Anzahlung der Buchung wurde online bezahlt und die Location hat festgelegt, dass eine Anzahlung im Gespräch geklärt wird und nicht über einen Storno-Link. Eine Stornierung würde den Slot freigeben, ohne dass jemand über das Geld entschieden hat – deshalb wird sie abgelehnt. Bewusst ein anderer type als reservation-cancellation-not-allowed: Die Website einer Location muss hier etwas anderes sagen ("wir müssen Ihre Anzahlung klären, bitte rufen Sie uns an") als bei einer gewöhnlichen Fristablehnung ("zu kurzfristig vor Ihrer Buchung"). Die Reservierung bleibt unverändert. GET /api/reservations/{cancelToken} meldet dasselbe schon vorab als canCancel: false mit einem erklärenden cancelNote. Abhilfe: nichts auf Ihrer Seite – zeigen Sie den Hinweis und verweisen Sie den Gast direkt an die Location. Das ist eine Einstellung der Location: Ein Betreiber, der in seiner Storno-Richtlinie die Anzahlung bei einer Gast-Stornierung erstatten (oder einbehalten) lässt, erzeugt dieses Problem gar nicht mehr.
{
"type": "https://bookdineplay.com/docs/api/errors/reservation-deposit-not-refundable",
"title": "Reservation deposit not refundable",
"status": 409,
"detail": "Für diese Buchung wurde eine Anzahlung geleistet, die noch nicht online erstattet werden kann. Bitte wenden Sie sich direkt an die Location.",
"traceId": "0HNOK3A31C71Z"
}reservation-refund-failed
502. Der umgekehrte Fall: Die Location erstattet Anzahlungen bei einer Gast-Stornierung sehr wohl, aber die Erstattung selbst ist beim Zahlungsanbieter fehlgeschlagen. Es wurde nichts storniert und nichts verzeichnet – die Erstattung läuft genau deshalb vor der Stornierung, damit ein Fehlschlag die Buchung des Gastes unangetastet lässt, statt seinen Slot freizugeben, während sein Geld liegen bleibt. Der 502 statt eines 409 ist der Punkt: Das ist keine festgelegte Regel der Location, sondern eine vorübergehende Störung weiter oben – ein erneuter Versuch lohnt sich wirklich, und Ihre Oberfläche darf dem Gast nicht sagen, seine Location erlaube das nicht. Abhilfe: Bitten Sie den Gast, es gleich noch einmal zu versuchen; schlägt es weiterhin fehl, braucht das Zahlungskonto der Location Aufmerksamkeit und der Gast sollte sie direkt kontaktieren.
{
"type": "https://bookdineplay.com/docs/api/errors/reservation-refund-failed",
"title": "Reservation refund failed",
"status": 502,
"detail": "Wir konnten Ihre Anzahlung gerade nicht erstatten — Ihre Buchung bleibt deshalb unverändert. Bitte versuchen Sie es gleich noch einmal.",
"traceId": "0HNOK3A31C720"
}Idempotenz-Probleme
Kein Schlüsselproblem und kein Tarifproblem: Vier Routen akzeptieren einen optionalen Idempotency-Key-Header –
POST /api/venues/{venueSlug}/reservations,
POST /api/venues/{venueSlug}/events/{eventSlug}/registrations,
die Ticket-Checkout-Route
und der Gutschein-Checkout
– und dieser Abschnitt zeigt die zwei Wege, wie dieser Header selbst abgelehnt werden kann oder Sie warten lässt.
idempotency-key-reused
409. Der gesendete Idempotency-Key wurde bereits – innerhalb der letzten 24 Stunden, auf derselben Route, für diese Location, von Ihrem eigenen Konto – für einen Request verwendet, dessen Body sich anders hasht als dieser. Durch diesen Aufruf wurde nichts angelegt: Ein übereinstimmender Body hätte stattdessen die Original-Buchung, -Anmeldung oder den -Checkout wiedergegeben, statt diese Ablehnung überhaupt zu erreichen – sie feuert also nur bei einer echten Abweichung. Übliche Ursache ist ein Key, der den Versuch überlebt hat, für den er erzeugt wurde – wiederverwendet für zwei verschiedene Anfragen, oder ein Formular, das versehentlich mit geänderten Angaben unter demselben Key erneut abgeschickt wurde. Bei der Ticket-Checkout-Route bleibt die Checkout-Sitzung des ersten Versuchs dabei unangetastet: Ein abweichender Aufrufer ist nicht ihr Eigentümer, deshalb rührt diese Ablehnung sie niemals an. Abhilfe: pro Versuch einen frischen Key erzeugen (siehe Sicher wiederholen mit Idempotency-Key), und unter einem bereits verwendeten Key immer nur den identischen Body erneut senden.
{
"type": "https://bookdineplay.com/docs/api/errors/idempotency-key-reused",
"title": "Idempotency key reused",
"status": 409,
"detail": "This Idempotency-Key was already used for a different request.",
"traceId": "0HNOK3A31C723"
}checkout-in-progress
409. Nur beim Ticket-Checkout. Für diese Anfrage existiert ein aktiver Idempotency-Key-Claim, aber die Checkout-Sitzung, für die er steht, ist noch nicht fertig angelegt – der Platz wird reserviert, bevor Stripe überhaupt aufgerufen wird, sodass ein identischer Wiederholungsversuch, der in die kurze Lücke fällt, während Stripe noch antwortet, die Checkout-URL noch nicht erhalten kann. Realistisch kann nur ein wirklich gleichzeitiger erneuter Aufruf (zwei Anfragen gleichzeitig unter demselben Key) das beobachten; ein sequenzieller Wiederholungsversuch – der übliche Fall, nachdem der erste Versuch tatsächlich zurückgekehrt ist – nie. Abhilfe: einen Moment warten und mit demselben Key erneut versuchen; er gibt dann entweder den abgeschlossenen Checkout wieder oder startet, falls der Stripe-Aufruf des ersten Versuchs selbst fehlgeschlagen ist, einen neuen.
{
"type": "https://bookdineplay.com/docs/api/errors/checkout-in-progress",
"title": "Checkout in progress",
"status": 409,
"detail": "Eine Checkout-Sitzung für diese Anfrage wird gerade noch erstellt. Bitte versuchen Sie es gleich noch einmal.",
"traceId": "0HNOK3A31C725"
}Abrechnungs-, Konto- und Auszahlungsprobleme
Hier geht es nicht um die Anfrage: Es ist das BookDinePlay-Konto der Location oder ihr verbundenes Stripe-Auszahlungskonto, das ablehnt.
tenant-suspended
403. Das Konto der Location wird nicht bedient. Entweder ist ihr Abonnement ausgelaufen (unbezahlt oder gekündigt), BookDinePlay hat es gesperrt, oder eine Selbstregistrierung wurde nie bezahlt – alle drei antworten mit demselben Problem, weil keines davon etwas ist, worauf eine Integration oder ein Gast reagieren könnte, und eine Unterscheidung den Abrechnungsstand der Location jedem preisgeben würde, der die API erreicht. Jede Route unter /api/venues/** antwortet so, Lesezugriffe eingeschlossen; die Routen mit eigenem Gast-Credential (GET /api/tickets/{code}, POST /api/event-registrations/{cancelToken}/cancel, GET /api/qr/{token} und die Gutscheinabfrage) funktionieren weiter, damit ein gedruckter QR-Code oder ein per E-Mail zugesandtes Ticket nicht an einer abgelaufenen Karte der Location scheitert. Abhilfe: auf Ihrer Seite nichts – blenden Sie das Buchungs-Widget aus und zeigen Sie die Telefonnummer der Location; die Location regelt es unter Abrechnung, und die Route antwortet Sekunden später wieder.
{
"type": "https://bookdineplay.com/docs/api/errors/tenant-suspended",
"title": "Tenant suspended",
"status": 403,
"detail": "Diese Location nimmt derzeit keine Buchungen an. Bitte wenden Sie sich direkt an die Location.",
"traceId": "0HNOK3A31C71V"
}billing-managed-by-stripe
409. Nur bei PUT /api/admin/tenants/{id}: plan und status des Mandanten gehören zu seinem Stripe-Abonnement, deshalb ändert die Admin-Oberfläche keines von beiden von Hand – beide werden bei jeder Synchronisierung aus dem Abonnement neu abgeleitet, eine Änderung hier würde also vom nächsten Webhook stillschweigend zurückgesetzt. Die bereits gesetzten Werte mitzusenden ist keine Änderung, ein anderes Feld lässt sich also weiterhin bearbeiten. Abhilfe: das Abonnement ändern (genau das tut Tarif wechseln für den Betreiber), oder den Mandanten in derselben Anfrage mit billing: "Manual" auf manuelle Abrechnung umstellen – das nimmt dem Abonnement die Hoheit über den Tarif, kündigt es bei Stripe aber nicht; der notice der Antwort sagt das.
{
"type": "https://bookdineplay.com/docs/api/errors/billing-managed-by-stripe",
"title": "Billing managed by Stripe",
"status": 409,
"detail": "Tarif und Kontostatus dieses Mandanten werden über sein Stripe-Abonnement verwaltet. Ändern Sie das Abonnement oder stellen Sie den Mandanten zuerst auf manuelle Abrechnung um.",
"traceId": "0HNOK3A31C71W"
}payouts-not-connected
409. Der Tarif des Mandanten und die eigenen Schalter der Location erlauben Online-Zahlungen, aber das Stripe-Connect-Auszahlungskonto der Location ist noch nicht Enabled – entweder wurde das Onboarding nie gestartet, läuft gerade, oder Stripe hat es nach einem Prüfungsproblem eingeschränkt. Wird von POST /api/venues/{venueSlug}/payment-intents für eine Reservierungsanzahlung zurückgegeben. Die Checkout-Route für Gast-Tickets antwortet damit nie direkt: Sie fasst dieselbe Ursache stattdessen unter ticket-sales-not-enabled zusammen, sodass ein Gast nie erfährt, welche der drei Ursachen zutrifft – nur der Betreiber sieht sie, in der Karte Abrechnung → Auszahlungen der Konsole. Abhilfe: nichts auf Ihrer Seite – überspringen Sie den Anzahlungsschritt und behandeln Sie die Reservierung als von der Location bestätigt; die Location verbindet (oder vervollständigt) ihr Auszahlungskonto in der Konsole.
{
"type": "https://bookdineplay.com/docs/api/errors/payouts-not-connected",
"title": "Payouts not connected",
"status": 409,
"detail": "Diese Location hat noch kein Auszahlungskonto verbunden.",
"traceId": "0HNOK3A31C71Y"
}connect-not-enabled
409. Wird von POST /api/operator/venue/payouts/onboarding-link zurückgegeben, wenn Stripe die Erstellung des Connect-Standard-Kontos der Location ablehnt, weil das eigene Stripe-Konto der Plattform sich noch nicht für Connect angemeldet hat – nichts, was der Betreiber der Location getan hat, und nichts, was er beheben kann. Auch ein erneuter Versuch hilft nicht: Die Operator-API erzeugt pro Versuch einen neuen Idempotenzschlüssel, aber Stripe lehnt dieselbe zugrunde liegende Voraussetzung weiterhin ab, bis das Plattformkonto Connect aktiviert. Abhilfe: nichts auf Seiten der Location – das ist ein Konfigurationsproblem von BookDinePlay; wenden Sie sich an den Support.
{
"type": "https://bookdineplay.com/docs/api/errors/connect-not-enabled",
"title": "Connect not enabled",
"status": 409,
"detail": "Wir können derzeit noch keine Stripe-Konten verbinden. Das liegt an uns — bitte versuchen Sie es später erneut oder kontaktieren Sie den Support.",
"traceId": "0HNOK3A31C721"
}connect-rejected
409. Wird von derselben Onboarding-Link-Route zurückgegeben, wenn Stripe zwar akzeptiert, dass Connect selbst aktiviert ist, aber die eigenen Kontodaten dieser Location ablehnt – in der Praxis Land, Umsatzsteuer-ID oder die Form der Website-URL der Firma. Anders als connect-not-enabled kann der Betreiber hier direkt reagieren. Abhilfe: Firmenprofil unter Abrechnung → Firma prüfen (Land, Umsatzsteuer-ID, Website), korrigieren und erneut auf Verbinden klicken.
{
"type": "https://bookdineplay.com/docs/api/errors/connect-rejected",
"title": "Connect rejected",
"status": 409,
"detail": "Unser Zahlungsdienstleister konnte diese Location-Daten nicht akzeptieren. Bitte prüfen Sie Land, Umsatzsteuer-Identifikationsnummer und Website der Firma und versuchen Sie es erneut.",
"traceId": "0HNOK3A31C722"
}Gutschein-Probleme
Jede Route, die einen Gutscheincode annimmt, antwortet mit diesen: die Gutschein-Routen, die Tab-, Anzahlungs- und Ticketzahlungen mit voucherCode und die Gutscheinseiten der Konsole. Ein Problem enthält nie den Code. Einige erreichen nur die Konsole; sie stehen hier, damit jede type-URL irgendwo landet.
voucher-not-found
404. Der Code führt zu keinem Gutschein, der hier verwendbar ist: vertippt, unbekannt, ein nie bezahlter Kauf oder ein Gutschein einer anderen Location. Alle diese Fälle geben absichtlich dieselbe Antwort, damit Codes nicht durchprobiert werden können. Abhilfe: Bitten Sie den Gast, den Code zu prüfen. Die SDKs fangen einen Tippfehler vor dem Senden ab, weil das letzte Zeichen ein Prüfzeichen ist.
voucher-not-redeemable
409. Den Gutschein gibt es, aber er kann nichts mehr bezahlen. reason nennt den Grund: Expired, Voided oder UsedUp, und detail sagt es in einem Satz. Abhilfe: detail anzeigen; der Gast bezahlt anders.
{
"type": "https://bookdineplay.com/docs/api/errors/voucher-not-redeemable",
"title": "Voucher not redeemable",
"status": 409,
"detail": "Dieser Gutschein ist abgelaufen.",
"reason": "Expired",
"traceId": "0HNOK3A31C723"
}voucher-insufficient-balance
409. Vom Gutschein wurde mehr verlangt, als er verfügbar hat; Wert, den eine laufende Zahlung reserviert hält, gilt als weg. Am Tisch hat das Personal mehr verlangt, als ein Betragsgutschein noch hat. Online nehmen die Zahlungen nur, was der Gutschein hat, und belasten den Rest der Karte – hier heißt es also, dass alles Übrige von einer anderen laufenden Zahlung reserviert ist. Abhilfe: einen kleineren Betrag einlösen oder es erneut versuchen, sobald die andere Zahlung abgeschlossen oder verfallen ist.
voucher-not-applicable
409. Diese Gutscheinart kann das nicht bezahlen, oder ihre Währung ist nicht die der Location. Anzahlung und Tickets nehmen nur Betragsgutscheine; Prozent- und Artikelgutscheine bezahlen eine Rechnung. Abhilfe: Sagen Sie dem Gast, dass der Gutschein für den Tisch gedacht ist, und machen Sie ohne ihn weiter.
voucher-busy
409. Eine andere Zahlung oder Kasse hat denselben Gutschein im selben Moment verwendet. Es wurde nichts abgebucht. Abhilfe: dieselbe Anfrage nach einem Moment wiederholen.
voucher-validity-not-set
409. Die Location hat noch nicht festgelegt, wie lange ihre Gutscheine gelten, und kann deshalb noch keine ausgeben oder verkaufen. Abhilfe: auf Ihrer Seite nichts; die Location legt die Gültigkeit in den Gutschein-Einstellungen der Konsole fest.
voucher-validity-too-short
400. Ein bezahlter Gutschein muss mindestens ein Jahr ab seiner Ausgabe gelten. Die Gültigkeitsregel der Location, ein von Hand ausgegebener Gutschein oder eine Änderung des Ablaufdatums würde ihm weniger geben. Abhilfe: Die Location wählt eine längere Gültigkeit.
voucher-sale-not-available
409. Gutscheine lassen sich bei dieser Location gerade nicht online kaufen: Der Online-Verkauf ist aus, das Produkt wird nicht online verkauft, Zahlungen sind ausgeschaltet, oder das Auszahlungskonto kann kein Geld annehmen. Die Angebote melden dasselbe schon vorher in onlineSaleAvailable. Abhilfe: den „nicht verfügbar“-Zustand der Angebote zeigen.
voucher-not-refundable
409. Nur Konsole: Ein Gutscheinverkauf lässt sich nur erstatten, solange der Gutschein unbenutzt ist, online verkauft wurde und nicht von einer laufenden Zahlung reserviert ist. Abhilfe: Einen benutzten Gutschein direkt mit dem Gast klären.
voucher-refund-failed
502. Nur Konsole: Stripe hat die Erstattung eines Gutscheinverkaufs nicht abgeschlossen. Es wurde nichts geändert, und der Gutschein ist weiter gültig. Abhilfe: erneut versuchen oder direkt in Stripe erstatten.
voucher-undo-not-allowed
409. Nur Konsole: Eine Einlösung am Tisch lässt sich einmal rückgängig machen, und außerhalb des Rückgängig-Fensters nur mit einer Begründung des Personals. Online-Einlösungen werden stattdessen über die Erstattung der Zahlung rückgängig gemacht.
voucher-hold-live
409. Nur Konsole: Eine laufende Zahlung hält Wert auf diesem Gutschein reserviert, deshalb lässt er sich gerade nicht entwerten und sein Verkauf nicht erstatten. Abhilfe: erneut versuchen, sobald der Gast die Zahlung abgeschlossen oder abgebrochen hat.
Plattform-Admin-Probleme
Wird nur von der Plattform-Admin-Oberfläche unter /api/admin/** beantwortet – nicht Teil der öffentlichen Widget-/SDK-API, aber Teil derselben Referenz (aus demselben Grund, aus dem billing-managed-by-stripe oben hier dokumentiert ist).
operator-already-exists
409. Wird von POST /api/admin/tenants/{id}/operators zurückgegeben, wenn das Auth0-Subject oder die E-Mail-Adresse aus der Anfrage bereits zu einer anderen Operator-Zeile gehört. Ein Subject muss sich auf genau einen Operator auflösen (ein Duplikat hat einen Plattform-Administrator schon einmal den Zugang zur eigenen Konsole gekostet), und zwei Zeilen mit derselben E-Mail-Adresse sind dieselbe Mehrdeutigkeit aus der anderen Richtung. Abhilfe: die vorhandene Zeile weiterverwenden statt eine zweite anzulegen, oder ein anderes Subject/eine andere E-Mail-Adresse angeben, falls es sich wirklich um eine andere Person handelt.
{
"type": "https://bookdineplay.com/docs/api/errors/operator-already-exists",
"title": "Operator already exists",
"status": 409,
"detail": "Für dieses Auth0-Subject existiert bereits ein Operator.",
"traceId": "0HNOK3A31C724"
}not-a-demo-venue
403. Wird von POST /api/admin/demo-venues/{venueSlug}/reset zurückgegeben, wenn venueSlug keine der eigenen Demo-Locations von BookDinePlay benennt. Dieser Endpunkt löscht die Transaktionsdaten einer Location — Reservierungen, Tischsitzungen, Event-Anmeldungen und -Tickets, Gast-Konversationen und QR-Tokens — für Release-Validierungsläufe; alles andere wird von vornherein abgelehnt, damit er niemals die Daten eines echten Kunden erreichen kann. 403, nicht 404: der Slug kann durchaus eine echte Location benennen, und genau das ist der Punkt — dieser Endpunkt wirkt niemals auf sie.
{
"type": "https://bookdineplay.com/docs/api/errors/not-a-demo-venue",
"title": "Not a demo venue",
"status": 403,
"detail": "Über diesen Endpunkt können nur die Transaktionsdaten einer Demo-Location zurückgesetzt werden.",
"traceId": "0HNOK3A31C724"
}Probleme ohne Reason-Code
Diese tragen den allgemeinen RFC-9110-type; detail sagt, was passiert ist.
| Status | Wann | Was tun |
|---|---|---|
| 400 | Ein Feld ist an der Validierung gescheitert; errors listet die Felder |
Eingabe korrigieren; die Feldnamen sind die Eigenschaftsnamen der Anfrage |
| 400 | date ist nicht yyyy-MM-dd, oder Uhrzeit bzw. Dauer einer Reservierung sind keine, die die Location anbietet |
Die Werte aus der Verfügbarkeitsantwort unverändert senden |
| 404 | Keine Location mit diesem Slug; keine Reservierung mit dieser Referenz; das QR-Token oder die Tischsitzung ist nicht aktiv; kein veröffentlichtes Event mit diesem Slug; ein unbekannter Ticketcode oder ein unbekanntes Storno-Token | Slug prüfen; ein widerrufener QR-Code bleibt 404 – den neuen drucken; ein Event-Entwurf bleibt 404, bis die Location ihn veröffentlicht |
| 409 | Der Slot wurde zwischen Verfügbarkeit und Reservierung vergeben; die Rechnung wurde gerade geschlossen; die Location hat Online-Zahlungen nicht aktiviert; ein Storno-Link wird genutzt, nachdem ein Ticket der Anmeldung eingecheckt wurde | Verfügbarkeit neu abfragen und den nächsten Slot anbieten; neue Sitzung starten; den Anzahlungsschritt überspringen; den Gast an die Location verweisen |
| 400 | amount oder currency einer Anzahlungszahlung ist nicht genau die Anzahlung der Buchung |
depositAmount und currency der Reservierung unverändert senden |
| 409 | Eine Anzahlungszahlung für eine Buchung, die auf keine mehr wartet – storniert, von der Location bestätigt oder vorbei (reason deposit-not-payable) –, oder deren Anzahlung schon bezahlt ist (reason deposit-already-paid) |
Die Buchung so zeigen, wie sie ist; es gibt nichts zu bezahlen |
| 409 | Ein Gutschein ließe bei Tab, Anzahlung oder Tickets eine Kartenzahlung unter dem Mindestbetrag von Stripe übrig (0,50 € in EUR; reason below-card-minimum) |
Ohne den Gutschein oder in der Location bezahlen |
| 5xx | Unser Fehler | Mit exponentiellem Backoff wiederholen; bleibt es, die traceId an den Support senden |
Nächste Schritte
- Authentifizierung – dieselben Ablehnungen aus Sicht des Schlüssels.
- API-Referenz – das Format des Problem-Bodys.
- Events – woher die Anmelde-, Checkout- und Erstattungsprobleme kommen.