# Operator Setup Before venues appear in the Bookings API, you must onboard each operator and connect their TMS credentials. This is a one-time administrative step — once set up, the operator's venues are immediately searchable and bookable. ## The setup model Bookable is a gateway to multiple Table Management Systems (Collins, SevenRooms, Zonal). Operators — the hospitality businesses whose venues you want to make bookable — each use one or more of these systems. You supply their TMS credentials to Bookable once, and Bookable handles all TMS communication on your behalf. ``` 1. Onboard operator → 2. Add TMS credentials → 3. Venues appear in GET /venues ``` ## Step 1: Onboard an operator An operator represents a hospitality business — a restaurant group, bar chain, or event venue company. Onboard one with `POST /operators`. The `partnerSource` field identifies your bookings channel within the operator's TMS. If the operator already has a label for your channel from a previous integration, use that value. If in doubt, ask the operator. cURL ```bash curl -X POST https://api.bookabletech.com/operators \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "businessName": "Acme Restaurant Group", "partnerSource": "YourTradingName" }' ``` JavaScript ```javascript const BASE_URL = 'https://api.bookabletech.com'; const response = await fetch(`${BASE_URL}/operators`, { method: 'POST', headers: { Authorization: `Bearer ${access_token}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ businessName: 'Acme Restaurant Group', partnerSource: 'YourTradingName', }), }); const operator = await response.json(); const operatorId = operator.id; // store this — needed for TMS credentials ``` Python ```python BASE_URL = 'https://api.bookabletech.com' response = requests.post( f'{BASE_URL}/operators', json={ 'businessName': 'Acme Restaurant Group', 'partnerSource': 'YourTradingName', }, headers={'Authorization': f'Bearer {access_token}'} ) response.raise_for_status() operator = response.json() operator_id = operator['id'] # store this — needed for TMS credentials ``` Java ```java String body = """ { "businessName": "Acme Restaurant Group", "partnerSource": "YourTradingName" } """; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(BASE_URL + "/operators")) .header("Authorization", "Bearer " + accessToken) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(body)) .build(); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); // Parse response.body() — extract id as operatorId ``` C# ```csharp var payload = new { businessName = "Acme Restaurant Group", partnerSource = "YourTradingName" }; var response = await client.PostAsJsonAsync($"{BASE_URL}/operators", payload); response.EnsureSuccessStatusCode(); using var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync()); var operatorId = doc.RootElement.GetProperty("id").GetInt32(); ``` **Example response:** ```json { "id": 3, "businessName": "Acme Restaurant Group", "createdAt": "2025-03-01T10:00:00Z", "updatedAt": "2025-03-01T10:00:00Z" } ``` Store the `id` — you need it in the next step. ## Step 2: Add TMS credentials TMS credentials tell Bookable how to authenticate with the operator's table management system. The required fields depend on which TMS the operator uses. ### Supported TMS systems | TMS | Slug | Auth type | Required fields | | --- | --- | --- | --- | | Collins | `CO` | Bearer token | `bearer`, `externalOperatorId` | | SevenRooms | `SR` | Client credentials | `clientId`, `secretId` | | Zonal | `ZO` | Basic auth | `clientId`, `secretId` | The operator must supply their TMS credentials to you directly. Contact the TMS provider if you need guidance on where to find them. ### Collins (CO) ```json { "tmsSlug": "CO", "bearer": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...", "externalOperatorId": "514ada610df690b6770000fd", "active": true } ``` ### SevenRooms (SR) ```json { "tmsSlug": "SR", "clientId": "44966392-f2d4-4929-8c9a-e87a0e7dc856", "secretId": "LjjXs5$3M%Btx@tt", "active": true } ``` ### Zonal (ZO) ```json { "tmsSlug": "ZO", "clientId": "44966392-f2d4-4929-8c9a-e87a0e7dc856", "secretId": "LjjXs5$3M%Btx@tt", "active": true } ``` ### Make the request cURL ```bash OPERATOR_ID=3 curl -X POST "https://api.bookabletech.com/operators/${OPERATOR_ID}/tms-credentials" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "tmsSlug": "CO", "bearer": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...", "externalOperatorId": "514ada610df690b6770000fd", "active": true }' ``` JavaScript ```javascript const operatorId = 3; const response = await fetch( `${BASE_URL}/operators/${operatorId}/tms-credentials`, { method: 'POST', headers: { Authorization: `Bearer ${access_token}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ tmsSlug: 'CO', bearer: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...', externalOperatorId: '514ada610df690b6770000fd', active: true, }), } ); const credentials = await response.json(); ``` Python ```python operator_id = 3 response = requests.post( f'{BASE_URL}/operators/{operator_id}/tms-credentials', json={ 'tmsSlug': 'CO', 'bearer': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...', 'externalOperatorId': '514ada610df690b6770000fd', 'active': True, }, headers={'Authorization': f'Bearer {access_token}'} ) response.raise_for_status() credentials = response.json() ``` Java ```java int operatorId = 3; String credBody = """ { "tmsSlug": "CO", "bearer": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...", "externalOperatorId": "514ada610df690b6770000fd", "active": true } """; HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(BASE_URL + "/operators/" + operatorId + "/tms-credentials")) .header("Authorization", "Bearer " + accessToken) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(credBody)) .build(); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); ``` C# ```csharp var credPayload = new { tmsSlug = "CO", bearer = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...", externalOperatorId = "514ada610df690b6770000fd", active = true }; var response = await client.PostAsJsonAsync( $"{BASE_URL}/operators/{operatorId}/tms-credentials", credPayload ); response.EnsureSuccessStatusCode(); ``` **Example response:** ```json { "operatorId": 3, "tmsId": 1, "tmsName": "Collins", "tmsSlug": "CO", "bearer": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...", "externalOperatorId": "514ada610df690b6770000fd", "active": true, "createdAt": "2025-03-01T10:05:00Z", "updatedAt": "2025-03-01T10:05:00Z" } ``` ## Step 3: Verify venues are visible Once credentials are active, call `GET /venues` to confirm the operator's venues appear: ```bash curl "https://api.bookabletech.com/venues" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" ``` You should see venues belonging to the operator you just onboarded. If the list is empty, double-check that `active` was set to `true` and that the credentials are correct. ## Managing operators | Action | Endpoint | | --- | --- | | List all operators | `GET /operators` | | Get a specific operator | `GET /operators/{operatorId}` | | Update operator details | `PUT /operators/{operatorId}` | | Remove an operator | `DELETE /operators/{operatorId}` | | List TMS credentials | `GET /operators/{operatorId}/tms-credentials` | | Update TMS credentials | `PUT /operators/{operatorId}/tms-credentials/{tmsId}` | | Remove TMS credentials | `DELETE /operators/{operatorId}/tms-credentials/{tmsId}` | See the [TMS Gateway API reference](/apis/production/operatorapi) for full endpoint documentation. ## Next steps Quickstart Make your first booking end-to-end Core Concepts Understand the gateway model, composite IDs, and availability types TMS Gateway API Full reference for operator and credential endpoints