curl --request POST \
--url https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"localBookingDateAndTime": "2026-09-01T18:30:00",
"partySize": 2,
"serviceId": "service_dinner",
"sectionId": "section_main",
"firstName": "Alex",
"lastName": "Chen",
"email": "[email protected]",
"mobileNumber": "+61400000000",
"subscribed": true,
"termsAgreementChecked": true,
"emailSmsNotifications": false,
"notes": "Window table if possible",
"tagIds": [
"tag_birthday"
],
"selectedOptions": [
{
"menuOptionId": "menuoption_set_menu",
"quantity": 2,
"extras": [
{
"menuOptionId": "menuoption_oysters",
"quantity": 1
}
]
}
]
}
'import requests
url = "https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation"
payload = {
"localBookingDateAndTime": "2026-09-01T18:30:00",
"partySize": 2,
"serviceId": "service_dinner",
"sectionId": "section_main",
"firstName": "Alex",
"lastName": "Chen",
"email": "[email protected]",
"mobileNumber": "+61400000000",
"subscribed": True,
"termsAgreementChecked": True,
"emailSmsNotifications": False,
"notes": "Window table if possible",
"tagIds": ["tag_birthday"],
"selectedOptions": [
{
"menuOptionId": "menuoption_set_menu",
"quantity": 2,
"extras": [
{
"menuOptionId": "menuoption_oysters",
"quantity": 1
}
]
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
localBookingDateAndTime: '2026-09-01T18:30:00',
partySize: 2,
serviceId: 'service_dinner',
sectionId: 'section_main',
firstName: 'Alex',
lastName: 'Chen',
email: '[email protected]',
mobileNumber: '+61400000000',
subscribed: true,
termsAgreementChecked: true,
emailSmsNotifications: false,
notes: 'Window table if possible',
tagIds: ['tag_birthday'],
selectedOptions: [
{
menuOptionId: 'menuoption_set_menu',
quantity: 2,
extras: [{menuOptionId: 'menuoption_oysters', quantity: 1}]
}
]
})
};
fetch('https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'localBookingDateAndTime' => '2026-09-01T18:30:00',
'partySize' => 2,
'serviceId' => 'service_dinner',
'sectionId' => 'section_main',
'firstName' => 'Alex',
'lastName' => 'Chen',
'email' => '[email protected]',
'mobileNumber' => '+61400000000',
'subscribed' => true,
'termsAgreementChecked' => true,
'emailSmsNotifications' => false,
'notes' => 'Window table if possible',
'tagIds' => [
'tag_birthday'
],
'selectedOptions' => [
[
'menuOptionId' => 'menuoption_set_menu',
'quantity' => 2,
'extras' => [
[
'menuOptionId' => 'menuoption_oysters',
'quantity' => 1
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation"
payload := strings.NewReader("{\n \"localBookingDateAndTime\": \"2026-09-01T18:30:00\",\n \"partySize\": 2,\n \"serviceId\": \"service_dinner\",\n \"sectionId\": \"section_main\",\n \"firstName\": \"Alex\",\n \"lastName\": \"Chen\",\n \"email\": \"[email protected]\",\n \"mobileNumber\": \"+61400000000\",\n \"subscribed\": true,\n \"termsAgreementChecked\": true,\n \"emailSmsNotifications\": false,\n \"notes\": \"Window table if possible\",\n \"tagIds\": [\n \"tag_birthday\"\n ],\n \"selectedOptions\": [\n {\n \"menuOptionId\": \"menuoption_set_menu\",\n \"quantity\": 2,\n \"extras\": [\n {\n \"menuOptionId\": \"menuoption_oysters\",\n \"quantity\": 1\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"localBookingDateAndTime\": \"2026-09-01T18:30:00\",\n \"partySize\": 2,\n \"serviceId\": \"service_dinner\",\n \"sectionId\": \"section_main\",\n \"firstName\": \"Alex\",\n \"lastName\": \"Chen\",\n \"email\": \"[email protected]\",\n \"mobileNumber\": \"+61400000000\",\n \"subscribed\": true,\n \"termsAgreementChecked\": true,\n \"emailSmsNotifications\": false,\n \"notes\": \"Window table if possible\",\n \"tagIds\": [\n \"tag_birthday\"\n ],\n \"selectedOptions\": [\n {\n \"menuOptionId\": \"menuoption_set_menu\",\n \"quantity\": 2,\n \"extras\": [\n {\n \"menuOptionId\": \"menuoption_oysters\",\n \"quantity\": 1\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"localBookingDateAndTime\": \"2026-09-01T18:30:00\",\n \"partySize\": 2,\n \"serviceId\": \"service_dinner\",\n \"sectionId\": \"section_main\",\n \"firstName\": \"Alex\",\n \"lastName\": \"Chen\",\n \"email\": \"[email protected]\",\n \"mobileNumber\": \"+61400000000\",\n \"subscribed\": true,\n \"termsAgreementChecked\": true,\n \"emailSmsNotifications\": false,\n \"notes\": \"Window table if possible\",\n \"tagIds\": [\n \"tag_birthday\"\n ],\n \"selectedOptions\": [\n {\n \"menuOptionId\": \"menuoption_set_menu\",\n \"quantity\": 2,\n \"extras\": [\n {\n \"menuOptionId\": \"menuoption_oysters\",\n \"quantity\": 1\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "booking_2026-09-01_G3F7PA8HO438Z_1787294227662",
"bookingRef": "94227662",
"status": "U",
"statusId": "status_unconfirmed",
"reservationType": "Booking",
"bookingDateTime": "2026-09-01T18:30:00",
"durationMinutes": 120,
"partySize": 2,
"service": {
"id": "service_dinner",
"name": "Dinner"
},
"diner": {
"id": "customer_9f2a1c",
"firstName": "Alex",
"lastName": "Chen",
"email": "[email protected]",
"phone": "+61400000000"
},
"tableIds": [
"table_12"
],
"requestedSectionId": "section_main",
"tagIds": [
"tag_birthday"
],
"optionsSelected": [
{
"id": "menuoption_set_menu",
"name": "Set Menu",
"unitPrice": 2500,
"quantity": 2,
"paymentType": "Deposit",
"isUpsell": false
},
{
"id": "menuoption_oysters",
"name": "Half Dozen Oysters",
"unitPrice": 1800,
"quantity": 1,
"paymentType": "Deposit",
"isUpsell": true
}
],
"paymentDetails": {
"paymentType": "NoPayment",
"currency": "AUD",
"total": 0,
"paid": 0,
"state": "None"
},
"notes": "Window table if possible",
"source": "online",
"createdAt": "2026-08-27T04:45:00.104Z"
}{
"code": "ValidationError",
"message": "Request body failed validation",
"requestId": "0f1c9f2e-4b8a-4c1e-9d33-2a7f5b1c8e90",
"errors": {
"firstName": [
"At least one of firstName or lastName is required"
],
"localBookingDateAndTime": [
"Inside the venue's minimum notice period"
]
}
}{
"code": "NotFoundError",
"message": "Venue not found: 6247",
"requestId": "0f1c9f2e-4b8a-4c1e-9d33-2a7f5b1c8e90"
}{
"detail": "No table can seat 2 at the requested time"
}{
"code": "InternalError",
"message": "Internal server error",
"requestId": "0f1c9f2e-4b8a-4c1e-9d33-2a7f5b1c8e90"
}{
"detail": "Takeaway venues are not supported on this endpoint"
}Create a Reservation
Book one slot on one service, allocating a table.
curl --request POST \
--url https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"localBookingDateAndTime": "2026-09-01T18:30:00",
"partySize": 2,
"serviceId": "service_dinner",
"sectionId": "section_main",
"firstName": "Alex",
"lastName": "Chen",
"email": "[email protected]",
"mobileNumber": "+61400000000",
"subscribed": true,
"termsAgreementChecked": true,
"emailSmsNotifications": false,
"notes": "Window table if possible",
"tagIds": [
"tag_birthday"
],
"selectedOptions": [
{
"menuOptionId": "menuoption_set_menu",
"quantity": 2,
"extras": [
{
"menuOptionId": "menuoption_oysters",
"quantity": 1
}
]
}
]
}
'import requests
url = "https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation"
payload = {
"localBookingDateAndTime": "2026-09-01T18:30:00",
"partySize": 2,
"serviceId": "service_dinner",
"sectionId": "section_main",
"firstName": "Alex",
"lastName": "Chen",
"email": "[email protected]",
"mobileNumber": "+61400000000",
"subscribed": True,
"termsAgreementChecked": True,
"emailSmsNotifications": False,
"notes": "Window table if possible",
"tagIds": ["tag_birthday"],
"selectedOptions": [
{
"menuOptionId": "menuoption_set_menu",
"quantity": 2,
"extras": [
{
"menuOptionId": "menuoption_oysters",
"quantity": 1
}
]
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
localBookingDateAndTime: '2026-09-01T18:30:00',
partySize: 2,
serviceId: 'service_dinner',
sectionId: 'section_main',
firstName: 'Alex',
lastName: 'Chen',
email: '[email protected]',
mobileNumber: '+61400000000',
subscribed: true,
termsAgreementChecked: true,
emailSmsNotifications: false,
notes: 'Window table if possible',
tagIds: ['tag_birthday'],
selectedOptions: [
{
menuOptionId: 'menuoption_set_menu',
quantity: 2,
extras: [{menuOptionId: 'menuoption_oysters', quantity: 1}]
}
]
})
};
fetch('https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'localBookingDateAndTime' => '2026-09-01T18:30:00',
'partySize' => 2,
'serviceId' => 'service_dinner',
'sectionId' => 'section_main',
'firstName' => 'Alex',
'lastName' => 'Chen',
'email' => '[email protected]',
'mobileNumber' => '+61400000000',
'subscribed' => true,
'termsAgreementChecked' => true,
'emailSmsNotifications' => false,
'notes' => 'Window table if possible',
'tagIds' => [
'tag_birthday'
],
'selectedOptions' => [
[
'menuOptionId' => 'menuoption_set_menu',
'quantity' => 2,
'extras' => [
[
'menuOptionId' => 'menuoption_oysters',
'quantity' => 1
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation"
payload := strings.NewReader("{\n \"localBookingDateAndTime\": \"2026-09-01T18:30:00\",\n \"partySize\": 2,\n \"serviceId\": \"service_dinner\",\n \"sectionId\": \"section_main\",\n \"firstName\": \"Alex\",\n \"lastName\": \"Chen\",\n \"email\": \"[email protected]\",\n \"mobileNumber\": \"+61400000000\",\n \"subscribed\": true,\n \"termsAgreementChecked\": true,\n \"emailSmsNotifications\": false,\n \"notes\": \"Window table if possible\",\n \"tagIds\": [\n \"tag_birthday\"\n ],\n \"selectedOptions\": [\n {\n \"menuOptionId\": \"menuoption_set_menu\",\n \"quantity\": 2,\n \"extras\": [\n {\n \"menuOptionId\": \"menuoption_oysters\",\n \"quantity\": 1\n }\n ]\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"localBookingDateAndTime\": \"2026-09-01T18:30:00\",\n \"partySize\": 2,\n \"serviceId\": \"service_dinner\",\n \"sectionId\": \"section_main\",\n \"firstName\": \"Alex\",\n \"lastName\": \"Chen\",\n \"email\": \"[email protected]\",\n \"mobileNumber\": \"+61400000000\",\n \"subscribed\": true,\n \"termsAgreementChecked\": true,\n \"emailSmsNotifications\": false,\n \"notes\": \"Window table if possible\",\n \"tagIds\": [\n \"tag_birthday\"\n ],\n \"selectedOptions\": [\n {\n \"menuOptionId\": \"menuoption_set_menu\",\n \"quantity\": 2,\n \"extras\": [\n {\n \"menuOptionId\": \"menuoption_oysters\",\n \"quantity\": 1\n }\n ]\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://platform.uat.nowbookit.com/api/reservations/venue/{venueId}/reservation")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"localBookingDateAndTime\": \"2026-09-01T18:30:00\",\n \"partySize\": 2,\n \"serviceId\": \"service_dinner\",\n \"sectionId\": \"section_main\",\n \"firstName\": \"Alex\",\n \"lastName\": \"Chen\",\n \"email\": \"[email protected]\",\n \"mobileNumber\": \"+61400000000\",\n \"subscribed\": true,\n \"termsAgreementChecked\": true,\n \"emailSmsNotifications\": false,\n \"notes\": \"Window table if possible\",\n \"tagIds\": [\n \"tag_birthday\"\n ],\n \"selectedOptions\": [\n {\n \"menuOptionId\": \"menuoption_set_menu\",\n \"quantity\": 2,\n \"extras\": [\n {\n \"menuOptionId\": \"menuoption_oysters\",\n \"quantity\": 1\n }\n ]\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "booking_2026-09-01_G3F7PA8HO438Z_1787294227662",
"bookingRef": "94227662",
"status": "U",
"statusId": "status_unconfirmed",
"reservationType": "Booking",
"bookingDateTime": "2026-09-01T18:30:00",
"durationMinutes": 120,
"partySize": 2,
"service": {
"id": "service_dinner",
"name": "Dinner"
},
"diner": {
"id": "customer_9f2a1c",
"firstName": "Alex",
"lastName": "Chen",
"email": "[email protected]",
"phone": "+61400000000"
},
"tableIds": [
"table_12"
],
"requestedSectionId": "section_main",
"tagIds": [
"tag_birthday"
],
"optionsSelected": [
{
"id": "menuoption_set_menu",
"name": "Set Menu",
"unitPrice": 2500,
"quantity": 2,
"paymentType": "Deposit",
"isUpsell": false
},
{
"id": "menuoption_oysters",
"name": "Half Dozen Oysters",
"unitPrice": 1800,
"quantity": 1,
"paymentType": "Deposit",
"isUpsell": true
}
],
"paymentDetails": {
"paymentType": "NoPayment",
"currency": "AUD",
"total": 0,
"paid": 0,
"state": "None"
},
"notes": "Window table if possible",
"source": "online",
"createdAt": "2026-08-27T04:45:00.104Z"
}{
"code": "ValidationError",
"message": "Request body failed validation",
"requestId": "0f1c9f2e-4b8a-4c1e-9d33-2a7f5b1c8e90",
"errors": {
"firstName": [
"At least one of firstName or lastName is required"
],
"localBookingDateAndTime": [
"Inside the venue's minimum notice period"
]
}
}{
"code": "NotFoundError",
"message": "Venue not found: 6247",
"requestId": "0f1c9f2e-4b8a-4c1e-9d33-2a7f5b1c8e90"
}{
"detail": "No table can seat 2 at the requested time"
}{
"code": "InternalError",
"message": "Internal server error",
"requestId": "0f1c9f2e-4b8a-4c1e-9d33-2a7f5b1c8e90"
}{
"detail": "Takeaway venues are not supported on this endpoint"
}tagIds come from List Venue Tags.Authorizations
Your API key. See Authorization to create one.
Path Parameters
The venue being addressed. Every endpoint on this API is venue-scoped.
1"6247"
Body
At least one of firstName / lastName, and at least one of email / mobileNumber, must be present. Unknown fields are ignored rather than rejected. The originating channel is taken from your credential.
Venue-local wall clock. A time component is required — a bare date means midnight, which is almost never a real sitting. Must be outside the venue's notice period and within its future-booking horizon.
"2026-09-01T18:30:00"
Also limited by the venue's maximum party size.
1 <= x <= 10002
The service, by id — take it from the availability response.
1"service_dinner"
Preferred section, by id. Absent — or the any / all sentinels — means no preference and the best match is picked. A named section that cannot seat the party fails with no fallback.
"section_main"
Guest's first name. At least one of firstName / lastName is required; a missing pair is reported against firstName.
100Guest's last name.
200Guest's email. At least one of email / mobileNumber is required; a missing pair is reported against email.
250Guest's mobile number, in international format.
20Marketing consent. Recorded on the reservation and sent to the guest's customer record.
Terms acceptance. Sent to the customer record only; the reservation does not carry it.
Not supported yet. Accepted and recorded on the reservation, but it has no effect today: no confirmation email or SMS is sent for a reservation created through this API. Send your own guest confirmation.
Guest's company. Forwarded to the customer record.
100Accepted and forwarded to the guest's customer record. Not currently stored on the reservation itself.
30Free-text note for the venue, e.g. a seating request.
1000Tag ids from the tags endpoint.
201The booking options the guest chose. Which selections are allowed depends on the service — see the pricing and option lists in the availability response. A quantity of 0 is accepted and dropped, so you may post one entry per option on the menu.
50Show child attributes
Show child attributes
Response
The reservation was written, with status Unconfirmed.
Payment is not collected through this API, so paymentDetails comes back as NoPayment with total: 0 even for a priced service. Read what the guest will owe at the venue from the availability response's pricing, never from here, and do not build a checkout step against this response.
A reservation. Absent optional fields are omitted from the JSON rather than sent as null or [].
The identifier that addresses this reservation.
"booking_2026-08-24_G3F7PA8HO438Z_1787294227662"
Venue-local wall clock, ISO formatted. Not an absolute instant.
"2026-08-24T14:00:00"
2
The tables allocated. Empty only for a standby or waitlist entry.
Booking options the guest chose, with the prices that determined what was payable.
Show child attributes
Show child attributes
Where the reservation stands on payment. Always present, including for reservations that take no payment.
Show child attributes
Show child attributes
The reference you quote to a guest. A different identifier from id, and not usable as a path parameter.
"94227662"
The status code the reservation carries, joining onto the reservation-statuses endpoint's code. U unconfirmed, P$ pending payment, C confirmed, X cancelled, NS cancelled no-show, S seated, F finished, SP standby pending, TX SMS sent or SMS failed.
Several statuses can share one code, so treat code as a coarse grouping and statusId as the precise value. Venues can add statuses of their own, so read the venue's own set from the reservation-statuses endpoint rather than assuming this list is closed.
U, P$, C, X, NS, S, F, SP, TX The status's id. Several statuses can share one code, so this is what identifies the status the reservation is in — and the value a patch sets status to.
"status_seated_main"
A standby or waitlist entry is the same kind of record as a confirmed booking.
Booking, WaitList, StandbyList 120
Show child attributes
Show child attributes
Guest details recorded on the reservation.
Show child attributes
Show child attributes
The section the reservation asked for, which is often not where the allocated table sits. Absent when no preference was given.
The reservation this one replaced, set when a reservation was moved to another calendar date. The same id coming back means an ordinary change; a new id with this set means a replacement, and the value names the reservation to stop tracking.
"booking_2026-08-24_G3F7PA8HO438Z_1787294227662"
Originating channel. Read-only — set from your credential when the reservation is created.
"online"
When the reservation was made. An absolute instant, unlike bookingDateTime.