openapi: 3.1.0
info:
  title: MMS API V2
  description: >-
    RESTful API specification for integrating gym management systems with the
    EGYM platform. This OpenAPI document defines all available endpoints,
    request/response schemas, authentication requirements, and error codes.


    **Key Features:**

    - Member account and membership management

    - RFID assignment and management

    - Real-time gym visit tracking (check-in/check-out)

    - EGYM product booking (Smart Strength, EGYM+)

    - Trainer task creation and tracking

    - Webhook subscriptions for event notifications

    - Push notifications to EGYM mobile apps

    - Member migration from V1 API
  termsOfService: https://egym.com/en/terms/
  contact:
    name: MMS Connect Team
    url: https://egym.com/
    email: connect@egym.com
  version: 2.0.0
servers:
  - url: https://one-mms-service.ext-1.test.co.egym.coffee
    description: Test
  - url: https://mms.api.egym.com
    description: Prod
security:
  - mms: []
tags:
  - name: Migrating members
    description: These operations are needed to migrate members from V1 API to V2 API.
  - name: Gym Visit
    description: >-
      These operations are needed to transmit the information to EGYM, that a
      specific member is currently in the gym. Based on that information several
      business logics are built, to provide a seamless training floor experience
      to the members of that gym. For example the trainer on the Training Floor
      is informed that this member is here and that he should complete some
      tasks.
  - name: Member Account Roles
    description: These operation are needed to assign and retrieve member account roles
  - name: Trainer Task
    description: These operations are needed to create and update trainer tasks.
  - name: Member Account NFC
    description: >-
      Note that NFC API endpoints are in beta as we've been tuning setup
      processes on both EGYM and partner sides.
  - name: Products booking
    description: >-
      Operations on EGYM products. Currently available products are EGYM Smart
      Strength (Machine Admission) and EGYM+
  - name: Push notifications
    description: Send push notifications to EGYM mobile apps
  - name: Member RFIDs
    description: Operations with RFIDs
  - name: Webhooks
    description: Operations with webhooks
  - name: Member Account
    description: >-
      These operations are needed to create and update member accounts and their
      membership information.
paths:
  /api/v2/webhooks/{id}:
    get:
      tags:
        - Webhooks
      summary: Retrieve webhook entry by id
      operationId: getWebhookById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookResponseDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    put:
      tags:
        - Webhooks
      summary: Update webhook entry
      description: Updates webhook url or/and secret by given webhook id
      operationId: updateWebhook
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookRequestDTO'
        required: true
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookResponseDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    delete:
      tags:
        - Webhooks
      summary: Delete webhook
      description: Deletes webhook url
      operationId: deleteWebhook
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/tasks/{taskId}:
    get:
      tags:
        - Trainer Task
      summary: Retrieve task details
      description: This endpoint returns the details of a specific trainer task.
      operationId: getTask
      parameters:
        - name: taskId
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    put:
      tags:
        - Trainer Task
      summary: Update a task
      description: This endpoint updates trainer task in a gym.
      operationId: updateTask
      parameters:
        - name: taskId
          in: path
          required: true
          schema:
            type: integer
            format: int64
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TaskDTO'
        required: true
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}:
    get:
      tags:
        - Member Account
      summary: Retrieve an account
      description: Retrieve an account using accountId.
      operationId: retrieveAccount
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberAccountDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    put:
      tags:
        - Member Account
      summary: Update an account
      description: Update an account using accountId.
      operationId: updateAccount
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemberAccountDTO'
        required: true
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberAccountDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    delete:
      tags:
        - Member Account
      summary: Delete an account
      description: >
        Delete an account using accountId.

        eraseMemberData parameter is optional and defaults to false. If set to
        true it removes all member data that belongs to a gym (personal data,
        contract data, rfid, product bookings).

        If set to false it deletes only membershipId and contract data.
      operationId: eraseAccountMembershipData
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
        - name: eraseMemberData
          in: query
          description: >-
            If set to true it removes all member data that belongs to a gym
            (personal data, contract data, rfid, product bookings). If set to
            false it deletes only membershipId and contract data.
          required: false
          schema:
            type: boolean
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    patch:
      tags:
        - Member Account
      summary: Partially update an account
      description: >-
        Partially update an account using accountId. Only non-null fields in the
        request will be updated. This is optimized for small, incremental
        changes.
      operationId: partialUpdate
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchMemberAccountDTO'
        required: true
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}/rfids:
    get:
      tags:
        - Member RFIDs
      summary: Retrieve user RFIDs
      description: Returns a list of RFIDs of the user.
      operationId: getUserRfids
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
        - name: allSources
          in: query
          description: >-
            Allows to receive user RFIDs that were assigned not only by MMS but
            also by other sources.
          required: false
          schema:
            type: boolean
            default: false
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/RfidDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    put:
      tags:
        - Member RFIDs
      summary: Update RFIDs of a user
      description: >-
        Note: If this field is sent we will replace the RFID list of this user
        with the info sent (for an empty list, we will delete all RFID
        connections of this user). The operation does not affect RFIDs assigned
        from other sources like EGYM machines, Fitness Hub etc.
      operationId: updateUsersRfids
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RfidListDTO'
        required: true
      responses:
        '200':
          description: Ok
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    post:
      tags:
        - Member RFIDs
      summary: Add RFID
      description: Add RFID to specified user.
      operationId: addRFIDToUser
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RfidDTO'
        required: true
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RfidDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}/products:
    get:
      tags:
        - Products booking
      summary: Retrieve user activated products
      description: >-
        Returns a list of products that are activated for the specified user and
        gym and are active now or in the future.
      operationId: userProducts
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/UserProductDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    put:
      tags:
        - Products booking
      summary: Activate a product or update product booking
      description: >-
        This endpoint activates or updates a product for a user in a gym. The
        product is active starting from the specified start date to the end date
        in Timezone of the club.
      operationId: productBooking
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserProductDTO'
        required: true
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserProductDTO'
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserProductDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}/nfc:
    get:
      tags:
        - Member Account NFC
      summary: Retrieve a member account NFC token
      operationId: getAccountNfcToken
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
        - name: collectorId
          in: query
          required: false
          schema:
            type: integer
            format: int32
        - name: passTypeId
          in: query
          required: false
          schema:
            type: string
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NfcTokenDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    put:
      tags:
        - Member Account NFC
      summary: Assign an NFC token to a member account
      operationId: assignAccountNfcToken
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssignNfcTokenRequest'
        required: true
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    delete:
      tags:
        - Member Account NFC
      summary: Delete a member account NFC token
      operationId: deleteAccountNfcToken
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
        - name: collectorId
          in: query
          required: false
          schema:
            type: integer
            format: int32
        - name: passTypeId
          in: query
          required: false
          schema:
            type: string
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}/images:
    put:
      tags:
        - Member Account
      summary: Upload account image
      description: >-
        This endpoint allows to upload a profile picture to the specified user
        using accountId (Supported formats: JPG, JPEG, PNG. Max file size: 16MB)
      operationId: uploadImage
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
        - name: Content-Length
          in: header
          required: true
          schema:
            type: integer
            format: int32
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  $ref: '#/components/schemas/Part'
              required:
                - file
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    delete:
      tags:
        - Member Account
      summary: Delete account image
      description: >-
        This endpoint allows to delete a profile picture of the specified user
        using accountId
      operationId: deleteImage
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/webhooks:
    get:
      tags:
        - Webhooks
      summary: Retrieve existing webhooks
      description: Returns a list of webhooks of the related gym.
      operationId: getAllWebhooks
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/WebhookResponseDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    post:
      tags:
        - Webhooks
      summary: Create webhook url
      description: Creates webhook url entry
      operationId: createWebhook
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookRequestDTO'
        required: true
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookResponseDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/webhooks/{id}/trigger:
    post:
      tags:
        - Webhooks
      summary: Trigger webhook
      description: Trigger webhook with type TEST
      operationId: triggerWebhook
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Ok
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/tasks:
    get:
      tags:
        - Trainer Task
      summary: Retrieve all tasks
      description: >-
        This endpoint returns a list of trainer tasks that are available in the
        gym. Can be filtered by modified date time.
      operationId: getTasks
      parameters:
        - name: modifiedSince
          in: query
          required: false
          schema:
            type: string
            format: date-time
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/TaskDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    post:
      tags:
        - Trainer Task
      summary: Create a task
      description: >-
        This endpoint create trainer task in a gym. The trainer task is active
        until it is completed.
      operationId: createTask
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TaskDTO'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TaskDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/migrate:
    post:
      tags:
        - Migrating members
      summary: Migrate an account
      description: >-
        Migrate membership from V1 API using old EGYM user id (if already
        migrated then just returns membership).
      operationId: migrate
      parameters:
        - name: legacyUserId
          in: query
          required: true
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberAccountDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts:
    get:
      tags:
        - Member Account
      summary: List member accounts
      description: >-
        Request all member accounts with paginated response. Result is always
        ordered by update timestamp (DESC). By default only accounts of the
        current gym are returned, otherwise set `currentGymOnly` to false. 
      operationId: listAccounts
      parameters:
        - name: currentGymOnly
          in: query
          required: false
          schema:
            type: boolean
            default: true
        - name: fromTimestamp
          in: query
          required: false
          schema:
            type: string
            format: date-time
          example: '2022-09-22T14:19:26.303Z'
        - name: toTimestamp
          in: query
          required: false
          schema:
            type: string
            format: date-time
          example: '2022-09-22T14:19:26.303Z'
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            format: int32
            default: 0
            minimum: 0
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            format: int32
            default: 10
            maximum: 100
            minimum: 0
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PageableResponseMemberAccountDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    post:
      tags:
        - Member Account
      summary: Create an account
      description: Create an account in the EGYM System.
      operationId: publishAccount
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemberAccountDTO'
        required: true
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberAccountDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}/roles:
    get:
      tags:
        - Member Account Roles
        - Member Account
      summary: Retrieve an account roles
      description: Retrieve an account roles in the current gym for given accountId
      operationId: getRoles
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GymRolesDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
    post:
      tags:
        - Member Account Roles
        - Member Account
      summary: Set an account roles
      description: Update an account roles using accountId.
      operationId: assignRoles
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GymRolesDTO'
        required: true
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}/notifications:
    post:
      tags:
        - Push notifications
      summary: Sent notification using accountId
      description: Simple fire and forget operation to sent notification
      operationId: sendPushNotificationByAccountId
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
            format: uuid
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PartnerPushNotificationDTO'
        required: true
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}/checkouts:
    post:
      tags:
        - Gym Visit
      summary: Member Gym Check Out
      description: This endpoint informs the EGYM system that the member has left the gym.
      operationId: checkout
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserPresenceDTO'
        required: true
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}/checkins:
    post:
      tags:
        - Gym Visit
      summary: Member Gym Check In
      description: >-
        This endpoint informs the EGYM system that the member has entered the
        gym.
      operationId: checkin
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserPresenceDTO'
        required: true
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}/admissions:
    post:
      tags:
        - Gym Visit
      summary: Member Admission
      description: >-
        This endpoint is currently used only for members with membership type
        “CORPORATE_FITNESS”. It verifies if the specified member can have access
        to the desired gym. The MMS should use the response status to allow or
        block the member from entering the gym. As a side-effect this access is
        logged in the EGYM Corporate Fitness system if the admission was
        granted.
      operationId: checkAdmission
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AdmissionDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/membership/{membershipId}/notifications:
    post:
      tags:
        - Push notifications
      summary: Sent notification using membershipId
      description: Simple fire and forget operation to sent notification
      operationId: sendPushNotificationByMembershipId
      parameters:
        - name: membershipId
          in: path
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PartnerPushNotificationDTO'
        required: true
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/products:
    get:
      tags:
        - Products booking
      summary: Retrieve gym products
      description: >-
        Returns a list of products that are available in the gym and can be
        activated for a user.
      operationId: listGymProducts
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ProductDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/products/{productId}:
    get:
      tags:
        - Products booking
      summary: Product details
      description: Returns the details of a specific product.
      operationId: productDetails
      parameters:
        - name: productId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/rfid/{rfid}:
    get:
      tags:
        - Member RFIDs
        - Member Account
      summary: Retrieve an account by RFID
      description: Retrieve an account using RFID.
      operationId: getByRfid
      parameters:
        - name: rfid
          in: path
          required: true
          schema:
            type: string
            minLength: 1
        - name: tagFormat
          in: query
          required: false
          schema:
            type: string
            enum:
              - HITAG1
              - MIFARE
              - LEGIC
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberAccountDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/nfc/{nfc}:
    get:
      tags:
        - Member Account
        - Member Account NFC
      summary: Retrieve an account by NFC
      description: Retrieve an account using NFC.
      operationId: getByNfc
      parameters:
        - name: nfc
          in: path
          required: true
          schema:
            type: string
            minLength: 1
        - name: nfcFormat
          in: query
          required: false
          schema:
            type: string
            enum:
              - NFC_EGYM_APPLE
              - NFC_EGYM_GOOGLE
              - NFC_EXTERNAL_APPLE
              - NFC_EXTERNAL_GOOGLE
        - name: collectorId
          in: query
          required: false
          schema:
            type: integer
            format: int32
        - name: passTypeId
          in: query
          required: false
          schema:
            type: string
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberAccountDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/membership/{membershipId}:
    get:
      tags:
        - Member Account
      summary: Retrieve an account by membership ID
      description: Retrieve an account using membershipId.
      operationId: retrieveAccountByMembershipId
      parameters:
        - name: membershipId
          in: path
          required: true
          schema:
            type: string
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberAccountDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/email/{email}:
    get:
      tags:
        - Member Account
      summary: Retrieve an account by email
      description: Retrieve an account using email.
      operationId: getByEmail
      parameters:
        - name: email
          in: path
          required: true
          schema:
            type: string
            maxLength: 320
            minLength: 5
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberAccountDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/corporate-fitness:
    get:
      tags:
        - Gym Visit
      summary: List Corporate Fitness member accounts
      description: >-
        Request Corporate Fitness member accounts for the current gym whose
        corporate membership cancellation date falls into specified date range.
        The type of membership is always `CORPORATE_FITNESS`, both `endDateFrom`
        and `endDateTo` parameters are mandatory and apply to
        `corporateFitness.endTimestamp`.
      operationId: getCorporateFitnessMemberAccounts
      parameters:
        - name: endDateFrom
          in: query
          required: true
          schema:
            type: string
            format: date
          example: '2022-09-22'
        - name: endDateTo
          in: query
          required: true
          schema:
            type: string
            format: date
          example: '2022-09-23'
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/MemberAccountDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}/rfids/{rfid}:
    delete:
      tags:
        - Member RFIDs
      summary: Remove RFID
      description: Delete specified RFID from user
      operationId: deleteRfid
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
        - name: rfid
          in: path
          required: true
          schema:
            type: string
        - name: tagFormat
          in: query
          required: false
          schema:
            type: string
            enum:
              - HITAG1
              - MIFARE
              - LEGIC
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDTO'
  /api/v2/accounts/{accountId}/products/{productId}:
    delete:
      tags:
        - Products booking
      summary: Deactivate a product
      description: This endpoint deactivates a product for a user in a gym.
      operationId: deactivateUserProduct
      parameters:
        - name: accountId
          in: path
          required: true
          schema:
            type: string
        - name: productId
          in: path
          required: true
          schema:
            type: string
      responses:
        '204':
          description: No Content
components:
  schemas:
    WebhookRequestDTO:
      type: object
      properties:
        url:
          type: string
          description: Webhook url
          minLength: 1
        secret:
          type: string
          description: Secret that will be added to the webhook call
          minLength: 1
      required:
        - secret
        - url
    ErrorDTO:
      type: object
      properties:
        timestamp:
          type: string
          format: date-time
          description: The timestamp of the request.
        path:
          type: string
          description: The path requested.
        requestId:
          type: string
          description: The request ID.
          example: de625cf1-1
        status:
          type: integer
          format: int32
          description: The http status code.
        error:
          type: string
          description: The error.
        errorCode:
          type: string
          description: The static error code.
        message:
          type: string
          description: The message to describe the error.
        fieldErrors:
          type: array
          description: The constraint violations.
          items:
            $ref: '#/components/schemas/FieldErrorDTO'
        metadata:
          type: object
          additionalProperties:
            type: string
          description: Additional information of the error context
    FieldErrorDTO:
      type: object
      properties:
        name:
          type: string
          description: The field name.
          example: age
        message:
          type: string
          description: The error message.
          example: Must be greater than 10.
        rejectedValue:
          description: The rejected value.
          example: 3
    WebhookResponseDTO:
      type: object
      properties:
        id:
          type: integer
          format: int64
          description: Webhook id
        url:
          type: string
          description: Webhook url
          minLength: 1
        secret:
          type: string
          description: Secret that will be added to the webhook call
          minLength: 1
      required:
        - id
        - secret
        - url
    TaskDTO:
      type: object
      properties:
        id:
          type: string
          description: The ID of the task
          readOnly: true
        name:
          type: string
          description: Task name
          minLength: 1
        type:
          type: string
          description: Task type
          enum:
            - GENERAL
            - ANAMNESIS
            - COORDINATION_FITNESS_TEST
            - HEALTH_FITNESS_TEST
            - PWC_FITNESS_TEST
            - MAX_FORCE_FITNESS_TEST
            - MOBILITY_SCREEN_FITNESS_TEST
            - BLOOD_PRESSURE_FITNESS_TEST
            - POLAR_FITNESS_TEST
            - INBODY_FITNESS_TEST
            - JAWON_FITNESS_TEST
        dueDate:
          type: string
          format: date
          description: 'Task completion deadline date. format: yyyy-MM-dd'
        authorId:
          type: string
          description: The author of the task. EGYM account ID
          minLength: 1
        targetId:
          type: string
          description: The account of task related to. EGYM account ID
          minLength: 1
        completerId:
          type: string
          description: The account who solved the task. EGYM account ID
        completed:
          type: boolean
          description: >-
            If this task has been completed in the gym this will be true, false
            otherwise.
      required:
        - authorId
        - dueDate
        - name
        - targetId
    ContactDTO:
      type: object
      properties:
        phone:
          type: string
          description: The Member telephone number.
        street:
          type: string
          description: Street name in member's address.
        streetNumber:
          type: string
          description: Street number in member's address.
        zipCode:
          type: string
          description: Zip Code in member's address.
        city:
          type: string
          description: City in member's address.
        state:
          type: string
          description: State in member's address.
        country:
          type: string
          description: Country of the member's address in ISO 3166-1 alpha-2.
          example: DE
    CorporateFitnessDTO:
      type: object
      properties:
        startTimestamp:
          type: string
          description: >-
            The date (in ISO format) when the corporate fitness
            (Qualitrain/Wellpass) membership will start, in case that is in the
            future. This field will not be returned in case of an active or past
            corporate fitness membership.
          example: '2021-03-08T18:26:47Z'
        endTimestamp:
          type: string
          description: >-
            The date (in ISO format) when the corporate fitness
            (Qualitrain/Wellpass) membership ends. This field is only returned
            in case there is a defined end timestamp for the corporate fitness
            membership.
          example: '2021-03-08T18:26:47Z'
    MemberAccountDTO:
      type: object
      properties:
        accountId:
          type: string
          description: The EGYM account ID for the Gym Member.
          readOnly: true
        email:
          type: string
          format: email
          description: The Member email address. It should be unique within the gym chain.
          minLength: 1
        firstName:
          type: string
          description: The Member first name.
          example: John
          minLength: 1
        lastName:
          type: string
          description: The Member last name.
          example: Wick
          minLength: 1
        dateOfBirth:
          type: string
          format: date
          description: 'The Member date of birth. format: yyyy-MM-dd'
        gender:
          type: string
          description: >-
            The Member gender. Please note that NON_BINARY is not correctly
            supported yet, we send it as FEMALE for the usage of the machines.
          enum:
            - MALE
            - FEMALE
            - NON_BINARY
        contact:
          $ref: '#/components/schemas/ContactDTO'
          description: The user's contact information
        membership:
          $ref: '#/components/schemas/MembershipDTO'
          description: The membership details.
      required:
        - email
        - firstName
        - gender
        - lastName
        - membership
    MembershipDTO:
      type: object
      properties:
        membershipId:
          type: string
          description: >-
            Member ID in the gym software. It must be unique for exactly one
            member in the gym chain.
          minLength: 1
        agreementNumber:
          type: string
          description: >-
            The agreement number is the number of the membership between the
            member and the gym chain.
        membershipType:
          type: string
          description: Type of the member's membership to determine available features.
          enum:
            - BASIC
            - PREMIUM
            - PROSPECT
            - CORPORATE_FITNESS
        membershipSubType:
          type: string
          description: >-
            Extension of membershipStatus for further customization for this
            user. One membershipStatus can have multiple membershipSubType.
          maxLength: 128
          minLength: 0
        endOfContract:
          type: string
          format: date
          description: >-
            Date when the member's contract ends. For gyms with automatic
            contract renewal, send the date when the contract would run out, if
            cancelled. Update the field when the contract was renewed (manually
            and automatically renewals). format: yyyy-MM-dd
        startOfContract:
          type: string
          format: date
          description: 'The date when the membership started. format: yyyy-MM-dd'
        referringMemberId:
          type: string
          description: MembershipId of the member who referred this member.
        barcode:
          type: string
          description: >-
            Member's barcode to check-in in the gym. Can be visualised on the
            Branded Member App and used for lookup to verify membership.
        verificationTAN:
          type: string
          description: >-
            Mandatory when creating new membership of type 'CORPORATE_FITNESS'
            or when updating membership to 'CORPORATE_FITNESS'. Member's
            verification TAN. Can be visualised on the Qualitrain Member App and
            used for Qualitrain Membership verification.
        corporateFitness:
          $ref: '#/components/schemas/CorporateFitnessDTO'
          description: >-
            The corporate fitness details. These fields are returned only in
            case membershipType=CORPORATE_FITNESS
          readOnly: true
      required:
        - membershipId
        - membershipType
        - startOfContract
    RfidDTO:
      type: object
      properties:
        rfid:
          type: string
          description: >-
            String representing RFID value in hex (with leading "0x"). Please
            ensure that the RFID string after "0x" contains an even number of
            hexadecimal characters and that only RFID information is sent in
            this field, but no other medium like magnetic stripe card numbers or
            bar codes.
          pattern: ^0x([0-9a-fA-F]{2})+$
        tagFormat:
          type: string
          description: The rfid tag format.
          enum:
            - HITAG1
            - MIFARE
            - LEGIC
      required:
        - rfid
    RfidListDTO:
      type: object
      properties:
        rfids:
          type: array
          description: List of the user's RFIDs
          items:
            $ref: '#/components/schemas/RfidDTO'
      required:
        - rfids
    UserProductDTO:
      type: object
      properties:
        productId:
          type: string
          description: The ID of the product.
          minLength: 1
        startDate:
          type: string
          format: date
          description: >-
            The date from which the specified product is active and can be used
            by the user. It must be today’s or future date in Timezone of the
            club. format: yyyy-MM-dd
        endDate:
          type: string
          format: date
          description: >-
            The date to which the specified product is active and can be used by
            the user. It must be future date in Timezone of the club. format:
            yyyy-MM-dd. Max date is 2050-12-31
      required:
        - productId
    AssignNfcTokenRequest:
      type: object
      description: Request payload for assigning an NFC token to a member account
      properties:
        collectorId:
          type: integer
          format: int32
          description: Google-specific pass issuer ID. Mutually exclusive with passTypeId.
        passTypeId:
          type: string
          description: Apple-specific pass issuer ID. Mutually exclusive with collectorId.
        token:
          type: string
          description: NFC token payload
          example: deadbeefcafebabe
          maxLength: 512
          minLength: 0
      required:
        - token
    Part: {}
    GymRolesDTO:
      type: object
      properties:
        trainer:
          type: boolean
          description: >-
            If trainer is true, assign trainer right for account, otherwise
            remove trainer rights.
        gymOwner:
          type: boolean
          description: >-
            If gymOwner is true, assign gymOwner right for account, otherwise
            remove gymOwner rights.
    PartnerPushNotificationDTO:
      type: object
      properties:
        text:
          type: string
          description: Notification plain text.
          example: Welcome to the gym!
          maxLength: 500
          minLength: 0
        deeplink:
          type: string
          description: Name of the feature for navigate to.
          example: workouts
          maxLength: 100
          minLength: 0
      required:
        - text
    UserPresenceDTO:
      type: object
      properties:
        timestamp:
          type: integer
          format: int64
          description: >-
            Timestamp in milliseconds since epoch for a checkin / checkout event
            that happened in the past.
          example: 1612790783000
    AdmissionDTO:
      type: object
      properties:
        firstAdmission:
          type: boolean
          description: >-
            If this member has been admitted for the first time in the gym this
            will be true, false otherwise.
      required:
        - firstAdmission
    PatchMemberAccountDTO:
      type: object
      properties:
        email:
          type: string
          format: email
          description: The Member email address. It should be unique within the gym chain.
        firstName:
          type: string
          description: The Member first name.
          example: John
        lastName:
          type: string
          description: The Member last name.
          example: Wick
        dateOfBirth:
          type: string
          format: date
          description: 'The Member date of birth. format: yyyy-MM-dd'
        gender:
          type: string
          description: >-
            The Member gender. Please note that NON_BINARY is not correctly
            supported yet, we send it as FEMALE for the usage of the machines.
          enum:
            - MALE
            - FEMALE
            - NON_BINARY
        contact:
          $ref: '#/components/schemas/ContactDTO'
          description: The user's contact information
        membership:
          $ref: '#/components/schemas/PatchMembershipDTO'
          description: The membership details.
    PatchMembershipDTO:
      type: object
      properties:
        membershipId:
          type: string
          description: >-
            Member ID in the gym software. It must be unique for exactly one
            member in the gym chain.
        agreementNumber:
          type: string
          description: >-
            The agreement number is the number of the membership between the
            member and the gym chain.
        membershipType:
          type: string
          description: Type of the member's membership to determine available features.
          enum:
            - BASIC
            - PREMIUM
            - PROSPECT
            - CORPORATE_FITNESS
        membershipSubType:
          type: string
          description: >-
            Extension of membershipStatus for further customization for this
            user. One membershipStatus can have multiple membershipSubType.
          maxLength: 128
          minLength: 0
        endOfContract:
          type: string
          format: date
          description: >-
            Date when the member's contract ends. For gyms with automatic
            contract renewal, send the date when the contract would run out, if
            cancelled. Update the field when the contract was renewed (manually
            and automatically renewals). format: yyyy-MM-dd
        startOfContract:
          type: string
          format: date
          description: 'The date when the membership started. format: yyyy-MM-dd'
        referringMemberId:
          type: string
          description: MembershipId of the member who referred this member.
        barcode:
          type: string
          description: >-
            Member's barcode to check-in in the gym. Can be visualised on the
            Branded Member App and used for lookup to verify membership.
    ProductDTO:
      type: object
      properties:
        productId:
          type: string
          description: The ID of the product.
          readOnly: true
        title:
          type: string
          description: Product title.
          readOnly: true
        description:
          type: string
          description: Product description.
          readOnly: true
        scope:
          type: string
          description: The scope of the bookable package.
          enum:
            - LOCATION
            - CHAIN
            - BRAND
    PageableResponseMemberAccountDTO:
      type: object
      properties:
        offset:
          type: integer
          format: int32
          example: 0
        limit:
          type: integer
          format: int32
          example: 10
        items:
          type: array
          items:
            $ref: '#/components/schemas/MemberAccountDTO'
        total:
          type: integer
          format: int64
          example: 100
        hasNext:
          type: boolean
          example: true
    NfcTokenDTO:
      type: object
      description: Represents an NFC token assigned to a member account
      properties:
        token:
          type: string
          description: NFC token payload
          example: deadbeefcafebabe
  securitySchemes:
    mms:
      type: apiKey
      description: >-
        Authentication is validated via an API key that is generated by EGYM for
        each gym location. This API key will not be identical with the access
        token used in the EGYM Gym API v1
      name: x-api-key
      in: header
x-tagGroups:
  - tags:
      - Member Account
      - Member Account Roles
      - Member RFIDs
      - Products booking
    name: Member Account Management
  - tags:
      - Member Account NFC
    name: NFC management (Beta version)
  - tags:
      - Migrating members
    name: Member Migration
  - tags:
      - Gym Visit
    name: Gym Visit Management
  - tags:
      - Trainer Task
    name: Trainer Task Management
  - tags:
      - Webhooks
      - Push notifications
    name: Integration
