Sign in to see your venue's slug and publishable key in every sample.
Your account has no venue yet, so the samples keep their placeholders. Sign out
Signed in as · . Create a publishable key in the console and reload to see it here. Sign out
Signed in as · . The samples show your venue's publishable key. Sign out
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
- Payment intents — take the deposit.
- Availability — where every
startcomes from.