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