{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"d8693424-cc85-46df-93a0-d19f39c93ec9","name":"Cenplex Booking API","description":"### Changelog\n\nThe latest version of the changelog is always available at [api.cenplexbooking.ch/changelog](https://api.cenplexbooking.ch/changelog)\n\n# API\n\n### Account\n\nEach user has a unique account identified by their email address. Access to the associated email address grants access to the account itself.\n\n### User Types\n\nDifferent types of users interact with the Cenplex booking API, categorized as patients and admins. Patients have a global scope, whereas admins are scoped to a specific customer, which represents a practice that may have multiple locations. An account can be linked to multiple user types or scopes; however, separate sets of endpoints (for admins and patients) exist to handle the different workflows required by each user type.\n\n### Authentication\n\nMost Endpoints cannot be executed anonymously and require authentication. Authentication is managed through bearer tokens (JWTs) that verify ownership of an account. These tokens are issued upon login, which can be performed using either user credentials or a refresh token.\n\n### Mandatory Client ID Header\n\nEvery request must include the `x-client-id` header. This value is used to distinguish different integrators of the API and is only used for tracing purposes. Not including the header will result in HTTP errors being returned.\n\n# Common Workflows\n\n### Patient Not Yet Registered Books an Appointment\n\n1. Access information on available appointments\n    \n    1. Query location details and select a location\n        \n    2. Query summaries of categories offered at that location and select a category\n        \n    3. Query summaries of employees offering the selected category and select an employee\n        \n    4. Query available time slots for the selected employee and category, then select a time slot\n        \n2. Register as a new patient\n    \n    1. Enter a password and address information to register\n        \n    2. Open the received email to obtain the verification code\n        \n    3. Verify the patient account using the verification code to obtain an access token, a refresh token and the patient ID - no separate login is needed\n        \n3. Book an appointment\n    \n    1. Book the appointment by authenticating with the access token and supplying all previously collected information\n        \n4. (Optional) Log in again\n    \n    1. Log in seamlessly using the refresh token obtained during verification, or log in using credentials\n        \n5. Access booking information\n    \n    1. Access appointment information by authenticating with the access token\n        \n6. (Optional) Cancel the appointment\n    \n    1. Cancel the appointment by specifying a reason\n        \n\n### New Admin Is Registered and Calls a Management Endpoint\n\n1. Existing admin logs in\n    \n    1. Existing admin logs in with account credentials or a refresh token to obtain an access token\n        \n2. Existing admin registers a new admin\n    \n    1. Authenticate with either an access token or legacy Calit credentials associated with customer management to register a new admin\n        \n    2. New admin opens the received email to obtain a verification code\n        \n    3. New admin verifies the account using the verification code and sets a password\n        \n3. New admin logs in\n    \n    1. New admin logs in using account credentials to obtain an access token\n        \n4. New admin calls a management endpoint\n    \n    1. New admin calls a management endpoint by authenticating with the access token\n        \n\n# Email Customization\n\nTo customize emails sent to patients, custom email templates can be defined at the customer or location level. This is achieved using the `Query Email Templates` and `Update Email Template` endpoints.\n\nEvery use case involving an email transmission is linked to a specific template key. Templates are specified per language (available languages are `en`, `de`, `fr`, and `it`). When an email is sent, the template is looked up in the following order, and the first match is used:\n\n1. Template of the location in the email language\n    \n2. Template of the customer in the email language (a template defined for another location of the same customer also matches)\n    \n3. Template of the customer in any language\n    \n4. Default template in the email language\n    \n5. Default template in any language\n    \n\nA template includes the following components\n\n- **Subject**\n    \n- **Email Text:** Plain text version for legacy email clients.\n    \n- **HTML Content:** Rich text version for modern email clients.\n    \n\n### Placeholders\n\nTemplate texts utilize placeholders, formatted as `$PLACEHOLDERNAME$`, which are filled in dynamically when the email is sent.\n\n**Note:** Not all placeholders are available for every type of email template. Placeholders that are not filled are removed from the email.\n\n#### Location Placeholders\n\n- **$CUSTOMERID$** – Customer ID\n    \n- **$COMPANY$** – Location Name\n    \n- **$LOCATIONID$** – Location ID\n    \n- **$STREET$** – Location Street\n    \n- **$ZIP$** – Location Zip Code\n    \n- **$TOWN$** – Location City\n    \n- **$PHONE$** – Location Phone\n    \n- **$MOBILE$** – Location Mobile\n    \n- **$HIDEMOBILE$** – Renders as `style=\"display:none;\"` when the location has no mobile number, otherwise empty. Intended for hiding the mobile row in HTML templates.\n    \n- **$EMAIL$** – Location Email\n    \n- **$WEBSITE$** – Location Website\n    \n- **$LOCATION$** – Location ID (identical to `$LOCATIONID$`)\n    \n- **$MESSAGE$** – The location's appointment confirmation text in the email language, converted to HTML\n    \n- **$PRIMARYCOLOR$** – Primary brand color, falling back to the system default when the location has no color override\n    \n- **$SECONDARYCOLOR$** – Secondary brand color, same fallback\n    \n- **$TERTIARYCOLOR$** – Tertiary brand color, same fallback\n    \n- **$ACCENTCOLOR$** – Legacy alias of `$TERTIARYCOLOR$`\n    \n\n#### Appointment Placeholders\n\n- **$APPID$** – Appointment ID\n    \n- **$STARTDATE$** – Start date (Format: `dd.MM.yyyy`)\n    \n- **$STARTTIME$** – Start time (Format: `HH:mm`)\n    \n- **$ENDDATE$** – End date (Format: `dd.MM.yyyy`)\n    \n- **$ENDTIME$** – End time (Format: `HH:mm`)\n    \n- **$STARTISO$** – Start date in ISO 8601 format (e.g., `2024-04-10T09:00:00+02:00`)\n    \n- **$ENDISO$** – End date in ISO 8601 format (e.g., `2024-04-10T09:30:00+02:00`)\n    \n- **$DURATION$** – Duration in minutes\n    \n- **$THERAPISTNAME$** – Therapist Name\n    \n- **$CATEGORY$** – Category Name\n    \n\n#### Multi-Booking Placeholders\n\n- **$APPOINTMENTSSUBJECT$** – The \"Subject\" part of the filled-in `Web.Appointment` template for every booked appointment (concatenated).\n    \n- **$APPOINTMENTSMAILTEXT$** – The \"Email Text\" part of the filled-in `Web.Appointment` template for every booked appointment (concatenated).\n    \n- **$APPOINTMENTSMAILTEXTHTML$** – The \"HTML Text\" part of the filled-in `Web.Appointment` template for every booked appointment (concatenated).\n    \n\n#### Patient Placeholders\n\n- **$PATIENTNAME$** – Patient Name\n    \n- **$PATIENTEMAIL$** - Patient Email\n    \n- **$PATIENTSTREET$** – Patient Street\n    \n- **$PATIENTZIPTOWN$** – Patient Zip Code and City\n    \n- **$PATIENTBIRTHDAY$** – Patient Date of Birth\n    \n\n#### Token Placeholders\n\n- **$TOKEN$** – Validation token (used for email confirmation, password resets, etc.)\n    \n- **$TOKENFIRST4$** – First 4 numbers of the validation token (used for email confirmation, password resets, etc.)\n    \n- **$TOKENLAST4$** – Last 4 numbers of the validation token (used for email confirmation, password resets, etc.)\n    \n\n#### Link Placeholders\n\nAvailable in every email that carries a token.\n\n- **$CENPLEXBOOKINGWEB$** – Base URL of the online booking frontend\n    \n- **$CENPLEXBOOKINGADMIN$** – Base URL of the configurator frontend\n    \n\n#### Practise Notification Placeholders\n\nOnly available in the emails sent to the practise (`Web.BookingNotification`, `Web.CancelNotification`).\n\n- **$PATIENTMESSAGE$** – The booking or cancellation message entered by the patient\n    \n\n### Email Templates\n\nThe following list details the available email templates, their keys, and the placeholders they support.\n\nTemplates whose key starts with `Web.` are sent to patients or to the practise; templates starting with `Admin.` are sent to administrators.\n\n#### Appointment\n\nUsed as a sub-template within the **Multi Booking Confirmation**. It is rendered once per booked appointment and the result is concatenated into the multi-booking placeholders.\n\n- **Key:** `Web.Appointment`\n    \n- **Supported Placeholders:** Appointment, Patient\n    \n\n#### Multi Booking Confirmation\n\nSent to the patient after a successful **Book Appointments**.\n\n- **Key:** `Web.MultiBookingConfirmation`\n    \n- **Supported Placeholders:** Location, Patient, Multi-Booking\n    \n\n#### Cancel Confirmation\n\nSent to the patient after a successful **Cancel Appointment**.\n\n- **Key:** `Web.CancelConfirmation`\n    \n- **Supported Placeholders:** Location, Patient, Appointment (except `$THERAPISTNAME$`), Link\n    \n\n#### Verify Email Address\n\nSent by **Register Patient** and **Resend Confirmation Email**. It carries the verification code the patient needs for **Verify Patient**.\n\n- **Key:** `Web.VerifyEmailAddress`\n    \n- **Supported Placeholders:** Location, Patient, Token, Link\n    \n\n#### Existing Account\n\nSent by **Register Patient** instead of the verification email when an account already exists for the given email address.\n\n- **Key:** `ExistingAccount`\n    \n- **Supported Placeholders:** Location, Token, Link\n    \n\n#### Reset Password\n\nSent by **Reset Patient Password**. It carries the verification code needed for **Set Patient Password**.\n\n- **Key:** `Web.ResetPassword`\n    \n- **Supported Placeholders:** Location, Patient, Token, Link\n    \n\n#### Delete Account\n\nSent by **Request Patient Deletion**. It carries the verification code needed for **Delete Patient**.\n\n- **Key:** `Web.DeleteAccount`\n    \n- **Supported Placeholders:** Location, Patient, Token, Link\n    \n\n#### Booking Notification\n\nSent to the practise after a successful **Book Appointments**, if the location's notification settings request it. One email is sent per call: if several appointments are booked at once, the Appointment placeholders and `$PATIENTMESSAGE$` hold the values of the last appointment only.\n\n- **Key:** `Web.BookingNotification`\n    \n- **Supported Placeholders:** Location, Patient, Appointment, Practise Notification\n    \n\n#### Cancel Notification\n\nSent to the practise after a successful **Cancel Appointment**, if the location's notification settings request it.\n\n- **Key:** `Web.CancelNotification`\n    \n- **Supported Placeholders:** Location, Patient, Appointment, Practise Notification\n    \n\n#### Admin Set Password\n\nSent by **Register Admin** and **Register Admin Legacy** when a new account is created. It carries the verification token needed for **Verify Admin**.\n\n- **Key:** `Admin.SetPassword`\n    \n- **Supported Placeholders:** Location, Token, Link\n    \n\n#### Admin New Role Notification\n\nSent by **Register Admin** and **Register Admin Legacy** when the email address already belongs to an account and the permissions are added to it instead.\n\n- **Key:** `Admin.NewRoleNotification`\n    \n- **Supported Placeholders:** Location\n    \n\n#### Admin Reset Password\n\nSent by **Reset Admin Password**. It carries the verification token needed for **Verify Admin**.\n\n- **Key:** `Admin.ResetPassword`\n    \n- **Supported Placeholders:** Location, Patient, Token, Link\n    \n\n# Errors\n\nErrors are reported through the HTTP status code. Unless stated otherwise, the body is a JSON object with the following fields:\n\n- **`description`** – A human-readable explanation of the error, intended for diagnostics. It can be `null`.\n    \n- **`errorCode`** – A machine-readable code, only present for conditions a client is expected to handle. Codes that are specific to an endpoint are documented in the description of that endpoint.\n    \n- **`metadata`** – Additional details, only present for validation errors.\n    \n\n### Status Codes\n\n- **`400 Bad Request`** – The request is invalid. When the request fails validation, e.g. a missing required field, an invalid email address, a string exceeding its maximum length or an ID that is not greater than 0, the error code is `validationError`, the `description` reads `One or multiple validation errors occurred.` and `metadata` lists the failing fields.\n    \n- **`401 Unauthorized`** – The access token is missing, invalid or expired, in which case the body is empty. The login endpoints also answer `401` when the credentials are invalid.\n    \n- **`403 Forbidden`** – The account is authenticated but not permitted to perform the request, or the customer lacks the booking license the endpoint requires (`noActiveLicense`, or `insufficientTier` when the enterprise tier is required).\n    \n- **`404 Not Found`** – A resource referenced by the request does not exist. The error code is `notFound` and the `description` names the missing resource.","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"19065114","team":6647748,"collectionId":"d8693424-cc85-46df-93a0-d19f39c93ec9","publishedId":"2sBYHVwf9U","public":true,"publicUrl":"https://api-documentation.cenplexbooking.ch","privateUrl":"https://go.postman.co/documentation/19065114-d8693424-cc85-46df-93a0-d19f39c93ec9","customColor":{"top-bar":"FFFFFF","right-sidebar":"2D3231","highlight":"0F766E"},"documentationLayout":"classic-double-column","customisation":{"metaTags":[{"name":"description","value":""},{"name":"title","value":""}],"appearance":{"default":"system_default","themes":[{"name":"dark","logo":null,"colors":{"top-bar":"212121","right-sidebar":"2D3231","highlight":"4DC4B0"}},{"name":"light","logo":null,"colors":{"top-bar":"FFFFFF","right-sidebar":"2D3231","highlight":"0F766E"}}]}},"version":"8.12.10","publishDate":"2026-10-29T16:43:59.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"","description":""},"logos":{"logoLight":null,"logoDark":null}},"statusCode":200},"environments":[{"name":"Booking API INT","id":"9af3fb76-790d-492e-b56f-e40d07ec340b","owner":"19065114","values":[{"key":"baseUrl","value":"https://api.int.cenplexbooking.ch","enabled":true,"type":"default"},{"key":"accessToken","value":"xxx","enabled":true,"type":"default"},{"key":"refreshToken","value":"xxx","enabled":true,"type":"default"},{"key":"patientId","value":"xxx","enabled":true,"type":"default"},{"key":"x-client-id","value":"postman","enabled":true,"type":"default"},{"key":"customerId","value":"xxx","enabled":true,"type":"default"},{"key":"locationId","value":"xxx","enabled":true,"type":"default"},{"key":"courseId","value":"xxx","enabled":true,"type":"default"},{"key":"employeeId","value":"xxx","enabled":true,"type":"default"},{"key":"appointmentId","value":"xxx","enabled":true,"type":"default"},{"key":"groupSeriesId","value":"xxx","enabled":true,"type":"default"},{"key":"waitlistReference","value":"xxx","enabled":true,"type":"default"}],"published":true}],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/0f87a8e4d5b1416a581e705d2d3adb38987629c306f7c675fda8a90ca47ffaff","favicon":"https://cenplexbooking.ch/favicon.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"},{"label":"Booking API INT","value":"19065114-9af3fb76-790d-492e-b56f-e40d07ec340b"}],"canonicalUrl":"https://api-documentation.cenplexbooking.ch/view/metadata/2sBYHVwf9U"}