WellnessLiving Classes API

The Classes API from WellnessLiving — 4 operation(s) for classes.

OpenAPI Specification

wellnessliving-classes-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: WellnessLiving Appointments Classes 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: Classes
paths:
  /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'
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 <token>`. 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.'