Developer docs

Reservations

Create a reservation for a slot the availability call offered — request fields, the reservation you get back, deposits, group bookings and every refusal.

One call books a slot. Send the resource type, date and start the guest chose from Availability, the party size and the guest's contact details; you get back a reservation with a reference the guest can quote, a status, and the price and deposit that apply.

Endpoints

POST /api/venues/{venueSlug}/reservations

Request body (Content-Type: application/json)

Field Required Meaning
resourceType yes The type of the slot, e.g. RestaurantTable
resourceId no The slot's resourceId to get exactly that resource. Omitted: the first available resource of the type at that time
date yes Venue-local yyyy-MM-dd
start yes Venue-local HH:mm, a start the availability call offered
end no Venue-local HH:mm; defaults to start plus the booking length
durationMinutes no 15–1440. Send the same value you queried availability with, or omit for the venue's default
partySize yes 1–200
games no 1–10, for resources priced per game; defaults to 1
customerName yes 2–120 characters
email yes A valid e-mail address — the confirmation goes there
phone no 3–40 characters when supplied; a blank value counts as not supplied
notes no Up to 500 characters, shown to the venue
depositOptIn no true when the guest agrees to pay a deposit; only has an effect when the venue enables deposits
extras no [{ "extraId": "…", "quantity": 1 }] — extras from the venue profile that apply to this resource type, quantity 1–100

Response 201 Created with a Location header of /api/venues/{venueSlug}/reservations/{reference} (informational — there is no public read endpoint yet).

Field Type Meaning
id GUID Internal id
reference string BDP-XXXX — what the guest quotes and what a payment intent refers to
status string Confirmed, or Pending when a deposit is required and not yet paid; later Cancelled, Completed, NoShow
venueSlug, resourceType, resourceName string Where
date, start, end string When, venue-local
partySize, customerName Who
priceEstimate, currency decimal, string The booking's price under the resource's model
depositRequired, depositAmount boolean, decimal or null Whether the guest must pay a deposit to confirm, and how much
createdAt ISO 8601 instant When the reservation was made
groupReference, groupResources string or null, object[] or null For a group booking: the shared reference and each member (resourceId, resourceName, partyShare)
games integer or null For per-game pricing
extras, extrasTotal object[] or null, decimal or null Priced extra lines (extraId, name, unitPrice, quantity, lineTotal, currency, basis) and their sum
{
  "id": "cad35696-0a75-45b6-b986-8bed7eb00ac5",
  "reference": "BDP-KSQS",
  "status": "Confirmed",
  "venueSlug": "demo-sportsbar",
  "resourceType": "RestaurantTable",
  "resourceName": "Corner table",
  "date": "2026-10-16",
  "start": "15:00",
  "end": "17:00",
  "partySize": 4,
  "customerName": "Ada Lovelace",
  "priceEstimate": 0,
  "currency": "EUR",
  "depositRequired": false,
  "depositAmount": null,
  "createdAt": "2026-09-15T12:55:15.1526956+00:00",
  "groupReference": null,
  "groupResources": null,
  "games": null,
  "extras": null,
  "extrasTotal": null
}

Errors

Status When
400 A field fails validation (errors names it); date/start malformed; the venue is closed then; the duration is not one the venue offers for that type; an extra does not apply
404 No venue with that slug
409 No resource of that type is free at that time — it was taken since the availability call. Re-query and offer the next slot

curl

curl -X POST "https://api.bookdineplay.com/api/venues/your-venue/reservations" \
  -H "X-BookDinePlay-Key: bdp_pk_your_publishable_key" \
  -H "Origin: https://www.your-venue.example" \
  -H "Content-Type: application/json" \
  -d '{
    "resourceType": "RestaurantTable",
    "date": "2026-10-16",
    "start": "19:00",
    "partySize": 4,
    "customerName": "Ada Lovelace",
    "email": "ada@example.com",
    "phone": "+49 30 1234567",
    "notes": "Window seat if possible"
  }'

JavaScript

const response = await fetch('https://api.bookdineplay.com/api/venues/your-venue/reservations', {
  method: 'POST',
  headers: { 'X-BookDinePlay-Key': 'bdp_pk_your_publishable_key', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    resourceType: 'RestaurantTable', date: '2026-10-16', start: '19:00', partySize: 4,
    customerName: 'Ada Lovelace', email: 'ada@example.com', phone: '+49 30 1234567',
    notes: 'Window seat if possible'
  })
});
if (response.status === 409) { /* slot just taken — re-query availability */ }
const reservation = await response.json();
console.log(reservation.reference, reservation.status);

C#

try
{
    var reservation = await client.CreateReservationAsync("your-venue", new CreateReservationRequest
    {
        ResourceType = BookableResourceType.RestaurantTable,
        Date = "2026-10-16",
        Start = "19:00",
        PartySize = 4,
        CustomerName = "Ada Lovelace",
        Email = "ada@example.com",
        Phone = "+49 30 1234567",
        Notes = "Window seat if possible"
    }, cancellationToken);
    Console.WriteLine($"{reservation.Reference} {reservation.Status}");
}
catch (BookDinePlayApiException ex) when (ex.StatusCode == HttpStatusCode.Conflict)
{
    // slot just taken — re-query availability
}

Deposits

A reservation needs a deposit when three things are true: the guest sent depositOptIn: true, the venue has deposits enabled, and the resource (or the venue's default for game resources) carries a deposit amount. Then depositRequired is true, depositAmount says how much, and status is Pending until the venue confirms the booking. Create a payment intent for that amount next. Without a deposit the reservation is Confirmed immediately.

Group bookings

When partySize exceeds one resource's capacity and the availability call offered a group slot, the reservation spans several resources: groupReference is the shared reference and groupResources lists each member with its share of the party. Extras are charged once for the whole group.

Next steps