curl --request POST \
--url https://api-dev.myrestoo.net/v3/availability/calendar \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Restoo-Account-Id: <restoo-account-id>' \
--header 'Restoo-Partner-Id: <restoo-partner-id>' \
--data '
{
"dateStart": "2025-01-01",
"dateEnd": "2025-01-31",
"paxChildren": 0,
"pax": 2,
"status": "CONFIRMED",
"filters": {
"experienceIds": [
1,
2
],
"floorPlanAreaIds": [
1,
2
],
"shiftTypes": [
"LUNCH",
"DINNER"
]
},
"customerUuid": "0199ce9adaab7327bda33ef9f75c123",
"excludeBookingUuid": "50b5571be67b477baa9dead4b290c555",
"promoCode": "promo2x1",
"redemptionCode": "ABC123"
}
'import requests
url = "https://api-dev.myrestoo.net/v3/availability/calendar"
payload = {
"dateStart": "2025-01-01",
"dateEnd": "2025-01-31",
"paxChildren": 0,
"pax": 2,
"status": "CONFIRMED",
"filters": {
"experienceIds": [1, 2],
"floorPlanAreaIds": [1, 2],
"shiftTypes": ["LUNCH", "DINNER"]
},
"customerUuid": "0199ce9adaab7327bda33ef9f75c123",
"excludeBookingUuid": "50b5571be67b477baa9dead4b290c555",
"promoCode": "promo2x1",
"redemptionCode": "ABC123"
}
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({
dateStart: '2025-01-01',
dateEnd: '2025-01-31',
paxChildren: 0,
pax: 2,
status: 'CONFIRMED',
filters: {
experienceIds: [1, 2],
floorPlanAreaIds: [1, 2],
shiftTypes: ['LUNCH', 'DINNER']
},
customerUuid: '0199ce9adaab7327bda33ef9f75c123',
excludeBookingUuid: '50b5571be67b477baa9dead4b290c555',
promoCode: 'promo2x1',
redemptionCode: 'ABC123'
})
};
fetch('https://api-dev.myrestoo.net/v3/availability/calendar', 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/calendar",
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([
'dateStart' => '2025-01-01',
'dateEnd' => '2025-01-31',
'paxChildren' => 0,
'pax' => 2,
'status' => 'CONFIRMED',
'filters' => [
'experienceIds' => [
1,
2
],
'floorPlanAreaIds' => [
1,
2
],
'shiftTypes' => [
'LUNCH',
'DINNER'
]
],
'customerUuid' => '0199ce9adaab7327bda33ef9f75c123',
'excludeBookingUuid' => '50b5571be67b477baa9dead4b290c555',
'promoCode' => 'promo2x1',
'redemptionCode' => 'ABC123'
]),
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/calendar"
payload := strings.NewReader("{\n \"dateStart\": \"2025-01-01\",\n \"dateEnd\": \"2025-01-31\",\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"filters\": {\n \"experienceIds\": [\n 1,\n 2\n ],\n \"floorPlanAreaIds\": [\n 1,\n 2\n ],\n \"shiftTypes\": [\n \"LUNCH\",\n \"DINNER\"\n ]\n },\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\"\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/calendar")
.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 \"dateStart\": \"2025-01-01\",\n \"dateEnd\": \"2025-01-31\",\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"filters\": {\n \"experienceIds\": [\n 1,\n 2\n ],\n \"floorPlanAreaIds\": [\n 1,\n 2\n ],\n \"shiftTypes\": [\n \"LUNCH\",\n \"DINNER\"\n ]\n },\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.myrestoo.net/v3/availability/calendar")
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 \"dateStart\": \"2025-01-01\",\n \"dateEnd\": \"2025-01-31\",\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"filters\": {\n \"experienceIds\": [\n 1,\n 2\n ],\n \"floorPlanAreaIds\": [\n 1,\n 2\n ],\n \"shiftTypes\": [\n \"LUNCH\",\n \"DINNER\"\n ]\n },\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\"\n}"
response = http.request(request)
puts response.read_body{
"workDays": [
{
"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
}
]
},
"date": "2025-03-20"
}
],
"metadata": {
"filters": {
"experiences": [
{
"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
}
],
"floorPlanAreas": [
{
"name": "Terrace",
"summary": "<p>The beautiful terrace of our restaurant.</p>",
"images": [
{
"type": "THUMBNAIL",
"url": "https://example.com/assets/image.jpg"
}
],
"id": 101
}
],
"shiftTypes": [
{
"id": "LUNCH",
"name": "Lunch"
}
]
}
},
"promo": {
"name": "Summer Discount 2025",
"id": 101
},
"accountId": "best-burger"
}{
"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 Calendar Availability
Returns the availability calendar for a specific date range, showing which Work Days have available booking slots.
curl --request POST \
--url https://api-dev.myrestoo.net/v3/availability/calendar \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Restoo-Account-Id: <restoo-account-id>' \
--header 'Restoo-Partner-Id: <restoo-partner-id>' \
--data '
{
"dateStart": "2025-01-01",
"dateEnd": "2025-01-31",
"paxChildren": 0,
"pax": 2,
"status": "CONFIRMED",
"filters": {
"experienceIds": [
1,
2
],
"floorPlanAreaIds": [
1,
2
],
"shiftTypes": [
"LUNCH",
"DINNER"
]
},
"customerUuid": "0199ce9adaab7327bda33ef9f75c123",
"excludeBookingUuid": "50b5571be67b477baa9dead4b290c555",
"promoCode": "promo2x1",
"redemptionCode": "ABC123"
}
'import requests
url = "https://api-dev.myrestoo.net/v3/availability/calendar"
payload = {
"dateStart": "2025-01-01",
"dateEnd": "2025-01-31",
"paxChildren": 0,
"pax": 2,
"status": "CONFIRMED",
"filters": {
"experienceIds": [1, 2],
"floorPlanAreaIds": [1, 2],
"shiftTypes": ["LUNCH", "DINNER"]
},
"customerUuid": "0199ce9adaab7327bda33ef9f75c123",
"excludeBookingUuid": "50b5571be67b477baa9dead4b290c555",
"promoCode": "promo2x1",
"redemptionCode": "ABC123"
}
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({
dateStart: '2025-01-01',
dateEnd: '2025-01-31',
paxChildren: 0,
pax: 2,
status: 'CONFIRMED',
filters: {
experienceIds: [1, 2],
floorPlanAreaIds: [1, 2],
shiftTypes: ['LUNCH', 'DINNER']
},
customerUuid: '0199ce9adaab7327bda33ef9f75c123',
excludeBookingUuid: '50b5571be67b477baa9dead4b290c555',
promoCode: 'promo2x1',
redemptionCode: 'ABC123'
})
};
fetch('https://api-dev.myrestoo.net/v3/availability/calendar', 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/calendar",
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([
'dateStart' => '2025-01-01',
'dateEnd' => '2025-01-31',
'paxChildren' => 0,
'pax' => 2,
'status' => 'CONFIRMED',
'filters' => [
'experienceIds' => [
1,
2
],
'floorPlanAreaIds' => [
1,
2
],
'shiftTypes' => [
'LUNCH',
'DINNER'
]
],
'customerUuid' => '0199ce9adaab7327bda33ef9f75c123',
'excludeBookingUuid' => '50b5571be67b477baa9dead4b290c555',
'promoCode' => 'promo2x1',
'redemptionCode' => 'ABC123'
]),
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/calendar"
payload := strings.NewReader("{\n \"dateStart\": \"2025-01-01\",\n \"dateEnd\": \"2025-01-31\",\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"filters\": {\n \"experienceIds\": [\n 1,\n 2\n ],\n \"floorPlanAreaIds\": [\n 1,\n 2\n ],\n \"shiftTypes\": [\n \"LUNCH\",\n \"DINNER\"\n ]\n },\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\"\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/calendar")
.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 \"dateStart\": \"2025-01-01\",\n \"dateEnd\": \"2025-01-31\",\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"filters\": {\n \"experienceIds\": [\n 1,\n 2\n ],\n \"floorPlanAreaIds\": [\n 1,\n 2\n ],\n \"shiftTypes\": [\n \"LUNCH\",\n \"DINNER\"\n ]\n },\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-dev.myrestoo.net/v3/availability/calendar")
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 \"dateStart\": \"2025-01-01\",\n \"dateEnd\": \"2025-01-31\",\n \"paxChildren\": 0,\n \"pax\": 2,\n \"status\": \"CONFIRMED\",\n \"filters\": {\n \"experienceIds\": [\n 1,\n 2\n ],\n \"floorPlanAreaIds\": [\n 1,\n 2\n ],\n \"shiftTypes\": [\n \"LUNCH\",\n \"DINNER\"\n ]\n },\n \"customerUuid\": \"0199ce9adaab7327bda33ef9f75c123\",\n \"excludeBookingUuid\": \"50b5571be67b477baa9dead4b290c555\",\n \"promoCode\": \"promo2x1\",\n \"redemptionCode\": \"ABC123\"\n}"
response = http.request(request)
puts response.read_body{
"workDays": [
{
"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
}
]
},
"date": "2025-03-20"
}
],
"metadata": {
"filters": {
"experiences": [
{
"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
}
],
"floorPlanAreas": [
{
"name": "Terrace",
"summary": "<p>The beautiful terrace of our restaurant.</p>",
"images": [
{
"type": "THUMBNAIL",
"url": "https://example.com/assets/image.jpg"
}
],
"id": 101
}
],
"shiftTypes": [
{
"id": "LUNCH",
"name": "Lunch"
}
]
}
},
"promo": {
"name": "Summer Discount 2025",
"id": 101
},
"accountId": "best-burger"
}{
"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).
Body
GetCalendarAvailabilityRequest
Request payload for calendar availability query.
The start date for the availability search in ISO 8601 format (YYYY-MM-DD)
"2025-01-01"
The end date for the availability search in ISO 8601 format (YYYY-MM-DD)
"2025-01-31"
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"
Filters to apply on the calendar and work day availability requests.
Show child attributes
Show child attributes
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"
Response
GetCalendarAvailabilityResponse
Response payload representing the availability a for a range of Work Days.
Show child attributes
Show child attributes
Metadata returned with the calendar availability response.
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 unique Restoo Account identifier for the Tenant
"best-burger"