WellnessLiving Appointments API

One-on-one appointment booking - service and staff availability, calendar day availability, and completing (or rescheduling) an appointment booking for one or more clients.

OpenAPI Specification

wellnessliving-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: WellnessLiving 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: Clients
- name: Members
- name: Profile
- name: Family
- name: Classes
- name: Schedules
- name: Group Fitness
- name: Appointments
- name: 1:1 Services
- name: Booking
- name: Checkout
- name: Promotions
- name: Memberships
- name: Guest Pass
- name: Staff
- name: Locations
- name: Business
- name: Catalog
- name: Purchases
- name: Point of Sale
- name: Payments
- name: Thoth WlPay
- name: Authentication
- name: Login
- name: Rewards
- name: Loyalty
- name: Reviews
- name: Reports
- name: WebSocket
- name: Real-Time
paths:
  /Wl/Member/Info/Info.json:
    get:
      operationId: get_Wl_Member_Info_Info
      summary: Returns information about specified member.
      description: 'Supports both single-user and batch modes: when `$a_uid` is provided, returns a keyed
        list of user data in

        `$a_result_list`; otherwise returns data for the single user identified by `$uid`. When `$is_full`
        is `true`,

        additional profile details, group membership, visit history, and lifetime value are included.'
      tags:
      - Clients
      parameters:
      - $ref: '#/components/parameters/XErrorRules'
      - name: a_uid
        in: query
        required: false
        schema:
          type: array
          nullable: true
          items:
            type: string
        description: 'Primary keys of users whose information must be returned.


          `null` if data of a single user is requested.'
      - name: a_uid_date
        in: query
        required: false
        schema:
          type: array
          nullable: true
          items:
            type: string
        description: 'List of dates for load additional information about users.


          Key is UID of user. Value is date.


          `null` if data of a single user is requested.'
      - name: dt_date
        in: query
        required: true
        schema:
          type: string
        description: Date of the session, if we show it on the appointment info window or on the attendance
          list.
      - name: is_backend
        in: query
        required: true
        schema:
          type: boolean
        description: '`true` - if API is being used from backend, `false` - otherwise.'
      - name: is_full
        in: query
        required: true
        schema:
          type: boolean
        description: If you need to return additional information set to `true` or `false` if not.
      - name: k_business
        in: query
        required: true
        schema:
          type: string
        description: 'The business ID required to access client information.


          Specify this as `0` to retrieve the system-wide version of the information.'
      - name: k_visit
        in: query
        required: true
        schema:
          type: string
        description: ID of the visit, if we show icons on the attendance list and information that depends
          on visit is required.
      - name: s_show
        in: query
        required: true
        schema:
          type: string
        description: 'A list of icons with additional information about the business member.

          If empty, all available icons will be displayed.

          Comma separated values from [M'
      - name: uid
        in: query
        required: true
        schema:
          type: string
        description: ID of a user to retrieve member information for.
      responses:
        '200':
          description: Successful response.
          content:
            application/json:
              schema:
                type: object
                properties:
                  a_info:
                    description: The `a_info` field.
                    nullable: true
                  a_result_list:
                    description: The `a_result_list` field.
                    nullable: true
                  a_visit_last:
                    description: The `a_visit_last` field.
                    nullable: true
                  a_visit_next:
                    description: The `a_visit_next` field.
                    nullable: true
                  i_lifetime_visit:
                    description: The `i_lifetime_visit` field.
                    nullable: true
                  is_traveller:
                    description: The `is_traveller` field.
                    nullable: true
                  m_lifetime_value:
                    description: The `m_lifetime_value` field.
                    nullable: true
                  s_member:
                    description: The `s_member` field.
                    nullable: true
                  text_first_name:
                    description: The `text_first_name` field.
                    nullable: true
                  text_fullname:
                    description: The `text_fullname` field.
                    nullable: true
                  url_barcode:
                    description: The `url_barcode` field.
                    nullable: true
                  url_email:
                    description: The `url_email` 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/Profile/Purchase/PurchaseList.json:
    get:
      operationId: get_Wl_Profile_Purchase_PurchaseList
      summary: Retrieves a list of user's purchase items to show in user profile.
      description: "Returns the complete purchase history for the client in the given business, covering\
        \ all\n item types such as memberships, redemption codes, enrollments, products, appointments,\
        \ and\n gift cards. Package components are resolved and included inline beside their parent item."
      tags:
      - Clients
      parameters:
      - $ref: '#/components/parameters/XErrorRules'
      - name: k_business
        in: query
        required: true
        schema:
          type: string
        description: The key of a business to show information for.
      - name: uid
        in: query
        required: true
        schema:
          type: string
        description: The key of a user to show information for.
      responses:
        '200':
          description: Successful response.
          content:
            application/json:
              schema:
                type: object
                properties:
                  a_purchase:
                    description: The `a_purchase` 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/Profile/ProfileCreate.json:
    post:
      operationId: post_Wl_Profile_ProfileCreate
      summary: Creates a new client profile with the provided personal details in the specified business.
      description: "Creates or retrieves a user account by email or phone, saves personal details such\
        \ as name,\n address, phones, birthday, gender, and vaccination status, registers the user in\
        \ the\n business, and optionally adds them to the lead report and sets intents."
      tags:
      - Clients
      parameters:
      - $ref: '#/components/parameters/XErrorRules'
      requestBody:
        required: true
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                a_intents:
                  description: The `a_intents` field. See WellnessLiving developer portal for full field
                    semantics.
                  type: string
                dt_birthday:
                  description: The `dt_birthday` field. See WellnessLiving developer portal for full field
                    semantics.
                  type: string
                id_gender:
                  description: The `id_gender` field. See WellnessLiving developer portal for full field
                    semantics.
                  type: string
                id_lead_source:
                  description: The `id_lead_source` field. See WellnessLiving developer portal for full
                    field semantics.
                  type: string
                id_vaccination_status:
                  description: The `id_vaccination_status` field. See WellnessLiving developer portal
                    for full field semantics.
                  type: string
                is_lead:
                  description: The `is_lead` field. See WellnessLiving developer portal for full field
                    semantics.
                  type: string
                k_business:
                  description: The `k_business` field. See WellnessLiving developer portal for full field
                    semantics.
                  type: string
                k_lead_source:
                  description: The `k_lead_source` field. See WellnessLiving developer portal for full
                    field semantics.
                  type: string
                k_location_home:
                  description: The `k_location_home` field. See WellnessLiving developer portal for full
                    field semantics.
                  type: string
                text_address:
                  description: The `text_address` field. See WellnessLiving developer portal for full
                    field semantics.
                  type: string
                text_firstname:
                  description: The `text_firstname` field. See WellnessLiving developer portal for full
                    field semantics.
                  type: string
                text_lastname:
                  description: The `text_lastname` field. See WellnessLiving developer portal for full
                    field semantics.
                  type: string
                text_mail:
                  description: The `text_mail` field. See WellnessLiving developer portal for full field
                    semantics.
                  type: string
                text_phone:
                  description: The `text_phone` field. See WellnessLiving developer portal for full field
                    semantics.
                  type: string
                text_phone_home:
                  description: The `text_phone_home` field. See WellnessLiving developer portal for full
                    field semantics.
                  type: string
              required:
              - a_intents
              - dt_birthday
              - id_gender
              - id_lead_source
              - id_vaccination_status
              - is_lead
              - k_business
              - k_lead_source
              - k_location_home
              - text_address
              - text_firstname
              - text_lastname
              - text_mail
              - text_phone
              - text_phone_home
      responses:
        '200':
          description: Successful response.
          content:
            application/json:
              schema:
                type: object
                properties:
                  uid:
                    description: The `uid` 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/Family/Relation/FamilyRelation.json:
    get:
      operationId: get_Wl_Family_Relation_FamilyRelation
      summary: Gets relationships list.
      description: 'Returns all relationship types enabled for the given business, or all system-defined
        relationship types if no

        business key is provided.'
      tags:
      - Clients
      parameters:
      - $ref: '#/components/parameters/XErrorRules'
      - name: k_business
        in: query
        required: true
        schema:
          type: string
        description: The business key.
      responses:
        '200':
          description: Successful response.
          content:
            application/json:
              schema:
                type: object
                properties:
                  a_business_relationships:
                    description: The `a_business_relationships` 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/Classes/ClassList/List.json:
    get:
      operationId: get_Wl_Classes_ClassList_List
      summary: Returns list of classes and events in the business.
      description: 'Used by import and integration tools to enumerate all classes and events offered by
        a business.

        In franchise mode, classes from all franchisee locations are included. Results are sorted by title

        and start date.'
      tags:
      - Classes
      parameters:
      - $ref: '#/components/parameters/XErrorRules'
      - name: a_class_tab
        in: query
        required: false
        schema:
          type: array
          nullable: true
          items:
            type: string
        description: 'List of tabs keys.

          Filtering by Book Now Tab is not supported if `is_franchise` is `true`.


          `null` if no filtering by Book Now Tab is required.'
      - name: id_class_tab
        in: query
        required: false
        schema:
          type: string
          description: Enumerated/coded value (see WellnessLiving *Sid constant classes).
        description: 'ID of book now tab. One of [TabSid](#/components/schemas/Wl.Classes.Tab.TabSid)
          constants.

          Only [TabSid::TRAINING](#/components/schemas/Wl.Classes.Tab'
      - name: is_enrollment_block_all
        in: query
        required: true
        schema:
          type: boolean
        description: 'Whether all events should be returned from same enrollment block.


          * `true` to return all events from same enrollment block.

          * `false` to return only'
      - name: is_enrollment_block_empty
        in: query
        required: true
        schema:
          type: boolean
        description: 'Whether to include events without sessions.

          An empty event is neither published nor unpublished. It simply has no sessions.

          Such events can be useful'
      - name: is_event_include
        in: query
        required: true
        schema:
          type: boolean
        description: 'Whether to include events in the result.


          true` to include both classes and events.

          false` to include only classes.'
      - name: is_franchise
        in: query
        required: true
        schema:
          type: boolean
        description: 'Whether to return franchisee-created classes (if business is franchisor).

          `true` to include franchisee-created classes.'
      - name: k_business
        in: query
        required: true
        schema:
          type: string
        description: Business key.
      responses:
        '200':
          description: Successful response.
          content:
            application/json:
              schema:
                type: object
                properties:
                  a_class:
                    description: The `a_class` 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/Classes/ClassView/Element.json:
    get:
      operationId: get_Wl_Classes_ClassView_Element
      summary: Returns class information including schedules, images, and booking settings for the specified
        business.
      description: 'Used by import tools to read the full class catalog for a business. Returns a map
        of all classes

        (or a single class) with the information needed to replicate class data in an external system:

        schedules, images, booking constraints, and descriptions.'
      tags:
      - Classes
      parameters:
      - $ref: '#/components/parameters/XErrorRules'
      - name: i_image_height
        in: query
        required: true
        schema:
          type: integer
        description: 'The image height in pixels. Specify this value if you need the image to be returned
          in a specific size.

          If this value isn''t specified, the returned im'
      - name: i_image_width
        in: query
        required: true
        schema:
          type: integer
        description: 'The image width in pixels. Specify this value if you need the image to be returned
          in a specific size.

          If this value isn''t specified, the returned ima'
      - name: k_business
        in: query
        required: true
        schema:
          type: string
        description: The business key.
      - name: k_class
        in: query
        required: true
        schema:
          type: string
        description: 'The class key used to get information for a specific class.


          An empty value returns information for all classes of the business.'
      - name: show_cancelled
        in: query
        required: true
        schema:
          type: boolean
        description: 'Defines if canceled schedules should be included in the result.


          If `true`, canceled schedules will be shown. Otherwise, this will be `false`.'
      responses:
        '200':
          description: Successful response.
          content:
            application/json:
              schema:
                type: object
                properties:
                  a_class_list:
                    description: The `a_class_list` 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/Schedule/ClassList/ClassList.json:
    get:
      operationId: get_Wl_Schedule_ClassList_ClassList
      summary: Retrieves a list of classes and class information for the given business and date range.
      description: 'Returns upcoming class sessions for a business, with optional filtering by location,

        day of week, time of day, staff member, and virtual or in-person mode. The result includes

        per-session details such as staff, capacity, booking counts, and virtual locations, as well as

        a calendar map indicating which dates have at least one scheduled session.'
      tags:
      - Classes
      parameters:
      - $ref: '#/components/parameters/XErrorRules'
      - name: a_class
        in: query
        required: true
        schema:
          type: array
          items:
            type: string
        description: 'The list of classes keys to filter.

          Return sessions with matching class IDs.


          If it''s empty, all classes/events will be returned.'
      - name: a_day
        in: query
        required: true
        schema:
          type: array
          items:
            type: string
        description: 'Class filter by day of the week.

          Array of number representing the days of the week.

          Return sessions matching the given weekdays.

          (7 = Sunday, 1 = Mond'
      - name: a_location
        in: query
        required: true
        schema:
          type: array
          items:
            type: string
        description: 'The list of location keys to filter results.

          If it''s empty, schedule for all locations will be returned.

          All given locations should be from the same b'
      - name: a_time
        in: query
        required: true
        schema:
          type: array
          items:
            type: string
        description: 'Class filter by time of day.

          List of arrays with start and end time in "HH:MM" format (24h).

          Include sessions that start between the specified time ra'
      - name: dt_date
        in: query
        required: true
        schema:
          type: string
        description: The list start date in UTC and in MySQL format.
      - name: dt_end
        in: query
        required: true
        schema:
          type: string
        description: The list end date in UTC and in MySQL format.
      - name: is_response_short
        in: query
        required: true
        schema:
          type: boolean
        description: '`true` means to not generate `a_session` result.

          Can be used, if you do not need full information about existing classes and result in `a_calendar`
          is'
      - name: is_tab_all
        in: query
        required: true
        schema:
          type: boolean
        description: 'If `true`, sessions from every class tab are returned. If `false`, use the

          `k_class_tab` value.'
      - name: is_virtual
        in: query
        required: false
        schema:
          type: boolean
          nullable: true
        description: 'Class filter by type.

          The class is virtual.


          `true`: Only virtual classes.

          `false`: Only in-person.

          `null` or not set: No filtering.'
      - name: k_business
        in: query
        required: true
        schema:
          type: string
        description: The business key.
      - name: k_class_tab
        in: query
        required: true
        schema:
          type: string
        description: 'The category tab key.


          This will be `null` if not set yet.

          This will be ignored if `is_tab_all` is `true`.'
      - name: s_staff
        in: query
        required: true
        schema:
          type: string
        description: 'The list of staff members to filter.

          A comma separated list of staff keys.'
      - name: s_staff_uid
        in: query
        required: true
        schema:
          type: string
        description: 'The list of staff user keys to filter.

          A comma separated list of staff user keys.'
      - name: show_cancel
        in: query
        required: true
        schema:
          type: boolean
        description: If `true`, canceled sessions will be returned. If `false`, canceled sessions won't
          be returned.
      - name: show_class
        in: query
        required: true
        schema:
          type: boolean
        description: If `true`, classes will be included in the response. `false` - otherwise.
      - name: show_event
        in: query
        required: true
        schema:
          type: boolean
        description: If `true`, events are also returned. If `false`, only classes are returned.
      - name: uid
        in: query
        required: true
        schema:
          type: string
        description: The user key.
      responses:
        '200':
          description: Successful response.
          content:
            application/json:
              schema:
                type: object
                properties:
                  a_calendar:
                    description: The `a_calendar` field.
                    nullable: true
                  a_session:
                    description: The `a_session` field.
                    nullable: true
                  is_timezone_different:
                    description: The `is_timezone_different` field.
                    nullable: true
                  is_virtual_service:
                    description: The `is_virtual_service` 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/Schedule/Cancel.json:
    post:
      operationId: post_Wl_Schedule_Cancel
      summary: 'Cancels session for the client.

        This method is an alias for partners using the API or SDK.'
      description: 'Identical in behavior to `get()`; exists as a POST alias for partner

        integrations that cannot issue GET requests.'
      tags:
      - Classes
      parameters:
      - $ref: '#/components/parameters/XErrorRules'
      - name: dt_date
        in: query
        required: true
        schema:
          type: string
        description: The date of the session in UTC.
      - name: is_backend
        in: query
        required: true
        schema:
          type: boolean
        description: 'This will be `true` if the API is being used from the back end. Otherwise, this
          will be `false`.

          Here, the back end refers to either a staff member or'
      - name: is_late_cancel
        in: query
        required: true
        schema:
          type: boolean
        description: '`true` is late cancel, `false` reservation is not late cancel.

          This is required to enable late cancel even if the user is staff.'
      - name: k_appointment
        in: query
        required: false
        schema:
          type: string
          nullable: true
        description: 'The appointment key.

          This will be `null` if not set yet or if a class or event is canceled.'
      - name: k_business
        in: query
        required: true
        schema:
          type: string
        description: Key of the business within which the action is performed.
      - name: k_class_period
        in: query
        required: false
        schema:
          type: string
          nullable: true
        description: 'The class period key.

          This will be `null` if not set yet or if an appointment is canceled.'
      - name: uid
        in: query
        required: true
        schema:
          type: string
        description: The user key.
      responses:
        '200':
          description: Successful response.
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
        '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/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:
                    descript

# --- truncated at 32 KB (177 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/wellnessliving/refs/heads/main/openapi/wellnessliving-openapi.yml