curl --request POST \
--url https://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Restoo-Account-Id: <restoo-account-id>' \
--header 'Restoo-Partner-Id: <restoo-partner-id>' \
--data '
{
"experience": {
"tickets": 2,
"id": 101
},
"paxChildren": 0,
"pax": 2,
"status": "CONFIRMED",
"customerUuid": "0199ce9adaab7327bda33ef9f75c123",
"excludeBookingUuid": "50b5571be67b477baa9dead4b290c555",
"promoCode": "promo2x1",
"redemptionCode": "ABC123",
"floorPlanAreaId": 123,
"highChairs": 1,
"strollers": 1
}
'import requests
url = "https://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons"
payload = {
"experience": {
"tickets": 2,
"id": 101
},
"paxChildren": 0,
"pax": 2,
"status": "CONFIRMED",
"customerUuid": "0199ce9adaab7327bda33ef9f75c123",
"excludeBookingUuid": "50b5571be67b477baa9dead4b290c555",
"promoCode": "promo2x1",
"redemptionCode": "ABC123",
"floorPlanAreaId": 123,
"highChairs": 1,
"strollers": 1
}
headers = {
"Restoo-Partner-Id": "<restoo-partner-id>",
"Restoo-Account-Id": "<restoo-account-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Restoo-Partner-Id': '<restoo-partner-id>',
'Restoo-Account-Id': '<restoo-account-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
experience: {tickets: 2, id: 101},
paxChildren: 0,
pax: 2,
status: 'CONFIRMED',
customerUuid: '0199ce9adaab7327bda33ef9f75c123',
excludeBookingUuid: '50b5571be67b477baa9dead4b290c555',
promoCode: 'promo2x1',
redemptionCode: 'ABC123',
floorPlanAreaId: 123,
highChairs: 1,
strollers: 1
})
};
fetch('https://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons', 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://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons",
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([
'experience' => [
'tickets' => 2,
'id' => 101
],
'paxChildren' => 0,
'pax' => 2,
'status' => 'CONFIRMED',
'customerUuid' => '0199ce9adaab7327bda33ef9f75c123',
'excludeBookingUuid' => '50b5571be67b477baa9dead4b290c555',
'promoCode' => 'promo2x1',
'redemptionCode' => 'ABC123',
'floorPlanAreaId' => 123,
'highChairs' => 1,
'strollers' => 1
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Restoo-Account-Id: <restoo-account-id>",
"Restoo-Partner-Id: <restoo-partner-id>"
],
]);
$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://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons"
payload := strings.NewReader("{\n \"experience\": {\n \"tickets\": 2,\n \"id\": 101\n },\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\",\n \"floorPlanAreaId\": 123,\n \"highChairs\": 1,\n \"strollers\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Restoo-Partner-Id", "<restoo-partner-id>")
req.Header.Add("Restoo-Account-Id", "<restoo-account-id>")
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://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons")
.header("Restoo-Partner-Id", "<restoo-partner-id>")
.header("Restoo-Account-Id", "<restoo-account-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"experience\": {\n \"tickets\": 2,\n \"id\": 101\n },\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\",\n \"floorPlanAreaId\": 123,\n \"highChairs\": 1,\n \"strollers\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Restoo-Partner-Id"] = '<restoo-partner-id>'
request["Restoo-Account-Id"] = '<restoo-account-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"experience\": {\n \"tickets\": 2,\n \"id\": 101\n },\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\",\n \"floorPlanAreaId\": 123,\n \"highChairs\": 1,\n \"strollers\": 1\n}"
response = http.request(request)
puts response.read_body{
"shift": {
"type": {
"id": "LUNCH",
"name": "Lunch"
},
"firstBookingAt": "2025-03-20T20:00:00+02:00",
"lastBookingAt": "2025-03-21T01:00:00+02:00",
"hasExperiences": true,
"hasAddOns": true,
"isExperienceRequired": true
},
"experience": {
"name": "Premium Menu",
"summary": "<p>A 5-course premium tasting menu.</p>",
"description": "<p>Enjoy a 5-course tasting menu crafted by our head chef.</p>",
"detailsUrl": "https://example.com/experiences/premium-menu",
"images": [
{
"type": "THUMBNAIL",
"url": "https://example.com/assets/image.jpg"
}
],
"turnMinutes": 90,
"isTimeLimited": true,
"minBookingSize": 2,
"maxBookingSize": 10,
"minTicketsPerBooking": 1,
"paxPerTicket": 4,
"automaticTicketQuantity": false,
"pricePerTicket": 7500,
"minAdvanceBookingMinutes": 60,
"firstBookingTime": "18:00:00",
"lastBookingTime": "23:00:00",
"groupId": 1,
"floorPlanAreas": ":\n [\n {\n \"id\": 1,\n \"name\": \"Terrace\",\n \"summary\": \"The beautiful terrace of our restaurant.\",\n \"images\": [],\n }\n ]",
"hasAddOns": true,
"currency": "EUR",
"id": 101
},
"addOnGroup": {
"name": "Wine pairing",
"summary": "<p>Do you want wine pairing with your experience?</p>",
"minTotalQuantity": 2,
"maxTotalQuantity": 4,
"maxTotalTypes": 2,
"addOns": [
{
"minQuantity": 1,
"maxQuantity": 10,
"minAdvanceBookingMinutes": 10,
"availability": {
"isAvailable": false,
"outcome": "SHIFT_FULL",
"code": "TENANT_BOOKING_MAX_DATE_NOTICE_EXCEEDED",
"detail": "Bookings cannot be made more than 30 days in advance.",
"fallbackOptions": [
{
"action": "CONTACT",
"isPreferred": true
}
]
},
"name": "Premium wine tasting",
"summary": "<p>Enjoy our best wines with your experience.</p>",
"unitPrice": 1000,
"currency": "EUR",
"id": 101
}
],
"availability": {
"isAvailable": false,
"outcome": "SHIFT_FULL",
"code": "TENANT_BOOKING_MAX_DATE_NOTICE_EXCEEDED",
"detail": "Bookings cannot be made more than 30 days in advance.",
"fallbackOptions": [
{
"action": "CONTACT",
"isPreferred": true
}
]
}
},
"promo": {
"name": "Summer Discount 2025",
"id": 101
},
"availability": {
"isAvailable": false,
"outcome": "SHIFT_FULL",
"code": "TENANT_BOOKING_MAX_DATE_NOTICE_EXCEEDED",
"detail": "Bookings cannot be made more than 30 days in advance.",
"fallbackOptions": [
{
"action": "CONTACT",
"isPreferred": true
}
]
},
"accountId": "best-burger",
"workDay": {
"date": "2025-03-20"
}
}{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"code": "BOOKING_IS_NOT_ON_SEATED_GROUP",
"detail": "The booking must be on the seated group status to be ended."
}{
"type": "about:blank",
"title": "Validation Error",
"status": 422,
"code": "VALIDATION_ERROR",
"detail": "The request is not valid.",
"errors": [
{
"parameter": "status",
"reason": "The selected status is invalid."
}
]
}Get Experience Add-ons Availability
Retrieves availability of Add-ons for a specific Experience.
curl --request POST \
--url https://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Restoo-Account-Id: <restoo-account-id>' \
--header 'Restoo-Partner-Id: <restoo-partner-id>' \
--data '
{
"experience": {
"tickets": 2,
"id": 101
},
"paxChildren": 0,
"pax": 2,
"status": "CONFIRMED",
"customerUuid": "0199ce9adaab7327bda33ef9f75c123",
"excludeBookingUuid": "50b5571be67b477baa9dead4b290c555",
"promoCode": "promo2x1",
"redemptionCode": "ABC123",
"floorPlanAreaId": 123,
"highChairs": 1,
"strollers": 1
}
'import requests
url = "https://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons"
payload = {
"experience": {
"tickets": 2,
"id": 101
},
"paxChildren": 0,
"pax": 2,
"status": "CONFIRMED",
"customerUuid": "0199ce9adaab7327bda33ef9f75c123",
"excludeBookingUuid": "50b5571be67b477baa9dead4b290c555",
"promoCode": "promo2x1",
"redemptionCode": "ABC123",
"floorPlanAreaId": 123,
"highChairs": 1,
"strollers": 1
}
headers = {
"Restoo-Partner-Id": "<restoo-partner-id>",
"Restoo-Account-Id": "<restoo-account-id>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Restoo-Partner-Id': '<restoo-partner-id>',
'Restoo-Account-Id': '<restoo-account-id>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
experience: {tickets: 2, id: 101},
paxChildren: 0,
pax: 2,
status: 'CONFIRMED',
customerUuid: '0199ce9adaab7327bda33ef9f75c123',
excludeBookingUuid: '50b5571be67b477baa9dead4b290c555',
promoCode: 'promo2x1',
redemptionCode: 'ABC123',
floorPlanAreaId: 123,
highChairs: 1,
strollers: 1
})
};
fetch('https://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons', 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://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons",
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([
'experience' => [
'tickets' => 2,
'id' => 101
],
'paxChildren' => 0,
'pax' => 2,
'status' => 'CONFIRMED',
'customerUuid' => '0199ce9adaab7327bda33ef9f75c123',
'excludeBookingUuid' => '50b5571be67b477baa9dead4b290c555',
'promoCode' => 'promo2x1',
'redemptionCode' => 'ABC123',
'floorPlanAreaId' => 123,
'highChairs' => 1,
'strollers' => 1
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Restoo-Account-Id: <restoo-account-id>",
"Restoo-Partner-Id: <restoo-partner-id>"
],
]);
$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://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons"
payload := strings.NewReader("{\n \"experience\": {\n \"tickets\": 2,\n \"id\": 101\n },\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\",\n \"floorPlanAreaId\": 123,\n \"highChairs\": 1,\n \"strollers\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Restoo-Partner-Id", "<restoo-partner-id>")
req.Header.Add("Restoo-Account-Id", "<restoo-account-id>")
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://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons")
.header("Restoo-Partner-Id", "<restoo-partner-id>")
.header("Restoo-Account-Id", "<restoo-account-id>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"experience\": {\n \"tickets\": 2,\n \"id\": 101\n },\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\",\n \"floorPlanAreaId\": 123,\n \"highChairs\": 1,\n \"strollers\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.myrestoo.net/v3/availability/work-days/{date}/shifts/{time}/experiences/add-ons")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Restoo-Partner-Id"] = '<restoo-partner-id>'
request["Restoo-Account-Id"] = '<restoo-account-id>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"experience\": {\n \"tickets\": 2,\n \"id\": 101\n },\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\",\n \"floorPlanAreaId\": 123,\n \"highChairs\": 1,\n \"strollers\": 1\n}"
response = http.request(request)
puts response.read_body{
"shift": {
"type": {
"id": "LUNCH",
"name": "Lunch"
},
"firstBookingAt": "2025-03-20T20:00:00+02:00",
"lastBookingAt": "2025-03-21T01:00:00+02:00",
"hasExperiences": true,
"hasAddOns": true,
"isExperienceRequired": true
},
"experience": {
"name": "Premium Menu",
"summary": "<p>A 5-course premium tasting menu.</p>",
"description": "<p>Enjoy a 5-course tasting menu crafted by our head chef.</p>",
"detailsUrl": "https://example.com/experiences/premium-menu",
"images": [
{
"type": "THUMBNAIL",
"url": "https://example.com/assets/image.jpg"
}
],
"turnMinutes": 90,
"isTimeLimited": true,
"minBookingSize": 2,
"maxBookingSize": 10,
"minTicketsPerBooking": 1,
"paxPerTicket": 4,
"automaticTicketQuantity": false,
"pricePerTicket": 7500,
"minAdvanceBookingMinutes": 60,
"firstBookingTime": "18:00:00",
"lastBookingTime": "23:00:00",
"groupId": 1,
"floorPlanAreas": ":\n [\n {\n \"id\": 1,\n \"name\": \"Terrace\",\n \"summary\": \"The beautiful terrace of our restaurant.\",\n \"images\": [],\n }\n ]",
"hasAddOns": true,
"currency": "EUR",
"id": 101
},
"addOnGroup": {
"name": "Wine pairing",
"summary": "<p>Do you want wine pairing with your experience?</p>",
"minTotalQuantity": 2,
"maxTotalQuantity": 4,
"maxTotalTypes": 2,
"addOns": [
{
"minQuantity": 1,
"maxQuantity": 10,
"minAdvanceBookingMinutes": 10,
"availability": {
"isAvailable": false,
"outcome": "SHIFT_FULL",
"code": "TENANT_BOOKING_MAX_DATE_NOTICE_EXCEEDED",
"detail": "Bookings cannot be made more than 30 days in advance.",
"fallbackOptions": [
{
"action": "CONTACT",
"isPreferred": true
}
]
},
"name": "Premium wine tasting",
"summary": "<p>Enjoy our best wines with your experience.</p>",
"unitPrice": 1000,
"currency": "EUR",
"id": 101
}
],
"availability": {
"isAvailable": false,
"outcome": "SHIFT_FULL",
"code": "TENANT_BOOKING_MAX_DATE_NOTICE_EXCEEDED",
"detail": "Bookings cannot be made more than 30 days in advance.",
"fallbackOptions": [
{
"action": "CONTACT",
"isPreferred": true
}
]
}
},
"promo": {
"name": "Summer Discount 2025",
"id": 101
},
"availability": {
"isAvailable": false,
"outcome": "SHIFT_FULL",
"code": "TENANT_BOOKING_MAX_DATE_NOTICE_EXCEEDED",
"detail": "Bookings cannot be made more than 30 days in advance.",
"fallbackOptions": [
{
"action": "CONTACT",
"isPreferred": true
}
]
},
"accountId": "best-burger",
"workDay": {
"date": "2025-03-20"
}
}{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"code": "BOOKING_IS_NOT_ON_SEATED_GROUP",
"detail": "The booking must be on the seated group status to be ended."
}{
"type": "about:blank",
"title": "Validation Error",
"status": 422,
"code": "VALIDATION_ERROR",
"detail": "The request is not valid.",
"errors": [
{
"parameter": "status",
"reason": "The selected status is invalid."
}
]
}Authorizations
All requests must include the static API Key in the Authorization header using the Bearer scheme.
Headers
Unique identifier of your Partner account (defined by Restoo).
Path Parameters
The date for the availability search in ISO 8601 format (YYYY-MM-DD)
"2025-03-20"
The time for the availability search in ISO 8601 format (HH:MM:SS)
"22:30:00"
Body
GetExperienceAddOnsAvailabilityRequest
Request payload representing an Experience selector (id + tickets only, without add-ons). Used by availability endpoints that compute availability for all add-ons in the group, regardless of any prior selection.
Show child attributes
Show child attributes
The number of children in the Booking. Available only if the Tenant setting for differentiating adults and children is enabled
0 <= x <= 1000
The number of people (or adults, depending on Tenant settings) in the Booking
1 <= x <= 1002
Desired status of the Booking.
This value determines how availability should be evaluated and how the Booking should be handled if created.
CONFIRMED— The Booking should be immediately confirmed.REQUESTED— The Booking requires manual review and confirmation by the venue.PENDING_WAIT_LIST_BOOKING— The customer wishes to join the wait list and may be confirmed if availability becomes available.
Availability requests should initially be performed using the CONFIRMED status.
If no availability is found, alternative statuses may be offered depending on
the availability result and venue configuration.
Not all statuses are available for every availability request
REQUESTED, PENDING_MERCHANT_CONFIRMATION, PENDING_WAIT_LIST_BOOKING, CONFIRMED, WAIT_LIST_WALK_IN, ARRIVED, SEATED, DESSERTS, ACCOUNT_SENT, ACCOUNT_PAID, ATTENDED, CANCELED, NO_SHOW, DECLINED_BY_MERCHANT, DELETED "CONFIRMED"
The Customer UUID.
Include this field only to associate the request with an existing Customer in Restoo
"0199ce9adaab7327bda33ef9f75c123"
UUID of the Booking to be excluded from the availability search. Required only when updating an existing Booking
"50b5571be67b477baa9dead4b290c555"
The promotion code requested for the reservation
6 - 255"promo2x1"
The alphanumeric code to redeem the purchased Product
6"ABC123"
The ID of the Floor Plan Area requested, taken from the chosen Time Slot's
floorPlanAreaId. Required when the Shift offers Floor Plan Areas open to
online booking
x >= 1123
The number of high chairs requested
x >= 01
The number of strollers requested
x >= 01
Response
GetExperienceAddOnsAvailabilityResponse
The Shift details.
Show child attributes
Show child attributes
The Experience details.
Show child attributes
Show child attributes
The Experience Add-on Group availability details
Show child attributes
Show child attributes
The Promo applied during the availability request, if any.
If null, no Promo was applied or no valid Promo was detected.
Show child attributes
Show child attributes
The Availability details for the request.
Show child attributes
Show child attributes
The unique Restoo Account identifier for the Tenant
"best-burger"
The Work Day details.
Show child attributes
Show child attributes