WellnessLiving Appointments API

The Appointments API from WellnessLiving — 4 operation(s) for appointments.

OpenAPI Specification

wellnessliving-appointments-api-openapi.yml Raw ↑
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 <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.'