{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-getting-started/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["tabs","tab","cards","card"]},"type":"markdown"},"seo":{"title":"Quickstart","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":"quickstart","__idx":0},"children":["Quickstart"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Make your first booking in 6 steps. This guide takes you from zero to a confirmed booking using the Bookable API."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"before-you-start","__idx":1},"children":["Before you start"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You'll need:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_secret"]}," — log in to the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://portal.bookabletech.com"},"children":["Bookable Portal"]}," to find your credentials"]}]},{"$$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":""},"children":[]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Sandbox"},"children":["Sandbox"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Production"},"children":["Production"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Base URL"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api-sandbox.bookabletech.com"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://api.bookabletech.com"]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Auth endpoint"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://auth-sandbox.bookabletech.com/oauth/token"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["https://auth.bookabletech.com/oauth/token"]}]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Start with sandbox credentials during development."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-1-get-an-access-token","__idx":2},"children":["Step 1: Get an access token"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Bookable API uses OAuth 2.0 Client Credentials. Exchange your ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_id"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["client_secret"]}," for a short-lived bearer token."]},{"$$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://auth.bookabletech.com/oauth/token \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"grant_type\": \"client_credentials\",\n    \"client_id\": \"YOUR_CLIENT_ID\",\n    \"client_secret\": \"YOUR_CLIENT_SECRET\",\n    \"audience\": \"api.bookabletech.com\"\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('https://auth.bookabletech.com/oauth/token', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({\n    grant_type: 'client_credentials',\n    client_id: process.env.BOOKABLE_CLIENT_ID,\n    client_secret: process.env.BOOKABLE_CLIENT_SECRET,\n    audience: 'api.bookabletech.com',\n  }),\n});\n\nconst { access_token, expires_in } = await response.json();\n// Store access_token and expires_in — reuse until expiry\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, os\n\nresp = requests.post(\n    'https://auth.bookabletech.com/oauth/token',\n    json={\n        'grant_type': 'client_credentials',\n        'client_id': os.environ['BOOKABLE_CLIENT_ID'],\n        'client_secret': os.environ['BOOKABLE_CLIENT_SECRET'],\n        'audience': 'api.bookabletech.com',\n    }\n)\nresp.raise_for_status()\ntoken_data = resp.json()\naccess_token = token_data['access_token']\n# Store access_token and token_data['expires_in'] — reuse until expiry\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":"import java.net.http.*;\nimport java.net.URI;\n\nHttpClient client = HttpClient.newHttpClient();\nString body = \"\"\"\n    {\n      \"grant_type\": \"client_credentials\",\n      \"client_id\": \"YOUR_CLIENT_ID\",\n      \"client_secret\": \"YOUR_CLIENT_SECRET\",\n      \"audience\": \"api.bookabletech.com\"\n    }\n\"\"\";\n\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(\"https://auth.bookabletech.com/oauth/token\"))\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// Parse response.body() JSON to extract access_token and expires_in\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":"using System.Net.Http.Json;\nusing System.Text.Json;\n\nvar client = new HttpClient();\nvar payload = new {\n    grant_type = \"client_credentials\",\n    client_id = Environment.GetEnvironmentVariable(\"BOOKABLE_CLIENT_ID\"),\n    client_secret = Environment.GetEnvironmentVariable(\"BOOKABLE_CLIENT_SECRET\"),\n    audience = \"api.bookabletech.com\"\n};\n\nvar response = await client.PostAsJsonAsync(\"https://auth.bookabletech.com/oauth/token\", payload);\nresponse.EnsureSuccessStatusCode();\n\nusing var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync());\nvar accessToken = doc.RootElement.GetProperty(\"access_token\").GetString();\nvar expiresIn = doc.RootElement.GetProperty(\"expires_in\").GetInt32();\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  \"access_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"scope\": \"venue:read venue-booking:create\",\n  \"expires_in\": 3600,\n  \"token_type\": \"Bearer\"\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Tokens are valid for 1 hour. See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/getting-started/auth"},"children":["Authentication"]}," for a full token manager with caching."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-2-onboard-an-operator-and-connect-their-tms","__idx":3},"children":["Step 2: Onboard an operator and connect their TMS"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Venues are scoped to operators you have onboarded. An ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["operator"]}," is the hospitality business whose venues you want to make bookable. You onboard them once, supply their TMS credentials, and their venues immediately become available via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /venues"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2a--onboard-the-operator","__idx":4},"children":["2a — Onboard the operator"]},{"$$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/operators \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"businessName\": \"Acme Restaurant Group\",\n    \"partnerSource\": \"YourTradingName\"\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';\n\nconst res = await fetch(`${BASE_URL}/operators`, {\n  method: 'POST',\n  headers: {\n    Authorization: `Bearer ${access_token}`,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    businessName: 'Acme Restaurant Group',\n    partnerSource: 'YourTradingName',\n  }),\n});\n\nconst { id: operatorId } = await res.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":"BASE_URL = 'https://api.bookabletech.com'\n\nres = requests.post(\n    f'{BASE_URL}/operators',\n    json={'businessName': 'Acme Restaurant Group', 'partnerSource': 'YourTradingName'},\n    headers={'Authorization': f'Bearer {access_token}'}\n)\nres.raise_for_status()\noperator_id = res.json()['id']\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 BASE_URL = \"https://api.bookabletech.com\";\n\nString opBody = \"\"\"\n    {\"businessName\": \"Acme Restaurant Group\", \"partnerSource\": \"YourTradingName\"}\n\"\"\";\n\nHttpRequest opRequest = HttpRequest.newBuilder()\n    .uri(URI.create(BASE_URL + \"/operators\"))\n    .header(\"Authorization\", \"Bearer \" + accessToken)\n    .header(\"Content-Type\", \"application/json\")\n    .POST(HttpRequest.BodyPublishers.ofString(opBody))\n    .build();\n\nHttpResponse<String> opResponse = client.send(opRequest, HttpResponse.BodyHandlers.ofString());\n// Parse opResponse.body() — extract id as operatorId\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":"string BASE_URL = \"https://api.bookabletech.com\";\n\nvar opPayload = new { businessName = \"Acme Restaurant Group\", partnerSource = \"YourTradingName\" };\nvar opResponse = await client.PostAsJsonAsync($\"{BASE_URL}/operators\", opPayload);\nopResponse.EnsureSuccessStatusCode();\n\nusing var opDoc = JsonDocument.Parse(await opResponse.Content.ReadAsStringAsync());\nvar operatorId = opDoc.RootElement.GetProperty(\"id\").GetInt32();\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":"{ \"id\": 3, \"businessName\": \"Acme Restaurant Group\", \"createdAt\": \"2025-03-01T10:00:00Z\", \"updatedAt\": \"2025-03-01T10:00:00Z\" }\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Store the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," — you need it in the next sub-step."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2b--add-tms-credentials","__idx":5},"children":["2b — Add TMS credentials"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The operator must tell you which TMS they use and provide their credentials. Bookable supports Collins (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CO"]},"), SevenRooms (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SR"]},"), and Zonal (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ZO"]},"). The example below uses Collins."]},{"$$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":"OPERATOR_ID=3\n\ncurl -X POST \"https://api.bookabletech.com/operators/${OPERATOR_ID}/tms-credentials\" \\\n  -H \"Authorization: Bearer YOUR_ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"tmsSlug\": \"CO\",\n    \"bearer\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...\",\n    \"externalOperatorId\": \"514ada610df690b6770000fd\",\n    \"active\": true\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":"await fetch(`${BASE_URL}/operators/${operatorId}/tms-credentials`, {\n  method: 'POST',\n  headers: {\n    Authorization: `Bearer ${access_token}`,\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    tmsSlug: 'CO',\n    bearer: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...',\n    externalOperatorId: '514ada610df690b6770000fd',\n    active: true,\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":"requests.post(\n    f'{BASE_URL}/operators/{operator_id}/tms-credentials',\n    json={\n        'tmsSlug': 'CO',\n        'bearer': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...',\n        'externalOperatorId': '514ada610df690b6770000fd',\n        'active': True,\n    },\n    headers={'Authorization': f'Bearer {access_token}'}\n).raise_for_status()\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 credBody = \"\"\"\n    {\n      \"tmsSlug\": \"CO\",\n      \"bearer\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...\",\n      \"externalOperatorId\": \"514ada610df690b6770000fd\",\n      \"active\": true\n    }\n\"\"\";\n\nHttpRequest credRequest = HttpRequest.newBuilder()\n    .uri(URI.create(BASE_URL + \"/operators/\" + operatorId + \"/tms-credentials\"))\n    .header(\"Authorization\", \"Bearer \" + accessToken)\n    .header(\"Content-Type\", \"application/json\")\n    .POST(HttpRequest.BodyPublishers.ofString(credBody))\n    .build();\n\nclient.send(credRequest, 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 credPayload = new {\n    tmsSlug = \"CO\",\n    bearer = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...\",\n    externalOperatorId = \"514ada610df690b6770000fd\",\n    active = true\n};\nvar credResponse = await client.PostAsJsonAsync(\n    $\"{BASE_URL}/operators/{operatorId}/tms-credentials\", credPayload);\ncredResponse.EnsureSuccessStatusCode();\n","lang":"csharp"},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Once ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["active: true"]},", the operator's venues are available in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /venues"]},". For SevenRooms and Zonal credential fields, and full management endpoints, see the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/getting-started/operator-setup"},"children":["Operator Setup guide"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-3-search-for-a-venue","__idx":6},"children":["Step 3: Search for a venue"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GET /venues"]}," to find venues. Filter by city, date, or other criteria to narrow results."]},{"$$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 \"https://api.bookabletech.com/venues?city=London&date=2025-08-15\" \\\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 response = await fetch(\n  `${BASE_URL}/venues?city=London&date=2025-08-15`,\n  {\n    headers: { Authorization: `Bearer ${access_token}` },\n  }\n);\n\nconst { data: venues } = 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.get(\n    f'{BASE_URL}/venues',\n    params={'city': 'London', 'date': '2025-08-15'},\n    headers={'Authorization': f'Bearer {access_token}'}\n)\nresponse.raise_for_status()\nvenues = response.json()['data']\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?city=London&date=2025-08-15\"))\n    .header(\"Authorization\", \"Bearer \" + accessToken)\n    .GET()\n    .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n// Parse response.body() — extract data[] array\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":"client.DefaultRequestHeaders.Authorization =\n    new System.Net.Http.Headers.AuthenticationHeaderValue(\"Bearer\", accessToken);\n\nvar response = await client.GetAsync($\"{BASE_URL}/venues?city=London&date=2025-08-15\");\nresponse.EnsureSuccessStatusCode();\nvar json = await response.Content.ReadAsStringAsync();\n","lang":"csharp"},"children":[]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Example response (truncated):"]}]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","header":{"controls":{"copy":{}}},"source":"{\n  \"data\": [\n    {\n      \"id\": \"29|X9|275cc44dd2e2496fba44857c9257443a\",\n      \"name\": \"The Grand Table\",\n      \"location\": { \"city\": \"London\" },\n      \"products\": [\n        {\n          \"compositeId\": \"29|CO|275cc44dd2e2496fba44857c9257443a|d99128c546b34b619c4477b712869f2b\",\n          \"productName\": \"Table Reservation\"\n        }\n      ]\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["compositeId"]}," inside ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["products[]"]}," is what you need for the next steps. Each product has its own ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["compositeId"]},"."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-4-check-availability","__idx":7},"children":["Step 4: Check availability"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Before creating a booking, verify that the venue has slots available for your desired date, time, and party size."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"GET /venues/{compositeId}/availability?date=YYYY-MM-DD&startTime=HH:MM&partySize=N\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 \"https://api.bookabletech.com/venues/${COMPOSITE_ID}/availability?date=2025-08-15&startTime=19:00&partySize=4\" \\\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 compositeId = '29|CO|275cc44dd2e2496fba44857c9257443a|d99128c546b34b619c4477b712869f2b';\n\nconst response = await fetch(\n  `${BASE_URL}/venues/${compositeId}/availability?date=2025-08-15&startTime=19:00&partySize=4`,\n  {\n    headers: { Authorization: `Bearer ${access_token}` },\n  }\n);\n\nconst availability = await response.json();\n// Pick the slot you want from the times array\nconst slot = availability.times?.find(t => t.time === '19:00');\n// slot.type — \"book\" or \"request\"\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":"composite_id = '29|CO|275cc44dd2e2496fba44857c9257443a|d99128c546b34b619c4477b712869f2b'\n\nresponse = requests.get(\n    f'{BASE_URL}/venues/{composite_id}/availability',\n    params={'date': '2025-08-15', 'startTime': '19:00', 'partySize': 4},\n    headers={'Authorization': f'Bearer {access_token}'}\n)\nresponse.raise_for_status()\navailability = response.json()\n# Pick the slot you want from the times array\nslot = next(t for t in availability['times'] if t['time'] == '19:00')\n# slot['type'] — \"book\" or \"request\"\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 compositeId = \"29|CO|275cc44dd2e2496fba44857c9257443a|d99128c546b34b619c4477b712869f2b\";\nString url = BASE_URL + \"/venues/\" + compositeId\n    + \"/availability?date=2025-08-15&startTime=19:00&partySize=4\";\n\nHttpRequest request = HttpRequest.newBuilder()\n    .uri(URI.create(url))\n    .header(\"Authorization\", \"Bearer \" + accessToken)\n    .GET()\n    .build();\n\nHttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());\n// Parse response.body() — iterate times[] to find your slot and extract its type\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":"string compositeId = \"29|CO|275cc44dd2e2496fba44857c9257443a|d99128c546b34b619c4477b712869f2b\";\nvar response = await client.GetAsync(\n    $\"{BASE_URL}/venues/{compositeId}/availability?date=2025-08-15&startTime=19:00&partySize=4\"\n);\nresponse.EnsureSuccessStatusCode();\n// Parse response — iterate times[] to find your slot and extract its type\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  \"name\": \"Table Reservation\",\n  \"times\": [\n    {\n      \"time\": \"19:00\",\n      \"duration\": 90,\n      \"type\": \"book\",\n      \"productId\": \"29|CO|275cc44dd2e2496fba44857c9257443a|d99128c546b34b619c4477b712869f2b\"\n    },\n    {\n      \"time\": \"19:30\",\n      \"duration\": 90,\n      \"type\": \"request\",\n      \"productId\": \"29|CO|275cc44dd2e2496fba44857c9257443a|d99128c546b34b619c4477b712869f2b\"\n    }\n  ]\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["times"]}," is null or empty, there are no slots available — try a different date. Use the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," from your chosen slot (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["book"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["request"]},") in the next step."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"step-5-create-a-booking","__idx":8},"children":["Step 5: Create a booking"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Submit the booking with the guest details and the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["type"]}," from Step 4."]},{"$$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":"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  -H \"x-Partner-Reference: YOUR_INTERNAL_ORDER_ID\" \\\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\": \"Window table if possible\"\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 ${access_token}`,\n    'Content-Type': 'application/json',\n    'x-Partner-Reference': 'YOUR_INTERNAL_ORDER_ID',\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 Step 4\n    notes: 'Window table if possible',\n  }),\n});\n\nconst booking = await response.json();\nconsole.log('Booking ID:', booking.id);\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'],  # from Step 4\n        'notes': 'Window table if possible',\n    },\n    headers={\n        'Authorization': f'Bearer {access_token}',\n        'x-Partner-Reference': 'YOUR_INTERNAL_ORDER_ID',\n    }\n)\nresponse.raise_for_status()\nbooking = response.json()\nprint('Booking ID:', booking['id'])\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 bookingBody = \"\"\"\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\": \"Window table if possible\"\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_ORDER_ID\")\n    .POST(HttpRequest.BodyPublishers.ofString(bookingBody))\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 bookingPayload = 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 = \"Window table if possible\"\n};\n\nvar request = new HttpRequestMessage(HttpMethod.Post,\n    $\"{BASE_URL}/venues/{compositeId}/booking\");\nrequest.Headers.Add(\"x-Partner-Reference\", \"YOUR_INTERNAL_ORDER_ID\");\nrequest.Content = JsonContent.Create(bookingPayload);\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":["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":"step-6-handle-the-response","__idx":9},"children":["Step 6: Handle the response"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"for-book-type-instant-confirmation","__idx":10},"children":["For ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["book"]}," type (instant confirmation)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The booking ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," will be ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Confirmed"]},". Store the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["id"]}," for future retrieval or cancellation, and the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["operatorBookingId"]}," for guest-facing communications."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"for-request-type-manual-approval","__idx":11},"children":["For ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["request"]}," type (manual approval)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The booking ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," will be ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Pending"]},". The venue operator will review and confirm or decline. Listen for status changes via ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/getting-started/webhook"},"children":["webhooks"]}," — the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["booking.confirmed"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["booking.declined"]}," events will fire when the operator responds."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"handling-errors","__idx":12},"children":["Handling errors"]},{"$$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":["400"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Invalid request body — check required fields"]}]},{"$$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 or invalid — refresh your token"]}]},{"$$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":["Venue not found or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["compositeId"]}," incorrect"]}]},{"$$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":["No longer available at the requested time"]}]},{"$$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. party size out of range)"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["See the ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/resources/error-catalog"},"children":["Error Catalog"]}," for the full list of error codes and resolution steps."]},{"$$mdtype":"Tag","name":"hr","attributes":{},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"next-steps","__idx":13},"children":["Next steps"]},{"$$mdtype":"Tag","name":"Cards","attributes":{},"children":[{"$$mdtype":"Tag","name":"Card","attributes":{"title":"Operator Setup","href":"/getting-started/operator-setup"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Full operator management and all TMS credential types"]}]},{"$$mdtype":"Tag","name":"Card","attributes":{"title":"Core Concepts","href":"/getting-started/concepts"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Understand venues, composite IDs, and availability types"]}]},{"$$mdtype":"Tag","name":"Card","attributes":{"title":"Booking Management","href":"/getting-started/booking-management"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Retrieve, update, and cancel bookings"]}]},{"$$mdtype":"Tag","name":"Card","attributes":{"title":"Webhooks","href":"/resources/webhook"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Receive real-time status updates"]}]}]}]},"headings":[{"value":"Quickstart","id":"quickstart","depth":1},{"value":"Before you start","id":"before-you-start","depth":2},{"value":"Step 1: Get an access token","id":"step-1-get-an-access-token","depth":2},{"value":"Step 2: Onboard an operator and connect their TMS","id":"step-2-onboard-an-operator-and-connect-their-tms","depth":2},{"value":"2a — Onboard the operator","id":"2a--onboard-the-operator","depth":3},{"value":"2b — Add TMS credentials","id":"2b--add-tms-credentials","depth":3},{"value":"Step 3: Search for a venue","id":"step-3-search-for-a-venue","depth":2},{"value":"Step 4: Check availability","id":"step-4-check-availability","depth":2},{"value":"Step 5: Create a booking","id":"step-5-create-a-booking","depth":2},{"value":"Step 6: Handle the response","id":"step-6-handle-the-response","depth":2},{"value":"For book type (instant confirmation)","id":"for-book-type-instant-confirmation","depth":3},{"value":"For request type (manual approval)","id":"for-request-type-manual-approval","depth":3},{"value":"Handling errors","id":"handling-errors","depth":3},{"value":"Next steps","id":"next-steps","depth":2}],"frontmatter":{"seo":{"title":"Quickstart"}},"lastModified":"2026-03-13T09:43:55.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/getting-started/quickstart","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}