openapi: 3.0.3 info: title: WellnessLiving Appointments API description: Curated, representative subset of WellnessLiving's official production API (RESTful, JSON-over-HTTPS). WellnessLiving is business-management software for fitness studios, gyms, spas, and salons; this API is the same one its own web and mobile clients (Achieve, Elevate) call, and is published for approved partners via an official OpenAPI document at github.com/wellnessliving/openapi (324 paths across 45+ resource areas as of the 2026-06-20 build). Endpoints below are grounded in that official spec and in the public github.com/wellnessliving/wl-sdk (PHP) and wl-sdk-js SDKs; this file selects roughly four representative endpoints per logical API area rather than reproducing the full catalog. Every WellnessLiving API resource is a `.json`-suffixed endpoint whose path is derived deterministically from the SDK model class's namespace (e.g. the PHP class `WellnessLiving\Wl\Staff\StaffElementModel` serves `/Wl/Staff/StaffElement.json`). Legacy numbered variants of several endpoints exist for backward compatibility (e.g. `Finish47`, `ServiceList52`, `Purchase72`) and are omitted here in favor of their current unsuffixed counterpart. version: 1.1.20260620071011 contact: name: WellnessLiving Support email: support@wellnessliving.com url: https://www.wellnessliving.com/support license: name: Proprietary url: https://www.wellnessliving.com/knowledge-sharing/terms-of-use/ termsOfService: https://www.wellnessliving.com/knowledge-sharing/terms-of-use/ servers: - url: https://us.wellnessliving.com description: Production - United States data center - url: https://au.wellnessliving.com description: Production - Australia data center - url: https://staging.wellnessliving.com description: Staging (pre-release QA branch) - url: https://demo.wellnessliving.com description: Demo/trunk (active development branch) security: - BearerAuth: [] tags: - name: Appointments paths: /Wl/Appointment/Info/Info.json: get: operationId: get_Wl_Appointment_Info_Info summary: Gets information about appointment. description: "Returns detailed information about the specified appointment, including service details, staff member,\n date and time in the location's timezone, booking status, client information, and any associated\n assets or add-ons. Access is validated against the current user's permissions." tags: - Appointments parameters: - $ref: '#/components/parameters/XErrorRules' - name: k_appointment in: query required: true schema: type: string description: Class identifier to get information for. responses: '200': description: Successful response. content: application/json: schema: type: object properties: a_next: description: The `a_next` field. nullable: true a_previous: description: The `a_previous` field. nullable: true a_question: description: The `a_question` field. nullable: true a_resource: description: The `a_resource` field. nullable: true a_shop_product_option: description: The `a_shop_product_option` field. nullable: true dt_date_local: description: The `dt_date_local` field. nullable: true i_duration: description: The `i_duration` field. nullable: true i_index: description: The `i_index` field. nullable: true id_appointment_pay: description: The `id_appointment_pay` field. nullable: true k_location: description: The `k_location` field. nullable: true k_login_promotion: description: The `k_login_promotion` field. nullable: true k_resource: description: The `k_resource` field. nullable: true k_resource_type: description: The `k_resource_type` field. nullable: true k_service: description: The `k_service` field. nullable: true k_service_category: description: The `k_service_category` field. nullable: true '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/ValidationError' '500': $ref: '#/components/responses/ServerError' /Wl/Appointment/Book/Schedule/Calendar.json: get: operationId: get_Wl_Appointment_Book_Schedule_Calendar summary: Retrieves a list with all calendar days in specified period with available and unavailable appointment booking schedule. description: "Returns each day in the requested month marked as available or unavailable for booking the given\n service at the given location. Availability is determined by the business schedule, holidays,\n and staff availability for the selected date range." tags: - Appointments parameters: - $ref: '#/components/parameters/XErrorRules' - name: a_uid in: query required: true schema: type: array items: type: string description: 'List of user keys to book appointments. There may be empty values in this list, which means that this is a walk-in.' - name: dt_date in: query required: true schema: type: string description: The date to show the available appointment booking schedule. - name: i_duration in: query required: true schema: type: integer description: 'The duration of the asset booking or custom appointment duration in minutes. Zero in case of service predefined duration. In case of back-to-back book' - name: i_index in: query required: true schema: type: integer description: An index of the selected asset. `0` for booking of service or if asset is not on layout. - name: id_gender_staff in: query required: true schema: type: string description: Enumerated/coded value (see WellnessLiving *Sid constant classes). description: 'The ID of the staff member''s gender. In case of back-to-back booking - staff gender of first appointment. One of the [AGenderSid](#/components/schemas' - name: is_back_to_back in: query required: true schema: type: boolean description: Determines whether multiple appointments are booked in back-to-back mode. - name: is_month_view in: query required: true schema: type: boolean description: If calendar should be displayed in month view mode. - name: is_staff in: query required: true schema: type: boolean description: '`true` if the request is made by staff member; in this case booking policy restrictions are ignored. `false` if the request is made by client; booking' - name: is_tab_all in: query required: true schema: type: boolean description: '`true` - search in all tabs. `false` - search only for the selected bookable tab. Cannot be set simultaneously with {DayTimeApi::$k_class_tab}.' - name: is_unavailable in: query required: true schema: type: boolean description: '`true` - return service categories that have no staff members able to conduct them. `false` - return only service categories that have staff members a' - name: is_walk_in in: query required: true schema: type: boolean description: If `true`, the client is a walk-in. Otherwise, this will be `false`. - name: k_class_tab in: query required: false schema: type: string nullable: true description: 'Current booking tab. Only used for asset booking with "Allow clients to select a date and time, then the available asset" booking policy enabled. Can' - name: k_location in: query required: true schema: type: string description: Location to show available appointment booking schedule. - name: k_resource in: query required: true schema: type: string description: 'The resource key to show which days are available for booking. Should be `0` in case of back-to-back booking.' - name: k_service in: query required: true schema: type: string description: 'The service key used for showing the available appointment booking schedule. In case of back-to-back booking - service key of first appointment.' - name: k_staff in: query required: true schema: type: string description: 'The staff member key used for showing the available appointment booking schedule. In case of back-to-back booking - staff key of first appointment. `0' - name: k_timezone in: query required: false schema: type: string nullable: true description: 'Key of timezone. `null` if not set to use client''s profile timezone.' - name: s_appointment in: query required: true schema: type: string description: 'The staff key to show what days are available for booking. For back-to-back booking ([DayTimeApi](/Wl/Appointment/Book/Schedule/DayTime.json) == `tru' - name: s_product in: query required: true schema: type: string description: 'A list of service add-ons keys(encoded as JSON string). In case of back-to-back booking - add-ons of first appointment.' - name: uid in: query required: true schema: type: string description: 'The user key. This field is used if the client books for himself or for the relative. This field is incorrect to use for guest booking since in this' - name: uid_staff in: query required: true schema: type: string description: 'The staff user key used for showing the available appointment booking schedule. In case of back-to-back booking - staff user key of first appointment.' responses: '200': description: Successful response. content: application/json: schema: type: object properties: a_date: description: The `a_date` field. nullable: true a_time: description: The `a_time` field. nullable: true a_timezone_data: description: The `a_timezone_data` field. nullable: true a_week_name: description: The `a_week_name` field. nullable: true can_backwards: description: The `can_backwards` field. nullable: true dt_date: description: The `dt_date` field. nullable: true i_capacity: description: The `i_capacity` field. nullable: true i_capacity_waitlist: description: The `i_capacity_waitlist` field. nullable: true i_week_end: description: The `i_week_end` field. nullable: true i_week_start: description: The `i_week_start` field. nullable: true is_waitlist: description: The `is_waitlist` field. nullable: true k_location: description: The `k_location` field. nullable: true '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/ValidationError' '500': $ref: '#/components/responses/ServerError' /Wl/Appointment/Book/Staff/List.json: get: operationId: get_Wl_Appointment_Book_Staff_List summary: Retrieves an information about staff members for the current service. description: "Returns the list of staff members who can perform the specified service at the given location\n on the specified date and time. Each entry includes the staff member's name, image, gender,\n and availability. An 'any staff' option is included when the service allows random staff assignment." tags: - Appointments parameters: - $ref: '#/components/parameters/XErrorRules' - name: dt_date in: query required: true schema: type: string description: The date/time of the appointment selected by user, in the location's time zone. - name: i_duration_custom in: query required: false schema: type: integer nullable: true description: 'Custom appointment duration in minutes. `null` if not set.' - name: id_role in: query required: true schema: type: string description: Enumerated/coded value (see WellnessLiving *Sid constant classes). description: 'User role by whom this api called. For different roles different results might be generated.' - name: is_unavailable in: query required: true schema: type: boolean description: '`true` - returns service categories that have no staff members available to conduct them. `false` - returns only service categories that have staff me' - name: k_appointment_ignore in: query required: true schema: type: string description: Key of appointment which must be ignored when searches available staff. - name: k_location in: query required: true schema: type: string description: The key of the location. - name: k_service in: query required: true schema: type: string description: The key of a service for which to show information. - name: k_timezone in: query required: false schema: type: string nullable: true description: 'User''s timezone. `null` until initialized or to use location timezone.' - name: uid in: query required: false schema: type: string nullable: true description: 'The user key for whom the service is booking. `null` when not set.' responses: '200': description: Successful response. content: application/json: schema: type: object properties: a_staff: description: The `a_staff` field. nullable: true can_book_unavailable_staff: description: The `can_book_unavailable_staff` field. nullable: true has_gender: description: The `has_gender` field. nullable: true has_staff: description: The `has_staff` field. nullable: true is_gender_different: description: The `is_gender_different` field. nullable: true '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/ValidationError' '500': $ref: '#/components/responses/ServerError' /Wl/Appointment/Book/Finish/FinishMultiple.json: post: operationId: post_Wl_Appointment_Book_Finish_FinishMultiple summary: Completes the appointment booking for one or more providers, optionally creating a new client. description: "Accepts booking details for one or more providers in `a_book_data`,\n processes payment using the selected Purchase Option, creates appointment records, and sends\n booking confirmation notifications. A new client account can be created by supplying user\n details in `a_user` when no UID is provided." tags: - Appointments parameters: - $ref: '#/components/parameters/XErrorRules' - name: a_pay in: query required: true schema: type: array items: type: string description: 'The payment type for the appointment. One of the [RsAppointmentPaySid](#/components/schemas/RsAppointmentPaySid) constants. Keys refer to provider in' - name: a_uid in: query required: true schema: type: array items: type: string description: 'List of user keys to book appointments. There may be empty values in this list, which means that this is a walk-in.' - name: a_user in: query required: true schema: type: object additionalProperties: true description: 'Data to create new users. Specify this if `$uid` is empty. The data must contain the next keys:' - name: is_walk_in in: query required: true schema: type: boolean description: If `true`, the client is a walk-in. Otherwise, this will be `false`. - name: k_appointment in: query required: true schema: type: string description: 'The appointment key. Specify this to reschedule a certain appointment.' - name: k_business in: query required: true schema: type: string description: The business key. - name: k_location in: query required: true schema: type: string description: Location to show available appointment booking schedule. - name: uid in: query required: true schema: type: string description: 'The user key. This field is used if the client books for himself or for the relative. This field is incorrect to use for guest booking since in this' requestBody: required: true content: application/x-www-form-urlencoded: schema: type: object properties: a_answer: description: The `a_answer` field. See WellnessLiving developer portal for full field semantics. type: string a_book_data: description: The `a_book_data` field. See WellnessLiving developer portal for full field semantics. type: string a_notification: description: The `a_notification` field. See WellnessLiving developer portal for full field semantics. type: string a_paid: description: The `a_paid` field. See WellnessLiving developer portal for full field semantics. type: string a_pay_form: description: The `a_pay_form` field. See WellnessLiving developer portal for full field semantics. type: string a_payment_data: description: The `a_payment_data` field. See WellnessLiving developer portal for full field semantics. type: string a_purchase_item: description: The `a_purchase_item` field. See WellnessLiving developer portal for full field semantics. type: string a_quiz_response: description: The `a_quiz_response` field. See WellnessLiving developer portal for full field semantics. type: string id_mode: description: The `id_mode` field. See WellnessLiving developer portal for full field semantics. type: string is_back_to_back: description: The `is_back_to_back` field. See WellnessLiving developer portal for full field semantics. type: string is_try: description: The `is_try` field. See WellnessLiving developer portal for full field semantics. type: string s_id: description: The `s_id` field. See WellnessLiving developer portal for full field semantics. type: string required: - a_answer - a_book_data - a_notification - a_paid - a_pay_form - a_payment_data - a_purchase_item - a_quiz_response - id_mode - is_back_to_back - is_try - s_id responses: '200': description: Successful response. content: application/json: schema: type: object properties: a_appointment: description: The `a_appointment` field. nullable: true a_login_activity_visit: description: The `a_login_activity_visit` field. nullable: true a_visit: description: The `a_visit` field. nullable: true a_visit_provider: description: The `a_visit_provider` field. nullable: true '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '403': $ref: '#/components/responses/Forbidden' '404': $ref: '#/components/responses/NotFound' '422': $ref: '#/components/responses/ValidationError' '500': $ref: '#/components/responses/ServerError' components: parameters: XErrorRules: name: X-Error-Rules in: header required: false schema: type: string description: Opt in to mapping internal API error statuses to real 4xx HTTP codes. By default the API always answers HTTP 200 even on error, with the failure encoded in the JSON body; setting this header (e.g. to `default`) makes the gateway translate matched error statuses to 400/403/404 responses instead. responses: ServerError: description: Unexpected server error. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' ValidationError: description: The request payload failed field-level validation. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' Unauthorized: description: Missing, expired, or invalid Bearer token / session. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' BadRequest: description: 'Client-side error: invalid input, failed validation, throttling, or other request error (only returned as an HTTP status when `X-Error-Rules` opts in; otherwise encoded in a 200 body).' content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' NotFound: description: The requested resource does not exist. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' Forbidden: description: Authenticated but not permitted to access this business, location, or resource. content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' schemas: ErrorResponse: type: object description: Standard WellnessLiving API error response shape. properties: status: type: string description: Machine-readable status/error code string (e.g. `access-denied`, `not-found`). text_message: type: string description: Human-readable error message. a_field: type: object additionalProperties: true description: Per-field validation errors, when the failure is a 422-style validation error. securitySchemes: BearerAuth: type: http scheme: bearer bearerFormat: JWT description: 'The officially published OpenAPI declares a JWT Bearer scheme: sign in via `POST /Core/Passport/Login/Enter/Enter.json`, then mint a token with `GET /Core/Passport/Enter/Jwt/JwtToken.json` and send it as `Authorization: Bearer `. The underlying PHP/JS SDKs additionally support the legacy scheme: a registered Application ID + secret code sign a per-request HMAC (SHA3-based) placed in the `Authorization:` header alongside session cookies established by the `Notepad`/`Enter` model pair. Both schemes require WellnessLiving''s Integrations Team to first approve API access, sign an NDA and API Agreement, and issue application credentials.'