{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-getting-started/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["tabs","tab"]},"type":"markdown"},"seo":{"title":"Booking Management","description":"Bookable is a TMS API gateway API — one integration to access real-time availability and manage bookings across venues on any table management system.","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"booking-management","__idx":0},"children":["Booking Management"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This guide covers the full booking lifecycle: creating, retrieving, updating, and cancelling reservations."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"create-a-booking","__idx":1},"children":["Create a booking"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"POST /venues/{compositeId}/booking\n"},"children":[]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"cURL","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"COMPOSITE_ID=\"29|CO|275cc44dd2e2496fba44857c9257443a|d99128c546b34b619c4477b712869f2b\"\n\ncurl -X POST \"https://api.bookabletech.com/venues/${COMPOSITE_ID}/booking\" \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"x-Partner-Reference: YOUR_INTERNAL_REF\" \\\n  -d '{\n    \"firstName\": \"Jane\",\n    \"lastName\": \"Smith\",\n    \"email\": \"jane.smith@example.com\",\n    \"phone\": \"+441234567890\",\n    \"partySize\": 4,\n    \"date\": \"2025-08-15\",\n    \"time\": \"19:00\",\n    \"type\": \"book\",\n    \"notes\": \"Anniversary dinner — please add candles\"\n  }'\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"JavaScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"const BASE_URL = 'https://api.bookabletech.com';\nconst compositeId = '29|CO|275cc44dd2e2496fba44857c9257443a|d99128c546b34b619c4477b712869f2b';\n\nconst response = await fetch(`${BASE_URL}/venues/${compositeId}/booking`, {\n  method: 'POST',\n  headers: {\n    Authorization: `Bearer ${accessToken}`,\n    'Content-Type': 'application/json',\n    'x-Partner-Reference': 'YOUR_INTERNAL_REF',\n  },\n  body: JSON.stringify({\n    firstName: 'Jane',\n    lastName: 'Smith',\n    email: 'jane.smith@example.com',\n    phone: '+441234567890',\n    partySize: 4,\n    date: '2025-08-15',\n    time: '19:00',\n    type: slot.type, // from availability check\n    notes: 'Anniversary dinner — please add candles',\n  }),\n});\n\nconst booking = await response.json();\n// booking.id              — store for future operations\n// booking.operatorBookingId — share with the guest\n// booking.status          — \"Confirmed\" or \"Pending\"\n","lang":"javascript"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"import requests\n\nBASE_URL = 'https://api.bookabletech.com'\ncomposite_id = '29|CO|275cc44dd2e2496fba44857c9257443a|d99128c546b34b619c4477b712869f2b'\n\nresponse = requests.post(\n    f'{BASE_URL}/venues/{composite_id}/booking',\n    json={\n        'firstName': 'Jane',\n        'lastName': 'Smith',\n        'email': 'jane.smith@example.com',\n        'phone': '+441234567890',\n        'partySize': 4,\n        'date': '2025-08-15',\n        'time': '19:00',\n        'type': slot['type'],  # from availability check\n        'notes': 'Anniversary dinner — please add candles',\n    },\n    headers={\n        'Authorization': f'Bearer {access_token}',\n        'x-Partner-Reference': 'YOUR_INTERNAL_REF',\n    },\n)\nresponse.raise_for_status()\nbooking = response.json()\n# booking['id']               — store for future operations\n# booking['operatorBookingId'] — share with the guest\n# booking['status']           — \"Confirmed\" or \"Pending\"\n","lang":"python"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Java","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"String body = \"\"\"\n    {\n      \"firstName\": \"Jane\",\n      \"lastName\": \"Smith\",\n      \"email\": \"jane.smith@example.com\",\n      \"phone\": \"+441234567890\",\n      \"partySize\": 4,\n      \"date\": \"2025-08-15\",\n      \"time\": \"19:00\",\n      \"type\": \"book\",\n      \"notes\": \"Anniversary dinner — please add candles\"\n    }\n\"\"\";\n\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(BASE_URL + \"/venues/\" + compositeId + \"/booking\"))\n    .header(\"Authorization\", \"Bearer \" + accessToken)\n    .header(\"Content-Type\", \"application/json\")\n    .header(\"x-Partner-Reference\", \"YOUR_INTERNAL_REF\")\n    .POST(HttpRequest.BodyPublishers.ofString(body))\n    .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n","lang":"java"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"csharp","header":{"controls":{"copy":{}}},"source":"var payload = new {\n    firstName = \"Jane\",\n    lastName = \"Smith\",\n    email = \"jane.smith@example.com\",\n    phone = \"+441234567890\",\n    partySize = 4,\n    date = \"2025-08-15\",\n    time = \"19:00\",\n    type = \"book\",\n    notes = \"Anniversary dinner — please add candles\"\n};\n\nvar request = new HttpRequestMessage(HttpMethod.Post,\n    $\"{BASE_URL}/venues/{compositeId}/booking\");\nrequest.Headers.Add(\"x-Partner-Reference\", \"YOUR_INTERNAL_REF\");\nrequest.Content = JsonContent.Create(payload);\n\nvar response = await client.SendAsync(request);\nresponse.EnsureSuccessStatusCode();\nvar booking = await response.Content.ReadFromJsonAsync<JsonElement>();\n","lang":"csharp"},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Example response:"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"id\": \"29|CO|550e8400e29b41d4a716446655440000\",\n  \"operatorBookingId\": \"BKA-7X2P\",\n  \"status\": \"Confirmed\",\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Smith\",\n  \"partySize\": 4,\n  \"date\": \"2025-08-15\",\n  \"time\": \"19:00\",\n  \"venueGroupName\": \"The Grand Table Group\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"preorders","__idx":2},"children":["Preorders"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Some venues offer ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["packages"]}," (standalone add-ons — a bottle of wine, a tasting platter, a cocktail kit) and ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["menus"]}," (structured multi-course offerings where the guest selects specific dishes). Both are submitted inside the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["preorders"]}," field of the booking request."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["products[].preOrderRequired"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]}," for the chosen product, a preorder must be included — the booking will be rejected without one."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-1-get-the-preorder-catalogue","__idx":3},"children":["Step 1: Get the preorder catalogue"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Packages and menus available at the venue are returned in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /venues"]}," response under ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["data[].preorders"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Example venue response (truncated):"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"data\": [\n    {\n      \"name\": \"The Grand Table\",\n      \"preorders\": {\n        \"packages\": [\n          {\n            \"id\": \"5888a5afc71620e04002d5bb\",\n            \"name\": \"Prosecco on arrival\",\n            \"price\": 8.50,\n            \"type\": \"drink\"\n          },\n          {\n            \"id\": \"62692e90d2cf1f163744efc4\",\n            \"name\": \"Sharing charcuterie board\",\n            \"price\": 18.00,\n            \"type\": \"food\",\n            \"sub_type\": \"starter\"\n          }\n        ],\n        \"menus\": [\n          {\n            \"id\": \"68a5f2eee07ae30fcd653b03\",\n            \"name\": \"Set Menu\",\n            \"description\": \"2 or 3 courses from our seasonal menu\",\n            \"items\": [\n              { \"packageId\": \"62c6c9f532c7cc7e4265dfdc\", \"name\": \"Pan roasted Padron peppers (V)\", \"price\": 9.00 },\n              { \"packageId\": \"619d19eb40e1512ebb03b378\", \"name\": \"Beef fillet with truffle jus\", \"price\": 28.00 }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-2-check-which-preorders-are-valid-for-your-slot","__idx":4},"children":["Step 2: Check which preorders are valid for your slot"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The availability response filters this catalogue per time slot. Each entry in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["times[]"]}," includes a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["preOrderItems"]}," object:"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"allowedPackages / allowedMenus"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowedPackages"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["allowedMenus"]}]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"all\""]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Every item in the venue catalogue is available"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"set\""]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Only the IDs listed in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["packageIds"]}," / ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["menuIds"]}," are available"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["\"none\""]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["No packages / menus for this slot"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Example availability response (truncated):"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"times\": [\n    {\n      \"time\": \"19:00\",\n      \"type\": \"book\",\n      \"preOrderItems\": {\n        \"allowedPackages\": \"set\",\n        \"packageIds\": [\"5888a5afc71620e04002d5bb\"],\n        \"allowedMenus\": \"all\",\n        \"menuIds\": null\n      }\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this example, only the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["5888a5afc71620e04002d5bb"]}," package is allowed at 19:00, but all menus are available."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-3-add-preorders-to-the-booking","__idx":5},"children":["Step 3: Add preorders to the booking"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Include a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["preorders"]}," object in the booking request body."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Packages"]}," — supply the package ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["quantity"]},":"]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"cURL","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST \"https://api.bookabletech.com/venues/${COMPOSITE_ID}/booking\" \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"firstName\": \"Jane\",\n    \"lastName\": \"Smith\",\n    \"email\": \"jane.smith@example.com\",\n    \"phone\": \"+441234567890\",\n    \"partySize\": 4,\n    \"date\": \"2025-08-15\",\n    \"time\": \"19:00\",\n    \"type\": \"book\",\n    \"preorders\": {\n      \"packages\": [\n        { \"id\": \"5888a5afc71620e04002d5bb\", \"quantity\": 4 }\n      ]\n    }\n  }'\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"JavaScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"const response = await fetch(`${BASE_URL}/venues/${compositeId}/booking`, {\n  method: 'POST',\n  headers: {\n    Authorization: `Bearer ${accessToken}`,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    firstName: 'Jane',\n    lastName: 'Smith',\n    email: 'jane.smith@example.com',\n    phone: '+441234567890',\n    partySize: 4,\n    date: '2025-08-15',\n    time: '19:00',\n    type: slot.type,\n    preorders: {\n      packages: [\n        { id: '5888a5afc71620e04002d5bb', quantity: 4 },\n      ],\n    },\n  }),\n});\n","lang":"javascript"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"response = requests.post(\n    f'{BASE_URL}/venues/{composite_id}/booking',\n    json={\n        'firstName': 'Jane',\n        'lastName': 'Smith',\n        'email': 'jane.smith@example.com',\n        'phone': '+441234567890',\n        'partySize': 4,\n        'date': '2025-08-15',\n        'time': '19:00',\n        'type': slot['type'],\n        'preorders': {\n            'packages': [\n                {'id': '5888a5afc71620e04002d5bb', 'quantity': 4},\n            ],\n        },\n    },\n    headers={'Authorization': f'Bearer {access_token}'},\n)\nresponse.raise_for_status()\nbooking = response.json()\n","lang":"python"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Java","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"String body = \"\"\"\n    {\n      \"firstName\": \"Jane\",\n      \"lastName\": \"Smith\",\n      \"email\": \"jane.smith@example.com\",\n      \"phone\": \"+441234567890\",\n      \"partySize\": 4,\n      \"date\": \"2025-08-15\",\n      \"time\": \"19:00\",\n      \"type\": \"book\",\n      \"preorders\": {\n        \"packages\": [\n          { \"id\": \"5888a5afc71620e04002d5bb\", \"quantity\": 4 }\n        ]\n      }\n    }\n\"\"\";\n\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(BASE_URL + \"/venues/\" + compositeId + \"/booking\"))\n    .header(\"Authorization\", \"Bearer \" + accessToken)\n    .header(\"Content-Type\", \"application/json\")\n    .POST(HttpRequest.BodyPublishers.ofString(body))\n    .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n","lang":"java"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"csharp","header":{"controls":{"copy":{}}},"source":"var payload = new {\n    firstName = \"Jane\",\n    lastName = \"Smith\",\n    email = \"jane.smith@example.com\",\n    phone = \"+441234567890\",\n    partySize = 4,\n    date = \"2025-08-15\",\n    time = \"19:00\",\n    type = \"book\",\n    preorders = new {\n        packages = new[] {\n            new { id = \"5888a5afc71620e04002d5bb\", quantity = 4 }\n        }\n    }\n};\n\nvar request = new HttpRequestMessage(HttpMethod.Post,\n    $\"{BASE_URL}/venues/{compositeId}/booking\");\nrequest.Content = JsonContent.Create(payload);\n\nvar response = await client.SendAsync(request);\nresponse.EnsureSuccessStatusCode();\n","lang":"csharp"},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Menus"]}," — supply the menu ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["quantity"]},", and optionally ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["items[]"]}," to pre-select specific dishes. Each item uses the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["packageId"]}," from the menu's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["items[]"]}," catalogue:"]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"cURL","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X POST \"https://api.bookabletech.com/venues/${COMPOSITE_ID}/booking\" \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"firstName\": \"Jane\",\n    \"lastName\": \"Smith\",\n    \"email\": \"jane.smith@example.com\",\n    \"phone\": \"+441234567890\",\n    \"partySize\": 4,\n    \"date\": \"2025-08-15\",\n    \"time\": \"19:00\",\n    \"type\": \"book\",\n    \"preorders\": {\n      \"menus\": [\n        {\n          \"id\": \"68a5f2eee07ae30fcd653b03\",\n          \"quantity\": 4,\n          \"items\": [\n            { \"id\": \"62c6c9f532c7cc7e4265dfdc\", \"quantity\": 2 },\n            { \"id\": \"619d19eb40e1512ebb03b378\", \"quantity\": 2 }\n          ]\n        }\n      ]\n    }\n  }'\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"JavaScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"const response = await fetch(`${BASE_URL}/venues/${compositeId}/booking`, {\n  method: 'POST',\n  headers: {\n    Authorization: `Bearer ${accessToken}`,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    firstName: 'Jane',\n    lastName: 'Smith',\n    email: 'jane.smith@example.com',\n    phone: '+441234567890',\n    partySize: 4,\n    date: '2025-08-15',\n    time: '19:00',\n    type: slot.type,\n    preorders: {\n      menus: [\n        {\n          id: '68a5f2eee07ae30fcd653b03',\n          quantity: 4,\n          items: [\n            { id: '62c6c9f532c7cc7e4265dfdc', quantity: 2 },\n            { id: '619d19eb40e1512ebb03b378', quantity: 2 },\n          ],\n        },\n      ],\n    },\n  }),\n});\n","lang":"javascript"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"response = requests.post(\n    f'{BASE_URL}/venues/{composite_id}/booking',\n    json={\n        'firstName': 'Jane',\n        'lastName': 'Smith',\n        'email': 'jane.smith@example.com',\n        'phone': '+441234567890',\n        'partySize': 4,\n        'date': '2025-08-15',\n        'time': '19:00',\n        'type': slot['type'],\n        'preorders': {\n            'menus': [\n                {\n                    'id': '68a5f2eee07ae30fcd653b03',\n                    'quantity': 4,\n                    'items': [\n                        {'id': '62c6c9f532c7cc7e4265dfdc', 'quantity': 2},\n                        {'id': '619d19eb40e1512ebb03b378', 'quantity': 2},\n                    ],\n                },\n            ],\n        },\n    },\n    headers={'Authorization': f'Bearer {access_token}'},\n)\nresponse.raise_for_status()\nbooking = response.json()\n","lang":"python"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Java","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"String body = \"\"\"\n    {\n      \"firstName\": \"Jane\",\n      \"lastName\": \"Smith\",\n      \"email\": \"jane.smith@example.com\",\n      \"phone\": \"+441234567890\",\n      \"partySize\": 4,\n      \"date\": \"2025-08-15\",\n      \"time\": \"19:00\",\n      \"type\": \"book\",\n      \"preorders\": {\n        \"menus\": [\n          {\n            \"id\": \"68a5f2eee07ae30fcd653b03\",\n            \"quantity\": 4,\n            \"items\": [\n              { \"id\": \"62c6c9f532c7cc7e4265dfdc\", \"quantity\": 2 },\n              { \"id\": \"619d19eb40e1512ebb03b378\", \"quantity\": 2 }\n            ]\n          }\n        ]\n      }\n    }\n\"\"\";\n\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(BASE_URL + \"/venues/\" + compositeId + \"/booking\"))\n    .header(\"Authorization\", \"Bearer \" + accessToken)\n    .header(\"Content-Type\", \"application/json\")\n    .POST(HttpRequest.BodyPublishers.ofString(body))\n    .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n","lang":"java"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"csharp","header":{"controls":{"copy":{}}},"source":"var payload = new {\n    firstName = \"Jane\",\n    lastName = \"Smith\",\n    email = \"jane.smith@example.com\",\n    phone = \"+441234567890\",\n    partySize = 4,\n    date = \"2025-08-15\",\n    time = \"19:00\",\n    type = \"book\",\n    preorders = new {\n        menus = new[] {\n            new {\n                id = \"68a5f2eee07ae30fcd653b03\",\n                quantity = 4,\n                items = new[] {\n                    new { id = \"62c6c9f532c7cc7e4265dfdc\", quantity = 2 },\n                    new { id = \"619d19eb40e1512ebb03b378\", quantity = 2 }\n                }\n            }\n        }\n    }\n};\n\nvar request = new HttpRequestMessage(HttpMethod.Post,\n    $\"{BASE_URL}/venues/{compositeId}/booking\");\nrequest.Content = JsonContent.Create(payload);\n\nvar response = await client.SendAsync(request);\nresponse.EnsureSuccessStatusCode();\n","lang":"csharp"},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Omitting ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["items"]}," is valid — the venue will send the guest a link after booking to complete their menu selections."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Packages and menus can be combined in the same request using both ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["preorders.packages"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["preorders.menus"]}," together."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"retrieve-a-booking","__idx":6},"children":["Retrieve a booking"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"GET /venues/bookings/{bookingId}\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use this to poll the current status of a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Pending"]}," booking, or to sync booking details into your system."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"cURL","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"BOOKING_ID=\"29|CO|550e8400e29b41d4a716446655440000\"\n\ncurl \"https://api.bookabletech.com/venues/bookings/${BOOKING_ID}\" \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\"\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"JavaScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"const bookingId = '29|CO|550e8400e29b41d4a716446655440000';\n\nconst response = await fetch(`${BASE_URL}/venues/bookings/${bookingId}`, {\n  headers: { Authorization: `Bearer ${accessToken}` },\n});\n\nconst booking = await response.json();\nconsole.log('Status:', booking.status); // \"Confirmed\", \"Pending\", \"Cancelled\"\n","lang":"javascript"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"booking_id = '29|CO|550e8400e29b41d4a716446655440000'\n\nresponse = requests.get(\n    f'{BASE_URL}/venues/bookings/{booking_id}',\n    headers={'Authorization': f'Bearer {access_token}'},\n)\nresponse.raise_for_status()\nbooking = response.json()\nprint('Status:', booking['status'])  # \"Confirmed\", \"Pending\", \"Cancelled\"\n","lang":"python"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Java","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"String bookingId = \"29|CO|550e8400e29b41d4a716446655440000\";\n\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(BASE_URL + \"/venues/bookings/\" + bookingId))\n    .header(\"Authorization\", \"Bearer \" + accessToken)\n    .GET()\n    .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n","lang":"java"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"csharp","header":{"controls":{"copy":{}}},"source":"var bookingId = \"29|CO|550e8400e29b41d4a716446655440000\";\n\nvar request = new HttpRequestMessage(HttpMethod.Get,\n    $\"{BASE_URL}/venues/bookings/{bookingId}\");\nrequest.Headers.Authorization = new AuthenticationHeaderValue(\"Bearer\", accessToken);\n\nvar response = await client.SendAsync(request);\nresponse.EnsureSuccessStatusCode();\nvar booking = await response.Content.ReadFromJsonAsync<JsonElement>();\nConsole.WriteLine($\"Status: {booking.GetProperty(\"status\")}\");\n","lang":"csharp"},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For ongoing status tracking, prefer ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/getting-started/webhook"},"children":["webhooks"]}," over polling."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"update-a-booking","__idx":7},"children":["Update a booking"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"PATCH /venues/bookings/{bookingId}\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Updates use ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://jsonpatch.com/"},"children":["JSON Patch (RFC 6902)"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Content-Type: application/json-patch+json"]},". Only confirmed bookings can be updated."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Patchable fields:"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["date"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["time"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["partySize"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["duration"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["firstName"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["lastName"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["phone"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["notes"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["preorders/packages"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["preorders/menus"]}]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"cURL","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X PATCH \"https://api.bookabletech.com/venues/bookings/${BOOKING_ID}\" \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json-patch+json\" \\\n  -d '[\n    { \"op\": \"replace\", \"path\": \"/partySize\", \"value\": 6 },\n    { \"op\": \"replace\", \"path\": \"/notes\", \"value\": \"Now 6 guests — please arrange accordingly\" }\n  ]'\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"JavaScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"const response = await fetch(`${BASE_URL}/venues/bookings/${bookingId}`, {\n  method: 'PATCH',\n  headers: {\n    Authorization: `Bearer ${accessToken}`,\n    'Content-Type': 'application/json-patch+json',\n  },\n  body: JSON.stringify([\n    { op: 'replace', path: '/partySize', value: 6 },\n    { op: 'replace', path: '/notes', value: 'Now 6 guests — please arrange accordingly' },\n  ]),\n});\n\nconst updated = await response.json();\n","lang":"javascript"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"response = requests.patch(\n    f'{BASE_URL}/venues/bookings/{booking_id}',\n    json=[\n        {'op': 'replace', 'path': '/partySize', 'value': 6},\n        {'op': 'replace', 'path': '/notes', 'value': 'Now 6 guests — please arrange accordingly'},\n    ],\n    headers={\n        'Authorization': f'Bearer {access_token}',\n        'Content-Type': 'application/json-patch+json',\n    },\n)\nresponse.raise_for_status()\nupdated = response.json()\n","lang":"python"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Java","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"String patch = \"\"\"\n    [\n      { \"op\": \"replace\", \"path\": \"/partySize\", \"value\": 6 },\n      { \"op\": \"replace\", \"path\": \"/notes\", \"value\": \"Now 6 guests — please arrange accordingly\" }\n    ]\n\"\"\";\n\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(BASE_URL + \"/venues/bookings/\" + bookingId))\n    .header(\"Authorization\", \"Bearer \" + accessToken)\n    .header(\"Content-Type\", \"application/json-patch+json\")\n    .method(\"PATCH\", HttpRequest.BodyPublishers.ofString(patch))\n    .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n","lang":"java"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"csharp","header":{"controls":{"copy":{}}},"source":"var patch = new[] {\n    new { op = \"replace\", path = \"/partySize\", value = (object)6 },\n    new { op = \"replace\", path = \"/notes\", value = (object)\"Now 6 guests — please arrange accordingly\" }\n};\n\nvar request = new HttpRequestMessage(HttpMethod.Patch,\n    $\"{BASE_URL}/venues/bookings/{bookingId}\");\nrequest.Content = new StringContent(\n    JsonSerializer.Serialize(patch),\n    Encoding.UTF8,\n    \"application/json-patch+json\");\n\nvar response = await client.SendAsync(request);\nresponse.EnsureSuccessStatusCode();\n","lang":"csharp"},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you're changing ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["date"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["time"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["partySize"]},", check availability first — the update will be rejected if the new slot is unavailable."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"cancel-a-booking","__idx":8},"children":["Cancel a booking"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"DELETE /venues/bookings/{bookingId}\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Cancellation is permanent. The booking status changes to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Cancelled"]}," and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["booking.cancelled"]}," webhook fires if configured."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"cURL","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -X DELETE \"https://api.bookabletech.com/venues/bookings/${BOOKING_ID}\" \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\"\n# 204 No Content on success\n","lang":"bash"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"JavaScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"javascript","header":{"controls":{"copy":{}}},"source":"const response = await fetch(`${BASE_URL}/venues/bookings/${bookingId}`, {\n  method: 'DELETE',\n  headers: { Authorization: `Bearer ${accessToken}` },\n});\n\nif (response.status === 204) {\n  console.log('Booking cancelled');\n}\n","lang":"javascript"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Python","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"python","header":{"controls":{"copy":{}}},"source":"response = requests.delete(\n    f'{BASE_URL}/venues/bookings/{booking_id}',\n    headers={'Authorization': f'Bearer {access_token}'},\n)\nresponse.raise_for_status()  # 204 No Content on success\n","lang":"python"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"Java","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"java","header":{"controls":{"copy":{}}},"source":"HttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(BASE_URL + \"/venues/bookings/\" + bookingId))\n    .header(\"Authorization\", \"Bearer \" + accessToken)\n    .DELETE()\n    .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n// 204 No Content on success\n","lang":"java"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"C#","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"csharp","header":{"controls":{"copy":{}}},"source":"var request = new HttpRequestMessage(HttpMethod.Delete,\n    $\"{BASE_URL}/venues/bookings/{bookingId}\");\nrequest.Headers.Authorization = new AuthenticationHeaderValue(\"Bearer\", accessToken);\n\nvar response = await client.SendAsync(request);\nresponse.EnsureSuccessStatusCode(); // 204 No Content on success\n","lang":"csharp"},"children":[]}]}]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"error-handling","__idx":9},"children":["Error handling"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"HTTP Status"},"children":["HTTP Status"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Meaning"},"children":["Meaning"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["401"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Token expired — refresh and retry"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["403"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["You don't have permission to modify this booking"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["404"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Booking not found"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Booking cannot be modified in its current state"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["422"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Business rule violation (e.g. cancellation window has passed)"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["See the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/resources/error-catalog"},"children":["Error Catalog"]}," for detailed error codes."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"related","__idx":10},"children":["Related"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/getting-started/quickstart"},"children":["Quickstart"]}," — first booking in 5 steps"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/getting-started/webhook"},"children":["Webhooks"]}," — real-time booking status events"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/apis/production/bookingapi"},"children":["Bookings API Reference"]}]}]}]},"headings":[{"value":"Booking Management","id":"booking-management","depth":1},{"value":"Create a booking","id":"create-a-booking","depth":2},{"value":"Preorders","id":"preorders","depth":2},{"value":"Step 1: Get the preorder catalogue","id":"step-1-get-the-preorder-catalogue","depth":3},{"value":"Step 2: Check which preorders are valid for your slot","id":"step-2-check-which-preorders-are-valid-for-your-slot","depth":3},{"value":"Step 3: Add preorders to the booking","id":"step-3-add-preorders-to-the-booking","depth":3},{"value":"Retrieve a booking","id":"retrieve-a-booking","depth":2},{"value":"Update a booking","id":"update-a-booking","depth":2},{"value":"Cancel a booking","id":"cancel-a-booking","depth":2},{"value":"Error handling","id":"error-handling","depth":2},{"value":"Related","id":"related","depth":2}],"frontmatter":{"seo":{"title":"Booking Management"}},"lastModified":"2026-03-13T09:43:55.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/getting-started/booking-management","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}