Entwicklerdokumentation

Payment Intents

Einen anbieterneutralen Payment Intent für die Anzahlung anlegen – was Sie senden, was zurückkommt und warum Kartendaten diese API nie berühren.

Ein Payment Intent hält fest, dass für eine Reservierung eine Anzahlung fällig ist, und liefert Ihnen, was ein Zahlungsanbieter zum Einziehen braucht. Die API sieht nie Kartennummern: Der Intent trägt ein clientSecret für den clientseitigen Ablauf des Anbieters oder eine checkoutUrl, zu der Sie den Gast schicken. Er folgt denselben Schlüsselregeln wie der Rest von /api/venues/**. Das einbettbare Widget ruft ihn aus dem Schritt „Pay deposit“ seiner Bestätigung auf, auf Wunsch mit einem Gutscheincode (Buchungsablauf); eine eigene Seite kann ihn mit einem veröffentlichbaren Schlüssel aufrufen, nach einer Reservierung mit depositRequired: true, genau wie unten gezeigt.

Endpunkte

POST /api/venues/{venueSlug}/payment-intents

Request-Body (Content-Type: application/json)

Feld Erforderlich Bedeutung
reservationReference ja Die reference der Reservierung (BDP-XXXXXX)
amount ja Genau die Anzahlung, die die Buchung schuldet: der depositAmount der Reservierung (bei einer Gruppenbuchung der der ganzen Gruppe). Jeder andere Betrag wird mit 400 abgelehnt
currency ja Dreibuchstabiger ISO-4217-Code, die currency der Reservierung
provider nein Reserviert für die Anbieterwahl, sobald mehr als einer konfiguriert ist; heute wird es ignoriert – der Anbieter ergibt sich aus der Serverkonfiguration (fake standardmäßig, stripe sobald Stripe:SecretKey gesetzt ist)
voucherCode nein Ein Geschenkgutschein dieser Location, der die Anzahlung ganz oder teilweise bezahlt (Mit einem Gutschein). Nur hier senden, nie in einer URL, nie protokollieren

Antwort 201 Created

Feld Typ Bedeutung
id GUID Der Intent
reservationReference string Wofür er zahlt
amount, currency decimal, string Was fällig ist
status string Der Status des Anbieters – anbieterspezifisch, z. B. RequiresConfirmation bei fake, ein Stripe-Checkout-Session-Status wie open bei stripe
provider string Welcher Anbieter ihn angelegt hat
clientSecret string Übergeben Sie es der Client-Bibliothek des Anbieters auf dem Gerät des Gastes – nie protokollieren
checkoutUrl string oder null Wenn gesetzt, leiten Sie den Gast stattdessen dorthin
createdAt ISO-8601-Zeitpunkt Wann der Intent angelegt wurde
voucherAmount decimal oder null Was der Gutschein bezahlt; null, wenn die Anfrage keinen enthielt
cardAmount decimal oder null Was die Karte bezahlt: amount abzüglich voucherAmount. 0 heißt, der Gutschein hat alles bezahlt; null ohne Gutschein
{
  "id": "79501bb3-1e05-4827-82ed-1086e889b3bd",
  "reservationReference": "BDP-KSQS7M",
  "amount": 20.00,
  "currency": "EUR",
  "status": "RequiresConfirmation",
  "provider": "fake",
  "clientSecret": "pi_fake_156d81370b0445619159a5028cc87bff_secret_82d75f634cbb4beaaf530982b18e492c",
  "createdAt": "2026-09-15T12:55:15.2187185+00:00",
  "checkoutUrl": null
}

Eine Anzahlung lässt sich einmal bezahlen, und nur solange die Buchung Pending ist und auf sie wartet. Der Betrag ist immer die eigene Anzahlung der Buchung, sodass nie ein Client bestimmt, was dem Gast berechnet wird.

Mit einem Gutschein

Fügen Sie voucherCode hinzu, und der Gutschein bezahlt, was er von der Anzahlung kann; die Karte bezahlt den Rest über denselben Checkout wie oben. Nur ein Betragsgutschein bezahlt eine Anzahlung. Der Wert des Gutscheins wird reserviert, solange der Gast auf der Stripe-Seite ist, und abgebucht, wenn die Zahlung eintrifft, sodass er nicht zweimal ausgegeben werden kann; bricht der Gast ab, verfällt die Reservierung von selbst. Der Kartenteil beträgt mindestens 0,50 €: Bliebe weniger übrig, zahlt der Gutschein etwas weniger, sodass die Karte genau 0,50 € zahlt (Mit einem Gutschein bezahlen).

Ein Gutschein, der die ganze Anzahlung deckt, öffnet gar keine Zahlung: Die Buchung ist sofort bestätigt, provider ist voucher, cardAmount ist 0, und checkoutUrl ist die Bestätigungsseite der Buchung. status ist succeeded oder paid_but_unavailable, wenn der Slot inzwischen vergeben wurde – dann klärt die Location die Buchung, und ihre Erstattung bucht den Wert auf den Gutschein zurück.

{
  "id": "0b6d2c51-9a7e-4f3b-8c1d-2e4f6a8b0c13",
  "reservationReference": "BDP-KSQS7M",
  "amount": 20.00,
  "currency": "EUR",
  "status": "succeeded",
  "provider": "voucher",
  "clientSecret": "",
  "createdAt": "2026-10-09T12:55:15.2187185+00:00",
  "checkoutUrl": "https://app.bookdineplay.com/booking/confirmed?ref=BDP-KSQS7M",
  "voucherAmount": 20.00,
  "cardAmount": 0.00
}

Mit einem Gutschein braucht die Location eingeschaltete Anzahlungen und einen Tarif, der sie enthält; Online-Zahlungen und ein Auszahlungskonto braucht es nur, solange ein Kartenteil übrig bleibt. Eine Erstattung – durch die Location, bei der eigenen Stornierung des Gasts, wenn die Regeln der Location erstatten, oder im Stripe-Dashboard der Location – bucht den Gutscheinteil auf den Gutschein und den Kartenteil auf die Karte zurück.

Fehler

Status Wann
400 Ein Feld scheitert an der Validierung (errors nennt es), oder amount/currency ist nicht genau die Anzahlung der Buchung
403 feature-not-in-plan: Der Tarif des Mandanten enthält keine Online-Zahlungen oder Anzahlungen. requiredPlan ist "Premium"
404 Keine Location mit diesem Slug oder keine Reservierung mit dieser Referenz an dieser Location
409 Die Location hat Online-Zahlungen oder Anzahlungen selbst nicht aktiviert – den Anzahlungsschritt überspringen und die Reservierung als von der Location bestätigt behandeln
409 payouts-not-connected: Tarif und Schalter der Location erlauben es, aber die Location hat ihr Stripe-Auszahlungskonto noch nicht (vollständig) verbunden
409 Die Buchung wartet auf keine Anzahlung – storniert, von der Location bestätigt oder vorbei (reason deposit-not-payable) –, oder ihre Anzahlung ist schon bezahlt (reason deposit-already-paid)
404, 409 Mit einem Gutschein: eines der Gutschein-Probleme oder 409 mit reason below-card-minimum, wenn die Anzahlung 0,50 € oder weniger beträgt und der Gutschein sie nicht deckt

Die Prüfungen von Schaltern, Tarif und Auszahlungskonto laufen in dieser Reihenfolge – eine Location mit ausgeschalteten Zahlungen bekommt zuerst das Schalter-Problem, selbst bei einem Tarif und Auszahlungskonto, die es sonst erlauben würden.

curl

curl -X POST "https://api.bookdineplay.com/api/venues/your-venue/payment-intents" \
  -H "X-BookDinePlay-Key: bdp_pk_your_publishable_key" \
  -H "Origin: https://www.your-venue.example" \
  -H "Content-Type: application/json" \
  -d '{ "reservationReference": "BDP-7K2Q9H", "amount": 20.00, "currency": "EUR" }'

JavaScript

const intent = await (await fetch('https://api.bookdineplay.com/api/venues/your-venue/payment-intents', {
  method: 'POST',
  headers: { 'X-BookDinePlay-Key': 'bdp_pk_your_publishable_key', 'Content-Type': 'application/json' },
  body: JSON.stringify({ reservationReference: reservation.reference, amount: reservation.depositAmount, currency: reservation.currency, voucherCode }) // voucherCode optional
})).json();
if (intent.checkoutUrl) location.assign(intent.checkoutUrl); // bei cardAmount 0 die Bestätigungsseite

C#

var intent = await client.CreatePaymentIntentAsync("your-venue", new CreatePaymentIntentRequest
{
    ReservationReference = reservation.Reference,
    Amount = reservation.DepositAmount ?? 0m,
    Currency = reservation.Currency,
    VoucherCode = voucherCode // optional
}, cancellationToken);

Nächste Schritte

  • Reservierungen – woher depositAmount kommt.
  • Gutscheine – die Regeln, die jede Gutscheinzahlung teilt.
  • Fehler – feature-not-in-plan und payouts-not-connected im Detail.
  • .NET-SDK – CreatePaymentIntentAsync und die Ausnahmen, die es bei 403/409 wirft.