openapi: 3.0.3
info:
  title: 'Aether API'
  description: ''
  version: 1.0.0
servers:
  -
    url: 'http://localhost:8000'
tags:
  -
    name: Acadle
    description: 'Endpoints related to Acadle integration'
  -
    name: 'Activation codes'
    description: 'API endpoints for activation codes'
  -
    name: Authentication
    description: 'API endpoints for managing authentication'
  -
    name: Chat
    description: 'API endpoints for chat management'
  -
    name: Config
    description: 'API endpoints for device config management'
  -
    name: 'Config Demo'
    description: 'API endpoints for managing config demos'
  -
    name: 'Config Modes'
    description: 'API endpoints for managing config modes'
  -
    name: 'Config Notes'
    description: 'API endpoints for config history notes'
  -
    name: 'Config Schema'
    description: 'API endpoints for config schema management'
  -
    name: 'Config Templates'
    description: 'API endpoints for managing config templates'
  -
    name: 'Config Templates Notes'
    description: 'API endpoints for config templates notes'
  -
    name: 'Custom Grips'
    description: 'API endpoints for custom grips management'
  -
    name: 'Device Models'
    description: 'API endpoints for device models management'
  -
    name: Devices
    description: 'API endpoints for devices management'
  -
    name: Documents
    description: 'API endpoints for documents management'
  -
    name: Feedback
    description: 'Endpoints related to feedback collecting'
  -
    name: GeoData
    description: 'API endpoints for geodata'
  -
    name: Goals
    description: "API endpoints for goals\n\nThe goals module consists of:\n - <strong>exercises</strong> - predefined actions which should be performed by patient. Exercises can be managed only by SuperAdmin,\n - <strong>goals</strong> - objectives defined for each patient which could consists of exercises, grips and grip switches,\n - <strong>goal conditions</strong> - parts of the goal, single condition of type exercise, grips goal or switches goal."
  -
    name: Invitations
    description: ''
  -
    name: Logs
    description: 'API endpoints for managing event logs'
  -
    name: Messages
    description: 'API endpoints for message center'
  -
    name: 'Mobile logs'
    description: 'API endpoints for managing mobile logs'
  -
    name: 'P2P Sessions'
    description: 'API endpoints for managing P2P (peer-to-peer) sessions'
  -
    name: 'Product features and toggles'
    description: "API endpoints for product features and toggles management\n\nDefinitions:\n<ul>\n<li><strong>Product feature</strong> - part of application which can be considered\nas hardware compatible (with for example specific PCB version)\nor software compatible (with for example specific firmware version).\nProduct features are used in versions compatibility matrix.</li>\n<li><strong>Product toggle</strong> - part of application which can be enabled and disabled for current environment.</li>\n</ul>"
  -
    name: Releases
    description: 'API endpoints for releases management'
  -
    name: Search
    description: 'API endpoints for search'
  -
    name: Servicing
    description: 'API endpoints for servicing'
  -
    name: Settings
    description: 'API endpoints for app settings'
  -
    name: 'Support Ticket'
    description: 'API endpoints for managing support tickets'
  -
    name: Tooltips
    description: 'API endpoints for managing tooltips'
  -
    name: Trainings
    description: 'API endpoints for trainings'
  -
    name: Users
    description: 'API endpoints for user management'
  -
    name: Versions
    description: 'API endpoints for versions management'
  -
    name: 'Video sessions'
    description: 'API endpoints for managing video sessions'
components:
  securitySchemes:
    default:
      type: http
      scheme: bearer
      description: "<h3>Token based authentication</h3>\n<p>You can retrieve your access token by calling <a href=\"#login-user\">api/login</a> endpoint.</p>\n<p>Access tokens are valid 7 days, then expire. You can obtain new access token with expiring access token by calling\n<a href=\"#refresh-access-token\">/api/token/refresh</a>.\nYou can only refresh still valid tokens, otherwise new request to <a href=\"#login-user\">api/login</a> will be required.</p>\n\n<h3>Cookie based authentication</h3>\n<p>You can also authenticate using cookie-based sessions. Before calling any other endpoints you have to obtain XSRF cookie by hitting <code>/sanctum/csrf-cookie</code> endpoint.\nIn return you receive XSRF-TOKEN cookie, which content you have to attach to each request as X-XSRF-TOKEN header.</p>\n<p>Then call <a href=\"#login-user-spa\">/login</a> endpoint. When your authenticated session is created, call any endpoint using X-XSRF-TOKEN header.</p>\n\n<h3>Multi-Factor Authorization (MFA)</h3>\n<p>User can protect its account setting up the MFA as email or one-time passwords (OTP).\nIf <code>mfa_enabled</code> is set to 1 and <code>mfa_method</code> is set to any of email or otp values,\nuser will have to use preferred method as second factor on login.<p>\n<p>If <code>mfa_method</code> is email, API will automatically send MFA code to user's email inbox.</p>\n<p>Most of API endpoints are secured with additional layer and cannot be properly called without this second-factor authorization done.\nInstead of endpoint response API will reply with message <code>\"MFA is required for this request.\"</code> and HTTP code <code>401 Unauthorized</code>.\nThat means user did not successfully authorized itself with second-factor.</p>\n\n<h3>Multi-Factor Authorization (MFA) - Remember Session</h3>\n<p>The user has the option to remember their device, which means they won't have to enter the MFA code for 30 days.\nIf using a Token based authentication, you need to add a header named <b><code>X-MFA-Session-Token</code></b> with the value <b><code>{mfa_token}</code></b> obtained from the <a href=\"#verify-mfa-code\">/verify</a> endpoint.\n</p>"
security:
  -
    default: []
paths:
  /api/acadle/sso:
    post:
      summary: 'Acadle SSO'
      operationId: acadleSSO
      description: 'Creates the SSO authorization link. The link expires after 60 seconds, but can be re-generated without any limits.'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  sso_url: 'https://adp.acadle.com/sso/authenticate/callback?ssoToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MzczNzU3OTksImV4cCI6MTczNzM3NTg1OSwiZmlyc3RuYW1lIjoiVG9tIiwibGFzdG5hbWUiOiJTbWl0aCIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsInVzZXJuYW1lIjpudWxsLCJ0aW1lem9uZSI6IlVUQyJ9.VzE2q6V53bdYJM7aB6CWWxDqcxF4gpdiEF80dD9j-5k'
                  sso_expires: 1737375859
                properties:
                  sso_url:
                    type: string
                    example: 'https://adp.acadle.com/sso/authenticate/callback?ssoToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MzczNzU3OTksImV4cCI6MTczNzM3NTg1OSwiZmlyc3RuYW1lIjoiVG9tIiwibGFzdG5hbWUiOiJTbWl0aCIsImVtYWlsIjoidGVzdEBleGFtcGxlLmNvbSIsInVzZXJuYW1lIjpudWxsLCJ0aW1lem9uZSI6IlVUQyJ9.VzE2q6V53bdYJM7aB6CWWxDqcxF4gpdiEF80dD9j-5k'
                  sso_expires:
                    type: integer
                    example: 1737375859
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to use Acadle'
                      code: 'ACADLE:SSO:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to use Acadle'
                      code:
                        type: string
                        example: 'ACADLE:SSO:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Survey required'
                    type: object
                    example:
                      message: 'Completing the survey is required to proceed to Acadle'
                      code: 'ACADLE:SSO:SURVEY_REQUIRED'
                    properties:
                      message:
                        type: string
                        example: 'Completing the survey is required to proceed to Acadle'
                      code:
                        type: string
                        example: 'ACADLE:SSO:SURVEY_REQUIRED'
      tags:
        - Acadle
  /api/acadle/survey/status:
    get:
      summary: 'Check Acadle survey status'
      operationId: checkAcadleSurveyStatus
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  survey_sent: false
                  survey_id: null
                properties:
                  survey_sent:
                    type: boolean
                    example: false
                  survey_id:
                    type: string
                    example: null
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to use Acadle'
                  code: 'ACADLE:SURVEY_STATUS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to use Acadle'
                  code:
                    type: string
                    example: 'ACADLE:SURVEY_STATUS:INSUFFICIENT_PERMISSION'
      tags:
        - Acadle
  /api/acadle/survey:
    get:
      summary: 'Get Acadle survey data'
      operationId: getAcadleSurveyData
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  user_id: 296
                  cpo_number: '35233'
                  country: Slovenia
                  medical_training: physiotherapist
                  myo_exp_zeus: '1'
                  has_demo_hand_access: 0
                  wants_demo_hand: 0
                  myo_exp_covvi: 1
                  myo_exp_fillauer: 0
                  myo_exp_ossur: 0
                  myo_exp_ottobock: 0
                  myo_exp_steeper: 1
                  myo_exp_taska: 0
                  myo_exp_vincent: 1
                  myo_exp_pattern_recognition: 0
                  myo_exp_other: 'Debitis quo et molestias facere autem corporis rerum.'
                  partial_hand_protheses: '1'
                  below_elbow_protheses_single_action: '3'
                  below_elbow_protheses_multi_action: '3'
                  above_elbow_protheses: '1'
                  shoulder_protheses: '5'
                  zeus_components_description: 'Sunt asperiores facilis deleniti.'
                  contact_name: Princess
                  contact_surname: Jacobs
                  company_name: 'Leuschke, Wilderman and Greenholt'
                  street: '668 Pouros Place Apt. 752'
                  city: 'South Koletown'
                  postal_code: 78369-5897
                  email: dino.monahan@mayert.com
                  phone: 1-407-247-9491
                  phone_country: ba
                  device_side: R
                  created_at: '2026-01-12T16:48:09.000000Z'
                  updated_at: '2026-01-12T16:48:09.000000Z'
                properties:
                  id:
                    type: integer
                    example: 1
                  user_id:
                    type: integer
                    example: 296
                  cpo_number:
                    type: string
                    example: '35233'
                  country:
                    type: string
                    example: Slovenia
                  medical_training:
                    type: string
                    example: physiotherapist
                  myo_exp_zeus:
                    type: string
                    example: '1'
                  has_demo_hand_access:
                    type: integer
                    example: 0
                  wants_demo_hand:
                    type: integer
                    example: 0
                  myo_exp_covvi:
                    type: integer
                    example: 1
                  myo_exp_fillauer:
                    type: integer
                    example: 0
                  myo_exp_ossur:
                    type: integer
                    example: 0
                  myo_exp_ottobock:
                    type: integer
                    example: 0
                  myo_exp_steeper:
                    type: integer
                    example: 1
                  myo_exp_taska:
                    type: integer
                    example: 0
                  myo_exp_vincent:
                    type: integer
                    example: 1
                  myo_exp_pattern_recognition:
                    type: integer
                    example: 0
                  myo_exp_other:
                    type: string
                    example: 'Debitis quo et molestias facere autem corporis rerum.'
                  partial_hand_protheses:
                    type: string
                    example: '1'
                  below_elbow_protheses_single_action:
                    type: string
                    example: '3'
                  below_elbow_protheses_multi_action:
                    type: string
                    example: '3'
                  above_elbow_protheses:
                    type: string
                    example: '1'
                  shoulder_protheses:
                    type: string
                    example: '5'
                  zeus_components_description:
                    type: string
                    example: 'Sunt asperiores facilis deleniti.'
                  contact_name:
                    type: string
                    example: Princess
                  contact_surname:
                    type: string
                    example: Jacobs
                  company_name:
                    type: string
                    example: 'Leuschke, Wilderman and Greenholt'
                  street:
                    type: string
                    example: '668 Pouros Place Apt. 752'
                  city:
                    type: string
                    example: 'South Koletown'
                  postal_code:
                    type: string
                    example: 78369-5897
                  email:
                    type: string
                    example: dino.monahan@mayert.com
                  phone:
                    type: string
                    example: 1-407-247-9491
                  phone_country:
                    type: string
                    example: ba
                  device_side:
                    type: string
                    example: R
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:09.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:09.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to use Acadle'
                  code: 'ACADLE:SURVEY_RESULTS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to use Acadle'
                  code:
                    type: string
                    example: 'ACADLE:SURVEY_RESULTS:INSUFFICIENT_PERMISSION'
        404:
          description: 'Survey not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Survey not found'
                  code: 'ACADLE:SURVEY_RESULTS:SURVEY_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Survey not found'
                  code:
                    type: string
                    example: 'ACADLE:SURVEY_RESULTS:SURVEY_NOT_FOUND'
      tags:
        - Acadle
    post:
      summary: 'Send Acadle survey'
      operationId: sendAcadleSurvey
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 5
                  user_id: 300
                  cpo_number: '35262'
                  country: 'Brunei Darussalam'
                  medical_training: physiotherapist
                  myo_exp_zeus: '0'
                  has_demo_hand_access: 1
                  wants_demo_hand: 1
                  myo_exp_covvi: 0
                  myo_exp_fillauer: 0
                  myo_exp_ossur: 0
                  myo_exp_ottobock: 1
                  myo_exp_steeper: 0
                  myo_exp_taska: 1
                  myo_exp_vincent: 0
                  myo_exp_pattern_recognition: 1
                  myo_exp_other: 'Voluptate qui voluptatem modi voluptas nisi repellat suscipit.'
                  partial_hand_protheses: '2'
                  below_elbow_protheses_single_action: '4'
                  below_elbow_protheses_multi_action: '0'
                  above_elbow_protheses: '5'
                  shoulder_protheses: '5'
                  zeus_components_description: 'Velit odit deserunt qui consectetur nulla blanditiis qui.'
                  contact_name: Winifred
                  contact_surname: Lesch
                  company_name: 'Heathcote Inc'
                  street: '929 Reichert Forge Apt. 369'
                  city: 'Port Christa'
                  postal_code: 98791-1839
                  email: beatty.augustine@wyman.org
                  phone: 1-401-752-7370
                  phone_country: vn
                  device_side: R
                  created_at: '2026-01-12T16:48:09.000000Z'
                  updated_at: '2026-01-12T16:48:09.000000Z'
                properties:
                  id:
                    type: integer
                    example: 5
                  user_id:
                    type: integer
                    example: 300
                  cpo_number:
                    type: string
                    example: '35262'
                  country:
                    type: string
                    example: 'Brunei Darussalam'
                  medical_training:
                    type: string
                    example: physiotherapist
                  myo_exp_zeus:
                    type: string
                    example: '0'
                  has_demo_hand_access:
                    type: integer
                    example: 1
                  wants_demo_hand:
                    type: integer
                    example: 1
                  myo_exp_covvi:
                    type: integer
                    example: 0
                  myo_exp_fillauer:
                    type: integer
                    example: 0
                  myo_exp_ossur:
                    type: integer
                    example: 0
                  myo_exp_ottobock:
                    type: integer
                    example: 1
                  myo_exp_steeper:
                    type: integer
                    example: 0
                  myo_exp_taska:
                    type: integer
                    example: 1
                  myo_exp_vincent:
                    type: integer
                    example: 0
                  myo_exp_pattern_recognition:
                    type: integer
                    example: 1
                  myo_exp_other:
                    type: string
                    example: 'Voluptate qui voluptatem modi voluptas nisi repellat suscipit.'
                  partial_hand_protheses:
                    type: string
                    example: '2'
                  below_elbow_protheses_single_action:
                    type: string
                    example: '4'
                  below_elbow_protheses_multi_action:
                    type: string
                    example: '0'
                  above_elbow_protheses:
                    type: string
                    example: '5'
                  shoulder_protheses:
                    type: string
                    example: '5'
                  zeus_components_description:
                    type: string
                    example: 'Velit odit deserunt qui consectetur nulla blanditiis qui.'
                  contact_name:
                    type: string
                    example: Winifred
                  contact_surname:
                    type: string
                    example: Lesch
                  company_name:
                    type: string
                    example: 'Heathcote Inc'
                  street:
                    type: string
                    example: '929 Reichert Forge Apt. 369'
                  city:
                    type: string
                    example: 'Port Christa'
                  postal_code:
                    type: string
                    example: 98791-1839
                  email:
                    type: string
                    example: beatty.augustine@wyman.org
                  phone:
                    type: string
                    example: 1-401-752-7370
                  phone_country:
                    type: string
                    example: vn
                  device_side:
                    type: string
                    example: R
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:09.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:09.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to use Acadle'
                      code: 'ACADLE:SURVEY_SEND:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to use Acadle'
                      code:
                        type: string
                        example: 'ACADLE:SURVEY_SEND:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Survey already sent'
                    type: object
                    example:
                      message: 'Survey already sent'
                      code: 'ACADLE:SURVEY_SEND:SURVEY_ALREADY_SENT'
                    properties:
                      message:
                        type: string
                        example: 'Survey already sent'
                      code:
                        type: string
                        example: 'ACADLE:SURVEY_SEND:SURVEY_ALREADY_SENT'
      tags:
        - Acadle
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                cpo_number:
                  type: string
                  description: 'CPO Number.'
                  example: 11
                country:
                  type: string
                  description: 'Country name.'
                  example: Norway
                medical_training:
                  type: string
                  description: "Clinician's medical/clinical training."
                  example: physician
                  enum:
                    - clinician
                    - physiotherapist
                    - physician
                    - biomedical_engineer
                    - other
                    - prosthetist
                myo_exp_zeus:
                  type: boolean
                  description: 'Does clinician have an experience working with Zeus hands.'
                  example: false
                myo_exp_covvi:
                  type: boolean
                  description: 'Does clinician have an experience working with Covvi hands.'
                  example: false
                myo_exp_fillauer:
                  type: boolean
                  description: 'Does clinician have an experience working with Fillauer hands.'
                  example: false
                myo_exp_ossur:
                  type: boolean
                  description: 'Does clinician have an experience working with Ossur hands.'
                  example: false
                myo_exp_ottobock:
                  type: boolean
                  description: 'Does clinician have an experience working with Ottobock hands.'
                  example: false
                myo_exp_steeper:
                  type: boolean
                  description: 'Does clinician have an experience working with Steeper hands.'
                  example: false
                myo_exp_taska:
                  type: boolean
                  description: 'Does clinician have an experience working with Taska hands.'
                  example: false
                myo_exp_vincent:
                  type: boolean
                  description: 'Does clinician have an experience working with Vincent hands.'
                  example: false
                myo_exp_pattern_recognition:
                  type: boolean
                  description: 'Does clinician have an experience working with Pattern Recognition.'
                  example: false
                myo_exp_other:
                  type: string
                  description: 'Does clinician have an experience working with any other hands. MINIMUM:STRING_LENGTH:3.'
                  example: 'Omnis quis nihil nobis dolores hic error laborum.'
                has_demo_hand_access:
                  type: boolean
                  description: 'Does clinician have access to a demo hand.'
                  example: false
                wants_demo_hand:
                  type: boolean
                  description: 'Does clinician want a demo hand.'
                  example: false
                partial_hand_protheses:
                  type: string
                  description: 'How many prostheses of type partial hand does clinician make per year.'
                  example: 1-5
                below_elbow_protheses_single_action:
                  type: string
                  description: 'How many prostheses of type below elbow (single-action) does clinician make per year.'
                  example: 1-5
                below_elbow_protheses_multi_action:
                  type: string
                  description: 'How many prostheses of type below elbow (multi-action) does clinician make per year.'
                  example: 5-10
                above_elbow_protheses:
                  type: string
                  description: 'How many prostheses of type above elbow does clinician make per year.'
                  example: 50+
                shoulder_protheses:
                  type: string
                  description: 'How many prostheses of type shoulder does clinician make per year.'
                  example: 1-5
                zeus_components_description:
                  type: string
                  description: 'Description which components would clinician like to use with a Zeus hand. MINIMUM:STRING_LENGTH:10.'
                  example: 'Reiciendis labore rerum iusto harum.'
                contact_name:
                  type: string
                  description: 'Contact information: full name. This field is required when <code>wants_demo_hand</code> is <code>true</code>.'
                  example: Jamir
                company_name:
                  type: string
                  description: 'Contact information: company name. This field is required when <code>wants_demo_hand</code> is <code>true</code>.'
                  example: 'Cummings, Wiegand and Rohan'
                street:
                  type: string
                  description: 'Contact information: street. This field is required when <code>wants_demo_hand</code> is <code>true</code>.'
                  example: '78543 Alene Street'
                city:
                  type: string
                  description: 'Contact information: city/state. This field is required when <code>wants_demo_hand</code> is <code>true</code>.'
                  example: 'North Mckenna'
                postal_code:
                  type: string
                  description: 'Contact information: postal code. This field is required when <code>wants_demo_hand</code> is <code>true</code>.'
                  example: '55668'
                email:
                  type: string
                  description: 'Contact information: email. This field is required when <code>wants_demo_hand</code> is <code>true</code>. MUST_BE_EMAIL.'
                  example: tromp.alford@casper.com
                phone:
                  type: string
                  description: 'Contact information: phone. This field is required when <code>wants_demo_hand</code> is <code>true</code>.'
                  example: 769-400-9430
                phone_country:
                  type: string
                  description: 'Contact information: phone country. This field is required when <code>wants_demo_hand</code> is <code>true</code>. SIZE:STRING_LENGTH:2.'
                  example: IR
                device_side:
                  type: string
                  description: 'The side of the hand. This field is required when <code>wants_demo_hand</code> is <code>true</code>.'
                  example: R
                  enum:
                    - L
                    - R
              required:
                - country
                - medical_training
                - myo_exp_zeus
                - myo_exp_covvi
                - myo_exp_fillauer
                - myo_exp_ossur
                - myo_exp_ottobock
                - myo_exp_steeper
                - myo_exp_taska
                - myo_exp_vincent
                - myo_exp_pattern_recognition
                - has_demo_hand_access
                - wants_demo_hand
  '/api/acadle/survey/{id}':
    get:
      summary: 'Get Acadle survey data (SuperAdmin)'
      operationId: getAcadleSurveyDataSuperAdmin
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 2
                  user_id: 297
                  cpo_number: '7730742'
                  country: 'French Southern Territories'
                  medical_training: biomedical_engineer
                  myo_exp_zeus: '1'
                  has_demo_hand_access: 1
                  wants_demo_hand: 0
                  myo_exp_covvi: 1
                  myo_exp_fillauer: 1
                  myo_exp_ossur: 0
                  myo_exp_ottobock: 0
                  myo_exp_steeper: 0
                  myo_exp_taska: 1
                  myo_exp_vincent: 1
                  myo_exp_pattern_recognition: 0
                  myo_exp_other: 'Impedit aut vero quo et nisi sed perferendis.'
                  partial_hand_protheses: '4'
                  below_elbow_protheses_single_action: '2'
                  below_elbow_protheses_multi_action: '4'
                  above_elbow_protheses: '5'
                  shoulder_protheses: '4'
                  zeus_components_description: 'Cumque aut assumenda expedita vel et soluta maxime.'
                  contact_name: Cheyanne
                  contact_surname: Crist
                  company_name: 'Kshlerin PLC'
                  street: '9526 Javon Grove'
                  city: 'East Christopbury'
                  postal_code: '51602'
                  email: heaney.russell@goldner.info
                  phone: 585.881.4266
                  phone_country: mf
                  device_side: R
                  created_at: '2026-01-12T16:48:09.000000Z'
                  updated_at: '2026-01-12T16:48:09.000000Z'
                properties:
                  id:
                    type: integer
                    example: 2
                  user_id:
                    type: integer
                    example: 297
                  cpo_number:
                    type: string
                    example: '7730742'
                  country:
                    type: string
                    example: 'French Southern Territories'
                  medical_training:
                    type: string
                    example: biomedical_engineer
                  myo_exp_zeus:
                    type: string
                    example: '1'
                  has_demo_hand_access:
                    type: integer
                    example: 1
                  wants_demo_hand:
                    type: integer
                    example: 0
                  myo_exp_covvi:
                    type: integer
                    example: 1
                  myo_exp_fillauer:
                    type: integer
                    example: 1
                  myo_exp_ossur:
                    type: integer
                    example: 0
                  myo_exp_ottobock:
                    type: integer
                    example: 0
                  myo_exp_steeper:
                    type: integer
                    example: 0
                  myo_exp_taska:
                    type: integer
                    example: 1
                  myo_exp_vincent:
                    type: integer
                    example: 1
                  myo_exp_pattern_recognition:
                    type: integer
                    example: 0
                  myo_exp_other:
                    type: string
                    example: 'Impedit aut vero quo et nisi sed perferendis.'
                  partial_hand_protheses:
                    type: string
                    example: '4'
                  below_elbow_protheses_single_action:
                    type: string
                    example: '2'
                  below_elbow_protheses_multi_action:
                    type: string
                    example: '4'
                  above_elbow_protheses:
                    type: string
                    example: '5'
                  shoulder_protheses:
                    type: string
                    example: '4'
                  zeus_components_description:
                    type: string
                    example: 'Cumque aut assumenda expedita vel et soluta maxime.'
                  contact_name:
                    type: string
                    example: Cheyanne
                  contact_surname:
                    type: string
                    example: Crist
                  company_name:
                    type: string
                    example: 'Kshlerin PLC'
                  street:
                    type: string
                    example: '9526 Javon Grove'
                  city:
                    type: string
                    example: 'East Christopbury'
                  postal_code:
                    type: string
                    example: '51602'
                  email:
                    type: string
                    example: heaney.russell@goldner.info
                  phone:
                    type: string
                    example: 585.881.4266
                  phone_country:
                    type: string
                    example: mf
                  device_side:
                    type: string
                    example: R
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:09.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:09.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to use Acadle'
                  code: 'ACADLE:SURVEY_RESULTS_ADMIN:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to use Acadle'
                  code:
                    type: string
                    example: 'ACADLE:SURVEY_RESULTS_ADMIN:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'User not found'
                    type: object
                    example:
                      message: 'User not found'
                      code: 'ACADLE:SURVEY_RESULTS_ADMIN:USER_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User not found'
                      code:
                        type: string
                        example: 'ACADLE:SURVEY_RESULTS_ADMIN:USER_NOT_FOUND'
                  -
                    description: 'Survey not found'
                    type: object
                    example:
                      message: 'Survey not found'
                      code: 'ACADLE:SURVEY_RESULTS_ADMIN:SURVEY_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Survey not found'
                      code:
                        type: string
                        example: 'ACADLE:SURVEY_RESULTS_ADMIN:SURVEY_NOT_FOUND'
      tags:
        - Acadle
    parameters:
      -
        in: path
        name: id
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/acadle/surveys:
    get:
      summary: 'List all Acadle surveys (SuperAdmin)'
      operationId: listAllAcadleSurveysSuperAdmin
      description: ''
      parameters:
        -
          in: query
          name: search
          description: 'Filter surveys by searching in: user name, user email, contact name, contact surname, contact email, CPO number.'
          example: john
          required: false
          schema:
            type: string
            description: 'Filter surveys by searching in: user name, user email, contact name, contact surname, contact email, CPO number.'
            example: john
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>user</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>user</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>, <code>user_name</code>, <code>user_email</code>, <code>contact_name</code>, <code>contact_surname</code>, <code>country</code>, <code>medical_training</code>, <code>cpo_number</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>, <code>user_name</code>, <code>user_email</code>, <code>contact_name</code>, <code>contact_surname</code>, <code>country</code>, <code>medical_training</code>, <code>cpo_number</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 3
                      user_id: 298
                      cpo_number: '62'
                      country: Burundi
                      medical_training: physiotherapist
                      myo_exp_zeus: '0'
                      has_demo_hand_access: 1
                      wants_demo_hand: 0
                      myo_exp_covvi: 0
                      myo_exp_fillauer: 0
                      myo_exp_ossur: 0
                      myo_exp_ottobock: 1
                      myo_exp_steeper: 1
                      myo_exp_taska: 0
                      myo_exp_vincent: 1
                      myo_exp_pattern_recognition: 1
                      myo_exp_other: 'Repellat voluptatum maiores ex ea esse.'
                      partial_hand_protheses: '2'
                      below_elbow_protheses_single_action: '5'
                      below_elbow_protheses_multi_action: '3'
                      above_elbow_protheses: '0'
                      shoulder_protheses: '0'
                      zeus_components_description: 'Natus aperiam corrupti eveniet sunt.'
                      contact_name: Kaitlyn
                      contact_surname: Price
                      company_name: 'Dickens, Boyer and Sanford'
                      street: '953 Estevan Summit Apt. 841'
                      city: Stuartbury
                      postal_code: '96331'
                      email: orin.beer@schaefer.info
                      phone: 936-989-0688
                      phone_country: lt
                      device_side: R
                      created_at: '2026-01-12T16:48:09.000000Z'
                      updated_at: '2026-01-12T16:48:09.000000Z'
                    -
                      id: 4
                      user_id: 299
                      cpo_number: '300'
                      country: Iraq
                      medical_training: clinician
                      myo_exp_zeus: '1'
                      has_demo_hand_access: 0
                      wants_demo_hand: 0
                      myo_exp_covvi: 1
                      myo_exp_fillauer: 0
                      myo_exp_ossur: 0
                      myo_exp_ottobock: 1
                      myo_exp_steeper: 0
                      myo_exp_taska: 1
                      myo_exp_vincent: 1
                      myo_exp_pattern_recognition: 1
                      myo_exp_other: 'Aspernatur blanditiis est similique ut.'
                      partial_hand_protheses: '1'
                      below_elbow_protheses_single_action: '1'
                      below_elbow_protheses_multi_action: '3'
                      above_elbow_protheses: '4'
                      shoulder_protheses: '0'
                      zeus_components_description: 'Laborum et vel aliquam excepturi ut nobis eligendi.'
                      contact_name: Andreane
                      contact_surname: Boehm
                      company_name: 'Fisher, Vandervort and Schimmel'
                      street: '178 Stroman Neck'
                      city: Kuhnchester
                      postal_code: 77146-7561
                      email: schimmel.mireille@botsford.com
                      phone: +1-484-561-9346
                      phone_country: jp
                      device_side: R
                      created_at: '2026-01-12T16:48:09.000000Z'
                      updated_at: '2026-01-12T16:48:09.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 3
                        user_id: 298
                        cpo_number: '62'
                        country: Burundi
                        medical_training: physiotherapist
                        myo_exp_zeus: '0'
                        has_demo_hand_access: 1
                        wants_demo_hand: 0
                        myo_exp_covvi: 0
                        myo_exp_fillauer: 0
                        myo_exp_ossur: 0
                        myo_exp_ottobock: 1
                        myo_exp_steeper: 1
                        myo_exp_taska: 0
                        myo_exp_vincent: 1
                        myo_exp_pattern_recognition: 1
                        myo_exp_other: 'Repellat voluptatum maiores ex ea esse.'
                        partial_hand_protheses: '2'
                        below_elbow_protheses_single_action: '5'
                        below_elbow_protheses_multi_action: '3'
                        above_elbow_protheses: '0'
                        shoulder_protheses: '0'
                        zeus_components_description: 'Natus aperiam corrupti eveniet sunt.'
                        contact_name: Kaitlyn
                        contact_surname: Price
                        company_name: 'Dickens, Boyer and Sanford'
                        street: '953 Estevan Summit Apt. 841'
                        city: Stuartbury
                        postal_code: '96331'
                        email: orin.beer@schaefer.info
                        phone: 936-989-0688
                        phone_country: lt
                        device_side: R
                        created_at: '2026-01-12T16:48:09.000000Z'
                        updated_at: '2026-01-12T16:48:09.000000Z'
                      -
                        id: 4
                        user_id: 299
                        cpo_number: '300'
                        country: Iraq
                        medical_training: clinician
                        myo_exp_zeus: '1'
                        has_demo_hand_access: 0
                        wants_demo_hand: 0
                        myo_exp_covvi: 1
                        myo_exp_fillauer: 0
                        myo_exp_ossur: 0
                        myo_exp_ottobock: 1
                        myo_exp_steeper: 0
                        myo_exp_taska: 1
                        myo_exp_vincent: 1
                        myo_exp_pattern_recognition: 1
                        myo_exp_other: 'Aspernatur blanditiis est similique ut.'
                        partial_hand_protheses: '1'
                        below_elbow_protheses_single_action: '1'
                        below_elbow_protheses_multi_action: '3'
                        above_elbow_protheses: '4'
                        shoulder_protheses: '0'
                        zeus_components_description: 'Laborum et vel aliquam excepturi ut nobis eligendi.'
                        contact_name: Andreane
                        contact_surname: Boehm
                        company_name: 'Fisher, Vandervort and Schimmel'
                        street: '178 Stroman Neck'
                        city: Kuhnchester
                        postal_code: 77146-7561
                        email: schimmel.mireille@botsford.com
                        phone: +1-484-561-9346
                        phone_country: jp
                        device_side: R
                        created_at: '2026-01-12T16:48:09.000000Z'
                        updated_at: '2026-01-12T16:48:09.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 3
                        user_id:
                          type: integer
                          example: 298
                        cpo_number:
                          type: string
                          example: '62'
                        country:
                          type: string
                          example: Burundi
                        medical_training:
                          type: string
                          example: physiotherapist
                        myo_exp_zeus:
                          type: string
                          example: '0'
                        has_demo_hand_access:
                          type: integer
                          example: 1
                        wants_demo_hand:
                          type: integer
                          example: 0
                        myo_exp_covvi:
                          type: integer
                          example: 0
                        myo_exp_fillauer:
                          type: integer
                          example: 0
                        myo_exp_ossur:
                          type: integer
                          example: 0
                        myo_exp_ottobock:
                          type: integer
                          example: 1
                        myo_exp_steeper:
                          type: integer
                          example: 1
                        myo_exp_taska:
                          type: integer
                          example: 0
                        myo_exp_vincent:
                          type: integer
                          example: 1
                        myo_exp_pattern_recognition:
                          type: integer
                          example: 1
                        myo_exp_other:
                          type: string
                          example: 'Repellat voluptatum maiores ex ea esse.'
                        partial_hand_protheses:
                          type: string
                          example: '2'
                        below_elbow_protheses_single_action:
                          type: string
                          example: '5'
                        below_elbow_protheses_multi_action:
                          type: string
                          example: '3'
                        above_elbow_protheses:
                          type: string
                          example: '0'
                        shoulder_protheses:
                          type: string
                          example: '0'
                        zeus_components_description:
                          type: string
                          example: 'Natus aperiam corrupti eveniet sunt.'
                        contact_name:
                          type: string
                          example: Kaitlyn
                        contact_surname:
                          type: string
                          example: Price
                        company_name:
                          type: string
                          example: 'Dickens, Boyer and Sanford'
                        street:
                          type: string
                          example: '953 Estevan Summit Apt. 841'
                        city:
                          type: string
                          example: Stuartbury
                        postal_code:
                          type: string
                          example: '96331'
                        email:
                          type: string
                          example: orin.beer@schaefer.info
                        phone:
                          type: string
                          example: 936-989-0688
                        phone_country:
                          type: string
                          example: lt
                        device_side:
                          type: string
                          example: R
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:09.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:09.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to use Acadle'
                  code: 'ACADLE:SURVEYS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to use Acadle'
                  code:
                    type: string
                    example: 'ACADLE:SURVEYS:INSUFFICIENT_PERMISSION'
      tags:
        - Acadle
  /api/activation-codes:
    get:
      summary: 'Get activation codes'
      operationId: getActivationCodes
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      code: 18E7LN
                      created_by: 37
                      used_by: 38
                      used_at: null
                      active: 1
                      created_at: '2026-01-12T16:47:45.000000Z'
                      updated_at: '2026-01-12T16:47:45.000000Z'
                    -
                      id: 2
                      code: ZOWOCJ
                      created_by: 39
                      used_by: 40
                      used_at: null
                      active: 1
                      created_at: '2026-01-12T16:47:45.000000Z'
                      updated_at: '2026-01-12T16:47:45.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        code: 18E7LN
                        created_by: 37
                        used_by: 38
                        used_at: null
                        active: 1
                        created_at: '2026-01-12T16:47:45.000000Z'
                        updated_at: '2026-01-12T16:47:45.000000Z'
                      -
                        id: 2
                        code: ZOWOCJ
                        created_by: 39
                        used_by: 40
                        used_at: null
                        active: 1
                        created_at: '2026-01-12T16:47:45.000000Z'
                        updated_at: '2026-01-12T16:47:45.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        code:
                          type: string
                          example: 18E7LN
                        created_by:
                          type: integer
                          example: 37
                        used_by:
                          type: integer
                          example: 38
                        used_at:
                          type: string
                          example: null
                        active:
                          type: integer
                          example: 1
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:45.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:45.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage activation codes'
                  code: 'ACTIVATION_CODE:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage activation codes'
                  code:
                    type: string
                    example: 'ACTIVATION_CODE:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - 'Activation codes'
    post:
      summary: 'Create activation code'
      operationId: createActivationCode
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 6
                  code: CUNA1Z
                  created_by: null
                  used_by: null
                  used_at: null
                  active: 1
                  created_at: '2026-01-12T16:47:46.000000Z'
                  updated_at: '2026-01-12T16:47:46.000000Z'
                properties:
                  id:
                    type: integer
                    example: 6
                  code:
                    type: string
                    example: CUNA1Z
                  created_by:
                    type: string
                    example: null
                  used_by:
                    type: string
                    example: null
                  used_at:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:46.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:46.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage activation codes'
                  code: 'ACTIVATION_CODE:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage activation codes'
                  code:
                    type: string
                    example: 'ACTIVATION_CODE:CREATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Server error'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Server error: activation code not created'
                  code: 'ACTIVATION_CODE:CREATE:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Server error: activation code not created'
                  code:
                    type: string
                    example: 'ACTIVATION_CODE:CREATE:SERVER_ERROR'
      tags:
        - 'Activation codes'
  /api/activation-codes/active:
    get:
      summary: 'Get active activation codes'
      operationId: getActiveActivationCodes
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 3
                      code: JF2UJ5
                      created_by: 41
                      used_by: 42
                      used_at: null
                      active: 0
                      created_at: '2026-01-12T16:47:45.000000Z'
                      updated_at: '2026-01-12T16:47:45.000000Z'
                    -
                      id: 4
                      code: 5TGPJE
                      created_by: 43
                      used_by: 44
                      used_at: null
                      active: 0
                      created_at: '2026-01-12T16:47:45.000000Z'
                      updated_at: '2026-01-12T16:47:45.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 3
                        code: JF2UJ5
                        created_by: 41
                        used_by: 42
                        used_at: null
                        active: 0
                        created_at: '2026-01-12T16:47:45.000000Z'
                        updated_at: '2026-01-12T16:47:45.000000Z'
                      -
                        id: 4
                        code: 5TGPJE
                        created_by: 43
                        used_by: 44
                        used_at: null
                        active: 0
                        created_at: '2026-01-12T16:47:45.000000Z'
                        updated_at: '2026-01-12T16:47:45.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 3
                        code:
                          type: string
                          example: JF2UJ5
                        created_by:
                          type: integer
                          example: 41
                        used_by:
                          type: integer
                          example: 42
                        used_at:
                          type: string
                          example: null
                        active:
                          type: integer
                          example: 0
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:45.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:45.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage activation codes'
                  code: 'ACTIVATION_CODE:ACTIVE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage activation codes'
                  code:
                    type: string
                    example: 'ACTIVATION_CODE:ACTIVE:INSUFFICIENT_PERMISSION'
      tags:
        - 'Activation codes'
  '/api/activation-codes/find/{code}':
    get:
      summary: 'Find activation code'
      operationId: findActivationCode
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 5
                  code: 4PD47I
                  created_by: null
                  used_by: null
                  used_at: null
                  active: 1
                  created_at: '2026-01-12T16:47:45.000000Z'
                  updated_at: '2026-01-12T16:47:45.000000Z'
                properties:
                  id:
                    type: integer
                    example: 5
                  code:
                    type: string
                    example: 4PD47I
                  created_by:
                    type: string
                    example: null
                  used_by:
                    type: string
                    example: null
                  used_at:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage activation codes'
                  code: 'ACTIVATION_CODE:FIND:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage activation codes'
                  code:
                    type: string
                    example: 'ACTIVATION_CODE:FIND:INSUFFICIENT_PERMISSION'
        404:
          description: 'Activation code not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Activation code not found'
                  code: 'ACTIVATION_CODE:FIND:CODE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Activation code not found'
                  code:
                    type: string
                    example: 'ACTIVATION_CODE:FIND:CODE_NOT_FOUND'
      tags:
        - 'Activation codes'
    parameters:
      -
        in: path
        name: code
        description: 'Activation code (not ID).'
        example: aspernatur
        required: true
        schema:
          type: string
  '/api/activation-codes/{code}':
    post:
      summary: 'Create activation code (multi-region)'
      operationId: createActivationCodemultiRegion
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 7
                  code: Y34N8C
                  created_by: null
                  used_by: null
                  used_at: null
                  active: 0
                  created_at: '2026-01-12T16:47:46.000000Z'
                  updated_at: '2026-01-12T16:47:46.000000Z'
                properties:
                  id:
                    type: integer
                    example: 7
                  code:
                    type: string
                    example: Y34N8C
                  created_by:
                    type: string
                    example: null
                  used_by:
                    type: string
                    example: null
                  used_at:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:46.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:46.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage activation codes'
                  code: 'ACTIVATION_CODE:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage activation codes'
                  code:
                    type: string
                    example: 'ACTIVATION_CODE:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - 'Activation codes'
    parameters:
      -
        in: path
        name: code
        description: ''
        example: 5
        required: true
        schema:
          type: integer
  '/api/activation-codes/{codeId}':
    delete:
      summary: 'Deactivate activation code'
      operationId: deactivateActivationCode
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 8
                  code: M3Y0OW
                  created_by: null
                  used_by: null
                  used_at: null
                  active: 0
                  created_at: '2026-01-12T16:47:46.000000Z'
                  updated_at: '2026-01-12T16:47:46.000000Z'
                properties:
                  id:
                    type: integer
                    example: 8
                  code:
                    type: string
                    example: M3Y0OW
                  created_by:
                    type: string
                    example: null
                  used_by:
                    type: string
                    example: null
                  used_at:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:46.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:46.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage activation codes'
                      code: 'ACTIVATION_CODE:DEACTIVATE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage activation codes'
                      code:
                        type: string
                        example: 'ACTIVATION_CODE:DEACTIVATE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Activation code is not active'
                    type: object
                    example:
                      message: 'Cannot deactivate: code is not active'
                      code: 'ACTIVATION_CODE:DEACTIVATE:CODE_NOT_ACTIVE'
                    properties:
                      message:
                        type: string
                        example: 'Cannot deactivate: code is not active'
                      code:
                        type: string
                        example: 'ACTIVATION_CODE:DEACTIVATE:CODE_NOT_ACTIVE'
        404:
          description: 'Activation code not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Activation code not found'
                  code: 'ACTIVATION_CODE:DEACTIVATE:CODE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Activation code not found'
                  code:
                    type: string
                    example: 'ACTIVATION_CODE:DEACTIVATE:CODE_NOT_FOUND'
        500:
          description: 'Server error'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Server error: activation code not deactivated'
                  code: 'ACTIVATION_CODE:DEACTIVATE:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Server error: activation code not deactivated'
                  code:
                    type: string
                    example: 'ACTIVATION_CODE:DEACTIVATE:SERVER_ERROR'
      tags:
        - 'Activation codes'
    parameters:
      -
        in: path
        name: codeId
        description: 'Activation code ID.'
        example: 19
        required: true
        schema:
          type: integer
  /api/login:
    post:
      summary: 'Login user'
      operationId: loginUser
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  access_token: 7|x7de9EgE0xiBNLgHU91DHvhj85HVgTG1bekCssIA
                  expires: '2021-10-25 17:05:25'
                properties:
                  access_token:
                    type: string
                    example: 7|x7de9EgE0xiBNLgHU91DHvhj85HVgTG1bekCssIA
                  expires:
                    type: string
                    example: '2021-10-25 17:05:25'
        403:
          description: 'Too many attempts'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Login: too many attempts'
                  code: 'GENERAL:TOO_MANY_ATTEMPTS'
                properties:
                  message:
                    type: string
                    example: 'Login: too many attempts'
                  code:
                    type: string
                    example: 'GENERAL:TOO_MANY_ATTEMPTS'
        422:
          description: 'Invalid credentials'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'The given data was invalid.'
                  errors:
                    email:
                      - 'Given credentials not found'
                  code: 'AUTH:LOGIN:INVALID_CREDENTIALS'
                properties:
                  message:
                    type: string
                    example: 'The given data was invalid.'
                  errors:
                    type: object
                    properties:
                      email:
                        type: array
                        example:
                          - 'Given credentials not found'
                        items:
                          type: string
                  code:
                    type: string
                    example: 'AUTH:LOGIN:INVALID_CREDENTIALS'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'User email. MUST_BE_EMAIL.'
                  example: test@example.com
                password:
                  type: string
                  description: 'User password.'
                  example: secretpassword
              required:
                - email
                - password
      security: []
  /api/register:
    post:
      summary: 'Register user'
      operationId: registerUser
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 2
                  mrn: FNL7O8GY1768236460
                  name: 'Burley Bahringer'
                  email: 1768236460yaltenwerth@example.net
                  language: en
                  phone: '(361) 371-1270'
                  phone_country: GW
                  phone_verified_at: null
                  address1: '86809 Mike Ranch'
                  address2: 'North Nikolasmouth, MT 04512'
                  postal_code: '17987'
                  city: Kunze-Bradtke
                  clinic_name: Aronburgh
                  clinic_location: "9062 Emiliano Turnpike\nSouth Miraclechester, OR 47282-0485"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:47:40.000000Z'
                  updated_at: '2026-01-12T16:47:40.000000Z'
                  invitation_status: accepted
                  acadle_invitation_status: null
                  roles:
                    -
                      id: 2
                      name: ClinicAdmin
                properties:
                  id:
                    type: integer
                    example: 2
                  mrn:
                    type: string
                    example: FNL7O8GY1768236460
                  name:
                    type: string
                    example: 'Burley Bahringer'
                  email:
                    type: string
                    example: 1768236460yaltenwerth@example.net
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: '(361) 371-1270'
                  phone_country:
                    type: string
                    example: GW
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '86809 Mike Ranch'
                  address2:
                    type: string
                    example: 'North Nikolasmouth, MT 04512'
                  postal_code:
                    type: string
                    example: '17987'
                  city:
                    type: string
                    example: Kunze-Bradtke
                  clinic_name:
                    type: string
                    example: Aronburgh
                  clinic_location:
                    type: string
                    example: "9062 Emiliano Turnpike\nSouth Miraclechester, OR 47282-0485"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:40.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:40.000000Z'
                  invitation_status:
                    type: string
                    example: accepted
                  acadle_invitation_status:
                    type: string
                    example: null
                  roles:
                    type: array
                    example:
                      -
                        id: 2
                        name: ClinicAdmin
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 2
                        name:
                          type: string
                          example: ClinicAdmin
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Too many attempts'
                    type: object
                    example:
                      message: 'Register: too many attempts'
                      code: 'GENERAL:TOO_MANY_ATTEMPTS'
                    properties:
                      message:
                        type: string
                        example: 'Register: too many attempts'
                      code:
                        type: string
                        example: 'GENERAL:TOO_MANY_ATTEMPTS'
                  -
                    description: 'E-mail in use (in another region)'
                    type: object
                    example:
                      message: 'E-mail address already in use (in another region)'
                      code: 'AUTH:REGISTER:EMAIL_IN_USE'
                    properties:
                      message:
                        type: string
                        example: 'E-mail address already in use (in another region)'
                      code:
                        type: string
                        example: 'AUTH:REGISTER:EMAIL_IN_USE'
                  -
                    description: 'Activation code is incorrect'
                    type: object
                    example:
                      message: 'Activation code is incorrect'
                      code: 'AUTH:REGISTER:INCORRECT_CODE'
                    properties:
                      message:
                        type: string
                        example: 'Activation code is incorrect'
                      code:
                        type: string
                        example: 'AUTH:REGISTER:INCORRECT_CODE'
        500:
          description: 'Server error'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Server error: user not created'
                  code: 'AUTH:REGISTER:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Server error: user not created'
                  code:
                    type: string
                    example: 'AUTH:REGISTER:SERVER_ERROR'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                region:
                  type: string
                  description: 'User region.'
                  example: us
                name:
                  type: string
                  description: 'User name.'
                  example: 'Tom Smith'
                email:
                  type: string
                  description: 'User e-mail address. MUST_BE_EMAIL.'
                  example: name@domain.com
                password:
                  type: string
                  description: 'User password.'
                  example: Test123!
                phone:
                  type: string
                  description: 'User phone number.'
                  example: '(870) 869-9610'
                phone_country:
                  type: string
                  description: "Phone number's country (2 characters). SIZE:STRING_LENGTH:2."
                  example: US
                language:
                  type: string
                  description: 'User language.'
                  example: en
                clinic_name:
                  type: string
                  description: 'Clinic name.'
                  example: Abshire-Hahn
                clinic_location:
                  type: string
                  description: 'Clinic location.'
                  example: 'North Hanna'
                address1:
                  type: string
                  description: 'Address line 1.'
                  example: '3679 Schroeder Mews Apt. 618'
                address2:
                  type: string
                  description: 'Address line 2.'
                  example: 'Port Gladyceburgh, IN 60931-4132'
                mfa_enabled:
                  type: boolean
                  description: 'MFA enabled.'
                  example: true
                mfa_method:
                  type: string
                  description: 'MFA method.'
                  example: email
                  enum:
                    - email
                    - sms
                activation_code:
                  type: string
                  description: 'Activation code. SIZE:STRING_LENGTH:6.'
                  example: 1A2B3C
              required:
                - region
                - name
                - email
                - password
                - phone
                - phone_country
                - language
                - activation_code
      security: []
  /api/mobile/register:
    post:
      summary: 'Register mobile user'
      operationId: registerMobileUser
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  mrn: QTIDCPJX1768236460
                  name: 'Prof. Barton Mayer I'
                  email: 1768236460xander.robel@example.org
                  language: en
                  phone: +1-701-937-9469
                  phone_country: AF
                  phone_verified_at: null
                  address1: '232 Eudora Parkway'
                  address2: 'Laverneville, CA 86476'
                  postal_code: '61998'
                  city: McClure-Weimann
                  clinic_name: Joellestad
                  clinic_location: "6148 Jacky Fields\nCorkerymouth, LA 55429"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:47:40.000000Z'
                  updated_at: '2026-01-12T16:47:40.000000Z'
                  invitation_status: accepted
                  acadle_invitation_status: null
                  roles:
                    -
                      id: 2
                      name: ClinicAdmin
                properties:
                  id:
                    type: integer
                    example: 3
                  mrn:
                    type: string
                    example: QTIDCPJX1768236460
                  name:
                    type: string
                    example: 'Prof. Barton Mayer I'
                  email:
                    type: string
                    example: 1768236460xander.robel@example.org
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: +1-701-937-9469
                  phone_country:
                    type: string
                    example: AF
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '232 Eudora Parkway'
                  address2:
                    type: string
                    example: 'Laverneville, CA 86476'
                  postal_code:
                    type: string
                    example: '61998'
                  city:
                    type: string
                    example: McClure-Weimann
                  clinic_name:
                    type: string
                    example: Joellestad
                  clinic_location:
                    type: string
                    example: "6148 Jacky Fields\nCorkerymouth, LA 55429"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:40.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:40.000000Z'
                  invitation_status:
                    type: string
                    example: accepted
                  acadle_invitation_status:
                    type: string
                    example: null
                  roles:
                    type: array
                    example:
                      -
                        id: 2
                        name: ClinicAdmin
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 2
                        name:
                          type: string
                          example: ClinicAdmin
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Too many attempts'
                    type: object
                    example:
                      message: 'Register: too many attempts'
                      code: 'GENERAL:TOO_MANY_ATTEMPTS'
                    properties:
                      message:
                        type: string
                        example: 'Register: too many attempts'
                      code:
                        type: string
                        example: 'GENERAL:TOO_MANY_ATTEMPTS'
                  -
                    description: 'E-mail in use (in another region)'
                    type: object
                    example:
                      message: 'E-mail address already in use (in another region)'
                      code: 'AUTH:MOBILE_REGISTER:EMAIL_IN_USE'
                    properties:
                      message:
                        type: string
                        example: 'E-mail address already in use (in another region)'
                      code:
                        type: string
                        example: 'AUTH:MOBILE_REGISTER:EMAIL_IN_USE'
        500:
          description: 'Server error'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Server error: user not created'
                  code: 'AUTH:MOBILE_REGISTER:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Server error: user not created'
                  code:
                    type: string
                    example: 'AUTH:MOBILE_REGISTER:SERVER_ERROR'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                region:
                  type: string
                  description: 'User region.'
                  example: us
                name:
                  type: string
                  description: 'User name.'
                  example: 'Tom Smith'
                email:
                  type: string
                  description: 'User e-mail address. MUST_BE_EMAIL.'
                  example: name@domain.com
                password:
                  type: string
                  description: 'User password.'
                  example: Test123!
                language:
                  type: string
                  description: 'User language.'
                  example: en
                terms_accepted:
                  type: boolean
                  description: 'User accepted terms. Must be accepted.'
                  example: true
              required:
                - region
                - name
                - email
                - password
                - terms_accepted
      security: []
  /api/password/reset:
    post:
      summary: 'Request password reset'
      operationId: requestPasswordReset
      description: 'Request sending password reset email message with token that allows to change the password'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  code: passwords.sent
                  message: 'Reset password link successfully sent'
                properties:
                  code:
                    type: string
                    example: passwords.sent
                  message:
                    type: string
                    example: 'Reset password link successfully sent'
        400:
          description: 'Throttled request'
          content:
            application/json:
              schema:
                type: object
                example:
                  code: passwords.throttled
                  message: 'You have requested password reset recently'
                properties:
                  code:
                    type: string
                    example: passwords.throttled
                  message:
                    type: string
                    example: 'You have requested password reset recently'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'User email. MUST_BE_EMAIL.'
                  example: test@example.com
              required:
                - email
      security: []
  /api/password/reset/verify:
    post:
      summary: 'Verify password reset token'
      operationId: verifyPasswordResetToken
      description: 'Check if token is valid before using it to reset password'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Valid token'
                  code: 'AUTH:PASSWORD_RESET_VERIFY:VALID_TOKEN'
                properties:
                  message:
                    type: string
                    example: 'Valid token'
                  code:
                    type: string
                    example: 'AUTH:PASSWORD_RESET_VERIFY:VALID_TOKEN'
        400:
          description: 'Invalid token'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invalid token'
                  code: 'AUTH:PASSWORD_RESET_VERIFY:INVALID_TOKEN'
                properties:
                  message:
                    type: string
                    example: 'Invalid token'
                  code:
                    type: string
                    example: 'AUTH:PASSWORD_RESET_VERIFY:INVALID_TOKEN'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'AUTH:PASSWORD_RESET_VERIFY:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'AUTH:PASSWORD_RESET_VERIFY:USER_NOT_FOUND'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: 'Password reset token.'
                  example: 158bed12188492617e43ecfcca43f5990b3f5f0383b5083247389482b70af019
                email:
                  type: string
                  description: 'User email. MUST_BE_EMAIL.'
                  example: test@example.com
              required:
                - token
                - email
      security: []
  /api/password/reset/change:
    post:
      summary: 'Change password with token'
      operationId: changePasswordWithToken
      description: 'Change user password using password reset token sent to email address'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  code: passwords.reset
                  message: 'Password changed successfully'
                properties:
                  code:
                    type: string
                    example: passwords.reset
                  message:
                    type: string
                    example: 'Password changed successfully'
        400:
          description: 'Invalid token'
          content:
            application/json:
              schema:
                type: object
                example:
                  code: passwords.token
                  message: 'Invalid token'
                properties:
                  code:
                    type: string
                    example: passwords.token
                  message:
                    type: string
                    example: 'Invalid token'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  code: passwords.user
                  message: 'User not found'
                properties:
                  code:
                    type: string
                    example: passwords.user
                  message:
                    type: string
                    example: 'User not found'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: 'Password reset token.'
                  example: 158bed12188492617e43ecfcca43f5990b3f5f0383b5083247389482b70af019
                email:
                  type: string
                  description: 'User email. MUST_BE_EMAIL.'
                  example: test@example.com
                password:
                  type: string
                  description: 'User new password.'
                  example: secretpassword
              required:
                - token
                - email
                - password
      security: []
  /api/logout:
    post:
      summary: 'Logout current device'
      operationId: logoutCurrentDevice
      description: 'Logout and delete current access token'
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example: []
      tags:
        - Authentication
  /api/logout/everywhere:
    post:
      summary: 'Logout everywhere'
      operationId: logoutEverywhere
      description: 'Logout and delete all access tokens owned by account'
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                example: []
      tags:
        - Authentication
  /api/token/refresh:
    post:
      summary: 'Refresh access token'
      operationId: refreshAccessToken
      description: 'Refresh the new access token from the expiring token'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  access_token: 7|x7de9EgE0xiBNLgHU91DHvhj85HVgTG1bekCssIA
                  expires: '2021-10-25 17:05:25'
                properties:
                  access_token:
                    type: string
                    example: 7|x7de9EgE0xiBNLgHU91DHvhj85HVgTG1bekCssIA
                  expires:
                    type: string
                    example: '2021-10-25 17:05:25'
      tags:
        - Authentication
  /api/mfa/status:
    get:
      summary: 'Check MFA status'
      operationId: checkMFAStatus
      description: "Check any of available MFA methods.\n\t\tSupported methods: email, sms, otp."
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  enabled: 1
                  method: email
                  phone: 1
                  otp: 1
                properties:
                  enabled:
                    type: integer
                    example: 1
                    description: 'Determines if user enabled MFA'
                    enum: []
                  method:
                    type: string
                    example: email
                    description: 'Preferred MFA method'
                    enum: []
                  phone:
                    type: integer
                    example: 1
                    description: 'Determines if user has verified phone number and sms channel could be used'
                    enum: []
                  otp:
                    type: integer
                    example: 1
                    description: 'Determines if user has setup OTP with authenticator application'
                    enum: []
                required:
                  - enabled
                  - method
                  - phone
                  - otp
      tags:
        - Authentication
    post:
      summary: 'Set MFA status'
      operationId: setMFAStatus
      description: "Set MFA status and preferred method.\n\t\tSupported methods: email, sms, otp."
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  enabled: 1
                  method: email
                  phone: 1
                  otp: 1
                properties:
                  enabled:
                    type: integer
                    example: 1
                  method:
                    type: string
                    example: email
                  phone:
                    type: integer
                    example: 1
                  otp:
                    type: integer
                    example: 1
      tags:
        - Authentication
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                enabled:
                  type: boolean
                  description: 'Use MFA after login.'
                  example: true
                method:
                  type: string
                  description: 'Preferred MFA method.'
                  example: email
                  enum:
                    - email
                    - sms
                    - otp
  /api/mfa/recovery-code:
    post:
      summary: 'Use recovery code'
      operationId: useRecoveryCode
      description: "Use generated recovery code in order to access account in case when other MFA methods couldn't be used.\n\t\tThis method only checks if code is valid, implement account access scenario on your own.\n\t\tSent code is removed and couldn't be used anymore.\n\t\tIf remaining_codes counter equals zero, <a href=\"#authentication-GETapi-mfa-recovery-codes\">generate a new set</a>."
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  access_token: 7|x7de9EgE0xiBNLgHU91DHvhj85HVgTG1bekCssIA
                  expires: '2021-10-25 17:05:25'
                  remaining_codes: 9
                properties:
                  access_token:
                    type: string
                    example: 7|x7de9EgE0xiBNLgHU91DHvhj85HVgTG1bekCssIA
                  expires:
                    type: string
                    example: '2021-10-25 17:05:25'
                  remaining_codes:
                    type: integer
                    example: 9
        401:
          description: 'Invalid code'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invalid code'
                  code: 'AUTH:USE_RECOVERY_CODE:INVALID_CODE'
                properties:
                  message:
                    type: string
                    example: 'Invalid code'
                  code:
                    type: string
                    example: 'AUTH:USE_RECOVERY_CODE:INVALID_CODE'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                  description: 'Recovery code.'
                  example: ZZASRM6S
              required:
                - code
  /api/mfa/send:
    post:
      summary: 'Send MFA code'
      operationId: sendMFACode
      description: "Send multi-factor authentication code via selected channel.\n\t\tCode is valid for 15 minutes."
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Code sent'
                  code: 'AUTH:SEND_MFA:SENT'
                properties:
                  message:
                    type: string
                    example: 'Code sent'
                  code:
                    type: string
                    example: 'AUTH:SEND_MFA:SENT'
        400:
          description: 'Channel SMS, phone number not verified'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Phone number is not verified'
                  code: 'AUTH:SEND_MFA:PHONE_NUMBER_NOT_VERIFIED'
                properties:
                  message:
                    type: string
                    example: 'Phone number is not verified'
                  code:
                    type: string
                    example: 'AUTH:SEND_MFA:PHONE_NUMBER_NOT_VERIFIED'
        500:
          description: 'Channel SMS, provider problem'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Code sending failed'
                  code: 'AUTH:SEND_MFA:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Code sending failed'
                  code:
                    type: string
                    example: 'AUTH:SEND_MFA:SERVER_ERROR'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                channel:
                  type: string
                  description: 'Authentication channel.'
                  example: email
                  enum:
                    - email
                    - sms
              required:
                - channel
  /api/mfa/verify:
    post:
      summary: 'Verify MFA code'
      operationId: verifyMFACode
      description: 'Verify multi-factor code obtained from selected channel.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'OK, token auth'
                    type: object
                    example:
                      access_token: 7|x7de9EgE0xiBNLgHU91DHvhj85HVgTG1bekCssIA
                      expires: '2021-10-25 17:05:25'
                      mfa_token: fd63e55c-2a67-44b2-95b9-a771778e9971
                      mfa_expires: '2023-04-25 21:00:00'
                    properties:
                      access_token:
                        type: string
                        example: 7|x7de9EgE0xiBNLgHU91DHvhj85HVgTG1bekCssIA
                      expires:
                        type: string
                        example: '2021-10-25 17:05:25'
                      mfa_token:
                        type: string
                        example: fd63e55c-2a67-44b2-95b9-a771778e9971
                      mfa_expires:
                        type: string
                        example: '2023-04-25 21:00:00'
                  -
                    description: 'OK, cookie auth'
                    type: object
                    example:
                      message: OK
                      mfa_token: fd63e55c-2a67-44b2-95b9-a771778e9971
                      mfa_expires: '2023-04-25 21:00:00'
                    properties:
                      message:
                        type: string
                        example: OK
                      mfa_token:
                        type: string
                        example: fd63e55c-2a67-44b2-95b9-a771778e9971
                      mfa_expires:
                        type: string
                        example: '2023-04-25 21:00:00'
        401:
          description: 'Invalid code'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invalid code'
                  code: 'AUTH:VERIFY_MFA:INVALID_CODE'
                properties:
                  message:
                    type: string
                    example: 'Invalid code'
                  code:
                    type: string
                    example: 'AUTH:VERIFY_MFA:INVALID_CODE'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                channel:
                  type: string
                  description: 'Authentication channel.'
                  example: email
                  enum:
                    - email
                    - sms
                remember_mfa_session:
                  type: boolean
                  description: 'Do not require MFA code. By default, for 30 days.'
                  example: true
                code:
                  type: string
                  description: 'Authentication code.'
                  example: '445566'
                machine_key:
                  type: string
                  description: 'Unique machine identifier.'
                  example: 35282880-244a-4328-9435-2aaf432f3619
              required:
                - channel
                - code
  /api/mfa/phone/verify:
    post:
      summary: 'Verify phone number'
      operationId: verifyPhoneNumber
      description: 'Verify phone number with text message'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Phone number verified'
                  code: 'AUTH:VERIFY_PHONE:VERIFIED'
                properties:
                  message:
                    type: string
                    example: 'Phone number verified'
                  code:
                    type: string
                    example: 'AUTH:VERIFY_PHONE:VERIFIED'
        401:
          description: 'Invalid code'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invalid code'
                  code: 'AUTH:VERIFY_PHONE:INVALID_CODE'
                properties:
                  message:
                    type: string
                    example: 'Invalid code'
                  code:
                    type: string
                    example: 'AUTH:VERIFY_PHONE:INVALID_CODE'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                  description: 'Verification code.'
                  example: '445566'
              required:
                - code
  /api/mfa/otp/verify:
    post:
      summary: 'Verify MFA OTP'
      operationId: verifyMFAOTP
      description: "Verify one-time password (OTP).\n\t\tIf verification is successful, new access token with additional permissions will be generated."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'OK, token auth'
                    type: object
                    example:
                      access_token: 7|x7de9EgE0xiBNLgHU91DHvhj85HVgTG1bekCssIA
                      expires: '2021-10-25 17:05:25'
                    properties:
                      access_token:
                        type: string
                        example: 7|x7de9EgE0xiBNLgHU91DHvhj85HVgTG1bekCssIA
                      expires:
                        type: string
                        example: '2021-10-25 17:05:25'
                  -
                    description: 'OK, cookie auth'
                    type: object
                    example:
                      message: OK
                    properties:
                      message:
                        type: string
                        example: OK
        401:
          description: 'Invalid code'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invalid code'
                  code: 'AUTH:VERIFY_MFA_OTP:INVALID_CODE'
                properties:
                  message:
                    type: string
                    example: 'Invalid code'
                  code:
                    type: string
                    example: 'AUTH:VERIFY_MFA_OTP:INVALID_CODE'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                code:
                  type: string
                  description: 'One-time password from app.'
                  example: '445566'
              required:
                - code
  /api/password/change:
    post:
      summary: 'Change password'
      operationId: changePassword
      description: 'Change authenticated user password'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Password changed successfully'
                  code: 'AUTH:PASSWORD_CHANGE:CHANGED'
                properties:
                  message:
                    type: string
                    example: 'Password changed successfully'
                  code:
                    type: string
                    example: 'AUTH:PASSWORD_CHANGE:CHANGED'
        422:
          description: 'Invalid old password'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'The given data was invalid.'
                  errors:
                    old_password:
                      - 'Old password is incorrect'
                  code: 'AUTH:PASSWORD_CHANGE:INVALID_OLD_PASSWORD'
                properties:
                  message:
                    type: string
                    example: 'The given data was invalid.'
                  errors:
                    type: object
                    properties:
                      old_password:
                        type: array
                        example:
                          - 'Old password is incorrect'
                        items:
                          type: string
                  code:
                    type: string
                    example: 'AUTH:PASSWORD_CHANGE:INVALID_OLD_PASSWORD'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                old_password:
                  type: string
                  description: 'User old password.'
                  example: oldpassword
                new_password:
                  type: string
                  description: 'User new password.'
                  example: newpassword
              required:
                - old_password
                - new_password
  /api/mfa/recovery-codes:
    get:
      summary: 'Generate recovery codes'
      operationId: generateRecoveryCodes
      description: "Generate recovery codes for authenticated user and revoke old ones.\n\t\tUser could use these codes in case when couldn't use any of MFA methods (e.g. lost device with OTP app or device is not accessible right now)."
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  recovery_codes:
                    - A3H8PF8P
                    - IZ8CGK2H
                    - DTYENLLT
                    - 0RKEZFST
                    - 9MPW91BS
                    - S38Z6HS6
                    - UF5ATOKP
                    - HSZXP8EL
                    - ZZASRM6S
                    - 07GR4CD1
                properties:
                  recovery_codes:
                    type: array
                    example:
                      - A3H8PF8P
                      - IZ8CGK2H
                      - DTYENLLT
                      - 0RKEZFST
                      - 9MPW91BS
                      - S38Z6HS6
                      - UF5ATOKP
                      - HSZXP8EL
                      - ZZASRM6S
                      - 07GR4CD1
                    items:
                      type: string
      tags:
        - Authentication
  /api/mfa/otp/setup:
    post:
      summary: 'Setup MFA OTP'
      operationId: setupMFAOTP
      description: "Setup multi-factor authentication with one-time passwords (OTP).\n\t\tUse secret on your own or generate QR code with given url.\n\t\tThen user could scan QR code with authentication app (e.g. Microsoft Authenticator, Authy).\n\t\tIf secret has been already generated, new secret will override existing one and revoke previous setup."
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  secret: VXGJ6JMIAWWDFXYDLKO3VG3RSGTS34BGMVTGQIEHMVVMJ2JBGCSNPQZDV4B6OMDIGI4UKCVCVKVMA7EASLHZEJWW4ZNKLAUTSZYN7EA
                  url: 'otpauth://totp/AetherDigitalTherapy?issuer=AetherDigitalTherapy&secret=VXGJ6JMIAWWDFXYDLKO3VG3RSGTS34BGMVTGQIEHMVVMJ2JBGCSNPQZDV4B6OMDIGI4UKCVCVKVMA7EASLHZEJWW4ZNKLAUTSZYN7EA'
                  recovery_codes:
                    - A3H8PF8P
                    - IZ8CGK2H
                    - DTYENLLT
                    - 0RKEZFST
                    - 9MPW91BS
                    - S38Z6HS6
                    - UF5ATOKP
                    - HSZXP8EL
                    - ZZASRM6S
                    - 07GR4CD1
                properties:
                  secret:
                    type: string
                    example: VXGJ6JMIAWWDFXYDLKO3VG3RSGTS34BGMVTGQIEHMVVMJ2JBGCSNPQZDV4B6OMDIGI4UKCVCVKVMA7EASLHZEJWW4ZNKLAUTSZYN7EA
                  url:
                    type: string
                    example: 'otpauth://totp/AetherDigitalTherapy?issuer=AetherDigitalTherapy&secret=VXGJ6JMIAWWDFXYDLKO3VG3RSGTS34BGMVTGQIEHMVVMJ2JBGCSNPQZDV4B6OMDIGI4UKCVCVKVMA7EASLHZEJWW4ZNKLAUTSZYN7EA'
                  recovery_codes:
                    type: array
                    example:
                      - A3H8PF8P
                      - IZ8CGK2H
                      - DTYENLLT
                      - 0RKEZFST
                      - 9MPW91BS
                      - S38Z6HS6
                      - UF5ATOKP
                      - HSZXP8EL
                      - ZZASRM6S
                      - 07GR4CD1
                    items:
                      type: string
      tags:
        - Authentication
  /login:
    post:
      summary: 'Login user (SPA)'
      operationId: loginUserSPA
      description: "Authorize user and create cookie-based session.\n\t\tHit GET /sanctum/csrf-cookie endpoint to retrieve XSRF-TOKEN cookie. Then attach X-XSRF-TOKEN HTTP header to any request to authorize.\n\t\tSee more: <a href=\"https://laravel.com/docs/8.x/sanctum#spa-authenticating\" target=\"_blank\">Laravel Sanctum documentation</a>\n\t"
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 316
                  mrn: 8IK8SKTE1768236490
                  name: 'Hank Gerlach PhD'
                  email: 1768236490leannon.ayla@example.org
                  language: en
                  phone: '+1 (925) 995-2911'
                  phone_country: BZ
                  phone_verified_at: null
                  address1: '797 Lebsack Village'
                  address2: 'West Raina, ID 71224'
                  postal_code: '45102'
                  city: 'Rempel, Krajcik and Hessel'
                  clinic_name: 'Lake Forrest'
                  clinic_location: "834 Halle Summit\nO'Reillystad, NH 22904-7640"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:48:11.000000Z'
                  updated_at: '2026-01-12T16:48:11.000000Z'
                  invitation_status: null
                  acadle_invitation_status: null
                  roles: []
                properties:
                  id:
                    type: integer
                    example: 316
                  mrn:
                    type: string
                    example: 8IK8SKTE1768236490
                  name:
                    type: string
                    example: 'Hank Gerlach PhD'
                  email:
                    type: string
                    example: 1768236490leannon.ayla@example.org
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: '+1 (925) 995-2911'
                  phone_country:
                    type: string
                    example: BZ
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '797 Lebsack Village'
                  address2:
                    type: string
                    example: 'West Raina, ID 71224'
                  postal_code:
                    type: string
                    example: '45102'
                  city:
                    type: string
                    example: 'Rempel, Krajcik and Hessel'
                  clinic_name:
                    type: string
                    example: 'Lake Forrest'
                  clinic_location:
                    type: string
                    example: "834 Halle Summit\nO'Reillystad, NH 22904-7640"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:11.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:11.000000Z'
                  invitation_status:
                    type: string
                    example: null
                  acadle_invitation_status:
                    type: string
                    example: null
                  roles:
                    type: array
                    example: []
        403:
          description: 'Too many attempts'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Login: too many attempts'
                  code: 'GENERAL:TOO_MANY_ATTEMPTS'
                properties:
                  message:
                    type: string
                    example: 'Login: too many attempts'
                  code:
                    type: string
                    example: 'GENERAL:TOO_MANY_ATTEMPTS'
        422:
          description: 'Invalid credentials'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'The given data was invalid.'
                  errors:
                    email:
                      - 'Given credentials not found'
                  code: 'AUTH:LOGIN_COOKIE:INVALID_CREDENTIALS'
                properties:
                  message:
                    type: string
                    example: 'The given data was invalid.'
                  errors:
                    type: object
                    properties:
                      email:
                        type: array
                        example:
                          - 'Given credentials not found'
                        items:
                          type: string
                  code:
                    type: string
                    example: 'AUTH:LOGIN_COOKIE:INVALID_CREDENTIALS'
      tags:
        - Authentication
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'User email. MUST_BE_EMAIL.'
                  example: test@example.com
                password:
                  type: string
                  description: 'User password.'
                  example: secretpassword
              required:
                - email
                - password
      security: []
  /api/chat/authorize-user:
    get:
      summary: 'Authorize a user'
      operationId: authorizeAUser
      description: "This method authorizes a user using Ably service. Endpoint used only by Ably SDK\n\nCheck more details on https://ably.com/docs/auth/token"
      parameters: []
      responses:
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: api.responses.general.unauthenticated
                  code: 'GENERAL:UNAUTHENTICATED'
                properties:
                  message:
                    type: string
                    example: api.responses.general.unauthenticated
                  code:
                    type: string
                    example: 'GENERAL:UNAUTHENTICATED'
      tags:
        - Chat
  /api/chat/rooms:
    get:
      summary: 'List all chat rooms'
      operationId: listAllChatRooms
      description: "This method retrieves all chat rooms.\n\t\tPossible extend options:\n\t\t<ul>\n\t\t\t<li>participants - user assigned to chat room</li>\n\t\t\t<li>participants.roles - roles assigned to chat participants</li>\n\t\t\t<li>owner - the clinician assigned to patient</li>\n\t\t\t<li>patient - the patient for whom the chat was created</li>\n\t\t\t<li>messages - the messages related to chat room</li>\n\t\t\t<li>messages.author - the author of message/li>\n\t\t</ul>\n\t"
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      owner: null
                      patient_id: null
                      encryption_key: cev+qzR6xJNBcbU34VXS0eXCkE9U0zmHWTK0IyS52Sc=
                      name: explicabo
                      friendly_name: explicabo
                      created_at: '2026-01-12T16:48:08.000000Z'
                      deleted_at: null
                      updated_at: '2026-01-12T16:48:08.000000Z'
                    -
                      id: 2
                      owner: null
                      patient_id: null
                      encryption_key: 6XhAXe06yQ6a2Dd4GLIS09Qq6npRWhaNBhFQ8wpgU14=
                      name: perferendis
                      friendly_name: perferendis
                      created_at: '2026-01-12T16:48:08.000000Z'
                      deleted_at: null
                      updated_at: '2026-01-12T16:48:08.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        owner: null
                        patient_id: null
                        encryption_key: cev+qzR6xJNBcbU34VXS0eXCkE9U0zmHWTK0IyS52Sc=
                        name: explicabo
                        friendly_name: explicabo
                        created_at: '2026-01-12T16:48:08.000000Z'
                        deleted_at: null
                        updated_at: '2026-01-12T16:48:08.000000Z'
                      -
                        id: 2
                        owner: null
                        patient_id: null
                        encryption_key: 6XhAXe06yQ6a2Dd4GLIS09Qq6npRWhaNBhFQ8wpgU14=
                        name: perferendis
                        friendly_name: perferendis
                        created_at: '2026-01-12T16:48:08.000000Z'
                        deleted_at: null
                        updated_at: '2026-01-12T16:48:08.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        owner:
                          type: string
                          example: null
                        patient_id:
                          type: string
                          example: null
                        encryption_key:
                          type: string
                          example: cev+qzR6xJNBcbU34VXS0eXCkE9U0zmHWTK0IyS52Sc=
                        name:
                          type: string
                          example: explicabo
                        friendly_name:
                          type: string
                          example: explicabo
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:08.000000Z'
                        deleted_at:
                          type: string
                          example: null
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:08.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list chat room'
                  code: 'CHAT:LIST_ROOMS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list chat room'
                  code:
                    type: string
                    example: 'CHAT:LIST_ROOMS:INSUFFICIENT_PERMISSION'
      tags:
        - Chat
  '/api/chat/room/{roomName}':
    get:
      summary: 'Retrieve a chat room'
      operationId: retrieveAChatRoom
      description: "This method retrieves a single chat room identified by roomId.\n\t\tPossible extend options:\n\t\t<ul>\n\t\t\t<li>participants - user assigned to chat room</li>\n\t\t\t<li>owner - the clinician assigned to patient</li>\n\t\t\t<li>patient - the patient for whom the chat was created</li>\n\t\t\t<li>messages - the messages related to chat room</li>\n\t\t\t<li>messages.author - the author of message/li>\n\t\t</ul>\n\t"
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  owner: null
                  patient_id: null
                  encryption_key: L7Nxg6dx6T0kn5o1+02tqfLQn2SQFdHd5S7/1XvwbiQ=
                  name: dolores
                  friendly_name: dolores
                  created_at: '2026-01-12T16:48:08.000000Z'
                  deleted_at: null
                  updated_at: '2026-01-12T16:48:08.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  owner:
                    type: string
                    example: null
                  patient_id:
                    type: string
                    example: null
                  encryption_key:
                    type: string
                    example: L7Nxg6dx6T0kn5o1+02tqfLQn2SQFdHd5S7/1XvwbiQ=
                  name:
                    type: string
                    example: dolores
                  friendly_name:
                    type: string
                    example: dolores
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:08.000000Z'
                  deleted_at:
                    type: string
                    example: null
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:08.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view chat room'
                  code: 'CHAT:GET_ROOM:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view chat room'
                  code:
                    type: string
                    example: 'CHAT:GET_ROOM:INSUFFICIENT_PERMISSION'
        404:
          description: 'Chat room not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Chat room not found'
                  code: 'CHAT:GET_ROOM:ROOM_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Chat room not found'
                  code:
                    type: string
                    example: 'CHAT:GET_ROOM:ROOM_NOT_FOUND'
      tags:
        - Chat
    parameters:
      -
        in: path
        name: roomName
        description: ''
        example: sapiente
        required: true
        schema:
          type: string
  /api/chat/room:
    post:
      summary: 'Create a new chat room'
      operationId: createANewChatRoom
      description: "This method creates a new chat room using the authenticated user's ID, a name for the room, and a list of participants.\n\t\t\n\t\tThe list of participants should contain the IDs of the users who will be participants in the room.\n\t"
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  owner: null
                  patient_id: null
                  encryption_key: r7WeZaFpkaPQPcRiwQPm5YjGr+Ubqcx4zbwjMsiQiYk=
                  name: consequatur
                  friendly_name: consequatur
                  created_at: '2026-01-12T16:48:08.000000Z'
                  deleted_at: null
                  updated_at: '2026-01-12T16:48:08.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  owner:
                    type: string
                    example: null
                  patient_id:
                    type: string
                    example: null
                  encryption_key:
                    type: string
                    example: r7WeZaFpkaPQPcRiwQPm5YjGr+Ubqcx4zbwjMsiQiYk=
                  name:
                    type: string
                    example: consequatur
                  friendly_name:
                    type: string
                    example: consequatur
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:08.000000Z'
                  deleted_at:
                    type: string
                    example: null
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:08.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view chat room'
                  code: 'CHAT:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view chat room'
                  code:
                    type: string
                    example: 'CHAT:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - Chat
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                owner:
                  type: string
                  description: 'The <code>id</code> of an existing record in the App\Models\User table.'
                  example: 1
                name:
                  type: string
                  description: 'Name of chat room. MAXIMUM:STRING_LENGTH:255.'
                  example: my-chat
                patient_id:
                  type: string
                  description: 'The <code>id</code> of an existing record in the App\Models\User table.'
                  example: 1
                participants:
                  type: array
                  description: 'Chat room participant. The <code>id</code> of an existing record in the App\Models\User table.'
                  example:
                    - '1'
                  items:
                    type: string
              required:
                - owner
                - name
                - patient_id
  '/api/chat/room/{id}':
    put:
      summary: 'Update an existing chat room'
      operationId: updateAnExistingChatRoom
      description: "This method updates an existing chat room using the authenticated user's ID, a new name for the room, and a list of participants.\n\t\n\t\tThe list of participants should contain the IDs of the users who will be participants in the room.\n\t"
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 5
                  owner: null
                  patient_id: null
                  encryption_key: vMv60WIGHhRltJWdoSOOzGKBDrXWyqK+UE3Fp9+298g=
                  name: nisi
                  friendly_name: nisi
                  created_at: '2026-01-12T16:48:08.000000Z'
                  deleted_at: null
                  updated_at: '2026-01-12T16:48:08.000000Z'
                properties:
                  id:
                    type: integer
                    example: 5
                  owner:
                    type: string
                    example: null
                  patient_id:
                    type: string
                    example: null
                  encryption_key:
                    type: string
                    example: vMv60WIGHhRltJWdoSOOzGKBDrXWyqK+UE3Fp9+298g=
                  name:
                    type: string
                    example: nisi
                  friendly_name:
                    type: string
                    example: nisi
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:08.000000Z'
                  deleted_at:
                    type: string
                    example: null
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:08.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update chat room'
                  code: 'CHAT:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update chat room'
                  code:
                    type: string
                    example: 'CHAT:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Chat room not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Chat room not found'
                  code: 'CHAT:UPDATE:ROOM_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Chat room not found'
                  code:
                    type: string
                    example: 'CHAT:UPDATE:ROOM_NOT_FOUND'
      tags:
        - Chat
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                owner:
                  type: string
                  description: 'The <code>id</code> of an existing record in the App\Models\User table.'
                  example: 1
                name:
                  type: string
                  description: 'Name of chat room. MAXIMUM:STRING_LENGTH:255.'
                  example: my-chat
                participants:
                  type: array
                  description: 'Chat room participant. The <code>id</code> of an existing record in the App\Models\User table.'
                  example:
                    - '1'
                  items:
                    type: string
                participants_del:
                  type: array
                  description: 'Chat room participant to be deleted. The <code>id</code> of an existing record in the App\Models\User table.'
                  example:
                    - '1'
                  items:
                    type: string
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the room.'
        example: ea
        required: true
        schema:
          type: string
  '/api/chat/room/{id}/archive':
    get:
      summary: 'Chat room archives'
      operationId: chatRoomArchives
      description: "Get archived messages for room\n\t\tPossible extend options:\n\t\t<ul>\n\t\t\t<li>author - this field represent user who send message</li>\n\t\t</ul>\n\t"
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>timestamp</code>). Default: timestamp, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>timestamp</code>). Default: timestamp, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 1
                    count: 1
                    perpage: 5
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 651a8e4868d5dc27c0000cc2
                      channel: chat.messages.room.44.56bf7d37-4ed6-4db4-947b-d68a1066677c.communication-channel
                      clientId: '95'
                      msgId: b8673175-01e6-4b6d-9032-226d3df20637
                      data: '{"encryptedMessage":{"message":"z6z1zNihCjlEePltz+BG8g==","initialVector":"7376fcbf0b32fbdcd5c5b62c087b7600"},"user":{"id":95,"name":"Bartosz Druga firmaa","email":"bartosz+drugafirma@refericon.pl","image":"https://aether-dev-bucket.s3.amazonaws.com/users/7T6im01PAj4cahksWHllrL7se2SQ9buquIjGGFtp.jpg","permissions":[],"roles":[{"id":2,"name":"Clinician"}]},"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","recipients":[{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"95"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"44"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"1250"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"3067"}]}'
                      name: message
                      recipients:
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: true
                          clientId: '95'
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: false
                          clientId: '44'
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: false
                          clientId: '1250'
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: false
                          clientId: '3067'
                      timestamp: 1696239176715
                      created_at: '2023-10-02 09:32:56'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 1
                      count:
                        type: integer
                        example: 1
                      perpage:
                        type: integer
                        example: 5
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 651a8e4868d5dc27c0000cc2
                        channel: chat.messages.room.44.56bf7d37-4ed6-4db4-947b-d68a1066677c.communication-channel
                        clientId: '95'
                        msgId: b8673175-01e6-4b6d-9032-226d3df20637
                        data: '{"encryptedMessage":{"message":"z6z1zNihCjlEePltz+BG8g==","initialVector":"7376fcbf0b32fbdcd5c5b62c087b7600"},"user":{"id":95,"name":"Bartosz Druga firmaa","email":"bartosz+drugafirma@refericon.pl","image":"https://aether-dev-bucket.s3.amazonaws.com/users/7T6im01PAj4cahksWHllrL7se2SQ9buquIjGGFtp.jpg","permissions":[],"roles":[{"id":2,"name":"Clinician"}]},"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","recipients":[{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"95"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"44"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"1250"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"3067"}]}'
                        name: message
                        recipients:
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: true
                            clientId: '95'
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: false
                            clientId: '44'
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: false
                            clientId: '1250'
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: false
                            clientId: '3067'
                        timestamp: 1696239176715
                        created_at: '2023-10-02 09:32:56'
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          example: 651a8e4868d5dc27c0000cc2
                        channel:
                          type: string
                          example: chat.messages.room.44.56bf7d37-4ed6-4db4-947b-d68a1066677c.communication-channel
                        clientId:
                          type: string
                          example: '95'
                        msgId:
                          type: string
                          example: b8673175-01e6-4b6d-9032-226d3df20637
                        data:
                          type: string
                          example: '{"encryptedMessage":{"message":"z6z1zNihCjlEePltz+BG8g==","initialVector":"7376fcbf0b32fbdcd5c5b62c087b7600"},"user":{"id":95,"name":"Bartosz Druga firmaa","email":"bartosz+drugafirma@refericon.pl","image":"https://aether-dev-bucket.s3.amazonaws.com/users/7T6im01PAj4cahksWHllrL7se2SQ9buquIjGGFtp.jpg","permissions":[],"roles":[{"id":2,"name":"Clinician"}]},"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","recipients":[{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"95"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"44"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"1250"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"3067"}]}'
                        name:
                          type: string
                          example: message
                        recipients:
                          type: array
                          example:
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: true
                              clientId: '95'
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: false
                              clientId: '44'
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: false
                              clientId: '1250'
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: false
                              clientId: '3067'
                          items:
                            type: object
                            properties:
                              delivered:
                                type: boolean
                                example: true
                              msgId:
                                type: string
                                example: b8673175-01e6-4b6d-9032-226d3df20637
                              seen:
                                type: boolean
                                example: true
                              clientId:
                                type: string
                                example: '95'
                        timestamp:
                          type: integer
                          example: 1696239176715
                        created_at:
                          type: string
                          example: '2023-10-02 09:32:56'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view archived messages'
                  code: 'CHAT:GET_ARCHIVES:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view archived messages'
                  code:
                    type: string
                    example: 'CHAT:GET_ARCHIVES:INSUFFICIENT_PERMISSION'
        404:
          description: 'Chat room not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Chat room not found'
                  code: 'CHAT:GET_ARCHIVES:ROOM_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Chat room not found'
                  code:
                    type: string
                    example: 'CHAT:GET_ARCHIVES:ROOM_NOT_FOUND'
      tags:
        - Chat
    parameters:
      -
        in: path
        name: id
        description: 'The ID of the room.'
        example: vero
        required: true
        schema:
          type: string
  /api/chat/messages/unread:
    get:
      summary: 'Unread messages'
      operationId: unreadMessages
      description: "Get unread messaged for chat room.\n\t\tPossible extend options:\n\t\t<ul>\n\t\t\t<li>author - this field represent user who send message</li>\n\t\t</ul>\n\t"
      parameters:
        -
          in: query
          name: room
          description: "Filter unread messages by room.\n\t\tProvide single ID (<code>room=1</code>), array of IDs (<code>room[]=1&room[]=2</code>) or comma-separated list of IDs (<code>room=1,2</code>)."
          example: 2
          required: false
          schema:
            type: integer
            description: "Filter unread messages by room.\n\t\tProvide single ID (<code>room=1</code>), array of IDs (<code>room[]=1&room[]=2</code>) or comma-separated list of IDs (<code>room=1,2</code>)."
            example: 2
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 1
                    count: 1
                    perpage: 5
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 651a8e4868d5dc27c0000cc2
                      channel: chat.messages.room.44.56bf7d37-4ed6-4db4-947b-d68a1066677c.communication-channel
                      clientId: '95'
                      msgId: b8673175-01e6-4b6d-9032-226d3df20637
                      data: '{"encryptedMessage":{"message":"z6z1zNihCjlEePltz+BG8g==","initialVector":"7376fcbf0b32fbdcd5c5b62c087b7600"},"user":{"id":95,"name":"Bartosz Druga firmaa","email":"bartosz+drugafirma@refericon.pl","image":"https://aether-dev-bucket.s3.amazonaws.com/users/7T6im01PAj4cahksWHllrL7se2SQ9buquIjGGFtp.jpg","permissions":[],"roles":[{"id":2,"name":"Clinician"}]},"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","recipients":[{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"95"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"44"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"1250"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"3067"}]}'
                      name: message
                      recipients:
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: true
                          clientId: '95'
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: false
                          clientId: '44'
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: false
                          clientId: '1250'
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: false
                          clientId: '3067'
                      timestamp: 1696239176715
                      created_at: '2023-10-02 09:32:56'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 1
                      count:
                        type: integer
                        example: 1
                      perpage:
                        type: integer
                        example: 5
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 651a8e4868d5dc27c0000cc2
                        channel: chat.messages.room.44.56bf7d37-4ed6-4db4-947b-d68a1066677c.communication-channel
                        clientId: '95'
                        msgId: b8673175-01e6-4b6d-9032-226d3df20637
                        data: '{"encryptedMessage":{"message":"z6z1zNihCjlEePltz+BG8g==","initialVector":"7376fcbf0b32fbdcd5c5b62c087b7600"},"user":{"id":95,"name":"Bartosz Druga firmaa","email":"bartosz+drugafirma@refericon.pl","image":"https://aether-dev-bucket.s3.amazonaws.com/users/7T6im01PAj4cahksWHllrL7se2SQ9buquIjGGFtp.jpg","permissions":[],"roles":[{"id":2,"name":"Clinician"}]},"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","recipients":[{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"95"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"44"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"1250"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"3067"}]}'
                        name: message
                        recipients:
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: true
                            clientId: '95'
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: false
                            clientId: '44'
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: false
                            clientId: '1250'
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: false
                            clientId: '3067'
                        timestamp: 1696239176715
                        created_at: '2023-10-02 09:32:56'
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          example: 651a8e4868d5dc27c0000cc2
                        channel:
                          type: string
                          example: chat.messages.room.44.56bf7d37-4ed6-4db4-947b-d68a1066677c.communication-channel
                        clientId:
                          type: string
                          example: '95'
                        msgId:
                          type: string
                          example: b8673175-01e6-4b6d-9032-226d3df20637
                        data:
                          type: string
                          example: '{"encryptedMessage":{"message":"z6z1zNihCjlEePltz+BG8g==","initialVector":"7376fcbf0b32fbdcd5c5b62c087b7600"},"user":{"id":95,"name":"Bartosz Druga firmaa","email":"bartosz+drugafirma@refericon.pl","image":"https://aether-dev-bucket.s3.amazonaws.com/users/7T6im01PAj4cahksWHllrL7se2SQ9buquIjGGFtp.jpg","permissions":[],"roles":[{"id":2,"name":"Clinician"}]},"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","recipients":[{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"95"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"44"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"1250"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"3067"}]}'
                        name:
                          type: string
                          example: message
                        recipients:
                          type: array
                          example:
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: true
                              clientId: '95'
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: false
                              clientId: '44'
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: false
                              clientId: '1250'
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: false
                              clientId: '3067'
                          items:
                            type: object
                            properties:
                              delivered:
                                type: boolean
                                example: true
                              msgId:
                                type: string
                                example: b8673175-01e6-4b6d-9032-226d3df20637
                              seen:
                                type: boolean
                                example: true
                              clientId:
                                type: string
                                example: '95'
                        timestamp:
                          type: integer
                          example: 1696239176715
                        created_at:
                          type: string
                          example: '2023-10-02 09:32:56'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view unread messages list'
                  code: 'CHAT:UNREAD_MESSAGES:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view unread messages list'
                  code:
                    type: string
                    example: 'CHAT:UNREAD_MESSAGES:INSUFFICIENT_PERMISSION'
      tags:
        - Chat
  '/api/chat/messages/{msgId}':
    delete:
      summary: 'Delete chat message'
      operationId: deleteChatMessage
      description: ''
      parameters:
        -
          in: query
          name: msgId
          description: 'Message ID.'
          example: et
          required: true
          schema:
            type: string
            description: 'Message ID.'
            example: et
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 1
                    count: 1
                    perpage: 5
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 651a8e4868d5dc27c0000cc2
                      channel: chat.messages.room.44.56bf7d37-4ed6-4db4-947b-d68a1066677c.communication-channel
                      clientId: '95'
                      msgId: b8673175-01e6-4b6d-9032-226d3df20637
                      data: '{"encryptedMessage":{"message":"z6z1zNihCjlEePltz+BG8g==","initialVector":"7376fcbf0b32fbdcd5c5b62c087b7600"},"user":{"id":95,"name":"Bartosz Druga firmaa","email":"bartosz+drugafirma@refericon.pl","image":"https://aether-dev-bucket.s3.amazonaws.com/users/7T6im01PAj4cahksWHllrL7se2SQ9buquIjGGFtp.jpg","permissions":[],"roles":[{"id":2,"name":"Clinician"}]},"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","recipients":[{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"95"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"44"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"1250"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"3067"}]}'
                      name: message
                      recipients:
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: true
                          clientId: '95'
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: false
                          clientId: '44'
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: false
                          clientId: '1250'
                        -
                          delivered: true
                          msgId: b8673175-01e6-4b6d-9032-226d3df20637
                          seen: false
                          clientId: '3067'
                      timestamp: 1696239176715
                      created_at: '2023-10-02 09:32:56'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 1
                      count:
                        type: integer
                        example: 1
                      perpage:
                        type: integer
                        example: 5
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 651a8e4868d5dc27c0000cc2
                        channel: chat.messages.room.44.56bf7d37-4ed6-4db4-947b-d68a1066677c.communication-channel
                        clientId: '95'
                        msgId: b8673175-01e6-4b6d-9032-226d3df20637
                        data: '{"encryptedMessage":{"message":"z6z1zNihCjlEePltz+BG8g==","initialVector":"7376fcbf0b32fbdcd5c5b62c087b7600"},"user":{"id":95,"name":"Bartosz Druga firmaa","email":"bartosz+drugafirma@refericon.pl","image":"https://aether-dev-bucket.s3.amazonaws.com/users/7T6im01PAj4cahksWHllrL7se2SQ9buquIjGGFtp.jpg","permissions":[],"roles":[{"id":2,"name":"Clinician"}]},"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","recipients":[{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"95"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"44"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"1250"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"3067"}]}'
                        name: message
                        recipients:
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: true
                            clientId: '95'
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: false
                            clientId: '44'
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: false
                            clientId: '1250'
                          -
                            delivered: true
                            msgId: b8673175-01e6-4b6d-9032-226d3df20637
                            seen: false
                            clientId: '3067'
                        timestamp: 1696239176715
                        created_at: '2023-10-02 09:32:56'
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          example: 651a8e4868d5dc27c0000cc2
                        channel:
                          type: string
                          example: chat.messages.room.44.56bf7d37-4ed6-4db4-947b-d68a1066677c.communication-channel
                        clientId:
                          type: string
                          example: '95'
                        msgId:
                          type: string
                          example: b8673175-01e6-4b6d-9032-226d3df20637
                        data:
                          type: string
                          example: '{"encryptedMessage":{"message":"z6z1zNihCjlEePltz+BG8g==","initialVector":"7376fcbf0b32fbdcd5c5b62c087b7600"},"user":{"id":95,"name":"Bartosz Druga firmaa","email":"bartosz+drugafirma@refericon.pl","image":"https://aether-dev-bucket.s3.amazonaws.com/users/7T6im01PAj4cahksWHllrL7se2SQ9buquIjGGFtp.jpg","permissions":[],"roles":[{"id":2,"name":"Clinician"}]},"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","recipients":[{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"95"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"44"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"1250"},{"delivered":true,"msgId":"b8673175-01e6-4b6d-9032-226d3df20637","seen":false,"clientId":"3067"}]}'
                        name:
                          type: string
                          example: message
                        recipients:
                          type: array
                          example:
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: true
                              clientId: '95'
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: false
                              clientId: '44'
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: false
                              clientId: '1250'
                            -
                              delivered: true
                              msgId: b8673175-01e6-4b6d-9032-226d3df20637
                              seen: false
                              clientId: '3067'
                          items:
                            type: object
                            properties:
                              delivered:
                                type: boolean
                                example: true
                              msgId:
                                type: string
                                example: b8673175-01e6-4b6d-9032-226d3df20637
                              seen:
                                type: boolean
                                example: true
                              clientId:
                                type: string
                                example: '95'
                        timestamp:
                          type: integer
                          example: 1696239176715
                        created_at:
                          type: string
                          example: '2023-10-02 09:32:56'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to delete message'
                  code: 'CHAT:DELETE_MESSAGE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to delete message'
                  code:
                    type: string
                    example: 'CHAT:DELETE_MESSAGE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Message not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Chat message not found'
                  code: 'CHAT:DELETE_MESSAGE:MESSAGE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Chat message not found'
                  code:
                    type: string
                    example: 'CHAT:DELETE_MESSAGE:MESSAGE_NOT_FOUND'
      tags:
        - Chat
    parameters:
      -
        in: path
        name: msgId
        description: ''
        example: 15
        required: true
        schema:
          type: integer
  '/api/chat/tickets/{roomId}':
    get:
      summary: 'Get tickets list for chat room'
      operationId: getTicketsListForChatRoom
      description: "Possible extend options:\n\t\t<ul>\n\t\t\t<li>sender - the user who created ticket</li>\n\t\t\t<li>recipient - the user who was ticket recipient</li>\n\t\t\t<li>messages - message allocated to ticket</li>\n\t\t\t<li>messages.attachments - list of attachments assigned to message and ticket</li>\n\t\t\t<li>messages.sender - the user who wrote the message</li>\n\t\t</ul>\n\t"
      parameters:
        -
          in: query
          name: status
          description: 'Filter tickets by status (available: <code>new</code>,<code>in_progress</code>,<code>closed</code>,<code>reopened</code>.'
          example: nam
          required: false
          schema:
            type: string
            description: 'Filter tickets by status (available: <code>new</code>,<code>in_progress</code>,<code>closed</code>,<code>reopened</code>.'
            example: nam
        -
          in: query
          name: sender
          description: 'Filter tickets by sender.'
          example: 7
          required: false
          schema:
            type: integer
            description: 'Filter tickets by sender.'
            example: 7
        -
          in: query
          name: recipient
          description: 'Filter tickets by recipient.'
          example: 18
          required: false
          schema:
            type: integer
            description: 'Filter tickets by recipient.'
            example: 18
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>sender</code>, <code>recipient</code>, <code>messages</code>, <code>messages.attachments</code>, <code>messages.sender</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>sender</code>, <code>recipient</code>, <code>messages</code>, <code>messages.attachments</code>, <code>messages.sender</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 87
                      sender_id: 288
                      recipient_id: 289
                      device_id: null
                      meeting_date: '2026-01-12 16:48:08'
                      meeting_type: online_meeting
                      contact_email: uernser@gmail.com
                      status: new
                      created_at: '2026-01-12T16:48:08.000000Z'
                      updated_at: '2026-01-12T16:48:08.000000Z'
                      sender:
                        id: 288
                        mrn: QVCJ5ON71768236488
                        name: 'Mustafa Wiegand IV'
                        email: 1768236488makayla.farrell@example.org
                        language: en
                        phone: 1-909-903-8306
                        phone_country: TG
                        phone_verified_at: null
                        address1: '743 Josephine Shoals'
                        address2: 'Lake Karellechester, ME 93703-6930'
                        postal_code: 27933-0071
                        city: Metz-Rutherford
                        clinic_name: Keonmouth
                        clinic_location: "29880 Ladarius Village\nWizastad, NE 65148"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:08.000000Z'
                        updated_at: '2026-01-12T16:48:08.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                      recipient:
                        id: 289
                        mrn: XE366NUS1768236488
                        name: 'Penelope Durgan'
                        email: 1768236488emard.jarrod@example.net
                        language: en
                        phone: 346.487.9465
                        phone_country: AZ
                        phone_verified_at: null
                        address1: '8903 Walter Motorway Apt. 708'
                        address2: 'Judeland, IA 58958'
                        postal_code: 26721-8310
                        city: Turcotte-Kovacek
                        clinic_name: Reingerside
                        clinic_location: "1112 Torey Passage Apt. 390\nSouth Francesca, UT 33277-3119"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:08.000000Z'
                        updated_at: '2026-01-12T16:48:08.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                      device: null
                      messages: []
                    -
                      id: 88
                      sender_id: 290
                      recipient_id: 291
                      device_id: null
                      meeting_date: '2026-01-12 16:48:08'
                      meeting_type: online_meeting
                      contact_email: araceli.thompson@tillman.com
                      status: new
                      created_at: '2026-01-12T16:48:08.000000Z'
                      updated_at: '2026-01-12T16:48:08.000000Z'
                      sender:
                        id: 290
                        mrn: 52HO7ZBI1768236488
                        name: 'Prof. Lizzie Yundt III'
                        email: 1768236488rutherford.gladyce@example.com
                        language: en
                        phone: '(629) 875-5963'
                        phone_country: SN
                        phone_verified_at: null
                        address1: '6518 Bridie Canyon Apt. 112'
                        address2: 'Kochchester, MN 84287-3091'
                        postal_code: 80008-5535
                        city: Dicki-Beier
                        clinic_name: 'South Lura'
                        clinic_location: "4310 Joan Springs\nDexterville, PA 47020-2500"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:08.000000Z'
                        updated_at: '2026-01-12T16:48:08.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                      recipient:
                        id: 291
                        mrn: S8PC47ZN1768236488
                        name: 'Prof. Kylee Predovic DDS'
                        email: 1768236488chadrick.quitzon@example.org
                        language: en
                        phone: '(501) 919-9088'
                        phone_country: BI
                        phone_verified_at: null
                        address1: '2426 Saul Heights'
                        address2: 'Wintheiserton, SD 03537'
                        postal_code: 47837-9405
                        city: 'Rau Ltd'
                        clinic_name: Johnton
                        clinic_location: "18572 Renner Union Suite 477\nEast Mauricio, NM 64309"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:08.000000Z'
                        updated_at: '2026-01-12T16:48:08.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                      device: null
                      messages: []
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 87
                        sender_id: 288
                        recipient_id: 289
                        device_id: null
                        meeting_date: '2026-01-12 16:48:08'
                        meeting_type: online_meeting
                        contact_email: uernser@gmail.com
                        status: new
                        created_at: '2026-01-12T16:48:08.000000Z'
                        updated_at: '2026-01-12T16:48:08.000000Z'
                        sender:
                          id: 288
                          mrn: QVCJ5ON71768236488
                          name: 'Mustafa Wiegand IV'
                          email: 1768236488makayla.farrell@example.org
                          language: en
                          phone: 1-909-903-8306
                          phone_country: TG
                          phone_verified_at: null
                          address1: '743 Josephine Shoals'
                          address2: 'Lake Karellechester, ME 93703-6930'
                          postal_code: 27933-0071
                          city: Metz-Rutherford
                          clinic_name: Keonmouth
                          clinic_location: "29880 Ladarius Village\nWizastad, NE 65148"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:48:08.000000Z'
                          updated_at: '2026-01-12T16:48:08.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                        recipient:
                          id: 289
                          mrn: XE366NUS1768236488
                          name: 'Penelope Durgan'
                          email: 1768236488emard.jarrod@example.net
                          language: en
                          phone: 346.487.9465
                          phone_country: AZ
                          phone_verified_at: null
                          address1: '8903 Walter Motorway Apt. 708'
                          address2: 'Judeland, IA 58958'
                          postal_code: 26721-8310
                          city: Turcotte-Kovacek
                          clinic_name: Reingerside
                          clinic_location: "1112 Torey Passage Apt. 390\nSouth Francesca, UT 33277-3119"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:48:08.000000Z'
                          updated_at: '2026-01-12T16:48:08.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                        device: null
                        messages: []
                      -
                        id: 88
                        sender_id: 290
                        recipient_id: 291
                        device_id: null
                        meeting_date: '2026-01-12 16:48:08'
                        meeting_type: online_meeting
                        contact_email: araceli.thompson@tillman.com
                        status: new
                        created_at: '2026-01-12T16:48:08.000000Z'
                        updated_at: '2026-01-12T16:48:08.000000Z'
                        sender:
                          id: 290
                          mrn: 52HO7ZBI1768236488
                          name: 'Prof. Lizzie Yundt III'
                          email: 1768236488rutherford.gladyce@example.com
                          language: en
                          phone: '(629) 875-5963'
                          phone_country: SN
                          phone_verified_at: null
                          address1: '6518 Bridie Canyon Apt. 112'
                          address2: 'Kochchester, MN 84287-3091'
                          postal_code: 80008-5535
                          city: Dicki-Beier
                          clinic_name: 'South Lura'
                          clinic_location: "4310 Joan Springs\nDexterville, PA 47020-2500"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:48:08.000000Z'
                          updated_at: '2026-01-12T16:48:08.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                        recipient:
                          id: 291
                          mrn: S8PC47ZN1768236488
                          name: 'Prof. Kylee Predovic DDS'
                          email: 1768236488chadrick.quitzon@example.org
                          language: en
                          phone: '(501) 919-9088'
                          phone_country: BI
                          phone_verified_at: null
                          address1: '2426 Saul Heights'
                          address2: 'Wintheiserton, SD 03537'
                          postal_code: 47837-9405
                          city: 'Rau Ltd'
                          clinic_name: Johnton
                          clinic_location: "18572 Renner Union Suite 477\nEast Mauricio, NM 64309"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:48:08.000000Z'
                          updated_at: '2026-01-12T16:48:08.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                        device: null
                        messages: []
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 87
                        sender_id:
                          type: integer
                          example: 288
                        recipient_id:
                          type: integer
                          example: 289
                        device_id:
                          type: string
                          example: null
                        meeting_date:
                          type: string
                          example: '2026-01-12 16:48:08'
                        meeting_type:
                          type: string
                          example: online_meeting
                        contact_email:
                          type: string
                          example: uernser@gmail.com
                        status:
                          type: string
                          example: new
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:08.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:08.000000Z'
                        sender:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 288
                            mrn:
                              type: string
                              example: QVCJ5ON71768236488
                            name:
                              type: string
                              example: 'Mustafa Wiegand IV'
                            email:
                              type: string
                              example: 1768236488makayla.farrell@example.org
                            language:
                              type: string
                              example: en
                            phone:
                              type: string
                              example: 1-909-903-8306
                            phone_country:
                              type: string
                              example: TG
                            phone_verified_at:
                              type: string
                              example: null
                            address1:
                              type: string
                              example: '743 Josephine Shoals'
                            address2:
                              type: string
                              example: 'Lake Karellechester, ME 93703-6930'
                            postal_code:
                              type: string
                              example: 27933-0071
                            city:
                              type: string
                              example: Metz-Rutherford
                            clinic_name:
                              type: string
                              example: Keonmouth
                            clinic_location:
                              type: string
                              example: "29880 Ladarius Village\nWizastad, NE 65148"
                            image:
                              type: string
                              example: null
                            mfa_enabled:
                              type: integer
                              example: 0
                            mfa_method:
                              type: string
                              example: null
                            mfa_verified_to:
                              type: string
                              example: null
                            location_id:
                              type: string
                              example: null
                            created_by:
                              type: string
                              example: null
                            active:
                              type: integer
                              example: 1
                            notifications_timezone:
                              type: string
                              example: null
                            notifications_at:
                              type: string
                              example: null
                            created_at:
                              type: string
                              example: '2026-01-12T16:48:08.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:48:08.000000Z'
                            invitation_status:
                              type: string
                              example: null
                            acadle_invitation_status:
                              type: string
                              example: null
                            roles:
                              type: array
                              example: []
                        recipient:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 289
                            mrn:
                              type: string
                              example: XE366NUS1768236488
                            name:
                              type: string
                              example: 'Penelope Durgan'
                            email:
                              type: string
                              example: 1768236488emard.jarrod@example.net
                            language:
                              type: string
                              example: en
                            phone:
                              type: string
                              example: 346.487.9465
                            phone_country:
                              type: string
                              example: AZ
                            phone_verified_at:
                              type: string
                              example: null
                            address1:
                              type: string
                              example: '8903 Walter Motorway Apt. 708'
                            address2:
                              type: string
                              example: 'Judeland, IA 58958'
                            postal_code:
                              type: string
                              example: 26721-8310
                            city:
                              type: string
                              example: Turcotte-Kovacek
                            clinic_name:
                              type: string
                              example: Reingerside
                            clinic_location:
                              type: string
                              example: "1112 Torey Passage Apt. 390\nSouth Francesca, UT 33277-3119"
                            image:
                              type: string
                              example: null
                            mfa_enabled:
                              type: integer
                              example: 0
                            mfa_method:
                              type: string
                              example: null
                            mfa_verified_to:
                              type: string
                              example: null
                            location_id:
                              type: string
                              example: null
                            created_by:
                              type: string
                              example: null
                            active:
                              type: integer
                              example: 1
                            notifications_timezone:
                              type: string
                              example: null
                            notifications_at:
                              type: string
                              example: null
                            created_at:
                              type: string
                              example: '2026-01-12T16:48:08.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:48:08.000000Z'
                            invitation_status:
                              type: string
                              example: null
                            acadle_invitation_status:
                              type: string
                              example: null
                            roles:
                              type: array
                              example: []
                        device:
                          type: string
                          example: null
                        messages:
                          type: array
                          example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view chat room tickets'
                  code: 'CHAT:LIST_TICKETS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view chat room tickets'
                  code:
                    type: string
                    example: 'CHAT:LIST_TICKETS:INSUFFICIENT_PERMISSION'
        404:
          description: 'Chat room not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Chat room not found'
                  code: 'CHAT:LIST_TICKETS:ROOM_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Chat room not found'
                  code:
                    type: string
                    example: 'CHAT:LIST_TICKETS:ROOM_NOT_FOUND'
      tags:
        - Chat
    parameters:
      -
        in: path
        name: roomId
        description: ''
        example: enim
        required: true
        schema:
          type: string
  /api/chat/available-patients:
    get:
      summary: 'List of available patients for chat'
      operationId: listOfAvailablePatientsForChat
      description: "Possible extend options:\n\t\t<ul>\n\t\t\t<li>clinician - clinician assigned to this user</li>\n\t\t\t<li>devices - products assigned to user</li>\n\t\t\t<li>roles - user roles</li>\n\t\t</ul>\n\t"
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 292
                      mrn: MW8VIH1G1768236488
                      name: 'Mrs. Marian Von'
                      email: 1768236488qabshire@example.net
                      language: en
                      phone: +1-531-514-7353
                      phone_country: SJ
                      phone_verified_at: null
                      address1: '85563 Ankunding Throughway Apt. 805'
                      address2: 'Oriontown, DE 14893-1465'
                      postal_code: '15100'
                      city: 'Kuphal, Hills and Rogahn'
                      clinic_name: Rauburgh
                      clinic_location: "33945 Duane Stravenue\nD'Amorechester, MD 90091-7589"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:48:08.000000Z'
                      updated_at: '2026-01-12T16:48:08.000000Z'
                      invitation_status: accepted
                      acadle_invitation_status: null
                      devices:
                        -
                          id: 141
                          serial: e61848ab-75be-3251-8527-15371f305adb
                          bluetooth_id: b969ecc1-fac2-3a23-b1c7-26d83ccf0abc
                          company_id: null
                          model_id: null
                          amputee_id: 292
                          clinician_id: null
                          firmware_version_id: null
                          pcb_version_id: null
                          reverse_magnets: 0
                          is_electrode: 0
                          active: 1
                          last_activity_at: '0000-00-00 00:00:00'
                          created_at: '2026-01-12T16:48:08.000000Z'
                          updated_at: '2026-01-12T16:48:08.000000Z'
                      roles:
                        -
                          id: 3
                          name: Clinician
                    -
                      id: 293
                      mrn: J3YHFU1M1768236488
                      name: 'Ms. Carli Turcotte'
                      email: 1768236488liza.nader@example.net
                      language: en
                      phone: 1-279-864-8134
                      phone_country: PN
                      phone_verified_at: null
                      address1: '91807 Lemke Centers'
                      address2: 'New Earnestinefurt, AZ 26397'
                      postal_code: '56751'
                      city: 'Cormier, Hansen and Simonis'
                      clinic_name: 'East Gretamouth'
                      clinic_location: "98410 Burnice Locks Apt. 871\nNew Mable, DC 95996"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:48:08.000000Z'
                      updated_at: '2026-01-12T16:48:08.000000Z'
                      invitation_status: null
                      acadle_invitation_status: null
                      devices:
                        -
                          id: 142
                          serial: 42238c2b-ad45-34f4-9620-ad353e09fd7a
                          bluetooth_id: 6bd666ad-554b-3777-a28f-9eff22f07114
                          company_id: null
                          model_id: null
                          amputee_id: 293
                          clinician_id: null
                          firmware_version_id: null
                          pcb_version_id: null
                          reverse_magnets: 0
                          is_electrode: 0
                          active: 1
                          last_activity_at: '0000-00-00 00:00:00'
                          created_at: '2026-01-12T16:48:08.000000Z'
                          updated_at: '2026-01-12T16:48:08.000000Z'
                      roles:
                        -
                          id: 1
                          name: SuperAdmin
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 292
                        mrn: MW8VIH1G1768236488
                        name: 'Mrs. Marian Von'
                        email: 1768236488qabshire@example.net
                        language: en
                        phone: +1-531-514-7353
                        phone_country: SJ
                        phone_verified_at: null
                        address1: '85563 Ankunding Throughway Apt. 805'
                        address2: 'Oriontown, DE 14893-1465'
                        postal_code: '15100'
                        city: 'Kuphal, Hills and Rogahn'
                        clinic_name: Rauburgh
                        clinic_location: "33945 Duane Stravenue\nD'Amorechester, MD 90091-7589"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:08.000000Z'
                        updated_at: '2026-01-12T16:48:08.000000Z'
                        invitation_status: accepted
                        acadle_invitation_status: null
                        devices:
                          -
                            id: 141
                            serial: e61848ab-75be-3251-8527-15371f305adb
                            bluetooth_id: b969ecc1-fac2-3a23-b1c7-26d83ccf0abc
                            company_id: null
                            model_id: null
                            amputee_id: 292
                            clinician_id: null
                            firmware_version_id: null
                            pcb_version_id: null
                            reverse_magnets: 0
                            is_electrode: 0
                            active: 1
                            last_activity_at: '0000-00-00 00:00:00'
                            created_at: '2026-01-12T16:48:08.000000Z'
                            updated_at: '2026-01-12T16:48:08.000000Z'
                        roles:
                          -
                            id: 3
                            name: Clinician
                      -
                        id: 293
                        mrn: J3YHFU1M1768236488
                        name: 'Ms. Carli Turcotte'
                        email: 1768236488liza.nader@example.net
                        language: en
                        phone: 1-279-864-8134
                        phone_country: PN
                        phone_verified_at: null
                        address1: '91807 Lemke Centers'
                        address2: 'New Earnestinefurt, AZ 26397'
                        postal_code: '56751'
                        city: 'Cormier, Hansen and Simonis'
                        clinic_name: 'East Gretamouth'
                        clinic_location: "98410 Burnice Locks Apt. 871\nNew Mable, DC 95996"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:08.000000Z'
                        updated_at: '2026-01-12T16:48:08.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        devices:
                          -
                            id: 142
                            serial: 42238c2b-ad45-34f4-9620-ad353e09fd7a
                            bluetooth_id: 6bd666ad-554b-3777-a28f-9eff22f07114
                            company_id: null
                            model_id: null
                            amputee_id: 293
                            clinician_id: null
                            firmware_version_id: null
                            pcb_version_id: null
                            reverse_magnets: 0
                            is_electrode: 0
                            active: 1
                            last_activity_at: '0000-00-00 00:00:00'
                            created_at: '2026-01-12T16:48:08.000000Z'
                            updated_at: '2026-01-12T16:48:08.000000Z'
                        roles:
                          -
                            id: 1
                            name: SuperAdmin
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 292
                        mrn:
                          type: string
                          example: MW8VIH1G1768236488
                        name:
                          type: string
                          example: 'Mrs. Marian Von'
                        email:
                          type: string
                          example: 1768236488qabshire@example.net
                        language:
                          type: string
                          example: en
                        phone:
                          type: string
                          example: +1-531-514-7353
                        phone_country:
                          type: string
                          example: SJ
                        phone_verified_at:
                          type: string
                          example: null
                        address1:
                          type: string
                          example: '85563 Ankunding Throughway Apt. 805'
                        address2:
                          type: string
                          example: 'Oriontown, DE 14893-1465'
                        postal_code:
                          type: string
                          example: '15100'
                        city:
                          type: string
                          example: 'Kuphal, Hills and Rogahn'
                        clinic_name:
                          type: string
                          example: Rauburgh
                        clinic_location:
                          type: string
                          example: "33945 Duane Stravenue\nD'Amorechester, MD 90091-7589"
                        image:
                          type: string
                          example: null
                        mfa_enabled:
                          type: integer
                          example: 0
                        mfa_method:
                          type: string
                          example: null
                        mfa_verified_to:
                          type: string
                          example: null
                        location_id:
                          type: string
                          example: null
                        created_by:
                          type: string
                          example: null
                        active:
                          type: integer
                          example: 1
                        notifications_timezone:
                          type: string
                          example: null
                        notifications_at:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:08.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:08.000000Z'
                        invitation_status:
                          type: string
                          example: accepted
                        acadle_invitation_status:
                          type: string
                          example: null
                        devices:
                          type: array
                          example:
                            -
                              id: 141
                              serial: e61848ab-75be-3251-8527-15371f305adb
                              bluetooth_id: b969ecc1-fac2-3a23-b1c7-26d83ccf0abc
                              company_id: null
                              model_id: null
                              amputee_id: 292
                              clinician_id: null
                              firmware_version_id: null
                              pcb_version_id: null
                              reverse_magnets: 0
                              is_electrode: 0
                              active: 1
                              last_activity_at: '0000-00-00 00:00:00'
                              created_at: '2026-01-12T16:48:08.000000Z'
                              updated_at: '2026-01-12T16:48:08.000000Z'
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 141
                              serial:
                                type: string
                                example: e61848ab-75be-3251-8527-15371f305adb
                              bluetooth_id:
                                type: string
                                example: b969ecc1-fac2-3a23-b1c7-26d83ccf0abc
                              company_id:
                                type: string
                                example: null
                              model_id:
                                type: string
                                example: null
                              amputee_id:
                                type: integer
                                example: 292
                              clinician_id:
                                type: string
                                example: null
                              firmware_version_id:
                                type: string
                                example: null
                              pcb_version_id:
                                type: string
                                example: null
                              reverse_magnets:
                                type: integer
                                example: 0
                              is_electrode:
                                type: integer
                                example: 0
                              active:
                                type: integer
                                example: 1
                              last_activity_at:
                                type: string
                                example: '0000-00-00 00:00:00'
                              created_at:
                                type: string
                                example: '2026-01-12T16:48:08.000000Z'
                              updated_at:
                                type: string
                                example: '2026-01-12T16:48:08.000000Z'
                        roles:
                          type: array
                          example:
                            -
                              id: 3
                              name: Clinician
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 3
                              name:
                                type: string
                                example: Clinician
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list available patients'
                  code: 'CHAT:LIST_PATIENTS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list available patients'
                  code:
                    type: string
                    example: 'CHAT:LIST_PATIENTS:INSUFFICIENT_PERMISSION'
      tags:
        - Chat
  '/api/chat/room/{id}/available-participants':
    get:
      summary: 'List of available participants for chat'
      operationId: listOfAvailableParticipantsForChat
      description: "Possible extend options:\n\t\t<ul>\n\t\t\t<li>roles - user roles</li>\n\t\t\t<li>permissions - user permissions</li>\n\t\t</ul>\n\t"
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>roles</code>, <code>permissions</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>roles</code>, <code>permissions</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 294
                      mrn: Y3IE4A651768236488
                      name: 'Judy Luettgen'
                      email: 1768236488hmayer@example.com
                      language: en
                      phone: +1-470-812-6003
                      phone_country: NU
                      phone_verified_at: null
                      address1: '4261 Terry Path Suite 137'
                      address2: 'South Mertie, IN 99079'
                      postal_code: '85877'
                      city: Hauck-Carroll
                      clinic_name: 'North Georgiana'
                      clinic_location: "43599 Letitia Groves Apt. 351\nAmoshaven, NJ 16913-7172"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:48:08.000000Z'
                      updated_at: '2026-01-12T16:48:08.000000Z'
                      invitation_status: null
                      acadle_invitation_status: null
                      roles:
                        -
                          id: 5
                          name: Amputee
                    -
                      id: 295
                      mrn: ABYHDVI21768236488
                      name: 'Miss Felipa Kshlerin'
                      email: 1768236488estehr@example.com
                      language: en
                      phone: 806.516.5492
                      phone_country: VN
                      phone_verified_at: null
                      address1: '4314 Bogisich Valleys'
                      address2: 'South Edmondstad, IL 24076-0996'
                      postal_code: '03321'
                      city: Pfannerstill-Bradtke
                      clinic_name: Ericville
                      clinic_location: "192 Kasey Landing\nAmeliehaven, OH 92191"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:48:08.000000Z'
                      updated_at: '2026-01-12T16:48:08.000000Z'
                      invitation_status: accepted
                      acadle_invitation_status: null
                      roles:
                        -
                          id: 2
                          name: ClinicAdmin
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 294
                        mrn: Y3IE4A651768236488
                        name: 'Judy Luettgen'
                        email: 1768236488hmayer@example.com
                        language: en
                        phone: +1-470-812-6003
                        phone_country: NU
                        phone_verified_at: null
                        address1: '4261 Terry Path Suite 137'
                        address2: 'South Mertie, IN 99079'
                        postal_code: '85877'
                        city: Hauck-Carroll
                        clinic_name: 'North Georgiana'
                        clinic_location: "43599 Letitia Groves Apt. 351\nAmoshaven, NJ 16913-7172"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:08.000000Z'
                        updated_at: '2026-01-12T16:48:08.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles:
                          -
                            id: 5
                            name: Amputee
                      -
                        id: 295
                        mrn: ABYHDVI21768236488
                        name: 'Miss Felipa Kshlerin'
                        email: 1768236488estehr@example.com
                        language: en
                        phone: 806.516.5492
                        phone_country: VN
                        phone_verified_at: null
                        address1: '4314 Bogisich Valleys'
                        address2: 'South Edmondstad, IL 24076-0996'
                        postal_code: '03321'
                        city: Pfannerstill-Bradtke
                        clinic_name: Ericville
                        clinic_location: "192 Kasey Landing\nAmeliehaven, OH 92191"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:08.000000Z'
                        updated_at: '2026-01-12T16:48:08.000000Z'
                        invitation_status: accepted
                        acadle_invitation_status: null
                        roles:
                          -
                            id: 2
                            name: ClinicAdmin
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 294
                        mrn:
                          type: string
                          example: Y3IE4A651768236488
                        name:
                          type: string
                          example: 'Judy Luettgen'
                        email:
                          type: string
                          example: 1768236488hmayer@example.com
                        language:
                          type: string
                          example: en
                        phone:
                          type: string
                          example: +1-470-812-6003
                        phone_country:
                          type: string
                          example: NU
                        phone_verified_at:
                          type: string
                          example: null
                        address1:
                          type: string
                          example: '4261 Terry Path Suite 137'
                        address2:
                          type: string
                          example: 'South Mertie, IN 99079'
                        postal_code:
                          type: string
                          example: '85877'
                        city:
                          type: string
                          example: Hauck-Carroll
                        clinic_name:
                          type: string
                          example: 'North Georgiana'
                        clinic_location:
                          type: string
                          example: "43599 Letitia Groves Apt. 351\nAmoshaven, NJ 16913-7172"
                        image:
                          type: string
                          example: null
                        mfa_enabled:
                          type: integer
                          example: 0
                        mfa_method:
                          type: string
                          example: null
                        mfa_verified_to:
                          type: string
                          example: null
                        location_id:
                          type: string
                          example: null
                        created_by:
                          type: string
                          example: null
                        active:
                          type: integer
                          example: 1
                        notifications_timezone:
                          type: string
                          example: null
                        notifications_at:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:08.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:08.000000Z'
                        invitation_status:
                          type: string
                          example: null
                        acadle_invitation_status:
                          type: string
                          example: null
                        roles:
                          type: array
                          example:
                            -
                              id: 5
                              name: Amputee
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 5
                              name:
                                type: string
                                example: Amputee
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list available participants'
                  code: 'CHAT:LIST_PARTICIPANTS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list available participants'
                  code:
                    type: string
                    example: 'CHAT:LIST_PARTICIPANTS:INSUFFICIENT_PERMISSION'
        404:
          description: 'Chat room not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Chat room not found'
                  code: 'CHAT:LIST_PARTICIPANTS:ROOM_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Chat room not found'
                  code:
                    type: string
                    example: 'CHAT:LIST_PARTICIPANTS:ROOM_NOT_FOUND'
      tags:
        - Chat
    parameters:
      -
        in: path
        name: id
        description: 'Chat room ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config':
    get:
      summary: 'Get device config'
      operationId: getDeviceConfig
      description: "Definitions:\n\t\t- config - current config entries\n\t\t- config history entry - set of changes in config, updated during the session\n\t\t- config history change - single change made to config (part of config history entry)\n\t"
      parameters:
        -
          in: query
          name: _format
          description: 'Config format. Pass <code>collection</code> to receive config as resource collection.'
          example: unde
          required: false
          schema:
            type: string
            description: 'Config format. Pass <code>collection</code> to receive config as resource collection.'
            example: unde
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Normal/compact response'
                    type: object
                    example:
                      common:
                        gripPairsConfig:
                          - 1
                          - 4
                          - 2
                          - 3
                          - 6
                          - 7
                          - 9
                          - 8
                        controlConfig:
                          - 0
                          - 1
                          - 0
                          - 0
                          - 0
                        emgThresholds:
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                        interval:
                          - 100
                        gripSequentialConfig:
                          - 1
                          - 2
                          - 4
                          - 3
                          - 0
                          - 255
                          - 6
                          - 7
                          - 9
                          - 8
                          - 255
                          - 255
                      modes:
                        -
                          id: 100
                          name: 'Mode 1'
                          slot: 0
                          config:
                            interval:
                              - 300
                            fingerStrength:
                              - 1
                              - 100
                            autoGrasp:
                              - 0
                              - 100
                            emgSpike:
                              - 0
                              - 300
                        -
                          id: 101
                          name: 'Mode 2'
                          slot: 1
                          config:
                            interval:
                              - 400
                            fingerStrength:
                              - 1
                              - 100
                            autoGrasp:
                              - 0
                              - 100
                            emgSpike:
                              - 0
                              - 300
                        -
                          id: 102
                          name: 'Mode 3'
                          slot: 2
                          config:
                            interval:
                              - 500
                            fingerStrength:
                              - 1
                              - 100
                            autoGrasp:
                              - 0
                              - 100
                            emgSpike:
                              - 0
                              - 300
                    properties:
                      common:
                        type: object
                        properties:
                          gripPairsConfig:
                            type: array
                            example:
                              - 1
                              - 4
                              - 2
                              - 3
                              - 6
                              - 7
                              - 9
                              - 8
                            items:
                              type: integer
                          controlConfig:
                            type: array
                            example:
                              - 0
                              - 1
                              - 0
                              - 0
                              - 0
                            items:
                              type: integer
                          emgThresholds:
                            type: array
                            example:
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                            items:
                              type: integer
                          interval:
                            type: array
                            example:
                              - 100
                            items:
                              type: integer
                          gripSequentialConfig:
                            type: array
                            example:
                              - 1
                              - 2
                              - 4
                              - 3
                              - 0
                              - 255
                              - 6
                              - 7
                              - 9
                              - 8
                              - 255
                              - 255
                            items:
                              type: integer
                      modes:
                        type: array
                        example:
                          -
                            id: 100
                            name: 'Mode 1'
                            slot: 0
                            config:
                              interval:
                                - 300
                              fingerStrength:
                                - 1
                                - 100
                              autoGrasp:
                                - 0
                                - 100
                              emgSpike:
                                - 0
                                - 300
                          -
                            id: 101
                            name: 'Mode 2'
                            slot: 1
                            config:
                              interval:
                                - 400
                              fingerStrength:
                                - 1
                                - 100
                              autoGrasp:
                                - 0
                                - 100
                              emgSpike:
                                - 0
                                - 300
                          -
                            id: 102
                            name: 'Mode 3'
                            slot: 2
                            config:
                              interval:
                                - 500
                              fingerStrength:
                                - 1
                                - 100
                              autoGrasp:
                                - 0
                                - 100
                              emgSpike:
                                - 0
                                - 300
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 100
                            name:
                              type: string
                              example: 'Mode 1'
                            slot:
                              type: integer
                              example: 0
                            config:
                              type: object
                              properties:
                                interval:
                                  type: array
                                  example:
                                    - 300
                                  items:
                                    type: integer
                                fingerStrength:
                                  type: array
                                  example:
                                    - 1
                                    - 100
                                  items:
                                    type: integer
                                autoGrasp:
                                  type: array
                                  example:
                                    - 0
                                    - 100
                                  items:
                                    type: integer
                                emgSpike:
                                  type: array
                                  example:
                                    - 0
                                    - 300
                                  items:
                                    type: integer
                  -
                    description: ''
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        device_id:
                          type: integer
                          example: 14
                        mode_id:
                          type: integer
                          example: 1
                        key:
                          type: string
                          example: qui
                        value:
                          type: string
                          example: occaecati
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:46.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:46.000000Z'
                        mode:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            device_id:
                              type: integer
                              example: 15
                            slot:
                              type: string
                              example: null
                            name:
                              type: string
                              example: 'Eum qui cumque quod rerum a ducimus quis possimus.'
                            active:
                              type: integer
                              example: 0
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:46.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:46.000000Z'
                    example:
                      -
                        id: 1
                        device_id: 14
                        mode_id: 1
                        key: qui
                        value: occaecati
                        created_at: '2026-01-12T16:47:46.000000Z'
                        updated_at: '2026-01-12T16:47:46.000000Z'
                        mode:
                          id: 1
                          device_id: 15
                          slot: null
                          name: 'Eum qui cumque quod rerum a ducimus quis possimus.'
                          active: 0
                          created_at: '2026-01-12T16:47:46.000000Z'
                          updated_at: '2026-01-12T16:47:46.000000Z'
                      -
                        id: 2
                        device_id: 16
                        mode_id: 2
                        key: necessitatibus
                        value: laborum
                        created_at: '2026-01-12T16:47:46.000000Z'
                        updated_at: '2026-01-12T16:47:46.000000Z'
                        mode:
                          id: 2
                          device_id: 17
                          slot: null
                          name: 'Laboriosam molestiae perferendis maxime sed et.'
                          active: 0
                          created_at: '2026-01-12T16:47:46.000000Z'
                          updated_at: '2026-01-12T16:47:46.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view device config'
                  code: 'CONFIG:GET:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view device config'
                  code:
                    type: string
                    example: 'CONFIG:GET:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'CONFIG:GET:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'CONFIG:GET:DEVICE_NOT_FOUND'
      tags:
        - Config
    post:
      summary: 'Update device config'
      operationId: updateDeviceConfig
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  common:
                    gripPairsConfig:
                      - 1
                      - 4
                      - 2
                      - 3
                      - 6
                      - 7
                      - 9
                      - 8
                    controlConfig:
                      - 0
                      - 1
                      - 0
                      - 0
                      - 0
                    emgThresholds:
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                    interval:
                      - 100
                    gripSequentialConfig:
                      - 1
                      - 2
                      - 4
                      - 3
                      - 0
                      - 255
                      - 6
                      - 7
                      - 9
                      - 8
                      - 255
                      - 255
                  modes:
                    -
                      id: 100
                      name: 'Mode 1'
                      slot: 0
                      config:
                        interval:
                          - 300
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                    -
                      id: 101
                      name: 'Mode 2'
                      slot: 1
                      config:
                        interval:
                          - 400
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                    -
                      id: 102
                      name: 'Mode 3'
                      slot: 2
                      config:
                        interval:
                          - 500
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                properties:
                  common:
                    type: object
                    properties:
                      gripPairsConfig:
                        type: array
                        example:
                          - 1
                          - 4
                          - 2
                          - 3
                          - 6
                          - 7
                          - 9
                          - 8
                        items:
                          type: integer
                      controlConfig:
                        type: array
                        example:
                          - 0
                          - 1
                          - 0
                          - 0
                          - 0
                        items:
                          type: integer
                      emgThresholds:
                        type: array
                        example:
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                        items:
                          type: integer
                      interval:
                        type: array
                        example:
                          - 100
                        items:
                          type: integer
                      gripSequentialConfig:
                        type: array
                        example:
                          - 1
                          - 2
                          - 4
                          - 3
                          - 0
                          - 255
                          - 6
                          - 7
                          - 9
                          - 8
                          - 255
                          - 255
                        items:
                          type: integer
                  modes:
                    type: array
                    example:
                      -
                        id: 100
                        name: 'Mode 1'
                        slot: 0
                        config:
                          interval:
                            - 300
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                      -
                        id: 101
                        name: 'Mode 2'
                        slot: 1
                        config:
                          interval:
                            - 400
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                      -
                        id: 102
                        name: 'Mode 3'
                        slot: 2
                        config:
                          interval:
                            - 500
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 100
                        name:
                          type: string
                          example: 'Mode 1'
                        slot:
                          type: integer
                          example: 0
                        config:
                          type: object
                          properties:
                            interval:
                              type: array
                              example:
                                - 300
                              items:
                                type: integer
                            fingerStrength:
                              type: array
                              example:
                                - 1
                                - 100
                              items:
                                type: integer
                            autoGrasp:
                              type: array
                              example:
                                - 0
                                - 100
                              items:
                                type: integer
                            emgSpike:
                              type: array
                              example:
                                - 0
                                - 300
                              items:
                                type: integer
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update device config'
                  code: 'CONFIG:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update device config'
                  code:
                    type: string
                    example: 'CONFIG:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'CONFIG:UPDATE:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'CONFIG:UPDATE:DEVICE_NOT_FOUND'
        422:
          description: 'Invalid config'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Config has some problems and cannot be saved.'
                  errors:
                    modes:
                      mode_3: 'Config mode 3 does not belong to device 12.'
                    values:
                      common.inputSite: 'Invalid value ["11"] for key inputSite - contains string values.'
                      common.gripsPositions.1.initial: 'Invalid value [200,"100","100","100","100"] for key gripsPositions.1.initial - contains string values.'
                      mode_1.inputSite: 'Invalid value ["11"] for key inputSite - contains string values.'
                      mode_1.gripsPositions.0.initial: 'Invalid value ["200","100","100","100","100"] for key gripsPositions.1.initial - contains string values.'
                  code: 'CONFIG:UPDATE:INVALID_CONFIG'
                properties:
                  message:
                    type: string
                    example: 'Config has some problems and cannot be saved.'
                  errors:
                    type: object
                    properties:
                      modes:
                        type: object
                        properties:
                          mode_3:
                            type: string
                            example: 'Config mode 3 does not belong to device 12.'
                      values:
                        type: object
                        properties:
                          common.inputSite:
                            type: string
                            example: 'Invalid value ["11"] for key inputSite - contains string values.'
                          common.gripsPositions.1.initial:
                            type: string
                            example: 'Invalid value [200,"100","100","100","100"] for key gripsPositions.1.initial - contains string values.'
                          mode_1.inputSite:
                            type: string
                            example: 'Invalid value ["11"] for key inputSite - contains string values.'
                          mode_1.gripsPositions.0.initial:
                            type: string
                            example: 'Invalid value ["200","100","100","100","100"] for key gripsPositions.1.initial - contains string values.'
                  code:
                    type: string
                    example: 'CONFIG:UPDATE:INVALID_CONFIG'
      tags:
        - Config
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Config history entry name (session name).'
                  example: 'Remote session 2022-05-30'
                common:
                  type: string
                  description: 'Common config as JSON string. MUST_BE_JSON.'
                  example: '{"gripPairsConfig": [1, 4, 2, 3, 6, 7, 9, 8], "controlConfig": [0, 1, 0, 0, 0], "gripSequentialConfig": [1, 2, 4, 3, 0, 255, 6, 7, 9, 8, 255, 255]'
                modes:
                  type: array
                  description: ''
                  example:
                    - []
                  items:
                    type: object
                    properties:
                      id:
                        type: string
                        description: 'Config mode ID. The <code>id</code> of an existing record in the App\Models\ConfigMode table.'
                        example: 1
                      config:
                        type: string
                        description: 'Config specific for mode as JSON string. MUST_BE_JSON.'
                        example: '{"gripPairsConfig": [1, 4, 2, 3, 6, 7, 9, 8], "controlConfig": [0, 1, 0, 0, 0], "gripSequentialConfig": [1, 2, 4, 3, 0, 255, 6, 7, 9, 8, 255, 255]'
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config/history':
    get:
      summary: 'Get device config history'
      operationId: getDeviceConfigHistory
      description: 'For amputees only restore points are returned.'
      parameters:
        -
          in: query
          name: restore_point
          description: 'Filter config entries by restore point status.'
          example: 1
          required: false
          schema:
            type: boolean
            description: 'Filter config entries by restore point status.'
            example: 1
        -
          in: query
          name: factory_reset_point
          description: 'Filter config entries by factory reset point status.'
          example: 1
          required: false
          schema:
            type: boolean
            description: 'Filter config entries by factory reset point status.'
            example: 1
        -
          in: query
          name: date_from
          description: 'Filter config entries from date (timestamp).'
          example: 1642003200
          required: false
          schema:
            type: integer
            description: 'Filter config entries from date (timestamp).'
            example: 1642003200
        -
          in: query
          name: date_to
          description: 'Filter config entries to date (timestamp).'
          example: 1642003200
          required: false
          schema:
            type: integer
            description: 'Filter config entries to date (timestamp).'
            example: 1642003200
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>author</code>, <code>entries</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>author</code>, <code>entries</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Normal/compact response'
                    type: object
                    example:
                      common:
                        gripPairsConfig:
                          - 1
                          - 4
                          - 2
                          - 3
                          - 6
                          - 7
                          - 9
                          - 8
                        controlConfig:
                          - 0
                          - 1
                          - 0
                          - 0
                          - 0
                        emgThresholds:
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                        interval:
                          - 100
                        gripSequentialConfig:
                          - 1
                          - 2
                          - 4
                          - 3
                          - 0
                          - 255
                          - 6
                          - 7
                          - 9
                          - 8
                          - 255
                          - 255
                      modes:
                        -
                          id: 100
                          name: 'Mode 1'
                          slot: 0
                          config:
                            interval:
                              - 300
                            fingerStrength:
                              - 1
                              - 100
                            autoGrasp:
                              - 0
                              - 100
                            emgSpike:
                              - 0
                              - 300
                        -
                          id: 101
                          name: 'Mode 2'
                          slot: 1
                          config:
                            interval:
                              - 400
                            fingerStrength:
                              - 1
                              - 100
                            autoGrasp:
                              - 0
                              - 100
                            emgSpike:
                              - 0
                              - 300
                        -
                          id: 102
                          name: 'Mode 3'
                          slot: 2
                          config:
                            interval:
                              - 500
                            fingerStrength:
                              - 1
                              - 100
                            autoGrasp:
                              - 0
                              - 100
                            emgSpike:
                              - 0
                              - 300
                    properties:
                      common:
                        type: object
                        properties:
                          gripPairsConfig:
                            type: array
                            example:
                              - 1
                              - 4
                              - 2
                              - 3
                              - 6
                              - 7
                              - 9
                              - 8
                            items:
                              type: integer
                          controlConfig:
                            type: array
                            example:
                              - 0
                              - 1
                              - 0
                              - 0
                              - 0
                            items:
                              type: integer
                          emgThresholds:
                            type: array
                            example:
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                              - 0
                            items:
                              type: integer
                          interval:
                            type: array
                            example:
                              - 100
                            items:
                              type: integer
                          gripSequentialConfig:
                            type: array
                            example:
                              - 1
                              - 2
                              - 4
                              - 3
                              - 0
                              - 255
                              - 6
                              - 7
                              - 9
                              - 8
                              - 255
                              - 255
                            items:
                              type: integer
                      modes:
                        type: array
                        example:
                          -
                            id: 100
                            name: 'Mode 1'
                            slot: 0
                            config:
                              interval:
                                - 300
                              fingerStrength:
                                - 1
                                - 100
                              autoGrasp:
                                - 0
                                - 100
                              emgSpike:
                                - 0
                                - 300
                          -
                            id: 101
                            name: 'Mode 2'
                            slot: 1
                            config:
                              interval:
                                - 400
                              fingerStrength:
                                - 1
                                - 100
                              autoGrasp:
                                - 0
                                - 100
                              emgSpike:
                                - 0
                                - 300
                          -
                            id: 102
                            name: 'Mode 3'
                            slot: 2
                            config:
                              interval:
                                - 500
                              fingerStrength:
                                - 1
                                - 100
                              autoGrasp:
                                - 0
                                - 100
                              emgSpike:
                                - 0
                                - 300
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 100
                            name:
                              type: string
                              example: 'Mode 1'
                            slot:
                              type: integer
                              example: 0
                            config:
                              type: object
                              properties:
                                interval:
                                  type: array
                                  example:
                                    - 300
                                  items:
                                    type: integer
                                fingerStrength:
                                  type: array
                                  example:
                                    - 1
                                    - 100
                                  items:
                                    type: integer
                                autoGrasp:
                                  type: array
                                  example:
                                    - 0
                                    - 100
                                  items:
                                    type: integer
                                emgSpike:
                                  type: array
                                  example:
                                    - 0
                                    - 300
                                  items:
                                    type: integer
                  -
                    description: ''
                    type: object
                    example:
                      paginator:
                        total: 2
                        count: 2
                        perpage: 20
                        current_page: 1
                        last_page: 1
                      items:
                        -
                          id: 1
                          device_id: 18
                          index: null
                          name: 'Rerum voluptatem est perspiciatis est totam qui voluptatem et.'
                          config: '{"common":{"fingerStrength":[1,500],"gripPositions":{"_":0,"0":{"initial":[7,40,18,21,62],"limit":[93,71,53,94,67]},"1":{"initial":[6,10,44,75,12],"limit":[86,50,67,76,24]},"2":{"initial":[47,51,21,11,20],"limit":[55,68,35,56,36]},"3":{"initial":[50,4,20,66,38],"limit":[83,80,24,77,64]},"4":{"initial":[9,79,6,70,56],"limit":[93,87,12,85,86]},"5":{"initial":[43,2,55,65,21],"limit":[89,83,74,91,46]},"6":{"initial":[92,41,55,22,3],"limit":[93,72,58,69,74]},"7":{"initial":[17,33,37,49,44],"limit":[61,74,67,70,80]},"8":{"initial":[14,56,82,22,20],"limit":[91,70,88,30,42]},"9":{"initial":[25,63,76,13,14],"limit":[84,69,78,84,29]},"10":{"initial":[43,66,61,11,50],"limit":[88,69,71,64,94]},"11":{"initial":[14,22,52,6,55],"limit":[52,60,92,61,81]},"12":{"initial":[5,46,43,3,80],"limit":[33,54,79,14,85]},"13":{"initial":[22,47,52,22,49],"limit":[70,74,83,78,89]}},"inputSite":[1]},"modes":[{"id":3,"name":"Hic a quae sed optio.","slot":0,"config":{"autoGrasp":[0,0],"coContractionTimings":[400,200],"controlMode":[0],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[50,0,20,40,60,70,90,60,60,0],"gripPairsConfig":[11,3,12,7,13,1,4,8],"gripSequentialConfig":[10,8,255,9,11,255,255,5,255,12,255,1],"gripSwitchingMode":[2],"holdOpen":[1500,2500],"pulseTimings":[930,590,1000,180],"softGrip":[1],"speedControlStrategy":[1]}},{"id":4,"name":"Cum voluptatibus rem nihil iure repudiandae voluptatum doloribus.","slot":1,"config":{"autoGrasp":[1,100],"coContractionTimings":[400,200],"controlMode":[0],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[0,70,30,30,40,90,100,20,0,100],"gripPairsConfig":[7,4,2,11,10,8,9,13],"gripSequentialConfig":[7,255,1,6,10,5,255,3,255,255,255,255],"gripSwitchingMode":[2],"holdOpen":[2000,2000],"pulseTimings":[770,1000,50,250],"softGrip":[1],"speedControlStrategy":[0]}},{"id":5,"name":"Qui eligendi facilis quas quos.","slot":2,"config":{"autoGrasp":[0,100],"coContractionTimings":[300,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[50,10,40,90,90,70,60,50,30,70],"gripPairsConfig":[2,7,5,9,8,1,11,12],"gripSequentialConfig":[255,8,5,255,9,2,3,255,4,12,7,1],"gripSwitchingMode":[3],"holdOpen":[1500,1500],"pulseTimings":[60,320,480,790],"softGrip":[0],"speedControlStrategy":[0]}}]}'
                          restore_point: 0
                          factory_reset_point: 0
                          changed_by: 46
                          created_at: '2026-01-12T16:47:46.000000Z'
                          updated_at: '2026-01-12T16:47:46.000000Z'
                          author:
                            id: 46
                            mrn: 2CRP1EJZ1768236466
                            name: 'Noemie Kutch'
                            email: 1768236466dante.legros@example.net
                            language: en
                            phone: 954.797.6456
                            phone_country: GD
                            phone_verified_at: null
                            address1: '66604 Hoeger Turnpike'
                            address2: 'Lefflerfurt, WI 35237-2385'
                            postal_code: 44913-8533
                            city: Grant-Bernhard
                            clinic_name: Boyerview
                            clinic_location: "45710 Hudson Square Apt. 758\nCreminchester, UT 63379-2939"
                            image: null
                            mfa_enabled: 0
                            mfa_method: null
                            mfa_verified_to: null
                            location_id: null
                            created_by: null
                            active: 1
                            notifications_timezone: null
                            notifications_at: null
                            created_at: '2026-01-12T16:47:46.000000Z'
                            updated_at: '2026-01-12T16:47:46.000000Z'
                            invitation_status: null
                            acadle_invitation_status: null
                            roles: []
                          entries:
                            -
                              id: 1
                              config_history_id: 1
                              config_id: 3
                              old_value: odit
                              new_value: amet
                              created_at: '2026-01-12T16:47:46.000000Z'
                              updated_at: '2026-01-12T16:47:46.000000Z'
                              config_entry:
                                id: 3
                                device_id: 26
                                mode_id: null
                                key: ipsum
                                value: odit
                                created_at: '2026-01-12T16:47:46.000000Z'
                                updated_at: '2026-01-12T16:47:46.000000Z'
                        -
                          id: 3
                          device_id: 27
                          index: null
                          name: 'Qui ea laborum cumque officiis.'
                          config: '{"common":{"fingerStrength":[1,500],"gripPositions":{"_":0,"0":{"initial":[67,32,54,8,40],"limit":[67,40,58,52,94]},"1":{"initial":[18,20,1,34,27],"limit":[79,52,30,72,61]},"2":{"initial":[6,40,1,54,32],"limit":[8,73,90,90,86]},"3":{"initial":[45,9,71,29,20],"limit":[63,69,84,53,54]},"4":{"initial":[78,24,37,36,10],"limit":[93,43,85,43,58]},"5":{"initial":[1,7,9,2,35],"limit":[64,27,12,37,46]},"6":{"initial":[12,15,69,29,26],"limit":[60,46,76,82,60]},"7":{"initial":[13,18,12,31,50],"limit":[24,56,16,88,63]},"8":{"initial":[27,7,2,15,80],"limit":[48,79,18,37,93]},"9":{"initial":[32,12,17,32,19],"limit":[74,20,76,86,41]},"10":{"initial":[49,49,8,20,26],"limit":[72,68,16,82,94]},"11":{"initial":[19,30,30,38,66],"limit":[45,56,50,70,82]},"12":{"initial":[30,35,20,30,33],"limit":[57,57,22,64,36]},"13":{"initial":[22,23,24,11,3],"limit":[75,28,37,31,83]}},"inputSite":[1]},"modes":[{"id":9,"name":"Totam culpa repellendus similique quas.","slot":0,"config":{"autoGrasp":[0,0],"coContractionTimings":[400,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[0,70,100,100,20,60,50,20,70,0],"gripPairsConfig":[12,13,5,3,2,7,10,11],"gripSequentialConfig":[255,255,5,255,6,1,4,7,9,255,8,3],"gripSwitchingMode":[1],"holdOpen":[1500,1500],"pulseTimings":[680,640,230,670],"softGrip":[0],"speedControlStrategy":[1]}},{"id":10,"name":"Sunt porro officiis iure aliquid et facilis et.","slot":1,"config":{"autoGrasp":[1,100],"coContractionTimings":[400,100],"controlMode":[0],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[100,10,80,30,50,40,60,70,40,0],"gripPairsConfig":[12,6,8,10,1,13,9,11],"gripSequentialConfig":[12,6,5,2,9,1,10,7,3,8,4,13],"gripSwitchingMode":[3],"holdOpen":[2500,2500],"pulseTimings":[850,320,820,270],"softGrip":[0],"speedControlStrategy":[1]}},{"id":11,"name":"Est beatae quibusdam sed veniam itaque facere.","slot":2,"config":{"autoGrasp":[1,0],"coContractionTimings":[300,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[20,50,80,20,50,90,90,100,10,40],"gripPairsConfig":[4,12,5,13,10,7,11,2],"gripSequentialConfig":[13,5,255,7,3,4,255,8,6,255,2,11],"gripSwitchingMode":[2],"holdOpen":[1500,2500],"pulseTimings":[100,290,730,820],"softGrip":[0],"speedControlStrategy":[0]}}]}'
                          restore_point: 1
                          factory_reset_point: 0
                          changed_by: 49
                          created_at: '2026-01-12T16:47:46.000000Z'
                          updated_at: '2026-01-12T16:47:46.000000Z'
                          author:
                            id: 49
                            mrn: ML4SLDQB1768236466
                            name: 'Dr. Perry Gorczany II'
                            email: 1768236466sonia.prosacco@example.com
                            language: en
                            phone: 757.413.0752
                            phone_country: NF
                            phone_verified_at: null
                            address1: '65300 Joelle Avenue'
                            address2: 'Lake Coltfurt, NJ 37705'
                            postal_code: 62218-3440
                            city: 'Cormier, Hill and Murray'
                            clinic_name: Johnsmouth
                            clinic_location: "94168 Witting Prairie\nNorth Madysonburgh, MD 14800-4889"
                            image: null
                            mfa_enabled: 0
                            mfa_method: null
                            mfa_verified_to: null
                            location_id: null
                            created_by: null
                            active: 1
                            notifications_timezone: null
                            notifications_at: null
                            created_at: '2026-01-12T16:47:46.000000Z'
                            updated_at: '2026-01-12T16:47:46.000000Z'
                            invitation_status: null
                            acadle_invitation_status: null
                            roles: []
                          entries:
                            -
                              id: 2
                              config_history_id: 3
                              config_id: 4
                              old_value: minus
                              new_value: voluptas
                              created_at: '2026-01-12T16:47:46.000000Z'
                              updated_at: '2026-01-12T16:47:46.000000Z'
                              config_entry:
                                id: 4
                                device_id: 35
                                mode_id: null
                                key: labore
                                value: qui
                                created_at: '2026-01-12T16:47:46.000000Z'
                                updated_at: '2026-01-12T16:47:46.000000Z'
                    properties:
                      paginator:
                        type: object
                        properties:
                          total:
                            type: integer
                            example: 2
                          count:
                            type: integer
                            example: 2
                          perpage:
                            type: integer
                            example: 20
                          current_page:
                            type: integer
                            example: 1
                          last_page:
                            type: integer
                            example: 1
                      items:
                        type: array
                        example:
                          -
                            id: 1
                            device_id: 18
                            index: null
                            name: 'Rerum voluptatem est perspiciatis est totam qui voluptatem et.'
                            config: '{"common":{"fingerStrength":[1,500],"gripPositions":{"_":0,"0":{"initial":[7,40,18,21,62],"limit":[93,71,53,94,67]},"1":{"initial":[6,10,44,75,12],"limit":[86,50,67,76,24]},"2":{"initial":[47,51,21,11,20],"limit":[55,68,35,56,36]},"3":{"initial":[50,4,20,66,38],"limit":[83,80,24,77,64]},"4":{"initial":[9,79,6,70,56],"limit":[93,87,12,85,86]},"5":{"initial":[43,2,55,65,21],"limit":[89,83,74,91,46]},"6":{"initial":[92,41,55,22,3],"limit":[93,72,58,69,74]},"7":{"initial":[17,33,37,49,44],"limit":[61,74,67,70,80]},"8":{"initial":[14,56,82,22,20],"limit":[91,70,88,30,42]},"9":{"initial":[25,63,76,13,14],"limit":[84,69,78,84,29]},"10":{"initial":[43,66,61,11,50],"limit":[88,69,71,64,94]},"11":{"initial":[14,22,52,6,55],"limit":[52,60,92,61,81]},"12":{"initial":[5,46,43,3,80],"limit":[33,54,79,14,85]},"13":{"initial":[22,47,52,22,49],"limit":[70,74,83,78,89]}},"inputSite":[1]},"modes":[{"id":3,"name":"Hic a quae sed optio.","slot":0,"config":{"autoGrasp":[0,0],"coContractionTimings":[400,200],"controlMode":[0],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[50,0,20,40,60,70,90,60,60,0],"gripPairsConfig":[11,3,12,7,13,1,4,8],"gripSequentialConfig":[10,8,255,9,11,255,255,5,255,12,255,1],"gripSwitchingMode":[2],"holdOpen":[1500,2500],"pulseTimings":[930,590,1000,180],"softGrip":[1],"speedControlStrategy":[1]}},{"id":4,"name":"Cum voluptatibus rem nihil iure repudiandae voluptatum doloribus.","slot":1,"config":{"autoGrasp":[1,100],"coContractionTimings":[400,200],"controlMode":[0],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[0,70,30,30,40,90,100,20,0,100],"gripPairsConfig":[7,4,2,11,10,8,9,13],"gripSequentialConfig":[7,255,1,6,10,5,255,3,255,255,255,255],"gripSwitchingMode":[2],"holdOpen":[2000,2000],"pulseTimings":[770,1000,50,250],"softGrip":[1],"speedControlStrategy":[0]}},{"id":5,"name":"Qui eligendi facilis quas quos.","slot":2,"config":{"autoGrasp":[0,100],"coContractionTimings":[300,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[50,10,40,90,90,70,60,50,30,70],"gripPairsConfig":[2,7,5,9,8,1,11,12],"gripSequentialConfig":[255,8,5,255,9,2,3,255,4,12,7,1],"gripSwitchingMode":[3],"holdOpen":[1500,1500],"pulseTimings":[60,320,480,790],"softGrip":[0],"speedControlStrategy":[0]}}]}'
                            restore_point: 0
                            factory_reset_point: 0
                            changed_by: 46
                            created_at: '2026-01-12T16:47:46.000000Z'
                            updated_at: '2026-01-12T16:47:46.000000Z'
                            author:
                              id: 46
                              mrn: 2CRP1EJZ1768236466
                              name: 'Noemie Kutch'
                              email: 1768236466dante.legros@example.net
                              language: en
                              phone: 954.797.6456
                              phone_country: GD
                              phone_verified_at: null
                              address1: '66604 Hoeger Turnpike'
                              address2: 'Lefflerfurt, WI 35237-2385'
                              postal_code: 44913-8533
                              city: Grant-Bernhard
                              clinic_name: Boyerview
                              clinic_location: "45710 Hudson Square Apt. 758\nCreminchester, UT 63379-2939"
                              image: null
                              mfa_enabled: 0
                              mfa_method: null
                              mfa_verified_to: null
                              location_id: null
                              created_by: null
                              active: 1
                              notifications_timezone: null
                              notifications_at: null
                              created_at: '2026-01-12T16:47:46.000000Z'
                              updated_at: '2026-01-12T16:47:46.000000Z'
                              invitation_status: null
                              acadle_invitation_status: null
                              roles: []
                            entries:
                              -
                                id: 1
                                config_history_id: 1
                                config_id: 3
                                old_value: odit
                                new_value: amet
                                created_at: '2026-01-12T16:47:46.000000Z'
                                updated_at: '2026-01-12T16:47:46.000000Z'
                                config_entry:
                                  id: 3
                                  device_id: 26
                                  mode_id: null
                                  key: ipsum
                                  value: odit
                                  created_at: '2026-01-12T16:47:46.000000Z'
                                  updated_at: '2026-01-12T16:47:46.000000Z'
                          -
                            id: 3
                            device_id: 27
                            index: null
                            name: 'Qui ea laborum cumque officiis.'
                            config: '{"common":{"fingerStrength":[1,500],"gripPositions":{"_":0,"0":{"initial":[67,32,54,8,40],"limit":[67,40,58,52,94]},"1":{"initial":[18,20,1,34,27],"limit":[79,52,30,72,61]},"2":{"initial":[6,40,1,54,32],"limit":[8,73,90,90,86]},"3":{"initial":[45,9,71,29,20],"limit":[63,69,84,53,54]},"4":{"initial":[78,24,37,36,10],"limit":[93,43,85,43,58]},"5":{"initial":[1,7,9,2,35],"limit":[64,27,12,37,46]},"6":{"initial":[12,15,69,29,26],"limit":[60,46,76,82,60]},"7":{"initial":[13,18,12,31,50],"limit":[24,56,16,88,63]},"8":{"initial":[27,7,2,15,80],"limit":[48,79,18,37,93]},"9":{"initial":[32,12,17,32,19],"limit":[74,20,76,86,41]},"10":{"initial":[49,49,8,20,26],"limit":[72,68,16,82,94]},"11":{"initial":[19,30,30,38,66],"limit":[45,56,50,70,82]},"12":{"initial":[30,35,20,30,33],"limit":[57,57,22,64,36]},"13":{"initial":[22,23,24,11,3],"limit":[75,28,37,31,83]}},"inputSite":[1]},"modes":[{"id":9,"name":"Totam culpa repellendus similique quas.","slot":0,"config":{"autoGrasp":[0,0],"coContractionTimings":[400,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[0,70,100,100,20,60,50,20,70,0],"gripPairsConfig":[12,13,5,3,2,7,10,11],"gripSequentialConfig":[255,255,5,255,6,1,4,7,9,255,8,3],"gripSwitchingMode":[1],"holdOpen":[1500,1500],"pulseTimings":[680,640,230,670],"softGrip":[0],"speedControlStrategy":[1]}},{"id":10,"name":"Sunt porro officiis iure aliquid et facilis et.","slot":1,"config":{"autoGrasp":[1,100],"coContractionTimings":[400,100],"controlMode":[0],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[100,10,80,30,50,40,60,70,40,0],"gripPairsConfig":[12,6,8,10,1,13,9,11],"gripSequentialConfig":[12,6,5,2,9,1,10,7,3,8,4,13],"gripSwitchingMode":[3],"holdOpen":[2500,2500],"pulseTimings":[850,320,820,270],"softGrip":[0],"speedControlStrategy":[1]}},{"id":11,"name":"Est beatae quibusdam sed veniam itaque facere.","slot":2,"config":{"autoGrasp":[1,0],"coContractionTimings":[300,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[20,50,80,20,50,90,90,100,10,40],"gripPairsConfig":[4,12,5,13,10,7,11,2],"gripSequentialConfig":[13,5,255,7,3,4,255,8,6,255,2,11],"gripSwitchingMode":[2],"holdOpen":[1500,2500],"pulseTimings":[100,290,730,820],"softGrip":[0],"speedControlStrategy":[0]}}]}'
                            restore_point: 1
                            factory_reset_point: 0
                            changed_by: 49
                            created_at: '2026-01-12T16:47:46.000000Z'
                            updated_at: '2026-01-12T16:47:46.000000Z'
                            author:
                              id: 49
                              mrn: ML4SLDQB1768236466
                              name: 'Dr. Perry Gorczany II'
                              email: 1768236466sonia.prosacco@example.com
                              language: en
                              phone: 757.413.0752
                              phone_country: NF
                              phone_verified_at: null
                              address1: '65300 Joelle Avenue'
                              address2: 'Lake Coltfurt, NJ 37705'
                              postal_code: 62218-3440
                              city: 'Cormier, Hill and Murray'
                              clinic_name: Johnsmouth
                              clinic_location: "94168 Witting Prairie\nNorth Madysonburgh, MD 14800-4889"
                              image: null
                              mfa_enabled: 0
                              mfa_method: null
                              mfa_verified_to: null
                              location_id: null
                              created_by: null
                              active: 1
                              notifications_timezone: null
                              notifications_at: null
                              created_at: '2026-01-12T16:47:46.000000Z'
                              updated_at: '2026-01-12T16:47:46.000000Z'
                              invitation_status: null
                              acadle_invitation_status: null
                              roles: []
                            entries:
                              -
                                id: 2
                                config_history_id: 3
                                config_id: 4
                                old_value: minus
                                new_value: voluptas
                                created_at: '2026-01-12T16:47:46.000000Z'
                                updated_at: '2026-01-12T16:47:46.000000Z'
                                config_entry:
                                  id: 4
                                  device_id: 35
                                  mode_id: null
                                  key: labore
                                  value: qui
                                  created_at: '2026-01-12T16:47:46.000000Z'
                                  updated_at: '2026-01-12T16:47:46.000000Z'
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            device_id:
                              type: integer
                              example: 18
                            index:
                              type: string
                              example: null
                            name:
                              type: string
                              example: 'Rerum voluptatem est perspiciatis est totam qui voluptatem et.'
                            config:
                              type: string
                              example: '{"common":{"fingerStrength":[1,500],"gripPositions":{"_":0,"0":{"initial":[7,40,18,21,62],"limit":[93,71,53,94,67]},"1":{"initial":[6,10,44,75,12],"limit":[86,50,67,76,24]},"2":{"initial":[47,51,21,11,20],"limit":[55,68,35,56,36]},"3":{"initial":[50,4,20,66,38],"limit":[83,80,24,77,64]},"4":{"initial":[9,79,6,70,56],"limit":[93,87,12,85,86]},"5":{"initial":[43,2,55,65,21],"limit":[89,83,74,91,46]},"6":{"initial":[92,41,55,22,3],"limit":[93,72,58,69,74]},"7":{"initial":[17,33,37,49,44],"limit":[61,74,67,70,80]},"8":{"initial":[14,56,82,22,20],"limit":[91,70,88,30,42]},"9":{"initial":[25,63,76,13,14],"limit":[84,69,78,84,29]},"10":{"initial":[43,66,61,11,50],"limit":[88,69,71,64,94]},"11":{"initial":[14,22,52,6,55],"limit":[52,60,92,61,81]},"12":{"initial":[5,46,43,3,80],"limit":[33,54,79,14,85]},"13":{"initial":[22,47,52,22,49],"limit":[70,74,83,78,89]}},"inputSite":[1]},"modes":[{"id":3,"name":"Hic a quae sed optio.","slot":0,"config":{"autoGrasp":[0,0],"coContractionTimings":[400,200],"controlMode":[0],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[50,0,20,40,60,70,90,60,60,0],"gripPairsConfig":[11,3,12,7,13,1,4,8],"gripSequentialConfig":[10,8,255,9,11,255,255,5,255,12,255,1],"gripSwitchingMode":[2],"holdOpen":[1500,2500],"pulseTimings":[930,590,1000,180],"softGrip":[1],"speedControlStrategy":[1]}},{"id":4,"name":"Cum voluptatibus rem nihil iure repudiandae voluptatum doloribus.","slot":1,"config":{"autoGrasp":[1,100],"coContractionTimings":[400,200],"controlMode":[0],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[0,70,30,30,40,90,100,20,0,100],"gripPairsConfig":[7,4,2,11,10,8,9,13],"gripSequentialConfig":[7,255,1,6,10,5,255,3,255,255,255,255],"gripSwitchingMode":[2],"holdOpen":[2000,2000],"pulseTimings":[770,1000,50,250],"softGrip":[1],"speedControlStrategy":[0]}},{"id":5,"name":"Qui eligendi facilis quas quos.","slot":2,"config":{"autoGrasp":[0,100],"coContractionTimings":[300,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[50,10,40,90,90,70,60,50,30,70],"gripPairsConfig":[2,7,5,9,8,1,11,12],"gripSequentialConfig":[255,8,5,255,9,2,3,255,4,12,7,1],"gripSwitchingMode":[3],"holdOpen":[1500,1500],"pulseTimings":[60,320,480,790],"softGrip":[0],"speedControlStrategy":[0]}}]}'
                            restore_point:
                              type: integer
                              example: 0
                            factory_reset_point:
                              type: integer
                              example: 0
                            changed_by:
                              type: integer
                              example: 46
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:46.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:46.000000Z'
                            author:
                              type: object
                              properties:
                                id:
                                  type: integer
                                  example: 46
                                mrn:
                                  type: string
                                  example: 2CRP1EJZ1768236466
                                name:
                                  type: string
                                  example: 'Noemie Kutch'
                                email:
                                  type: string
                                  example: 1768236466dante.legros@example.net
                                language:
                                  type: string
                                  example: en
                                phone:
                                  type: string
                                  example: 954.797.6456
                                phone_country:
                                  type: string
                                  example: GD
                                phone_verified_at:
                                  type: string
                                  example: null
                                address1:
                                  type: string
                                  example: '66604 Hoeger Turnpike'
                                address2:
                                  type: string
                                  example: 'Lefflerfurt, WI 35237-2385'
                                postal_code:
                                  type: string
                                  example: 44913-8533
                                city:
                                  type: string
                                  example: Grant-Bernhard
                                clinic_name:
                                  type: string
                                  example: Boyerview
                                clinic_location:
                                  type: string
                                  example: "45710 Hudson Square Apt. 758\nCreminchester, UT 63379-2939"
                                image:
                                  type: string
                                  example: null
                                mfa_enabled:
                                  type: integer
                                  example: 0
                                mfa_method:
                                  type: string
                                  example: null
                                mfa_verified_to:
                                  type: string
                                  example: null
                                location_id:
                                  type: string
                                  example: null
                                created_by:
                                  type: string
                                  example: null
                                active:
                                  type: integer
                                  example: 1
                                notifications_timezone:
                                  type: string
                                  example: null
                                notifications_at:
                                  type: string
                                  example: null
                                created_at:
                                  type: string
                                  example: '2026-01-12T16:47:46.000000Z'
                                updated_at:
                                  type: string
                                  example: '2026-01-12T16:47:46.000000Z'
                                invitation_status:
                                  type: string
                                  example: null
                                acadle_invitation_status:
                                  type: string
                                  example: null
                                roles:
                                  type: array
                                  example: []
                            entries:
                              type: array
                              example:
                                -
                                  id: 1
                                  config_history_id: 1
                                  config_id: 3
                                  old_value: odit
                                  new_value: amet
                                  created_at: '2026-01-12T16:47:46.000000Z'
                                  updated_at: '2026-01-12T16:47:46.000000Z'
                                  config_entry:
                                    id: 3
                                    device_id: 26
                                    mode_id: null
                                    key: ipsum
                                    value: odit
                                    created_at: '2026-01-12T16:47:46.000000Z'
                                    updated_at: '2026-01-12T16:47:46.000000Z'
                              items:
                                type: object
                                properties:
                                  id:
                                    type: integer
                                    example: 1
                                  config_history_id:
                                    type: integer
                                    example: 1
                                  config_id:
                                    type: integer
                                    example: 3
                                  old_value:
                                    type: string
                                    example: odit
                                  new_value:
                                    type: string
                                    example: amet
                                  created_at:
                                    type: string
                                    example: '2026-01-12T16:47:46.000000Z'
                                  updated_at:
                                    type: string
                                    example: '2026-01-12T16:47:46.000000Z'
                                  config_entry:
                                    type: object
                                    properties:
                                      id: { type: integer, example: 3 }
                                      device_id: { type: integer, example: 26 }
                                      mode_id: { type: string, example: null }
                                      key: { type: string, example: ipsum }
                                      value: { type: string, example: odit }
                                      created_at: { type: string, example: '2026-01-12T16:47:46.000000Z' }
                                      updated_at: { type: string, example: '2026-01-12T16:47:46.000000Z' }
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view device config'
                  code: 'CONFIG:HISTORY:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view device config'
                  code:
                    type: string
                    example: 'CONFIG:HISTORY:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'CONFIG:HISTORY:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'CONFIG:HISTORY:DEVICE_NOT_FOUND'
      tags:
        - Config
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                restore_point:
                  type: boolean
                  description: ''
                  example: true
                factory_reset_point:
                  type: boolean
                  description: ''
                  example: true
                date_from:
                  type: string
                  description: ''
                  example: null
                date_to:
                  type: string
                  description: ''
                  example: null
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config/history/{configId}':
    get:
      summary: 'Get device config history entry'
      operationId: getDeviceConfigHistoryEntry
      description: ''
      parameters:
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>author</code>, <code>entries</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>author</code>, <code>entries</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 5
                  device_id: 36
                  index: null
                  name: 'Reiciendis illum culpa laborum expedita sint quasi minima.'
                  config: '{"common":{"fingerStrength":[1,400],"gripPositions":{"_":0,"0":{"initial":[22,42,3,39,10],"limit":[36,84,86,42,59]},"1":{"initial":[17,6,9,11,74],"limit":[46,17,65,50,89]},"2":{"initial":[64,57,52,35,88],"limit":[89,61,69,52,89]},"3":{"initial":[77,6,37,24,12],"limit":[91,94,62,24,56]},"4":{"initial":[4,11,44,35,82],"limit":[47,61,77,45,94]},"5":{"initial":[65,65,26,1,9],"limit":[95,88,85,47,60]},"6":{"initial":[9,78,26,15,2],"limit":[34,85,46,91,77]},"7":{"initial":[71,7,3,20,36],"limit":[77,20,32,27,64]},"8":{"initial":[30,24,2,27,42],"limit":[42,70,86,89,60]},"9":{"initial":[75,38,9,25,2],"limit":[75,81,35,71,92]},"10":{"initial":[3,25,26,3,19],"limit":[45,67,94,76,85]},"11":{"initial":[63,14,26,37,75],"limit":[78,93,52,45,85]},"12":{"initial":[1,60,45,65,57],"limit":[10,61,67,92,68]},"13":{"initial":[14,29,11,18,67],"limit":[40,67,23,45,75]}},"inputSite":[1]},"modes":[{"id":15,"name":"Illo repudiandae ea sint voluptatem aut aliquam.","slot":0,"config":{"autoGrasp":[0,100],"coContractionTimings":[400,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[50,70,30,90,100,100,10,50,80,20],"gripPairsConfig":[2,12,11,8,6,5,4,7],"gripSequentialConfig":[11,10,8,4,7,1,13,255,5,255,255,255],"gripSwitchingMode":[1],"holdOpen":[1500,2500],"pulseTimings":[130,730,410,300],"softGrip":[1],"speedControlStrategy":[1]}},{"id":16,"name":"Et dolor pariatur rerum similique voluptatibus sit.","slot":1,"config":{"autoGrasp":[0,0],"coContractionTimings":[500,400],"controlMode":[0],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[80,50,100,30,80,30,20,20,0,0],"gripPairsConfig":[4,7,2,3,8,1,5,11],"gripSequentialConfig":[9,1,8,5,10,6,4,13,12,255,3,2],"gripSwitchingMode":[1],"holdOpen":[1500,1500],"pulseTimings":[760,930,600,840],"softGrip":[1],"speedControlStrategy":[1]}},{"id":17,"name":"Eveniet nam impedit quisquam.","slot":2,"config":{"autoGrasp":[0,100],"coContractionTimings":[400,300],"controlMode":[0],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[100,80,70,70,40,90,80,70,30,70],"gripPairsConfig":[12,1,3,5,8,6,11,4],"gripSequentialConfig":[11,12,255,4,255,255,10,8,255,5,2,1],"gripSwitchingMode":[2],"holdOpen":[1500,2000],"pulseTimings":[680,870,240,580],"softGrip":[0],"speedControlStrategy":[0]}}]}'
                  restore_point: 0
                  factory_reset_point: 0
                  changed_by: 51
                  created_at: '2026-01-12T16:47:46.000000Z'
                  updated_at: '2026-01-12T16:47:46.000000Z'
                properties:
                  id:
                    type: integer
                    example: 5
                  device_id:
                    type: integer
                    example: 36
                  index:
                    type: string
                    example: null
                  name:
                    type: string
                    example: 'Reiciendis illum culpa laborum expedita sint quasi minima.'
                  config:
                    type: string
                    example: '{"common":{"fingerStrength":[1,400],"gripPositions":{"_":0,"0":{"initial":[22,42,3,39,10],"limit":[36,84,86,42,59]},"1":{"initial":[17,6,9,11,74],"limit":[46,17,65,50,89]},"2":{"initial":[64,57,52,35,88],"limit":[89,61,69,52,89]},"3":{"initial":[77,6,37,24,12],"limit":[91,94,62,24,56]},"4":{"initial":[4,11,44,35,82],"limit":[47,61,77,45,94]},"5":{"initial":[65,65,26,1,9],"limit":[95,88,85,47,60]},"6":{"initial":[9,78,26,15,2],"limit":[34,85,46,91,77]},"7":{"initial":[71,7,3,20,36],"limit":[77,20,32,27,64]},"8":{"initial":[30,24,2,27,42],"limit":[42,70,86,89,60]},"9":{"initial":[75,38,9,25,2],"limit":[75,81,35,71,92]},"10":{"initial":[3,25,26,3,19],"limit":[45,67,94,76,85]},"11":{"initial":[63,14,26,37,75],"limit":[78,93,52,45,85]},"12":{"initial":[1,60,45,65,57],"limit":[10,61,67,92,68]},"13":{"initial":[14,29,11,18,67],"limit":[40,67,23,45,75]}},"inputSite":[1]},"modes":[{"id":15,"name":"Illo repudiandae ea sint voluptatem aut aliquam.","slot":0,"config":{"autoGrasp":[0,100],"coContractionTimings":[400,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[50,70,30,90,100,100,10,50,80,20],"gripPairsConfig":[2,12,11,8,6,5,4,7],"gripSequentialConfig":[11,10,8,4,7,1,13,255,5,255,255,255],"gripSwitchingMode":[1],"holdOpen":[1500,2500],"pulseTimings":[130,730,410,300],"softGrip":[1],"speedControlStrategy":[1]}},{"id":16,"name":"Et dolor pariatur rerum similique voluptatibus sit.","slot":1,"config":{"autoGrasp":[0,0],"coContractionTimings":[500,400],"controlMode":[0],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[80,50,100,30,80,30,20,20,0,0],"gripPairsConfig":[4,7,2,3,8,1,5,11],"gripSequentialConfig":[9,1,8,5,10,6,4,13,12,255,3,2],"gripSwitchingMode":[1],"holdOpen":[1500,1500],"pulseTimings":[760,930,600,840],"softGrip":[1],"speedControlStrategy":[1]}},{"id":17,"name":"Eveniet nam impedit quisquam.","slot":2,"config":{"autoGrasp":[0,100],"coContractionTimings":[400,300],"controlMode":[0],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[100,80,70,70,40,90,80,70,30,70],"gripPairsConfig":[12,1,3,5,8,6,11,4],"gripSequentialConfig":[11,12,255,4,255,255,10,8,255,5,2,1],"gripSwitchingMode":[2],"holdOpen":[1500,2000],"pulseTimings":[680,870,240,580],"softGrip":[0],"speedControlStrategy":[0]}}]}'
                  restore_point:
                    type: integer
                    example: 0
                  factory_reset_point:
                    type: integer
                    example: 0
                  changed_by:
                    type: integer
                    example: 51
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:46.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:46.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view device config'
                  code: 'CONFIG:HISTORY_ENTRY:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view device config'
                  code:
                    type: string
                    example: 'CONFIG:HISTORY_ENTRY:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG:HISTORY_ENTRY:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG:HISTORY_ENTRY:DEVICE_NOT_FOUND'
                  -
                    description: 'Config history entry not found'
                    type: object
                    example:
                      message: 'Config history entry not found'
                      code: 'CONFIG:HISTORY_ENTRY:HISTORY_ENTRY_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config history entry not found'
                      code:
                        type: string
                        example: 'CONFIG:HISTORY_ENTRY:HISTORY_ENTRY_NOT_FOUND'
      tags:
        - Config
    post:
      summary: 'Update config history'
      operationId: updateConfigHistory
      description: 'Returns updated config history in response.'
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 6
                  device_id: 40
                  index: null
                  name: 'Magnam eum dolorum quod nam.'
                  config: '{"common":{"fingerStrength":[1,300],"gripPositions":{"_":0,"0":{"initial":[18,26,66,3,13],"limit":[62,38,86,55,37]},"1":{"initial":[59,3,45,38,16],"limit":[91,78,53,66,29]},"2":{"initial":[56,16,76,44,4],"limit":[79,50,92,67,53]},"3":{"initial":[3,23,1,33,16],"limit":[26,62,85,90,59]},"4":{"initial":[16,21,44,16,64],"limit":[93,43,59,95,69]},"5":{"initial":[16,7,53,28,56],"limit":[30,14,62,51,61]},"6":{"initial":[14,48,67,18,35],"limit":[88,67,85,46,43]},"7":{"initial":[40,18,19,28,2],"limit":[79,57,51,78,11]},"8":{"initial":[16,67,47,73,38],"limit":[41,76,59,79,56]},"9":{"initial":[5,56,22,2,8],"limit":[82,90,56,70,87]},"10":{"initial":[20,62,7,39,20],"limit":[32,66,61,63,94]},"11":{"initial":[32,42,36,73,2],"limit":[81,93,89,85,57]},"12":{"initial":[73,37,26,63,70],"limit":[90,89,58,78,82]},"13":{"initial":[54,20,48,16,48],"limit":[62,65,68,40,90]}},"inputSite":[1]},"modes":[{"id":18,"name":"Animi et omnis ducimus id velit et sit.","slot":0,"config":{"autoGrasp":[1,100],"coContractionTimings":[500,200],"controlMode":[1],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[0,80,10,60,80,40,90,50,20,30],"gripPairsConfig":[1,6,2,7,3,5,10,11],"gripSequentialConfig":[4,2,255,8,1,255,3,255,9,255,255,255],"gripSwitchingMode":[1],"holdOpen":[1500,2000],"pulseTimings":[230,950,30,290],"softGrip":[1],"speedControlStrategy":[1]}},{"id":19,"name":"Et ipsa quo consequatur id alias perspiciatis non.","slot":1,"config":{"autoGrasp":[0,100],"coContractionTimings":[400,100],"controlMode":[0],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[80,60,10,80,100,70,70,40,90,40],"gripPairsConfig":[7,3,6,2,1,8,4,11],"gripSequentialConfig":[3,8,255,5,1,6,255,7,2,255,255,255],"gripSwitchingMode":[1],"holdOpen":[1500,2500],"pulseTimings":[140,470,920,600],"softGrip":[0],"speedControlStrategy":[0]}},{"id":20,"name":"Sunt soluta explicabo sint aut et.","slot":2,"config":{"autoGrasp":[1,100],"coContractionTimings":[100,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[10,50,40,0,40,90,10,60,70,0],"gripPairsConfig":[3,4,9,12,6,2,7,10],"gripSequentialConfig":[255,5,3,8,12,13,4,1,255,2,6,10],"gripSwitchingMode":[2],"holdOpen":[1500,2500],"pulseTimings":[130,300,690,980],"softGrip":[0],"speedControlStrategy":[0]}}]}'
                  restore_point: 1
                  factory_reset_point: 0
                  changed_by: 52
                  created_at: '2026-01-12T16:47:46.000000Z'
                  updated_at: '2026-01-12T16:47:46.000000Z'
                properties:
                  id:
                    type: integer
                    example: 6
                  device_id:
                    type: integer
                    example: 40
                  index:
                    type: string
                    example: null
                  name:
                    type: string
                    example: 'Magnam eum dolorum quod nam.'
                  config:
                    type: string
                    example: '{"common":{"fingerStrength":[1,300],"gripPositions":{"_":0,"0":{"initial":[18,26,66,3,13],"limit":[62,38,86,55,37]},"1":{"initial":[59,3,45,38,16],"limit":[91,78,53,66,29]},"2":{"initial":[56,16,76,44,4],"limit":[79,50,92,67,53]},"3":{"initial":[3,23,1,33,16],"limit":[26,62,85,90,59]},"4":{"initial":[16,21,44,16,64],"limit":[93,43,59,95,69]},"5":{"initial":[16,7,53,28,56],"limit":[30,14,62,51,61]},"6":{"initial":[14,48,67,18,35],"limit":[88,67,85,46,43]},"7":{"initial":[40,18,19,28,2],"limit":[79,57,51,78,11]},"8":{"initial":[16,67,47,73,38],"limit":[41,76,59,79,56]},"9":{"initial":[5,56,22,2,8],"limit":[82,90,56,70,87]},"10":{"initial":[20,62,7,39,20],"limit":[32,66,61,63,94]},"11":{"initial":[32,42,36,73,2],"limit":[81,93,89,85,57]},"12":{"initial":[73,37,26,63,70],"limit":[90,89,58,78,82]},"13":{"initial":[54,20,48,16,48],"limit":[62,65,68,40,90]}},"inputSite":[1]},"modes":[{"id":18,"name":"Animi et omnis ducimus id velit et sit.","slot":0,"config":{"autoGrasp":[1,100],"coContractionTimings":[500,200],"controlMode":[1],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[0,80,10,60,80,40,90,50,20,30],"gripPairsConfig":[1,6,2,7,3,5,10,11],"gripSequentialConfig":[4,2,255,8,1,255,3,255,9,255,255,255],"gripSwitchingMode":[1],"holdOpen":[1500,2000],"pulseTimings":[230,950,30,290],"softGrip":[1],"speedControlStrategy":[1]}},{"id":19,"name":"Et ipsa quo consequatur id alias perspiciatis non.","slot":1,"config":{"autoGrasp":[0,100],"coContractionTimings":[400,100],"controlMode":[0],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[80,60,10,80,100,70,70,40,90,40],"gripPairsConfig":[7,3,6,2,1,8,4,11],"gripSequentialConfig":[3,8,255,5,1,6,255,7,2,255,255,255],"gripSwitchingMode":[1],"holdOpen":[1500,2500],"pulseTimings":[140,470,920,600],"softGrip":[0],"speedControlStrategy":[0]}},{"id":20,"name":"Sunt soluta explicabo sint aut et.","slot":2,"config":{"autoGrasp":[1,100],"coContractionTimings":[100,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[10,50,40,0,40,90,10,60,70,0],"gripPairsConfig":[3,4,9,12,6,2,7,10],"gripSequentialConfig":[255,5,3,8,12,13,4,1,255,2,6,10],"gripSwitchingMode":[2],"holdOpen":[1500,2500],"pulseTimings":[130,300,690,980],"softGrip":[0],"speedControlStrategy":[0]}}]}'
                  restore_point:
                    type: integer
                    example: 1
                  factory_reset_point:
                    type: integer
                    example: 0
                  changed_by:
                    type: integer
                    example: 52
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:46.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:46.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to update device config'
                      code: 'CONFIG:HISTORY_UPDATE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to update device config'
                      code:
                        type: string
                        example: 'CONFIG:HISTORY_UPDATE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Factory reset point already exists'
                    type: object
                    example:
                      message: 'Factory reset point does not exist'
                      code: 'CONFIG:HISTORY_UPDATE:FACTORY_RESET_POINT_ALREADY_EXISTS'
                    properties:
                      message:
                        type: string
                        example: 'Factory reset point does not exist'
                      code:
                        type: string
                        example: 'CONFIG:HISTORY_UPDATE:FACTORY_RESET_POINT_ALREADY_EXISTS'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG:HISTORY_UPDATE:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG:HISTORY_UPDATE:DEVICE_NOT_FOUND'
                  -
                    description: 'Config history entry not found'
                    type: object
                    example:
                      message: 'Config history entry not found'
                      code: 'CONFIG:HISTORY_UPDATE:HISTORY_ENTRY_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config history entry not found'
                      code:
                        type: string
                        example: 'CONFIG:HISTORY_UPDATE:HISTORY_ENTRY_NOT_FOUND'
      tags:
        - Config
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Config history entry name.'
                  example: 'Remote session 2022-05-30'
                restore_point:
                  type: boolean
                  description: 'Restore point status.'
                  example: true
                factory_reset_point:
                  type: boolean
                  description: 'Point of factory reset.'
                  example: false
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: configId
        description: 'Config history entry ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config/history/undo/{configId}':
    delete:
      summary: 'Undo single config history change'
      operationId: undoSingleConfigHistoryChange
      description: 'Returns updated config in response.'
      parameters: []
      responses:
        202:
          description: 'Normal/compact response'
          content:
            application/json:
              schema:
                type: object
                example:
                  common:
                    gripPairsConfig:
                      - 1
                      - 4
                      - 2
                      - 3
                      - 6
                      - 7
                      - 9
                      - 8
                    controlConfig:
                      - 0
                      - 1
                      - 0
                      - 0
                      - 0
                    emgThresholds:
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                    interval:
                      - 100
                    gripSequentialConfig:
                      - 1
                      - 2
                      - 4
                      - 3
                      - 0
                      - 255
                      - 6
                      - 7
                      - 9
                      - 8
                      - 255
                      - 255
                  modes:
                    -
                      id: 100
                      name: 'Mode 1'
                      slot: 0
                      config:
                        interval:
                          - 300
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                    -
                      id: 101
                      name: 'Mode 2'
                      slot: 1
                      config:
                        interval:
                          - 400
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                    -
                      id: 102
                      name: 'Mode 3'
                      slot: 2
                      config:
                        interval:
                          - 500
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                properties:
                  common:
                    type: object
                    properties:
                      gripPairsConfig:
                        type: array
                        example:
                          - 1
                          - 4
                          - 2
                          - 3
                          - 6
                          - 7
                          - 9
                          - 8
                        items:
                          type: integer
                      controlConfig:
                        type: array
                        example:
                          - 0
                          - 1
                          - 0
                          - 0
                          - 0
                        items:
                          type: integer
                      emgThresholds:
                        type: array
                        example:
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                        items:
                          type: integer
                      interval:
                        type: array
                        example:
                          - 100
                        items:
                          type: integer
                      gripSequentialConfig:
                        type: array
                        example:
                          - 1
                          - 2
                          - 4
                          - 3
                          - 0
                          - 255
                          - 6
                          - 7
                          - 9
                          - 8
                          - 255
                          - 255
                        items:
                          type: integer
                  modes:
                    type: array
                    example:
                      -
                        id: 100
                        name: 'Mode 1'
                        slot: 0
                        config:
                          interval:
                            - 300
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                      -
                        id: 101
                        name: 'Mode 2'
                        slot: 1
                        config:
                          interval:
                            - 400
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                      -
                        id: 102
                        name: 'Mode 3'
                        slot: 2
                        config:
                          interval:
                            - 500
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 100
                        name:
                          type: string
                          example: 'Mode 1'
                        slot:
                          type: integer
                          example: 0
                        config:
                          type: object
                          properties:
                            interval:
                              type: array
                              example:
                                - 300
                              items:
                                type: integer
                            fingerStrength:
                              type: array
                              example:
                                - 1
                                - 100
                              items:
                                type: integer
                            autoGrasp:
                              type: array
                              example:
                                - 0
                                - 100
                              items:
                                type: integer
                            emgSpike:
                              type: array
                              example:
                                - 0
                                - 300
                              items:
                                type: integer
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update device config'
                  code: 'CONFIG:UNDO:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update device config'
                  code:
                    type: string
                    example: 'CONFIG:UNDO:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG:UNDO:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG:UNDO:DEVICE_NOT_FOUND'
                  -
                    description: 'Config history entry not found'
                    type: object
                    example:
                      message: 'Config history entry not found'
                      code: 'CONFIG:UNDO:HISTORY_ENTRY_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config history entry not found'
                      code:
                        type: string
                        example: 'CONFIG:UNDO:HISTORY_ENTRY_NOT_FOUND'
      tags:
        - Config
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: configId
        description: 'Config history entry ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config/restore/{configId}':
    post:
      summary: 'Restore config history entry'
      operationId: restoreConfigHistoryEntry
      description: "Restores config from given config history entry (all changes).\n\t\tSends support ticket if patient is assigned to device, returns config instead."
      parameters: []
      responses:
        200:
          description: 'Patient not assigned, returns config'
          content:
            application/json:
              schema:
                type: object
                example:
                  common:
                    gripPairsConfig:
                      - 1
                      - 4
                      - 2
                      - 3
                      - 6
                      - 7
                      - 9
                      - 8
                    controlConfig:
                      - 0
                      - 1
                      - 0
                      - 0
                      - 0
                    emgThresholds:
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                    interval:
                      - 100
                    gripSequentialConfig:
                      - 1
                      - 2
                      - 4
                      - 3
                      - 0
                      - 255
                      - 6
                      - 7
                      - 9
                      - 8
                      - 255
                      - 255
                  modes:
                    -
                      id: 100
                      name: 'Mode 1'
                      slot: 0
                      config:
                        interval:
                          - 300
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                    -
                      id: 101
                      name: 'Mode 2'
                      slot: 1
                      config:
                        interval:
                          - 400
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                    -
                      id: 102
                      name: 'Mode 3'
                      slot: 2
                      config:
                        interval:
                          - 500
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                properties:
                  common:
                    type: object
                    properties:
                      gripPairsConfig:
                        type: array
                        example:
                          - 1
                          - 4
                          - 2
                          - 3
                          - 6
                          - 7
                          - 9
                          - 8
                        items:
                          type: integer
                      controlConfig:
                        type: array
                        example:
                          - 0
                          - 1
                          - 0
                          - 0
                          - 0
                        items:
                          type: integer
                      emgThresholds:
                        type: array
                        example:
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                        items:
                          type: integer
                      interval:
                        type: array
                        example:
                          - 100
                        items:
                          type: integer
                      gripSequentialConfig:
                        type: array
                        example:
                          - 1
                          - 2
                          - 4
                          - 3
                          - 0
                          - 255
                          - 6
                          - 7
                          - 9
                          - 8
                          - 255
                          - 255
                        items:
                          type: integer
                  modes:
                    type: array
                    example:
                      -
                        id: 100
                        name: 'Mode 1'
                        slot: 0
                        config:
                          interval:
                            - 300
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                      -
                        id: 101
                        name: 'Mode 2'
                        slot: 1
                        config:
                          interval:
                            - 400
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                      -
                        id: 102
                        name: 'Mode 3'
                        slot: 2
                        config:
                          interval:
                            - 500
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 100
                        name:
                          type: string
                          example: 'Mode 1'
                        slot:
                          type: integer
                          example: 0
                        config:
                          type: object
                          properties:
                            interval:
                              type: array
                              example:
                                - 300
                              items:
                                type: integer
                            fingerStrength:
                              type: array
                              example:
                                - 1
                                - 100
                              items:
                                type: integer
                            autoGrasp:
                              type: array
                              example:
                                - 0
                                - 100
                              items:
                                type: integer
                            emgSpike:
                              type: array
                              example:
                                - 0
                                - 300
                              items:
                                type: integer
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  sender_id: 53
                  recipient_id: 54
                  device_id: null
                  meeting_date: '2026-01-12 16:47:47'
                  meeting_type: online_meeting
                  contact_email: lesley.oreilly@hotmail.com
                  status: new
                  created_at: '2026-01-12T16:47:47.000000Z'
                  updated_at: '2026-01-12T16:47:47.000000Z'
                  sender:
                    id: 53
                    mrn: 9OGD2ICX1768236467
                    name: 'Prof. Theresa Boehm II'
                    email: 1768236467rahul82@example.org
                    language: en
                    phone: +1.631.214.5401
                    phone_country: PR
                    phone_verified_at: null
                    address1: '41209 Oberbrunner Throughway Apt. 655'
                    address2: 'Fisherview, CO 14376-7979'
                    postal_code: '78460'
                    city: 'Berge Ltd'
                    clinic_name: 'North Melyna'
                    clinic_location: "3777 Jasmin Forge\nSouth Bartholomemouth, TN 03325-2008"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:47.000000Z'
                    updated_at: '2026-01-12T16:47:47.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  recipient:
                    id: 54
                    mrn: MX491N1J1768236467
                    name: 'Savanna Moore'
                    email: 1768236467qtreutel@example.net
                    language: en
                    phone: +1-239-609-6459
                    phone_country: AL
                    phone_verified_at: null
                    address1: '869 Janae Corner'
                    address2: 'Carolborough, PA 56951-9334'
                    postal_code: 37141-2375
                    city: 'Wintheiser PLC'
                    clinic_name: Onachester
                    clinic_location: "58144 Reichel Street Suite 062\nLake Deonte, SD 89648-9532"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:47.000000Z'
                    updated_at: '2026-01-12T16:47:47.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  device: null
                  messages:
                    -
                      id: 1
                      ticket_id: 1
                      sender_id: 55
                      title: Dr.
                      content: 'Fuga dolorum eveniet eos nobis.'
                      is_read: false
                      created_at: '2026-01-12T16:47:47.000000Z'
                      updated_at: '2026-01-12T16:47:47.000000Z'
                properties:
                  id:
                    type: integer
                    example: 1
                  sender_id:
                    type: integer
                    example: 53
                  recipient_id:
                    type: integer
                    example: 54
                  device_id:
                    type: string
                    example: null
                  meeting_date:
                    type: string
                    example: '2026-01-12 16:47:47'
                  meeting_type:
                    type: string
                    example: online_meeting
                  contact_email:
                    type: string
                    example: lesley.oreilly@hotmail.com
                  status:
                    type: string
                    example: new
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:47.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:47.000000Z'
                  sender:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 53
                      mrn:
                        type: string
                        example: 9OGD2ICX1768236467
                      name:
                        type: string
                        example: 'Prof. Theresa Boehm II'
                      email:
                        type: string
                        example: 1768236467rahul82@example.org
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: +1.631.214.5401
                      phone_country:
                        type: string
                        example: PR
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '41209 Oberbrunner Throughway Apt. 655'
                      address2:
                        type: string
                        example: 'Fisherview, CO 14376-7979'
                      postal_code:
                        type: string
                        example: '78460'
                      city:
                        type: string
                        example: 'Berge Ltd'
                      clinic_name:
                        type: string
                        example: 'North Melyna'
                      clinic_location:
                        type: string
                        example: "3777 Jasmin Forge\nSouth Bartholomemouth, TN 03325-2008"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:47.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:47.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  recipient:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 54
                      mrn:
                        type: string
                        example: MX491N1J1768236467
                      name:
                        type: string
                        example: 'Savanna Moore'
                      email:
                        type: string
                        example: 1768236467qtreutel@example.net
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: +1-239-609-6459
                      phone_country:
                        type: string
                        example: AL
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '869 Janae Corner'
                      address2:
                        type: string
                        example: 'Carolborough, PA 56951-9334'
                      postal_code:
                        type: string
                        example: 37141-2375
                      city:
                        type: string
                        example: 'Wintheiser PLC'
                      clinic_name:
                        type: string
                        example: Onachester
                      clinic_location:
                        type: string
                        example: "58144 Reichel Street Suite 062\nLake Deonte, SD 89648-9532"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:47.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:47.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  device:
                    type: string
                    example: null
                  messages:
                    type: array
                    example:
                      -
                        id: 1
                        ticket_id: 1
                        sender_id: 55
                        title: Dr.
                        content: 'Fuga dolorum eveniet eos nobis.'
                        is_read: false
                        created_at: '2026-01-12T16:47:47.000000Z'
                        updated_at: '2026-01-12T16:47:47.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        ticket_id:
                          type: integer
                          example: 1
                        sender_id:
                          type: integer
                          example: 55
                        title:
                          type: string
                          example: Dr.
                        content:
                          type: string
                          example: 'Fuga dolorum eveniet eos nobis.'
                        is_read:
                          type: boolean
                          example: false
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:47.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:47.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update device config'
                  code: 'CONFIG:RESTORE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update device config'
                  code:
                    type: string
                    example: 'CONFIG:RESTORE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG:RESTORE:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG:RESTORE:DEVICE_NOT_FOUND'
                  -
                    description: 'Config history entry not found'
                    type: object
                    example:
                      message: 'Config history entry not found'
                      code: 'CONFIG:RESTORE:HISTORY_ENTRY_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config history entry not found'
                      code:
                        type: string
                        example: 'CONFIG:RESTORE:HISTORY_ENTRY_NOT_FOUND'
      tags:
        - Config
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: configId
        description: 'Config history entry ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config/restore-factory-reset':
    post:
      summary: 'Restore to factory reset point'
      operationId: restoreToFactoryResetPoint
      description: "Restores config from the device's factory reset point.\n\t\tSends a support ticket if the patient is assigned to the device. Returns the array that contains:\n\t\t<ul>\n\t\t\t<li><code>config</code> - The factory reset config. It might be updated with current config entries\n\t\t\twhen the restored config does not contain a key or its value is false,\n\t\t\tbut the key is available in the current config, has a non-false value, and is required by the config schema.</li>\n\t\t\t<li><code>not_modified</code> - The part of the current config that contains keys which were ignored\n\t\t\t(because they’re on the ignore list, such as custom grips settings),\n\t\t\tor were not updated with values from the factory reset config (because the values are the same in both configs,\n\t\t\tor missing in the factory reset config but present and non-false in the current config).\n\t\t\tThese are included in the <code>config</code> to ensure their values remain unchanged and are not replaced with defaults.</li>\n\t\t\t<li><code>ticket</code> - Support ticket entity, if patient is assigned, null otherwise.</li>\n\t\t</ul>"
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  config:
                    common:
                      inputSite:
                        - 1
                      generalHandSettings: false
                      batteryBeep:
                        - 1
                        - 0
                      emgGains: false
                      autoGrasp: false
                    modes:
                      -
                        id: 1
                        name: 'Mode 0'
                        slot: 0
                        config:
                          gripPairsConfig: false
                          emgThresholds: false
                          emgSpike: false
                          controlMode: false
                      -
                        id: 1530
                        name: 'Mode 1'
                        slot: 1
                        config:
                          gripPairsConfig: false
                          emgThresholds: false
                          emgSpike: false
                          controlMode: false
                      -
                        id: 1531
                        name: 'Mode 2'
                        slot: 2
                        config:
                          gripPairsConfig: false
                          emgThresholds: false
                          emgSpike: false
                          controlMode: false
                  not_modified:
                    common:
                      inputSite:
                        - 1
                      batteryBeep:
                        - 1
                        - 0
                      generalHandSettings:
                        - 1
                        - 2
                        - 3
                        - 4
                    modes:
                      -
                        userFeedbackType: false
                        buzzingVolumeSettings: false
                      -
                        userFeedbackType: false
                        buzzingVolumeSettings: false
                      -
                        userFeedbackType: false
                        buzzingVolumeSettings: false
                  ticket:
                    id: 1
                    sender_id: 1
                    recipient_id: 2
                    device_id: 1
                    meeting_date: '2025-07-22T15:00:00.000000Z'
                    meeting_type: none
                    contact_email: null
                    status: new
                    created_at: '2025-07-22T15:00:00.000000Z'
                    updated_at: '2025-07-22T15:00:00.000000Z'
                    messages:
                      -
                        id: 1
                        ticket_id: 1
                        sender_id: 1
                        title: 'New config update'
                        content: ''
                        is_read: false
                        created_at: '2025-07-22T15:00:00.000000Z'
                        updated_at: '2025-07-22T15:00:00.000000Z'
                        attachments:
                          -
                            id: 6629
                            ticket_id: 12973
                            ticket_message_id: 6517
                            type: json
                            title: 'Current config'
                            attachment: '{"common":{},"modes":[{"id":1,"name":"Mode 0","slot":0,"config":{}},{"id":2,"name":"Mode 1","slot":1,"config":{}},{"id":3,"name":"Mode 2","slot":2,"config":{}}]}'
                            created_at: '2025-07-22T15:00:00.000000Z'
                            updated_at: '2025-07-22T15:00:00.000000Z'
                          -
                            id: 6630
                            ticket_id: 12973
                            ticket_message_id: 6517
                            type: json
                            title: 'New config'
                            attachment: '{"common":{},"modes":[{"id":1,"name":"Mode 0","slot":0,"config":{}},{"id":2,"name":"Mode 1","slot":1,"config":{}},{"id":3,"name":"Mode 2","slot":2,"config":{}}]}'
                            created_at: '2025-07-22T15:00:00.000000Z'
                            updated_at: '2025-07-22T15:00:00.000000Z'
                properties:
                  config:
                    type: object
                    properties:
                      common:
                        type: object
                        properties:
                          inputSite:
                            type: array
                            example:
                              - 1
                            items:
                              type: integer
                          generalHandSettings:
                            type: boolean
                            example: false
                          batteryBeep:
                            type: array
                            example:
                              - 1
                              - 0
                            items:
                              type: integer
                          emgGains:
                            type: boolean
                            example: false
                          autoGrasp:
                            type: boolean
                            example: false
                      modes:
                        type: array
                        example:
                          -
                            id: 1
                            name: 'Mode 0'
                            slot: 0
                            config:
                              gripPairsConfig: false
                              emgThresholds: false
                              emgSpike: false
                              controlMode: false
                          -
                            id: 1530
                            name: 'Mode 1'
                            slot: 1
                            config:
                              gripPairsConfig: false
                              emgThresholds: false
                              emgSpike: false
                              controlMode: false
                          -
                            id: 1531
                            name: 'Mode 2'
                            slot: 2
                            config:
                              gripPairsConfig: false
                              emgThresholds: false
                              emgSpike: false
                              controlMode: false
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            name:
                              type: string
                              example: 'Mode 0'
                            slot:
                              type: integer
                              example: 0
                            config:
                              type: object
                              properties:
                                gripPairsConfig:
                                  type: boolean
                                  example: false
                                emgThresholds:
                                  type: boolean
                                  example: false
                                emgSpike:
                                  type: boolean
                                  example: false
                                controlMode:
                                  type: boolean
                                  example: false
                  not_modified:
                    type: object
                    properties:
                      common:
                        type: object
                        properties:
                          inputSite:
                            type: array
                            example:
                              - 1
                            items:
                              type: integer
                          batteryBeep:
                            type: array
                            example:
                              - 1
                              - 0
                            items:
                              type: integer
                          generalHandSettings:
                            type: array
                            example:
                              - 1
                              - 2
                              - 3
                              - 4
                            items:
                              type: integer
                      modes:
                        type: array
                        example:
                          -
                            userFeedbackType: false
                            buzzingVolumeSettings: false
                          -
                            userFeedbackType: false
                            buzzingVolumeSettings: false
                          -
                            userFeedbackType: false
                            buzzingVolumeSettings: false
                        items:
                          type: object
                          properties:
                            userFeedbackType:
                              type: boolean
                              example: false
                            buzzingVolumeSettings:
                              type: boolean
                              example: false
                  ticket:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      sender_id:
                        type: integer
                        example: 1
                      recipient_id:
                        type: integer
                        example: 2
                      device_id:
                        type: integer
                        example: 1
                      meeting_date:
                        type: string
                        example: '2025-07-22T15:00:00.000000Z'
                      meeting_type:
                        type: string
                        example: none
                      contact_email:
                        type: string
                        example: null
                      status:
                        type: string
                        example: new
                      created_at:
                        type: string
                        example: '2025-07-22T15:00:00.000000Z'
                      updated_at:
                        type: string
                        example: '2025-07-22T15:00:00.000000Z'
                      messages:
                        type: array
                        example:
                          -
                            id: 1
                            ticket_id: 1
                            sender_id: 1
                            title: 'New config update'
                            content: ''
                            is_read: false
                            created_at: '2025-07-22T15:00:00.000000Z'
                            updated_at: '2025-07-22T15:00:00.000000Z'
                            attachments:
                              -
                                id: 6629
                                ticket_id: 12973
                                ticket_message_id: 6517
                                type: json
                                title: 'Current config'
                                attachment: '{"common":{},"modes":[{"id":1,"name":"Mode 0","slot":0,"config":{}},{"id":2,"name":"Mode 1","slot":1,"config":{}},{"id":3,"name":"Mode 2","slot":2,"config":{}}]}'
                                created_at: '2025-07-22T15:00:00.000000Z'
                                updated_at: '2025-07-22T15:00:00.000000Z'
                              -
                                id: 6630
                                ticket_id: 12973
                                ticket_message_id: 6517
                                type: json
                                title: 'New config'
                                attachment: '{"common":{},"modes":[{"id":1,"name":"Mode 0","slot":0,"config":{}},{"id":2,"name":"Mode 1","slot":1,"config":{}},{"id":3,"name":"Mode 2","slot":2,"config":{}}]}'
                                created_at: '2025-07-22T15:00:00.000000Z'
                                updated_at: '2025-07-22T15:00:00.000000Z'
                        items:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            ticket_id:
                              type: integer
                              example: 1
                            sender_id:
                              type: integer
                              example: 1
                            title:
                              type: string
                              example: 'New config update'
                            content:
                              type: string
                              example: ''
                            is_read:
                              type: boolean
                              example: false
                            created_at:
                              type: string
                              example: '2025-07-22T15:00:00.000000Z'
                            updated_at:
                              type: string
                              example: '2025-07-22T15:00:00.000000Z'
                            attachments:
                              type: array
                              example:
                                -
                                  id: 6629
                                  ticket_id: 12973
                                  ticket_message_id: 6517
                                  type: json
                                  title: 'Current config'
                                  attachment: '{"common":{},"modes":[{"id":1,"name":"Mode 0","slot":0,"config":{}},{"id":2,"name":"Mode 1","slot":1,"config":{}},{"id":3,"name":"Mode 2","slot":2,"config":{}}]}'
                                  created_at: '2025-07-22T15:00:00.000000Z'
                                  updated_at: '2025-07-22T15:00:00.000000Z'
                                -
                                  id: 6630
                                  ticket_id: 12973
                                  ticket_message_id: 6517
                                  type: json
                                  title: 'New config'
                                  attachment: '{"common":{},"modes":[{"id":1,"name":"Mode 0","slot":0,"config":{}},{"id":2,"name":"Mode 1","slot":1,"config":{}},{"id":3,"name":"Mode 2","slot":2,"config":{}}]}'
                                  created_at: '2025-07-22T15:00:00.000000Z'
                                  updated_at: '2025-07-22T15:00:00.000000Z'
                              items:
                                type: object
                                properties:
                                  id:
                                    type: integer
                                    example: 6629
                                  ticket_id:
                                    type: integer
                                    example: 12973
                                  ticket_message_id:
                                    type: integer
                                    example: 6517
                                  type:
                                    type: string
                                    example: json
                                  title:
                                    type: string
                                    example: 'Current config'
                                  attachment:
                                    type: string
                                    example: '{"common":{},"modes":[{"id":1,"name":"Mode 0","slot":0,"config":{}},{"id":2,"name":"Mode 1","slot":1,"config":{}},{"id":3,"name":"Mode 2","slot":2,"config":{}}]}'
                                  created_at:
                                    type: string
                                    example: '2025-07-22T15:00:00.000000Z'
                                  updated_at:
                                    type: string
                                    example: '2025-07-22T15:00:00.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to update device config'
                      code: 'CONFIG:RESTORE_FACTORY_RESET:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to update device config'
                      code:
                        type: string
                        example: 'CONFIG:RESTORE_FACTORY_RESET:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Config history entry not found'
                    type: object
                    example:
                      message: 'Config history entry not found'
                      code: 'CONFIG:RESTORE_FACTORY_RESET:NO_RESTORE_POINT'
                    properties:
                      message:
                        type: string
                        example: 'Config history entry not found'
                      code:
                        type: string
                        example: 'CONFIG:RESTORE_FACTORY_RESET:NO_RESTORE_POINT'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'CONFIG:RESTORE_FACTORY_RESET:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'CONFIG:RESTORE_FACTORY_RESET:DEVICE_NOT_FOUND'
      tags:
        - Config
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config/send':
    post:
      summary: 'Send test config'
      operationId: sendTestConfig
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 7
                  sender_id: 64
                  recipient_id: 65
                  device_id: null
                  meeting_date: '2026-01-12 16:47:47'
                  meeting_type: online_meeting
                  contact_email: moen.cathy@ratke.com
                  status: new
                  created_at: '2026-01-12T16:47:48.000000Z'
                  updated_at: '2026-01-12T16:47:48.000000Z'
                  sender:
                    id: 64
                    mrn: 3GECRWIE1768236467
                    name: 'Ignatius Watsica'
                    email: 1768236467wfritsch@example.com
                    language: en
                    phone: '+14135174422'
                    phone_country: PK
                    phone_verified_at: null
                    address1: '2805 Danial Island Apt. 013'
                    address2: 'Port Justinatown, NH 34427-9454'
                    postal_code: '12742'
                    city: 'Murphy, Watsica and Luettgen'
                    clinic_name: Laverneburgh
                    clinic_location: "4091 Hand Street\nNew Elliott, CO 82929"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:47.000000Z'
                    updated_at: '2026-01-12T16:47:47.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  recipient:
                    id: 65
                    mrn: FUY1REQD1768236467
                    name: 'Cole Wiegand'
                    email: 1768236467xcronin@example.com
                    language: en
                    phone: '(520) 399-7521'
                    phone_country: BR
                    phone_verified_at: null
                    address1: '55107 Mraz Route Suite 854'
                    address2: 'South Pasqualeport, IN 14337'
                    postal_code: 47525-1018
                    city: Bayer-Mayer
                    clinic_name: 'North Tyreek'
                    clinic_location: "94663 Kovacek Keys Apt. 871\nHowellton, CT 99184-2460"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:48.000000Z'
                    updated_at: '2026-01-12T16:47:48.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  device: null
                  messages:
                    -
                      id: 4
                      ticket_id: 7
                      sender_id: 66
                      title: Ms.
                      content: 'Ducimus natus recusandae exercitationem sit perspiciatis earum quae totam.'
                      is_read: false
                      created_at: '2026-01-12T16:47:48.000000Z'
                      updated_at: '2026-01-12T16:47:48.000000Z'
                properties:
                  id:
                    type: integer
                    example: 7
                  sender_id:
                    type: integer
                    example: 64
                  recipient_id:
                    type: integer
                    example: 65
                  device_id:
                    type: string
                    example: null
                  meeting_date:
                    type: string
                    example: '2026-01-12 16:47:47'
                  meeting_type:
                    type: string
                    example: online_meeting
                  contact_email:
                    type: string
                    example: moen.cathy@ratke.com
                  status:
                    type: string
                    example: new
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:48.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:48.000000Z'
                  sender:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 64
                      mrn:
                        type: string
                        example: 3GECRWIE1768236467
                      name:
                        type: string
                        example: 'Ignatius Watsica'
                      email:
                        type: string
                        example: 1768236467wfritsch@example.com
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: '+14135174422'
                      phone_country:
                        type: string
                        example: PK
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '2805 Danial Island Apt. 013'
                      address2:
                        type: string
                        example: 'Port Justinatown, NH 34427-9454'
                      postal_code:
                        type: string
                        example: '12742'
                      city:
                        type: string
                        example: 'Murphy, Watsica and Luettgen'
                      clinic_name:
                        type: string
                        example: Laverneburgh
                      clinic_location:
                        type: string
                        example: "4091 Hand Street\nNew Elliott, CO 82929"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:47.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:47.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  recipient:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 65
                      mrn:
                        type: string
                        example: FUY1REQD1768236467
                      name:
                        type: string
                        example: 'Cole Wiegand'
                      email:
                        type: string
                        example: 1768236467xcronin@example.com
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: '(520) 399-7521'
                      phone_country:
                        type: string
                        example: BR
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '55107 Mraz Route Suite 854'
                      address2:
                        type: string
                        example: 'South Pasqualeport, IN 14337'
                      postal_code:
                        type: string
                        example: 47525-1018
                      city:
                        type: string
                        example: Bayer-Mayer
                      clinic_name:
                        type: string
                        example: 'North Tyreek'
                      clinic_location:
                        type: string
                        example: "94663 Kovacek Keys Apt. 871\nHowellton, CT 99184-2460"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:48.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:48.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  device:
                    type: string
                    example: null
                  messages:
                    type: array
                    example:
                      -
                        id: 4
                        ticket_id: 7
                        sender_id: 66
                        title: Ms.
                        content: 'Ducimus natus recusandae exercitationem sit perspiciatis earum quae totam.'
                        is_read: false
                        created_at: '2026-01-12T16:47:48.000000Z'
                        updated_at: '2026-01-12T16:47:48.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 4
                        ticket_id:
                          type: integer
                          example: 7
                        sender_id:
                          type: integer
                          example: 66
                        title:
                          type: string
                          example: Ms.
                        content:
                          type: string
                          example: 'Ducimus natus recusandae exercitationem sit perspiciatis earum quae totam.'
                        is_read:
                          type: boolean
                          example: false
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:48.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:48.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update device config'
                  code: 'CONFIG:SEND:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update device config'
                  code:
                    type: string
                    example: 'CONFIG:SEND:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'CONFIG:SEND:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'CONFIG:SEND:DEVICE_NOT_FOUND'
        422:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device does not have an amputee assigned'
                    type: object
                    example:
                      message: 'Device does not have an amputee assigned'
                      code: 'CONFIG:SEND:NO_PATIENT'
                    properties:
                      message:
                        type: string
                        example: 'Device does not have an amputee assigned'
                      code:
                        type: string
                        example: 'CONFIG:SEND:NO_PATIENT'
                  -
                    description: 'Invalid P2P session'
                    type: object
                    example:
                      message: 'Invalid P2P session'
                      code: 'CONFIG:SEND:INVALID_P2P_SESSION'
                    properties:
                      message:
                        type: string
                        example: 'Invalid P2P session'
                      code:
                        type: string
                        example: 'CONFIG:SEND:INVALID_P2P_SESSION'
      tags:
        - Config
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                description:
                  type: string
                  description: 'Config description to add in message notification.'
                  example: 'Fixed problem with grips.'
                p2p_session:
                  type: integer
                  description: 'P2P Session ID. If config was prepared during P2P session, pass its ID, if not, pass <code>null</code>. The <code>id</code> of an existing record in the App\Models\P2PSession table.'
                  example: 1
                  nullable: true
                common:
                  type: string
                  description: 'Common config as JSON string. MUST_BE_JSON.'
                  example: '{"gripPairsConfig": [1, 4, 2, 3, 6, 7, 9, 8], "controlConfig": [0, 1, 0, 0, 0], "gripSequentialConfig": [1, 2, 4, 3, 0, 255, 6, 7, 9, 8, 255, 255]'
                modes:
                  type: array
                  description: ''
                  example:
                    - []
                  items:
                    type: object
                    properties:
                      id:
                        type: string
                        description: 'Config mode ID. The <code>id</code> of an existing record in the App\Models\ConfigMode table.'
                        example: 1
                      config:
                        type: string
                        description: 'Config specific for mode as JSON string. MUST_BE_JSON.'
                        example: '{"gripPairsConfig": [1, 4, 2, 3, 6, 7, 9, 8], "controlConfig": [0, 1, 0, 0, 0], "gripSequentialConfig": [1, 2, 4, 3, 0, 255, 6, 7, 9, 8, 255, 255]'
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/config/convert:
    post:
      summary: 'Convert config'
      operationId: convertConfig
      description: 'Convert config JSON to match given Firmware Version. Keys are moved between common config and modes.'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  common:
                    gripPairsConfig:
                      - 1
                      - 4
                      - 2
                      - 3
                      - 6
                      - 7
                      - 9
                      - 8
                    controlConfig:
                      - 0
                      - 1
                      - 0
                      - 0
                      - 0
                    emgThresholds:
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                    interval:
                      - 100
                    gripSequentialConfig:
                      - 1
                      - 2
                      - 4
                      - 3
                      - 0
                      - 255
                      - 6
                      - 7
                      - 9
                      - 8
                      - 255
                      - 255
                  modes:
                    -
                      id: 100
                      name: 'Mode 1'
                      slot: 0
                      config:
                        interval:
                          - 300
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                    -
                      id: 101
                      name: 'Mode 2'
                      slot: 1
                      config:
                        interval:
                          - 400
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                    -
                      id: 102
                      name: 'Mode 3'
                      slot: 2
                      config:
                        interval:
                          - 500
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                properties:
                  common:
                    type: object
                    properties:
                      gripPairsConfig:
                        type: array
                        example:
                          - 1
                          - 4
                          - 2
                          - 3
                          - 6
                          - 7
                          - 9
                          - 8
                        items:
                          type: integer
                      controlConfig:
                        type: array
                        example:
                          - 0
                          - 1
                          - 0
                          - 0
                          - 0
                        items:
                          type: integer
                      emgThresholds:
                        type: array
                        example:
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                        items:
                          type: integer
                      interval:
                        type: array
                        example:
                          - 100
                        items:
                          type: integer
                      gripSequentialConfig:
                        type: array
                        example:
                          - 1
                          - 2
                          - 4
                          - 3
                          - 0
                          - 255
                          - 6
                          - 7
                          - 9
                          - 8
                          - 255
                          - 255
                        items:
                          type: integer
                  modes:
                    type: array
                    example:
                      -
                        id: 100
                        name: 'Mode 1'
                        slot: 0
                        config:
                          interval:
                            - 300
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                      -
                        id: 101
                        name: 'Mode 2'
                        slot: 1
                        config:
                          interval:
                            - 400
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                      -
                        id: 102
                        name: 'Mode 3'
                        slot: 2
                        config:
                          interval:
                            - 500
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 100
                        name:
                          type: string
                          example: 'Mode 1'
                        slot:
                          type: integer
                          example: 0
                        config:
                          type: object
                          properties:
                            interval:
                              type: array
                              example:
                                - 300
                              items:
                                type: integer
                            fingerStrength:
                              type: array
                              example:
                                - 1
                                - 100
                              items:
                                type: integer
                            autoGrasp:
                              type: array
                              example:
                                - 0
                                - 100
                              items:
                                type: integer
                            emgSpike:
                              type: array
                              example:
                                - 0
                                - 300
                              items:
                                type: integer
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update device config'
                  code: 'CONFIG:CONVERT:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update device config'
                  code:
                    type: string
                    example: 'CONFIG:CONVERT:INSUFFICIENT_PERMISSION'
        404:
          description: 'Firmware version not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Firmware version not found'
                  code: 'CONFIG:CONVERT:FIRMWARE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Firmware version not found'
                  code:
                    type: string
                    example: 'CONFIG:CONVERT:FIRMWARE_NOT_FOUND'
      tags:
        - Config
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                config:
                  type: string
                  description: 'Full config JSON. MUST_BE_JSON.'
                  example: '["reiciendis","ut"]'
                firmware:
                  type: string
                  description: 'Firmware Version ID to which config should be adjusted. The <code>id</code> of an existing record in the App\Models\FirmwareVersion table.'
                  example: 1
              required:
                - config
                - firmware
  '/api/device/{deviceId}/config/demos':
    get:
      summary: 'List config demos'
      operationId: listConfigDemos
      description: ''
      parameters:
        -
          in: query
          name: accepted
          description: "Filter config demos by accepted status.\n\t\tIf not specified, all entries will be returned.\n\t\tPass -1 to get entries not accepted or rejected yet.\n\t\tThe value must be one of <code>-1</code>, <code>0</code> or <code>1</code>."
          example: 15
          required: false
          schema:
            type: integer
            description: "Filter config demos by accepted status.\n\t\tIf not specified, all entries will be returned.\n\t\tPass -1 to get entries not accepted or rejected yet.\n\t\tThe value must be one of <code>-1</code>, <code>0</code> or <code>1</code>."
            example: 15
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>message</code>, <code>message.ticket</code>, <code>message.attachments</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>message</code>, <code>message.ticket</code>, <code>message.attachments</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      device_id: 72
                      message_id: 8
                      config: 'Pariatur id quia autem enim maiores.'
                      is_accepted: 1
                      notes: 'Rem incidunt debitis odio.'
                      created_at: '2026-01-12T16:47:49.000000Z'
                      updated_at: '2026-01-12T16:47:49.000000Z'
                      message:
                        id: 8
                        ticket_id: 15
                        sender_id: 87
                        title: Mrs.
                        content: 'Voluptatem accusantium voluptatem ducimus facilis ad maiores quibusdam magnam.'
                        is_read: false
                        created_at: '2026-01-12T16:47:49.000000Z'
                        updated_at: '2026-01-12T16:47:49.000000Z'
                    -
                      id: 2
                      device_id: 73
                      message_id: 10
                      config: 'Sed laborum nesciunt et iusto vel.'
                      is_accepted: 1
                      notes: 'Atque necessitatibus eum eos rerum.'
                      created_at: '2026-01-12T16:47:50.000000Z'
                      updated_at: '2026-01-12T16:47:50.000000Z'
                      message:
                        id: 10
                        ticket_id: 18
                        sender_id: 92
                        title: Ms.
                        content: 'Fugiat deleniti corporis officiis vitae ratione aspernatur.'
                        is_read: false
                        created_at: '2026-01-12T16:47:50.000000Z'
                        updated_at: '2026-01-12T16:47:50.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        device_id: 72
                        message_id: 8
                        config: 'Pariatur id quia autem enim maiores.'
                        is_accepted: 1
                        notes: 'Rem incidunt debitis odio.'
                        created_at: '2026-01-12T16:47:49.000000Z'
                        updated_at: '2026-01-12T16:47:49.000000Z'
                        message:
                          id: 8
                          ticket_id: 15
                          sender_id: 87
                          title: Mrs.
                          content: 'Voluptatem accusantium voluptatem ducimus facilis ad maiores quibusdam magnam.'
                          is_read: false
                          created_at: '2026-01-12T16:47:49.000000Z'
                          updated_at: '2026-01-12T16:47:49.000000Z'
                      -
                        id: 2
                        device_id: 73
                        message_id: 10
                        config: 'Sed laborum nesciunt et iusto vel.'
                        is_accepted: 1
                        notes: 'Atque necessitatibus eum eos rerum.'
                        created_at: '2026-01-12T16:47:50.000000Z'
                        updated_at: '2026-01-12T16:47:50.000000Z'
                        message:
                          id: 10
                          ticket_id: 18
                          sender_id: 92
                          title: Ms.
                          content: 'Fugiat deleniti corporis officiis vitae ratione aspernatur.'
                          is_read: false
                          created_at: '2026-01-12T16:47:50.000000Z'
                          updated_at: '2026-01-12T16:47:50.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        device_id:
                          type: integer
                          example: 72
                        message_id:
                          type: integer
                          example: 8
                        config:
                          type: string
                          example: 'Pariatur id quia autem enim maiores.'
                        is_accepted:
                          type: integer
                          example: 1
                        notes:
                          type: string
                          example: 'Rem incidunt debitis odio.'
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:49.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:49.000000Z'
                        message:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 8
                            ticket_id:
                              type: integer
                              example: 15
                            sender_id:
                              type: integer
                              example: 87
                            title:
                              type: string
                              example: Mrs.
                            content:
                              type: string
                              example: 'Voluptatem accusantium voluptatem ducimus facilis ad maiores quibusdam magnam.'
                            is_read:
                              type: boolean
                              example: false
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:49.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:49.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to access config demos'
                  code: 'CONFIG_DEMO:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to access config demos'
                  code:
                    type: string
                    example: 'CONFIG_DEMO:LIST:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'CONFIG_DEMO:LIST:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'CONFIG_DEMO:LIST:DEVICE_NOT_FOUND'
      tags:
        - 'Config Demo'
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config/demos/{demoId}':
    put:
      summary: 'Update config demo'
      operationId: updateConfigDemo
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  device_id: 74
                  message_id: 11
                  config: 'Placeat ratione quibusdam at autem provident.'
                  is_accepted: 0
                  notes: 'Possimus velit reprehenderit aut voluptatem.'
                  created_at: '2026-01-12T16:47:50.000000Z'
                  updated_at: '2026-01-12T16:47:50.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  device_id:
                    type: integer
                    example: 74
                  message_id:
                    type: integer
                    example: 11
                  config:
                    type: string
                    example: 'Placeat ratione quibusdam at autem provident.'
                  is_accepted:
                    type: integer
                    example: 0
                  notes:
                    type: string
                    example: 'Possimus velit reprehenderit aut voluptatem.'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:50.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:50.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to access config demos'
                  code: 'CONFIG_DEMO:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to access config demos'
                  code:
                    type: string
                    example: 'CONFIG_DEMO:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG_DEMO:UPDATE:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG_DEMO:UPDATE:DEVICE_NOT_FOUND'
                  -
                    description: 'Config demo not found'
                    type: object
                    example:
                      message: 'Config demo not found'
                      code: 'CONFIG_DEMO:UPDATE:DEMO_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config demo not found'
                      code:
                        type: string
                        example: 'CONFIG_DEMO:UPDATE:DEMO_NOT_FOUND'
      tags:
        - 'Config Demo'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                is_accepted:
                  type: boolean
                  description: 'Determines if demo config was accepted by patient.'
                  example: false
                notes:
                  type: string
                  description: 'Patient notes about tested config.'
                  example: 'Something is still not working'
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: demoId
        description: 'Config demo ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config-modes':
    get:
      summary: 'List config modes'
      operationId: listConfigModes
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 72
                    device_id:
                      type: integer
                      example: 103
                    slot:
                      type: string
                      example: null
                    name:
                      type: string
                      example: 'Nisi vel dolorem non dignissimos sequi.'
                    active:
                      type: integer
                      example: 1
                    created_at:
                      type: string
                      example: '2026-01-12T16:47:51.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:47:51.000000Z'
                    device:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 103
                        serial:
                          type: string
                          example: 7fe2e7c0-3796-3a00-9ef4-1ff1c6829605
                        bluetooth_id:
                          type: string
                          example: bac97e64-8811-34b7-b589-a33cf0576ebe
                        company_id:
                          type: string
                          example: null
                        model_id:
                          type: string
                          example: null
                        amputee_id:
                          type: integer
                          example: 105
                        clinician_id:
                          type: string
                          example: null
                        firmware_version_id:
                          type: string
                          example: null
                        pcb_version_id:
                          type: string
                          example: null
                        reverse_magnets:
                          type: integer
                          example: 0
                        is_electrode:
                          type: integer
                          example: 0
                        active:
                          type: integer
                          example: 1
                        last_activity_at:
                          type: string
                          example: '0000-00-00 00:00:00'
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:51.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:51.000000Z'
                example:
                  -
                    id: 72
                    device_id: 103
                    slot: null
                    name: 'Nisi vel dolorem non dignissimos sequi.'
                    active: 1
                    created_at: '2026-01-12T16:47:51.000000Z'
                    updated_at: '2026-01-12T16:47:51.000000Z'
                    device:
                      id: 103
                      serial: 7fe2e7c0-3796-3a00-9ef4-1ff1c6829605
                      bluetooth_id: bac97e64-8811-34b7-b589-a33cf0576ebe
                      company_id: null
                      model_id: null
                      amputee_id: 105
                      clinician_id: null
                      firmware_version_id: null
                      pcb_version_id: null
                      reverse_magnets: 0
                      is_electrode: 0
                      active: 1
                      last_activity_at: '0000-00-00 00:00:00'
                      created_at: '2026-01-12T16:47:51.000000Z'
                      updated_at: '2026-01-12T16:47:51.000000Z'
                  -
                    id: 73
                    device_id: 105
                    slot: null
                    name: 'Omnis odit distinctio enim non.'
                    active: 1
                    created_at: '2026-01-12T16:47:51.000000Z'
                    updated_at: '2026-01-12T16:47:51.000000Z'
                    config: {  }
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list config modes'
                  code: 'CONFIG_MODES:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list config modes'
                  code:
                    type: string
                    example: 'CONFIG_MODES:LIST:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'CONFIG_MODES:LIST:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'CONFIG_MODES:LIST:DEVICE_NOT_FOUND'
      tags:
        - 'Config Modes'
    post:
      summary: 'Create config mode'
      operationId: createConfigMode
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 75
                  device_id: 107
                  slot: null
                  name: 'Cumque consequatur in aut.'
                  active: 1
                  created_at: '2026-01-12T16:47:51.000000Z'
                  updated_at: '2026-01-12T16:47:51.000000Z'
                properties:
                  id:
                    type: integer
                    example: 75
                  device_id:
                    type: integer
                    example: 107
                  slot:
                    type: string
                    example: null
                  name:
                    type: string
                    example: 'Cumque consequatur in aut.'
                  active:
                    type: integer
                    example: 1
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to create config modes'
                  code: 'CONFIG_MODES:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to create config modes'
                  code:
                    type: string
                    example: 'CONFIG_MODES:CREATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'CONFIG_MODES:CREATE:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'CONFIG_MODES:CREATE:DEVICE_NOT_FOUND'
      tags:
        - 'Config Modes'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                slot:
                  type: integer
                  description: 'Mode index on device.'
                  example: 0
                  enum:
                    - '0'
                    - '1'
                    - '2'
                name:
                  type: string
                  description: 'Name of mode.'
                  example: 'Sport mode'
                active:
                  type: boolean
                  description: 'Active status. Default: 1.'
                  example: true
              required:
                - name
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config-modes/{modeId}':
    get:
      summary: 'Get config mode'
      operationId: getConfigMode
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 74
                  device_id: 106
                  slot: null
                  name: 'Facere nihil itaque et tenetur.'
                  active: 0
                  created_at: '2026-01-12T16:47:51.000000Z'
                  updated_at: '2026-01-12T16:47:51.000000Z'
                properties:
                  id:
                    type: integer
                    example: 74
                  device_id:
                    type: integer
                    example: 106
                  slot:
                    type: string
                    example: null
                  name:
                    type: string
                    example: 'Facere nihil itaque et tenetur.'
                  active:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list config modes'
                  code: 'CONFIG_MODES:GET:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list config modes'
                  code:
                    type: string
                    example: 'CONFIG_MODES:GET:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG_MODES:GET:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG_MODES:GET:DEVICE_NOT_FOUND'
                  -
                    description: 'Config mode not found'
                    type: object
                    example:
                      message: 'Config mode not found'
                      code: 'CONFIG_MODES:GET:MODE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config mode not found'
                      code:
                        type: string
                        example: 'CONFIG_MODES:GET:MODE_NOT_FOUND'
      tags:
        - 'Config Modes'
    put:
      summary: 'Update config mode'
      operationId: updateConfigMode
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 76
                  device_id: 108
                  slot: null
                  name: 'Sit eius maiores molestiae perspiciatis.'
                  active: 0
                  created_at: '2026-01-12T16:47:51.000000Z'
                  updated_at: '2026-01-12T16:47:51.000000Z'
                properties:
                  id:
                    type: integer
                    example: 76
                  device_id:
                    type: integer
                    example: 108
                  slot:
                    type: string
                    example: null
                  name:
                    type: string
                    example: 'Sit eius maiores molestiae perspiciatis.'
                  active:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update config mode'
                  code: 'CONFIG_MODES:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update config mode'
                  code:
                    type: string
                    example: 'CONFIG_MODES:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG_MODES:UPDATE:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG_MODES:UPDATE:DEVICE_NOT_FOUND'
                  -
                    description: 'Config mode not found'
                    type: object
                    example:
                      message: 'Config mode not found'
                      code: 'CONFIG_MODES:UPDATE:MODE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config mode not found'
                      code:
                        type: string
                        example: 'CONFIG_MODES:UPDATE:MODE_NOT_FOUND'
      tags:
        - 'Config Modes'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                slot:
                  type: integer
                  description: 'Mode index on device.'
                  example: 0
                  enum:
                    - '0'
                    - '1'
                    - '2'
                name:
                  type: string
                  description: 'Name of mode.'
                  example: 'Sport mode'
                active:
                  type: boolean
                  description: 'Active status. Default: 1.'
                  example: true
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: modeId
        description: 'Config mode ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config-modes/{modeId}/from-template/{templateId}':
    post:
      summary: 'Copy device config from template'
      operationId: copyDeviceConfigFromTemplate
      description: "Copy config template into selected config mode.\n\t\tSends support ticket if patient is assigned to device, returns config instead."
      parameters: []
      responses:
        200:
          description: 'Patient not assigned, returns config'
          content:
            application/json:
              schema:
                type: object
                example:
                  common:
                    gripPairsConfig:
                      - 1
                      - 4
                      - 2
                      - 3
                      - 6
                      - 7
                      - 9
                      - 8
                    controlConfig:
                      - 0
                      - 1
                      - 0
                      - 0
                      - 0
                    emgThresholds:
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                      - 0
                    interval:
                      - 100
                    gripSequentialConfig:
                      - 1
                      - 2
                      - 4
                      - 3
                      - 0
                      - 255
                      - 6
                      - 7
                      - 9
                      - 8
                      - 255
                      - 255
                  modes:
                    -
                      id: 100
                      name: 'Mode 1'
                      slot: 0
                      config:
                        interval:
                          - 300
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                    -
                      id: 101
                      name: 'Mode 2'
                      slot: 1
                      config:
                        interval:
                          - 400
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                    -
                      id: 102
                      name: 'Mode 3'
                      slot: 2
                      config:
                        interval:
                          - 500
                        fingerStrength:
                          - 1
                          - 100
                        autoGrasp:
                          - 0
                          - 100
                        emgSpike:
                          - 0
                          - 300
                properties:
                  common:
                    type: object
                    properties:
                      gripPairsConfig:
                        type: array
                        example:
                          - 1
                          - 4
                          - 2
                          - 3
                          - 6
                          - 7
                          - 9
                          - 8
                        items:
                          type: integer
                      controlConfig:
                        type: array
                        example:
                          - 0
                          - 1
                          - 0
                          - 0
                          - 0
                        items:
                          type: integer
                      emgThresholds:
                        type: array
                        example:
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                          - 0
                        items:
                          type: integer
                      interval:
                        type: array
                        example:
                          - 100
                        items:
                          type: integer
                      gripSequentialConfig:
                        type: array
                        example:
                          - 1
                          - 2
                          - 4
                          - 3
                          - 0
                          - 255
                          - 6
                          - 7
                          - 9
                          - 8
                          - 255
                          - 255
                        items:
                          type: integer
                  modes:
                    type: array
                    example:
                      -
                        id: 100
                        name: 'Mode 1'
                        slot: 0
                        config:
                          interval:
                            - 300
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                      -
                        id: 101
                        name: 'Mode 2'
                        slot: 1
                        config:
                          interval:
                            - 400
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                      -
                        id: 102
                        name: 'Mode 3'
                        slot: 2
                        config:
                          interval:
                            - 500
                          fingerStrength:
                            - 1
                            - 100
                          autoGrasp:
                            - 0
                            - 100
                          emgSpike:
                            - 0
                            - 300
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 100
                        name:
                          type: string
                          example: 'Mode 1'
                        slot:
                          type: integer
                          example: 0
                        config:
                          type: object
                          properties:
                            interval:
                              type: array
                              example:
                                - 300
                              items:
                                type: integer
                            fingerStrength:
                              type: array
                              example:
                                - 1
                                - 100
                              items:
                                type: integer
                            autoGrasp:
                              type: array
                              example:
                                - 0
                                - 100
                              items:
                                type: integer
                            emgSpike:
                              type: array
                              example:
                                - 0
                                - 300
                              items:
                                type: integer
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 21
                  sender_id: 107
                  recipient_id: 108
                  device_id: null
                  meeting_date: '2026-01-12 16:47:51'
                  meeting_type: online_meeting
                  contact_email: pagac.deangelo@olson.com
                  status: new
                  created_at: '2026-01-12T16:47:51.000000Z'
                  updated_at: '2026-01-12T16:47:51.000000Z'
                  sender:
                    id: 107
                    mrn: CP72ENQQ1768236471
                    name: 'Mrs. Selena Bahringer PhD'
                    email: 1768236471madisen.olson@example.com
                    language: en
                    phone: '(949) 471-8773'
                    phone_country: KH
                    phone_verified_at: null
                    address1: '159 Miller Lodge Apt. 028'
                    address2: 'Lake Camille, OK 02534'
                    postal_code: 39551-5268
                    city: 'Kirlin, Mueller and Barton'
                    clinic_name: Konopelskiport
                    clinic_location: "50777 Lonzo Loaf\nLake Arch, NE 84611"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:51.000000Z'
                    updated_at: '2026-01-12T16:47:51.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  recipient:
                    id: 108
                    mrn: V92Y1JAC1768236471
                    name: 'Viola Marquardt'
                    email: 1768236471hardy.fay@example.com
                    language: en
                    phone: 279.678.4838
                    phone_country: UZ
                    phone_verified_at: null
                    address1: '35007 Elliott Spring Suite 492'
                    address2: 'Schummmouth, NH 32534-3943'
                    postal_code: 51880-4747
                    city: Donnelly-Harris
                    clinic_name: Leannonfurt
                    clinic_location: "56622 Schroeder Lights\nLondonton, OH 88879"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:51.000000Z'
                    updated_at: '2026-01-12T16:47:51.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  device: null
                  messages:
                    -
                      id: 12
                      ticket_id: 21
                      sender_id: 109
                      title: Dr.
                      content: 'Voluptatum et doloremque fugiat laboriosam voluptatem alias ullam.'
                      is_read: false
                      created_at: '2026-01-12T16:47:52.000000Z'
                      updated_at: '2026-01-12T16:47:52.000000Z'
                properties:
                  id:
                    type: integer
                    example: 21
                  sender_id:
                    type: integer
                    example: 107
                  recipient_id:
                    type: integer
                    example: 108
                  device_id:
                    type: string
                    example: null
                  meeting_date:
                    type: string
                    example: '2026-01-12 16:47:51'
                  meeting_type:
                    type: string
                    example: online_meeting
                  contact_email:
                    type: string
                    example: pagac.deangelo@olson.com
                  status:
                    type: string
                    example: new
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
                  sender:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 107
                      mrn:
                        type: string
                        example: CP72ENQQ1768236471
                      name:
                        type: string
                        example: 'Mrs. Selena Bahringer PhD'
                      email:
                        type: string
                        example: 1768236471madisen.olson@example.com
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: '(949) 471-8773'
                      phone_country:
                        type: string
                        example: KH
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '159 Miller Lodge Apt. 028'
                      address2:
                        type: string
                        example: 'Lake Camille, OK 02534'
                      postal_code:
                        type: string
                        example: 39551-5268
                      city:
                        type: string
                        example: 'Kirlin, Mueller and Barton'
                      clinic_name:
                        type: string
                        example: Konopelskiport
                      clinic_location:
                        type: string
                        example: "50777 Lonzo Loaf\nLake Arch, NE 84611"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:51.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:51.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  recipient:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 108
                      mrn:
                        type: string
                        example: V92Y1JAC1768236471
                      name:
                        type: string
                        example: 'Viola Marquardt'
                      email:
                        type: string
                        example: 1768236471hardy.fay@example.com
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 279.678.4838
                      phone_country:
                        type: string
                        example: UZ
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '35007 Elliott Spring Suite 492'
                      address2:
                        type: string
                        example: 'Schummmouth, NH 32534-3943'
                      postal_code:
                        type: string
                        example: 51880-4747
                      city:
                        type: string
                        example: Donnelly-Harris
                      clinic_name:
                        type: string
                        example: Leannonfurt
                      clinic_location:
                        type: string
                        example: "56622 Schroeder Lights\nLondonton, OH 88879"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:51.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:51.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  device:
                    type: string
                    example: null
                  messages:
                    type: array
                    example:
                      -
                        id: 12
                        ticket_id: 21
                        sender_id: 109
                        title: Dr.
                        content: 'Voluptatum et doloremque fugiat laboriosam voluptatem alias ullam.'
                        is_read: false
                        created_at: '2026-01-12T16:47:52.000000Z'
                        updated_at: '2026-01-12T16:47:52.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 12
                        ticket_id:
                          type: integer
                          example: 21
                        sender_id:
                          type: integer
                          example: 109
                        title:
                          type: string
                          example: Dr.
                        content:
                          type: string
                          example: 'Voluptatum et doloremque fugiat laboriosam voluptatem alias ullam.'
                        is_read:
                          type: boolean
                          example: false
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:52.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:52.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update config mode'
                  code: 'CONFIG_MODES:COPY_TEMPLATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update config mode'
                  code:
                    type: string
                    example: 'CONFIG_MODES:COPY_TEMPLATE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG_MODES:COPY_TEMPLATE:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG_MODES:COPY_TEMPLATE:DEVICE_NOT_FOUND'
                  -
                    description: 'Config mode not found'
                    type: object
                    example:
                      message: 'Config mode not found'
                      code: 'CONFIG_MODES:COPY_TEMPLATE:MODE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config mode not found'
                      code:
                        type: string
                        example: 'CONFIG_MODES:COPY_TEMPLATE:MODE_NOT_FOUND'
                  -
                    description: 'Config template not found'
                    type: object
                    example:
                      message: 'Config template not found'
                      code: 'CONFIG_MODES:COPY_TEMPLATE:TEMPLATE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config template not found'
                      code:
                        type: string
                        example: 'CONFIG_MODES:COPY_TEMPLATE:TEMPLATE_NOT_FOUND'
      tags:
        - 'Config Modes'
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: modeId
        description: 'Config mode ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: templateId
        description: 'Config template ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config/{configId}/notes':
    get:
      summary: 'Get config entry notes list'
      operationId: getConfigEntryNotesList
      description: ''
      parameters:
        -
          in: query
          name: user
          description: 'Filter notes by user.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Filter notes by user.'
            example: 1
        -
          in: query
          name: type
          description: 'Filter notes by type (available: <code>public</code> and <code>private</code>)'
          example: public
          required: false
          schema:
            type: string
            description: 'Filter notes by type (available: <code>public</code> and <code>private</code>)'
            example: public
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      config_history_id: 7
                      user_id: 76
                      note: 'Delectus nostrum iure labore unde.'
                      type: public
                      created_at: '2026-01-12T16:47:48.000000Z'
                      updated_at: '2026-01-12T16:47:48.000000Z'
                      author:
                        id: 76
                        mrn: BM3G57TI1768236468
                        name: 'Lawson Kessler'
                        email: 1768236468chanel82@example.org
                        language: en
                        phone: +1.281.973.2370
                        phone_country: GB
                        phone_verified_at: null
                        address1: '807 Witting Hill'
                        address2: 'Huelsshire, RI 88813'
                        postal_code: '86941'
                        city: 'Koch, Lakin and Leffler'
                        clinic_name: Uptonville
                        clinic_location: "923 Grant Parkways Suite 029\nEast Talonshire, WI 13705"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:48.000000Z'
                        updated_at: '2026-01-12T16:47:48.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                    -
                      id: 2
                      config_history_id: 8
                      user_id: 78
                      note: 'Recusandae soluta modi ipsum id deleniti.'
                      type: public
                      created_at: '2026-01-12T16:47:49.000000Z'
                      updated_at: '2026-01-12T16:47:49.000000Z'
                      author:
                        id: 78
                        mrn: 6931BN4Y1768236468
                        name: 'Emelie Walker DDS'
                        email: 1768236468vreichel@example.org
                        language: en
                        phone: 757.765.8413
                        phone_country: KY
                        phone_verified_at: null
                        address1: '82026 Howell Extensions Suite 198'
                        address2: 'Lake Linda, NV 05309'
                        postal_code: '67772'
                        city: 'Koch LLC'
                        clinic_name: Erdmanberg
                        clinic_location: "588 Idell Forest\nLake Maximilianborough, AL 10386"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:49.000000Z'
                        updated_at: '2026-01-12T16:47:49.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        config_history_id: 7
                        user_id: 76
                        note: 'Delectus nostrum iure labore unde.'
                        type: public
                        created_at: '2026-01-12T16:47:48.000000Z'
                        updated_at: '2026-01-12T16:47:48.000000Z'
                        author:
                          id: 76
                          mrn: BM3G57TI1768236468
                          name: 'Lawson Kessler'
                          email: 1768236468chanel82@example.org
                          language: en
                          phone: +1.281.973.2370
                          phone_country: GB
                          phone_verified_at: null
                          address1: '807 Witting Hill'
                          address2: 'Huelsshire, RI 88813'
                          postal_code: '86941'
                          city: 'Koch, Lakin and Leffler'
                          clinic_name: Uptonville
                          clinic_location: "923 Grant Parkways Suite 029\nEast Talonshire, WI 13705"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:48.000000Z'
                          updated_at: '2026-01-12T16:47:48.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                      -
                        id: 2
                        config_history_id: 8
                        user_id: 78
                        note: 'Recusandae soluta modi ipsum id deleniti.'
                        type: public
                        created_at: '2026-01-12T16:47:49.000000Z'
                        updated_at: '2026-01-12T16:47:49.000000Z'
                        author:
                          id: 78
                          mrn: 6931BN4Y1768236468
                          name: 'Emelie Walker DDS'
                          email: 1768236468vreichel@example.org
                          language: en
                          phone: 757.765.8413
                          phone_country: KY
                          phone_verified_at: null
                          address1: '82026 Howell Extensions Suite 198'
                          address2: 'Lake Linda, NV 05309'
                          postal_code: '67772'
                          city: 'Koch LLC'
                          clinic_name: Erdmanberg
                          clinic_location: "588 Idell Forest\nLake Maximilianborough, AL 10386"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:49.000000Z'
                          updated_at: '2026-01-12T16:47:49.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        config_history_id:
                          type: integer
                          example: 7
                        user_id:
                          type: integer
                          example: 76
                        note:
                          type: string
                          example: 'Delectus nostrum iure labore unde.'
                        type:
                          type: string
                          example: public
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:48.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:48.000000Z'
                        author:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 76
                            mrn:
                              type: string
                              example: BM3G57TI1768236468
                            name:
                              type: string
                              example: 'Lawson Kessler'
                            email:
                              type: string
                              example: 1768236468chanel82@example.org
                            language:
                              type: string
                              example: en
                            phone:
                              type: string
                              example: +1.281.973.2370
                            phone_country:
                              type: string
                              example: GB
                            phone_verified_at:
                              type: string
                              example: null
                            address1:
                              type: string
                              example: '807 Witting Hill'
                            address2:
                              type: string
                              example: 'Huelsshire, RI 88813'
                            postal_code:
                              type: string
                              example: '86941'
                            city:
                              type: string
                              example: 'Koch, Lakin and Leffler'
                            clinic_name:
                              type: string
                              example: Uptonville
                            clinic_location:
                              type: string
                              example: "923 Grant Parkways Suite 029\nEast Talonshire, WI 13705"
                            image:
                              type: string
                              example: null
                            mfa_enabled:
                              type: integer
                              example: 0
                            mfa_method:
                              type: string
                              example: null
                            mfa_verified_to:
                              type: string
                              example: null
                            location_id:
                              type: string
                              example: null
                            created_by:
                              type: string
                              example: null
                            active:
                              type: integer
                              example: 1
                            notifications_timezone:
                              type: string
                              example: null
                            notifications_at:
                              type: string
                              example: null
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:48.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:48.000000Z'
                            invitation_status:
                              type: string
                              example: null
                            acadle_invitation_status:
                              type: string
                              example: null
                            roles:
                              type: array
                              example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to access config notes'
                  code: 'CONFIG_NOTES:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to access config notes'
                  code:
                    type: string
                    example: 'CONFIG_NOTES:LIST:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG_NOTES:LIST:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG_NOTES:LIST:DEVICE_NOT_FOUND'
                  -
                    description: 'Config history entry not found'
                    type: object
                    example:
                      message: 'Config history entry not found'
                      code: 'CONFIG_NOTES:LIST:HISTORY_ENTRY_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config history entry not found'
                      code:
                        type: string
                        example: 'CONFIG_NOTES:LIST:HISTORY_ENTRY_NOT_FOUND'
      tags:
        - 'Config Notes'
    post:
      summary: 'Create config entry note'
      operationId: createConfigEntryNote
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  config_history_id: 10
                  user_id: 82
                  note: 'Est eius vitae velit vitae repellendus.'
                  type: public
                  created_at: '2026-01-12T16:47:49.000000Z'
                  updated_at: '2026-01-12T16:47:49.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  config_history_id:
                    type: integer
                    example: 10
                  user_id:
                    type: integer
                    example: 82
                  note:
                    type: string
                    example: 'Est eius vitae velit vitae repellendus.'
                  type:
                    type: string
                    example: public
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:49.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:49.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to add config notes'
                  code: 'CONFIG_NOTES:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to add config notes'
                  code:
                    type: string
                    example: 'CONFIG_NOTES:CREATE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG_NOTES:CREATE:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG_NOTES:CREATE:DEVICE_NOT_FOUND'
                  -
                    description: 'Config history entry not found'
                    type: object
                    example:
                      message: 'Config history entry not found'
                      code: 'CONFIG_NOTES:CREATE:HISTORY_ENTRY_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config history entry not found'
                      code:
                        type: string
                        example: 'CONFIG_NOTES:CREATE:HISTORY_ENTRY_NOT_FOUND'
      tags:
        - 'Config Notes'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                note:
                  type: string
                  description: 'Note text.'
                  example: 'Dolores eveniet et animi ut quis.'
                type:
                  type: string
                  description: 'Type of the note. Default: public.'
                  example: public
                  enum:
                    - public
                    - private
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: configId
        description: 'Config history entry ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/config/{configId}/notes/{noteId}':
    get:
      summary: 'Get config entry note'
      operationId: getConfigEntryNote
      description: 'Returns single config history entry note in response.'
      parameters:
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  config_history_id: 9
                  user_id: 80
                  note: 'Modi cupiditate quisquam rerum beatae.'
                  type: public
                  created_at: '2026-01-12T16:47:49.000000Z'
                  updated_at: '2026-01-12T16:47:49.000000Z'
                  author:
                    id: 80
                    mrn: NPRVG3WV1768236469
                    name: 'Dr. Dexter Will III'
                    email: 1768236469witting.annabelle@example.net
                    language: en
                    phone: 907-210-6208
                    phone_country: OM
                    phone_verified_at: null
                    address1: '93992 Maurice Village Apt. 040'
                    address2: 'Starkborough, DE 32502'
                    postal_code: 31018-3825
                    city: 'Hansen PLC'
                    clinic_name: 'West Phoebefurt'
                    clinic_location: "456 Aufderhar Drives\nAlichester, OH 60486"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:49.000000Z'
                    updated_at: '2026-01-12T16:47:49.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                properties:
                  id:
                    type: integer
                    example: 3
                  config_history_id:
                    type: integer
                    example: 9
                  user_id:
                    type: integer
                    example: 80
                  note:
                    type: string
                    example: 'Modi cupiditate quisquam rerum beatae.'
                  type:
                    type: string
                    example: public
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:49.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:49.000000Z'
                  author:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 80
                      mrn:
                        type: string
                        example: NPRVG3WV1768236469
                      name:
                        type: string
                        example: 'Dr. Dexter Will III'
                      email:
                        type: string
                        example: 1768236469witting.annabelle@example.net
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 907-210-6208
                      phone_country:
                        type: string
                        example: OM
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '93992 Maurice Village Apt. 040'
                      address2:
                        type: string
                        example: 'Starkborough, DE 32502'
                      postal_code:
                        type: string
                        example: 31018-3825
                      city:
                        type: string
                        example: 'Hansen PLC'
                      clinic_name:
                        type: string
                        example: 'West Phoebefurt'
                      clinic_location:
                        type: string
                        example: "456 Aufderhar Drives\nAlichester, OH 60486"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:49.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:49.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to access config notes'
                  code: 'CONFIG_NOTES:GET_ENTRY:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to access config notes'
                  code:
                    type: string
                    example: 'CONFIG_NOTES:GET_ENTRY:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG_NOTES:GET_ENTRY:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG_NOTES:GET_ENTRY:DEVICE_NOT_FOUND'
                  -
                    description: 'Config history entry not found'
                    type: object
                    example:
                      message: 'Config history entry not found'
                      code: 'CONFIG_NOTES:GET_ENTRY:HISTORY_ENTRY_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config history entry not found'
                      code:
                        type: string
                        example: 'CONFIG_NOTES:GET_ENTRY:HISTORY_ENTRY_NOT_FOUND'
                  -
                    description: 'Config history note not found'
                    type: object
                    example:
                      message: 'Config history note not found'
                      code: 'CONFIG_NOTES:GET_ENTRY:HISTORY_NOTE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config history note not found'
                      code:
                        type: string
                        example: 'CONFIG_NOTES:GET_ENTRY:HISTORY_NOTE_NOT_FOUND'
      tags:
        - 'Config Notes'
    delete:
      summary: 'Delete config note'
      operationId: deleteConfigNote
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Config history note deleted'
                  code: 'CONFIG_NOTES:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Config history note deleted'
                  code:
                    type: string
                    example: 'CONFIG_NOTES:DELETE:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to delete config notes'
                  code: 'CONFIG_NOTES:DELETE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to delete config notes'
                  code:
                    type: string
                    example: 'CONFIG_NOTES:DELETE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CONFIG_NOTES:DELETE:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CONFIG_NOTES:DELETE:DEVICE_NOT_FOUND'
                  -
                    description: 'Config history entry not found'
                    type: object
                    example:
                      message: 'Config history entry not found'
                      code: 'CONFIG_NOTES:DELETE:HISTORY_ENTRY_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config history entry not found'
                      code:
                        type: string
                        example: 'CONFIG_NOTES:DELETE:HISTORY_ENTRY_NOT_FOUND'
                  -
                    description: 'Config history note not found'
                    type: object
                    example:
                      message: 'Config history note not found'
                      code: 'CONFIG_NOTES:DELETE:HISTORY_NOTE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config history note not found'
                      code:
                        type: string
                        example: 'CONFIG_NOTES:DELETE:HISTORY_NOTE_NOT_FOUND'
      tags:
        - 'Config Notes'
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: configId
        description: 'Config history entry ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: noteId
        description: 'Device config entry note ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/versions/firmware/{firmwareId}/schema':
    get:
      summary: 'Get config schema'
      operationId: getConfigSchema
      description: 'Returns list of config schema entries for given firmware version.'
      parameters:
        -
          in: query
          name: filter
          description: 'Filter entries by type (available: <code>common</code>, <code>modes</code>). By default all entries all returned.'
          example: modes
          required: false
          schema:
            type: string
            description: 'Filter entries by type (available: <code>common</code>, <code>modes</code>). By default all entries all returned.'
            example: modes
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 1
                    firmware_id:
                      type: integer
                      example: 7
                    key:
                      type: string
                      example: laudantium
                    is_common:
                      type: integer
                      example: 1
                    created_at:
                      type: string
                      example: '2026-01-12T16:48:04.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:48:04.000000Z'
                example:
                  -
                    id: 1
                    firmware_id: 7
                    key: laudantium
                    is_common: 1
                    created_at: '2026-01-12T16:48:04.000000Z'
                    updated_at: '2026-01-12T16:48:04.000000Z'
                  -
                    id: 2
                    firmware_id: 9
                    key: est
                    is_common: 0
                    created_at: '2026-01-12T16:48:04.000000Z'
                    updated_at: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view config schema'
                  code: 'CONFIG_SCHEMA:GET:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view config schema'
                  code:
                    type: string
                    example: 'CONFIG_SCHEMA:GET:INSUFFICIENT_PERMISSION'
        404:
          description: 'Firmware version not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Firmware version not found'
                  code: 'CONFIG_SCHEMA:GET:FIRMWARE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Firmware version not found'
                  code:
                    type: string
                    example: 'CONFIG_SCHEMA:GET:FIRMWARE_NOT_FOUND'
      tags:
        - 'Config Schema'
    post:
      summary: 'Add config schema'
      operationId: addConfigSchema
      description: "Add one or many config schema entries. Each entry is one key in config.\n\t\tBody of this request is simple array of objects:\n\t\t<pre style=\"float: none; padding: 0;\"><code class=\"language-json hljs\" style=\"padding: 0;\">\n\t\t\t[\n\t\t\t\t{\"key\": \"key_name\", \"is_common\": 1},\n\t\t\t\t{\"key\": \"another_name\", \"is_common\": 0},\n\t\t\t\t...\n\t\t\t]\n\t\t</code></pre>"
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 3
                    firmware_id:
                      type: integer
                      example: 11
                    key:
                      type: string
                      example: id
                    is_common:
                      type: integer
                      example: 0
                    created_at:
                      type: string
                      example: '2026-01-12T16:48:04.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:48:04.000000Z'
                example:
                  -
                    id: 3
                    firmware_id: 11
                    key: id
                    is_common: 0
                    created_at: '2026-01-12T16:48:04.000000Z'
                    updated_at: '2026-01-12T16:48:04.000000Z'
                  -
                    id: 4
                    firmware_id: 13
                    key: et
                    is_common: 1
                    created_at: '2026-01-12T16:48:04.000000Z'
                    updated_at: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage config schema'
                  code: 'CONFIG_SCHEMA:ADD:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage config schema'
                  code:
                    type: string
                    example: 'CONFIG_SCHEMA:ADD:INSUFFICIENT_PERMISSION'
        404:
          description: 'Firmware version not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Firmware version not found'
                  code: 'CONFIG_SCHEMA:ADD:FIRMWARE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Firmware version not found'
                  code:
                    type: string
                    example: 'CONFIG_SCHEMA:ADD:FIRMWARE_NOT_FOUND'
      tags:
        - 'Config Schema'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              description: ''
              example:
                -
                  key: gripsPosition.0.initial
                  is_common: 1
              items:
                type: object
                properties:
                  key:
                    type: string
                    description: 'Config key.'
                    example: gripsPosition.0.initial
                  is_common:
                    type: integer
                    description: 'Information if the key belongs to common config (1) or to modes (0). Default: 1.'
                    example: 1
    parameters:
      -
        in: path
        name: firmwareId
        description: 'Firmware version ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/versions/firmware/{firmwareId}/schema/{schemaId}':
    delete:
      summary: 'Delete config schema'
      operationId: deleteConfigSchema
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Config schema entry deleted'
                  code: 'CONFIG_SCHEMA:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Config schema entry deleted'
                  code:
                    type: string
                    example: 'CONFIG_SCHEMA:DELETE:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage config schema'
                  code: 'CONFIG_SCHEMA:DELETE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage config schema'
                  code:
                    type: string
                    example: 'CONFIG_SCHEMA:DELETE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Firmware version not found'
                    type: object
                    example:
                      message: 'Firmware version not found'
                      code: 'CONFIG_SCHEMA:DELETE:FIRMWARE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Firmware version not found'
                      code:
                        type: string
                        example: 'CONFIG_SCHEMA:DELETE:FIRMWARE_NOT_FOUND'
                  -
                    description: 'Config schema entry not found'
                    type: object
                    example:
                      message: 'Config schema entry not found'
                      code: 'CONFIG_SCHEMA:DELETE:SCHEMA_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config schema entry not found'
                      code:
                        type: string
                        example: 'CONFIG_SCHEMA:DELETE:SCHEMA_NOT_FOUND'
      tags:
        - 'Config Schema'
    parameters:
      -
        in: path
        name: firmwareId
        description: 'Firmware version ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: schemaId
        description: 'Config schema ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/config/templates:
    get:
      summary: 'Get config templates list'
      operationId: getConfigTemplatesList
      description: "Entries where author is present are private and owned by its author.\n\t\tEntries where author is null should be considered as global templates prepared by Aether team."
      parameters:
        -
          in: query
          name: search
          description: 'Filter config templates by name.'
          example: sport
          required: false
          schema:
            type: string
            description: 'Filter config templates by name.'
            example: sport
        -
          in: query
          name: author
          description: '<strong>Super Admin only:</strong> Filter config templates by author.'
          example: 1
          required: false
          schema:
            type: integer
            description: '<strong>Super Admin only:</strong> Filter config templates by author.'
            example: 1
        -
          in: query
          name: scope
          description: "<strong>ClinicAdmin/Clinician/ClinicianSupport only:</strong> Filter config templates by scope.\n\t\tThe value must be one of:\n\t\t<ul>\n\t\t\t<li><code>me</code> (entries where current user is author),</li>\n\t\t\t<li><code>global</code> (entries added by Aether).</li>\n\t\t</ul>"
          example: me
          required: false
          schema:
            type: string
            description: "<strong>ClinicAdmin/Clinician/ClinicianSupport only:</strong> Filter config templates by scope.\n\t\tThe value must be one of:\n\t\t<ul>\n\t\t\t<li><code>me</code> (entries where current user is author),</li>\n\t\t\t<li><code>global</code> (entries added by Aether).</li>\n\t\t</ul>"
            example: me
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      name: 'Quidem alias doloribus enim ea.'
                      description: 'Officia ea consequuntur excepturi velit aspernatur commodi animi architecto.'
                      author_id: 96
                      company_id: null
                      config: '{"autoGrasp":[1,0],"coContractionTimings":[500,400],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[60,50,50,60,100,0,90,80,0,100],"gripPairsConfig":[10,2,9,1,13,11,4,6],"gripSequentialConfig":[10,13,3,255,6,5,2,9,4,7,255,8],"gripSwitchingMode":[3],"holdOpen":[1500,2500],"pulseTimings":[970,600,630,380],"softGrip":[0],"speedControlStrategy":[0]}'
                      created_at: '2026-01-12T16:47:50.000000Z'
                      updated_at: '2026-01-12T16:47:50.000000Z'
                      author:
                        id: 96
                        mrn: NBB3067H1768236470
                        name: 'Makayla Lueilwitz'
                        email: 1768236470dare.thomas@example.com
                        language: en
                        phone: 351-358-0206
                        phone_country: SN
                        phone_verified_at: null
                        address1: '3690 Powlowski Knoll'
                        address2: 'Johannahaven, MT 55682-6637'
                        postal_code: 16033-3381
                        city: 'Kihn PLC'
                        clinic_name: 'Port Milton'
                        clinic_location: "7539 Coby Station Suite 417\nNorth John, NJ 32442-0087"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:50.000000Z'
                        updated_at: '2026-01-12T16:47:50.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                    -
                      id: 2
                      name: 'Maiores fugit neque eos dolorem qui quam sint quam.'
                      description: 'Possimus quam dolorum perferendis saepe quia delectus.'
                      author_id: 97
                      company_id: null
                      config: '{"autoGrasp":[0,100],"coContractionTimings":[300,100],"controlMode":[0],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[40,100,100,10,90,70,10,40,50,30],"gripPairsConfig":[9,3,10,11,7,5,1,8],"gripSequentialConfig":[255,255,255,10,255,5,255,255,13,255,8,255],"gripSwitchingMode":[1],"holdOpen":[1500,2000],"pulseTimings":[20,660,530,350],"softGrip":[0],"speedControlStrategy":[1]}'
                      created_at: '2026-01-12T16:47:50.000000Z'
                      updated_at: '2026-01-12T16:47:50.000000Z'
                      author:
                        id: 97
                        mrn: 9EQQTMCH1768236470
                        name: 'Mr. Erich Gislason'
                        email: 1768236470lamar.rath@example.org
                        language: en
                        phone: 425.751.1870
                        phone_country: LB
                        phone_verified_at: null
                        address1: '1347 Elaina Cliff'
                        address2: 'Hammesshire, VT 29249'
                        postal_code: 55209-9918
                        city: 'Turcotte, Reichel and Durgan'
                        clinic_name: 'West Dandre'
                        clinic_location: "15770 Morgan Bypass Apt. 819\nStiedemannshire, GA 36170"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:50.000000Z'
                        updated_at: '2026-01-12T16:47:50.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        name: 'Quidem alias doloribus enim ea.'
                        description: 'Officia ea consequuntur excepturi velit aspernatur commodi animi architecto.'
                        author_id: 96
                        company_id: null
                        config: '{"autoGrasp":[1,0],"coContractionTimings":[500,400],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[60,50,50,60,100,0,90,80,0,100],"gripPairsConfig":[10,2,9,1,13,11,4,6],"gripSequentialConfig":[10,13,3,255,6,5,2,9,4,7,255,8],"gripSwitchingMode":[3],"holdOpen":[1500,2500],"pulseTimings":[970,600,630,380],"softGrip":[0],"speedControlStrategy":[0]}'
                        created_at: '2026-01-12T16:47:50.000000Z'
                        updated_at: '2026-01-12T16:47:50.000000Z'
                        author:
                          id: 96
                          mrn: NBB3067H1768236470
                          name: 'Makayla Lueilwitz'
                          email: 1768236470dare.thomas@example.com
                          language: en
                          phone: 351-358-0206
                          phone_country: SN
                          phone_verified_at: null
                          address1: '3690 Powlowski Knoll'
                          address2: 'Johannahaven, MT 55682-6637'
                          postal_code: 16033-3381
                          city: 'Kihn PLC'
                          clinic_name: 'Port Milton'
                          clinic_location: "7539 Coby Station Suite 417\nNorth John, NJ 32442-0087"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:50.000000Z'
                          updated_at: '2026-01-12T16:47:50.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                      -
                        id: 2
                        name: 'Maiores fugit neque eos dolorem qui quam sint quam.'
                        description: 'Possimus quam dolorum perferendis saepe quia delectus.'
                        author_id: 97
                        company_id: null
                        config: '{"autoGrasp":[0,100],"coContractionTimings":[300,100],"controlMode":[0],"emgGains":[100,100],"emgSpike":[1,300],"emgThresholds":[40,100,100,10,90,70,10,40,50,30],"gripPairsConfig":[9,3,10,11,7,5,1,8],"gripSequentialConfig":[255,255,255,10,255,5,255,255,13,255,8,255],"gripSwitchingMode":[1],"holdOpen":[1500,2000],"pulseTimings":[20,660,530,350],"softGrip":[0],"speedControlStrategy":[1]}'
                        created_at: '2026-01-12T16:47:50.000000Z'
                        updated_at: '2026-01-12T16:47:50.000000Z'
                        author:
                          id: 97
                          mrn: 9EQQTMCH1768236470
                          name: 'Mr. Erich Gislason'
                          email: 1768236470lamar.rath@example.org
                          language: en
                          phone: 425.751.1870
                          phone_country: LB
                          phone_verified_at: null
                          address1: '1347 Elaina Cliff'
                          address2: 'Hammesshire, VT 29249'
                          postal_code: 55209-9918
                          city: 'Turcotte, Reichel and Durgan'
                          clinic_name: 'West Dandre'
                          clinic_location: "15770 Morgan Bypass Apt. 819\nStiedemannshire, GA 36170"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:50.000000Z'
                          updated_at: '2026-01-12T16:47:50.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'Quidem alias doloribus enim ea.'
                        description:
                          type: string
                          example: 'Officia ea consequuntur excepturi velit aspernatur commodi animi architecto.'
                        author_id:
                          type: integer
                          example: 96
                        company_id:
                          type: string
                          example: null
                        config:
                          type: string
                          example: '{"autoGrasp":[1,0],"coContractionTimings":[500,400],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[60,50,50,60,100,0,90,80,0,100],"gripPairsConfig":[10,2,9,1,13,11,4,6],"gripSequentialConfig":[10,13,3,255,6,5,2,9,4,7,255,8],"gripSwitchingMode":[3],"holdOpen":[1500,2500],"pulseTimings":[970,600,630,380],"softGrip":[0],"speedControlStrategy":[0]}'
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:50.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:50.000000Z'
                        author:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 96
                            mrn:
                              type: string
                              example: NBB3067H1768236470
                            name:
                              type: string
                              example: 'Makayla Lueilwitz'
                            email:
                              type: string
                              example: 1768236470dare.thomas@example.com
                            language:
                              type: string
                              example: en
                            phone:
                              type: string
                              example: 351-358-0206
                            phone_country:
                              type: string
                              example: SN
                            phone_verified_at:
                              type: string
                              example: null
                            address1:
                              type: string
                              example: '3690 Powlowski Knoll'
                            address2:
                              type: string
                              example: 'Johannahaven, MT 55682-6637'
                            postal_code:
                              type: string
                              example: 16033-3381
                            city:
                              type: string
                              example: 'Kihn PLC'
                            clinic_name:
                              type: string
                              example: 'Port Milton'
                            clinic_location:
                              type: string
                              example: "7539 Coby Station Suite 417\nNorth John, NJ 32442-0087"
                            image:
                              type: string
                              example: null
                            mfa_enabled:
                              type: integer
                              example: 0
                            mfa_method:
                              type: string
                              example: null
                            mfa_verified_to:
                              type: string
                              example: null
                            location_id:
                              type: string
                              example: null
                            created_by:
                              type: string
                              example: null
                            active:
                              type: integer
                              example: 1
                            notifications_timezone:
                              type: string
                              example: null
                            notifications_at:
                              type: string
                              example: null
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:50.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:50.000000Z'
                            invitation_status:
                              type: string
                              example: null
                            acadle_invitation_status:
                              type: string
                              example: null
                            roles:
                              type: array
                              example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list config templates'
                  code: 'CONFIG_TEMPLATES:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list config templates'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATES:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - 'Config Templates'
    post:
      summary: 'Create new config template'
      operationId: createNewConfigTemplate
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  name: 'Placeat recusandae iure eos quasi non.'
                  description: 'Ipsum repudiandae laudantium laborum expedita et.'
                  author_id: 99
                  company_id: null
                  config: '{"autoGrasp":[0,100],"coContractionTimings":[200,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[40,70,10,20,100,10,50,70,20,60],"gripPairsConfig":[7,3,12,9,4,5,13,2],"gripSequentialConfig":[2,255,7,255,8,10,255,12,9,255,255,255],"gripSwitchingMode":[2],"holdOpen":[2000,2500],"pulseTimings":[490,490,240,10],"softGrip":[0],"speedControlStrategy":[0]}'
                  created_at: '2026-01-12T16:47:50.000000Z'
                  updated_at: '2026-01-12T16:47:50.000000Z'
                  author:
                    id: 99
                    mrn: XHIZ5RWN1768236470
                    name: 'Rachel Klein'
                    email: 1768236470hilario.bins@example.com
                    language: en
                    phone: 801.914.9065
                    phone_country: OM
                    phone_verified_at: null
                    address1: '52246 Feeney Mountains'
                    address2: 'West Dalehaven, KY 79485-3652'
                    postal_code: '44594'
                    city: Zemlak-Moore
                    clinic_name: 'South Arnulfo'
                    clinic_location: "55223 Sarai Alley\nBednarbury, LA 25309-1218"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:50.000000Z'
                    updated_at: '2026-01-12T16:47:50.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                properties:
                  id:
                    type: integer
                    example: 4
                  name:
                    type: string
                    example: 'Placeat recusandae iure eos quasi non.'
                  description:
                    type: string
                    example: 'Ipsum repudiandae laudantium laborum expedita et.'
                  author_id:
                    type: integer
                    example: 99
                  company_id:
                    type: string
                    example: null
                  config:
                    type: string
                    example: '{"autoGrasp":[0,100],"coContractionTimings":[200,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[40,70,10,20,100,10,50,70,20,60],"gripPairsConfig":[7,3,12,9,4,5,13,2],"gripSequentialConfig":[2,255,7,255,8,10,255,12,9,255,255,255],"gripSwitchingMode":[2],"holdOpen":[2000,2500],"pulseTimings":[490,490,240,10],"softGrip":[0],"speedControlStrategy":[0]}'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:50.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:50.000000Z'
                  author:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 99
                      mrn:
                        type: string
                        example: XHIZ5RWN1768236470
                      name:
                        type: string
                        example: 'Rachel Klein'
                      email:
                        type: string
                        example: 1768236470hilario.bins@example.com
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 801.914.9065
                      phone_country:
                        type: string
                        example: OM
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '52246 Feeney Mountains'
                      address2:
                        type: string
                        example: 'West Dalehaven, KY 79485-3652'
                      postal_code:
                        type: string
                        example: '44594'
                      city:
                        type: string
                        example: Zemlak-Moore
                      clinic_name:
                        type: string
                        example: 'South Arnulfo'
                      clinic_location:
                        type: string
                        example: "55223 Sarai Alley\nBednarbury, LA 25309-1218"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:50.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:50.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to create config template'
                  code: 'CONFIG_TEMPLATES:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to create config template'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATES:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - 'Config Templates'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of the config template.'
                  example: 'Default config for Aether Zeus'
                description:
                  type: string
                  description: 'Description of the config template.'
                  example: 'Description of the config template.'
                owner:
                  type: string
                  description: 'Mark config template owned by clinician or company. Default: <code>me</code> (clinician).'
                  example: company
                  enum:
                    - me
                    - company
                author:
                  type: string
                  description: '<strong>Super Admin only:</strong> User ID to be the author of template. The <code>id</code> of an existing record in the App\Models\User table.'
                  example: 1
                  nullable: true
                config:
                  type: string
                  description: 'Full config. MUST_BE_JSON.'
                  example: '{"param_1": [100, 200], "param_2": [100, 200, 300]}'
              required:
                - name
                - config
  '/api/config/templates/{id}':
    get:
      summary: 'Get config template'
      operationId: getConfigTemplate
      description: ''
      parameters:
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  name: 'Libero incidunt quod officia temporibus rerum officiis et.'
                  description: 'Enim perferendis pariatur tempora nemo adipisci totam fugiat adipisci.'
                  author_id: 98
                  company_id: null
                  config: '{"autoGrasp":[0,0],"coContractionTimings":[500,200],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[60,90,60,60,70,60,10,20,80,70],"gripPairsConfig":[13,4,9,12,1,8,6,2],"gripSequentialConfig":[1,6,3,10,255,12,8,255,4,13,11,7],"gripSwitchingMode":[1],"holdOpen":[1500,2000],"pulseTimings":[360,830,830,280],"softGrip":[0],"speedControlStrategy":[1]}'
                  created_at: '2026-01-12T16:47:50.000000Z'
                  updated_at: '2026-01-12T16:47:50.000000Z'
                  author:
                    id: 98
                    mrn: ZV0AA7FI1768236470
                    name: 'Dr. Amber Lind DVM'
                    email: 1768236470soledad79@example.net
                    language: en
                    phone: 860-297-0666
                    phone_country: GM
                    phone_verified_at: null
                    address1: '36629 Chloe Coves Apt. 880'
                    address2: 'Rutheborough, LA 06915'
                    postal_code: '23051'
                    city: Beier-Weber
                    clinic_name: 'New Letitia'
                    clinic_location: "4208 Gutmann Knoll Suite 735\nNorth Destiny, ND 66048"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:50.000000Z'
                    updated_at: '2026-01-12T16:47:50.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                properties:
                  id:
                    type: integer
                    example: 3
                  name:
                    type: string
                    example: 'Libero incidunt quod officia temporibus rerum officiis et.'
                  description:
                    type: string
                    example: 'Enim perferendis pariatur tempora nemo adipisci totam fugiat adipisci.'
                  author_id:
                    type: integer
                    example: 98
                  company_id:
                    type: string
                    example: null
                  config:
                    type: string
                    example: '{"autoGrasp":[0,0],"coContractionTimings":[500,200],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[60,90,60,60,70,60,10,20,80,70],"gripPairsConfig":[13,4,9,12,1,8,6,2],"gripSequentialConfig":[1,6,3,10,255,12,8,255,4,13,11,7],"gripSwitchingMode":[1],"holdOpen":[1500,2000],"pulseTimings":[360,830,830,280],"softGrip":[0],"speedControlStrategy":[1]}'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:50.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:50.000000Z'
                  author:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 98
                      mrn:
                        type: string
                        example: ZV0AA7FI1768236470
                      name:
                        type: string
                        example: 'Dr. Amber Lind DVM'
                      email:
                        type: string
                        example: 1768236470soledad79@example.net
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 860-297-0666
                      phone_country:
                        type: string
                        example: GM
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '36629 Chloe Coves Apt. 880'
                      address2:
                        type: string
                        example: 'Rutheborough, LA 06915'
                      postal_code:
                        type: string
                        example: '23051'
                      city:
                        type: string
                        example: Beier-Weber
                      clinic_name:
                        type: string
                        example: 'New Letitia'
                      clinic_location:
                        type: string
                        example: "4208 Gutmann Knoll Suite 735\nNorth Destiny, ND 66048"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:50.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:50.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view config template'
                  code: 'CONFIG_TEMPLATES:GET:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view config template'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATES:GET:INSUFFICIENT_PERMISSION'
        404:
          description: 'Config template not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Config template not found'
                  code: 'CONFIG_TEMPLATES:GET:TEMPLATE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Config template not found'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATES:GET:TEMPLATE_NOT_FOUND'
      tags:
        - 'Config Templates'
    put:
      summary: 'Update config template'
      operationId: updateConfigTemplate
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 5
                  name: 'Quo omnis sint neque.'
                  description: 'Aut quas ullam id id est.'
                  author_id: 100
                  company_id: null
                  config: '{"autoGrasp":[1,0],"coContractionTimings":[400,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[20,70,60,20,10,30,10,0,10,20],"gripPairsConfig":[5,13,8,11,4,10,1,6],"gripSequentialConfig":[255,255,255,12,255,255,5,6,7,255,255,9],"gripSwitchingMode":[3],"holdOpen":[2500,2500],"pulseTimings":[570,110,820,480],"softGrip":[0],"speedControlStrategy":[0]}'
                  created_at: '2026-01-12T16:47:50.000000Z'
                  updated_at: '2026-01-12T16:47:50.000000Z'
                  author:
                    id: 100
                    mrn: RC02Y9FZ1768236470
                    name: 'Breana Volkman'
                    email: 1768236470andreanne91@example.com
                    language: en
                    phone: '+1 (475) 685-1187'
                    phone_country: SN
                    phone_verified_at: null
                    address1: '64113 Noe Estates Apt. 667'
                    address2: 'Lake Reilly, HI 42798-2647'
                    postal_code: '34423'
                    city: 'Aufderhar, Gutkowski and Rutherford'
                    clinic_name: 'East Carlie'
                    clinic_location: "875 Hoeger Mountains\nWest Serena, DE 14903-3347"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:50.000000Z'
                    updated_at: '2026-01-12T16:47:50.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                properties:
                  id:
                    type: integer
                    example: 5
                  name:
                    type: string
                    example: 'Quo omnis sint neque.'
                  description:
                    type: string
                    example: 'Aut quas ullam id id est.'
                  author_id:
                    type: integer
                    example: 100
                  company_id:
                    type: string
                    example: null
                  config:
                    type: string
                    example: '{"autoGrasp":[1,0],"coContractionTimings":[400,100],"controlMode":[1],"emgGains":[100,100],"emgSpike":[0,300],"emgThresholds":[20,70,60,20,10,30,10,0,10,20],"gripPairsConfig":[5,13,8,11,4,10,1,6],"gripSequentialConfig":[255,255,255,12,255,255,5,6,7,255,255,9],"gripSwitchingMode":[3],"holdOpen":[2500,2500],"pulseTimings":[570,110,820,480],"softGrip":[0],"speedControlStrategy":[0]}'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:50.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:50.000000Z'
                  author:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 100
                      mrn:
                        type: string
                        example: RC02Y9FZ1768236470
                      name:
                        type: string
                        example: 'Breana Volkman'
                      email:
                        type: string
                        example: 1768236470andreanne91@example.com
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: '+1 (475) 685-1187'
                      phone_country:
                        type: string
                        example: SN
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '64113 Noe Estates Apt. 667'
                      address2:
                        type: string
                        example: 'Lake Reilly, HI 42798-2647'
                      postal_code:
                        type: string
                        example: '34423'
                      city:
                        type: string
                        example: 'Aufderhar, Gutkowski and Rutherford'
                      clinic_name:
                        type: string
                        example: 'East Carlie'
                      clinic_location:
                        type: string
                        example: "875 Hoeger Mountains\nWest Serena, DE 14903-3347"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:50.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:50.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update config template'
                  code: 'CONFIG_TEMPLATES:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update config template'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATES:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Config template not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Config template not found'
                  code: 'CONFIG_TEMPLATES:UPDATE:TEMPLATE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Config template not found'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATES:UPDATE:TEMPLATE_NOT_FOUND'
      tags:
        - 'Config Templates'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of the config template.'
                  example: 'Default config for Aether Zeus'
                description:
                  type: string
                  description: 'Description of the config template.'
                  example: 'Description of the config template.'
                owner:
                  type: string
                  description: 'Mark config template owned by clinician or company. Default: <code>me</code> (clinician).'
                  example: company
                  enum:
                    - me
                    - company
                author:
                  type: string
                  description: '<strong>Super Admin only:</strong> User ID to be the author of template. The <code>id</code> of an existing record in the App\Models\User table.'
                  example: 1
                  nullable: true
                config:
                  type: string
                  description: 'Full config. MUST_BE_JSON.'
                  example: '{"param_1": [100, 200], "param_2": [100, 200, 300]}'
    delete:
      summary: 'Delete config template'
      operationId: deleteConfigTemplate
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Config template deleted'
                  code: 'CONFIG_TEMPLATES:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Config template deleted'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATES:DELETE:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to delete config template'
                  code: 'CONFIG_TEMPLATES:DELETE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to delete config template'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATES:DELETE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Config template not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Config template not found'
                  code: 'CONFIG_TEMPLATES:DELETE:TEMPLATE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Config template not found'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATES:DELETE:TEMPLATE_NOT_FOUND'
      tags:
        - 'Config Templates'
    parameters:
      -
        in: path
        name: id
        description: 'Config template ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/config/templates/{id}/notes':
    get:
      summary: 'Get config templates notes list'
      operationId: getConfigTemplatesNotesList
      description: ''
      parameters:
        -
          in: query
          name: user
          description: 'Filter notes by user.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Filter notes by user.'
            example: 1
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      template_id: 6
                      user_id: 101
                      note: 'Voluptatum saepe et et voluptas.'
                      created_at: '2026-01-12T16:47:51.000000Z'
                      updated_at: '2026-01-12T16:47:51.000000Z'
                      author:
                        id: 101
                        mrn: 5H7OGJGZ1768236470
                        name: 'Rudy Hagenes'
                        email: 1768236470myriam77@example.org
                        language: en
                        phone: '+18487488043'
                        phone_country: NU
                        phone_verified_at: null
                        address1: '299 Tessie Field'
                        address2: 'East Chasehaven, RI 90747-5897'
                        postal_code: '96068'
                        city: Lubowitz-Lebsack
                        clinic_name: Hillfurt
                        clinic_location: "79165 Schultz Viaduct\nNew Aliyah, AL 93383"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:51.000000Z'
                        updated_at: '2026-01-12T16:47:51.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                    -
                      id: 2
                      template_id: 7
                      user_id: 102
                      note: 'Delectus sint quia laborum pariatur doloremque quis optio.'
                      created_at: '2026-01-12T16:47:51.000000Z'
                      updated_at: '2026-01-12T16:47:51.000000Z'
                      author:
                        id: 102
                        mrn: XJ8FB9CG1768236471
                        name: 'Connie Ruecker MD'
                        email: 1768236471bosco.iliana@example.net
                        language: en
                        phone: '(956) 549-5564'
                        phone_country: MQ
                        phone_verified_at: null
                        address1: '49325 Ferry Highway Suite 748'
                        address2: 'South Emmetburgh, SD 94375-3506'
                        postal_code: 09432-0715
                        city: 'Stiedemann, Padberg and Monahan'
                        clinic_name: Jaskolskimouth
                        clinic_location: "96610 Beahan Light Suite 729\nSouth Isabellberg, CA 43459-1678"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:51.000000Z'
                        updated_at: '2026-01-12T16:47:51.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        template_id: 6
                        user_id: 101
                        note: 'Voluptatum saepe et et voluptas.'
                        created_at: '2026-01-12T16:47:51.000000Z'
                        updated_at: '2026-01-12T16:47:51.000000Z'
                        author:
                          id: 101
                          mrn: 5H7OGJGZ1768236470
                          name: 'Rudy Hagenes'
                          email: 1768236470myriam77@example.org
                          language: en
                          phone: '+18487488043'
                          phone_country: NU
                          phone_verified_at: null
                          address1: '299 Tessie Field'
                          address2: 'East Chasehaven, RI 90747-5897'
                          postal_code: '96068'
                          city: Lubowitz-Lebsack
                          clinic_name: Hillfurt
                          clinic_location: "79165 Schultz Viaduct\nNew Aliyah, AL 93383"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:51.000000Z'
                          updated_at: '2026-01-12T16:47:51.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                      -
                        id: 2
                        template_id: 7
                        user_id: 102
                        note: 'Delectus sint quia laborum pariatur doloremque quis optio.'
                        created_at: '2026-01-12T16:47:51.000000Z'
                        updated_at: '2026-01-12T16:47:51.000000Z'
                        author:
                          id: 102
                          mrn: XJ8FB9CG1768236471
                          name: 'Connie Ruecker MD'
                          email: 1768236471bosco.iliana@example.net
                          language: en
                          phone: '(956) 549-5564'
                          phone_country: MQ
                          phone_verified_at: null
                          address1: '49325 Ferry Highway Suite 748'
                          address2: 'South Emmetburgh, SD 94375-3506'
                          postal_code: 09432-0715
                          city: 'Stiedemann, Padberg and Monahan'
                          clinic_name: Jaskolskimouth
                          clinic_location: "96610 Beahan Light Suite 729\nSouth Isabellberg, CA 43459-1678"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:51.000000Z'
                          updated_at: '2026-01-12T16:47:51.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        template_id:
                          type: integer
                          example: 6
                        user_id:
                          type: integer
                          example: 101
                        note:
                          type: string
                          example: 'Voluptatum saepe et et voluptas.'
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:51.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:51.000000Z'
                        author:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 101
                            mrn:
                              type: string
                              example: 5H7OGJGZ1768236470
                            name:
                              type: string
                              example: 'Rudy Hagenes'
                            email:
                              type: string
                              example: 1768236470myriam77@example.org
                            language:
                              type: string
                              example: en
                            phone:
                              type: string
                              example: '+18487488043'
                            phone_country:
                              type: string
                              example: NU
                            phone_verified_at:
                              type: string
                              example: null
                            address1:
                              type: string
                              example: '299 Tessie Field'
                            address2:
                              type: string
                              example: 'East Chasehaven, RI 90747-5897'
                            postal_code:
                              type: string
                              example: '96068'
                            city:
                              type: string
                              example: Lubowitz-Lebsack
                            clinic_name:
                              type: string
                              example: Hillfurt
                            clinic_location:
                              type: string
                              example: "79165 Schultz Viaduct\nNew Aliyah, AL 93383"
                            image:
                              type: string
                              example: null
                            mfa_enabled:
                              type: integer
                              example: 0
                            mfa_method:
                              type: string
                              example: null
                            mfa_verified_to:
                              type: string
                              example: null
                            location_id:
                              type: string
                              example: null
                            created_by:
                              type: string
                              example: null
                            active:
                              type: integer
                              example: 1
                            notifications_timezone:
                              type: string
                              example: null
                            notifications_at:
                              type: string
                              example: null
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:51.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:51.000000Z'
                            invitation_status:
                              type: string
                              example: null
                            acadle_invitation_status:
                              type: string
                              example: null
                            roles:
                              type: array
                              example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to access config templates notes'
                  code: 'CONFIG_TEMPLATE_NOTES:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to access config templates notes'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATE_NOTES:LIST:INSUFFICIENT_PERMISSION'
        404:
          description: 'Config template not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Config template not found'
                  code: 'CONFIG_TEMPLATE_NOTES:LIST:TEMPLATE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Config template not found'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATE_NOTES:LIST:TEMPLATE_NOT_FOUND'
      tags:
        - 'Config Templates Notes'
    post:
      summary: 'Create new config template note'
      operationId: createNewConfigTemplateNote
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  template_id: 9
                  user_id: 104
                  note: 'Exercitationem ea et dolorem pariatur.'
                  created_at: '2026-01-12T16:47:51.000000Z'
                  updated_at: '2026-01-12T16:47:51.000000Z'
                  author:
                    id: 104
                    mrn: PRN67FKJ1768236471
                    name: 'Isai Marvin III'
                    email: 1768236471milan.kertzmann@example.net
                    language: en
                    phone: '(442) 221-9197'
                    phone_country: CF
                    phone_verified_at: null
                    address1: '978 Kobe Corners'
                    address2: 'Walkerville, WY 81106'
                    postal_code: '26030'
                    city: Stoltenberg-Davis
                    clinic_name: 'West Margarett'
                    clinic_location: "87991 Medhurst Shores Suite 747\nLake Ana, OR 56717-8688"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:51.000000Z'
                    updated_at: '2026-01-12T16:47:51.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                properties:
                  id:
                    type: integer
                    example: 4
                  template_id:
                    type: integer
                    example: 9
                  user_id:
                    type: integer
                    example: 104
                  note:
                    type: string
                    example: 'Exercitationem ea et dolorem pariatur.'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
                  author:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 104
                      mrn:
                        type: string
                        example: PRN67FKJ1768236471
                      name:
                        type: string
                        example: 'Isai Marvin III'
                      email:
                        type: string
                        example: 1768236471milan.kertzmann@example.net
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: '(442) 221-9197'
                      phone_country:
                        type: string
                        example: CF
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '978 Kobe Corners'
                      address2:
                        type: string
                        example: 'Walkerville, WY 81106'
                      postal_code:
                        type: string
                        example: '26030'
                      city:
                        type: string
                        example: Stoltenberg-Davis
                      clinic_name:
                        type: string
                        example: 'West Margarett'
                      clinic_location:
                        type: string
                        example: "87991 Medhurst Shores Suite 747\nLake Ana, OR 56717-8688"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:51.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:51.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to add config templates notes'
                  code: 'CONFIG_TEMPLATE_NOTES:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to add config templates notes'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATE_NOTES:CREATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Config template not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Config template not found'
                  code: 'CONFIG_TEMPLATE_NOTES:CREATE:TEMPLATE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Config template not found'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATE_NOTES:CREATE:TEMPLATE_NOT_FOUND'
      tags:
        - 'Config Templates Notes'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                note:
                  type: string
                  description: 'Note text.'
                  example: 'Voluptatem facilis rem qui ducimus debitis est a itaque.'
    parameters:
      -
        in: path
        name: id
        description: 'Config template ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/config/templates/{id}/notes/{noteId}':
    get:
      summary: 'Get config template note'
      operationId: getConfigTemplateNote
      description: 'Returns single config template note in response.'
      parameters:
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>author</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  template_id: 8
                  user_id: 103
                  note: 'Assumenda et vel est.'
                  created_at: '2026-01-12T16:47:51.000000Z'
                  updated_at: '2026-01-12T16:47:51.000000Z'
                  author:
                    id: 103
                    mrn: G6VKAC7T1768236471
                    name: 'Prof. Randall Dickens II'
                    email: 1768236471javon.bergstrom@example.org
                    language: en
                    phone: 706-428-8240
                    phone_country: LV
                    phone_verified_at: null
                    address1: '1991 Myriam Parkway'
                    address2: 'North Presleyton, AL 15213'
                    postal_code: '87895'
                    city: 'Greenfelder, Greenfelder and Zulauf'
                    clinic_name: 'East Scarlettchester'
                    clinic_location: "316 Weimann Ramp Apt. 783\nSouth Donnellborough, MN 92257"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:51.000000Z'
                    updated_at: '2026-01-12T16:47:51.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                properties:
                  id:
                    type: integer
                    example: 3
                  template_id:
                    type: integer
                    example: 8
                  user_id:
                    type: integer
                    example: 103
                  note:
                    type: string
                    example: 'Assumenda et vel est.'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:51.000000Z'
                  author:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 103
                      mrn:
                        type: string
                        example: G6VKAC7T1768236471
                      name:
                        type: string
                        example: 'Prof. Randall Dickens II'
                      email:
                        type: string
                        example: 1768236471javon.bergstrom@example.org
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 706-428-8240
                      phone_country:
                        type: string
                        example: LV
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '1991 Myriam Parkway'
                      address2:
                        type: string
                        example: 'North Presleyton, AL 15213'
                      postal_code:
                        type: string
                        example: '87895'
                      city:
                        type: string
                        example: 'Greenfelder, Greenfelder and Zulauf'
                      clinic_name:
                        type: string
                        example: 'East Scarlettchester'
                      clinic_location:
                        type: string
                        example: "316 Weimann Ramp Apt. 783\nSouth Donnellborough, MN 92257"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:51.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:51.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to access config templates notes'
                  code: 'CONFIG_TEMPLATE_NOTES:GET:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to access config templates notes'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATE_NOTES:GET:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Config template not found'
                    type: object
                    example:
                      message: 'Config template not found'
                      code: 'CONFIG_TEMPLATE_NOTES:GET:TEMPLATE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config template not found'
                      code:
                        type: string
                        example: 'CONFIG_TEMPLATE_NOTES:GET:TEMPLATE_NOT_FOUND'
                  -
                    description: 'Config template note not found'
                    type: object
                    example:
                      message: 'Config template note not found'
                      code: 'CONFIG_TEMPLATE_NOTES:GET:NOTE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config template note not found'
                      code:
                        type: string
                        example: 'CONFIG_TEMPLATE_NOTES:GET:NOTE_NOT_FOUND'
      tags:
        - 'Config Templates Notes'
    delete:
      summary: 'Delete config template note'
      operationId: deleteConfigTemplateNote
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Config template note deleted'
                  code: 'CONFIG_TEMPLATE_NOTES:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Config template note deleted'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATE_NOTES:DELETE:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to delete config templates notes'
                  code: 'CONFIG_TEMPLATE_NOTES:DELETE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to delete config templates notes'
                  code:
                    type: string
                    example: 'CONFIG_TEMPLATE_NOTES:DELETE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Config template not found'
                    type: object
                    example:
                      message: 'Config template not found'
                      code: 'CONFIG_TEMPLATE_NOTES:DELETE:TEMPLATE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config template not found'
                      code:
                        type: string
                        example: 'CONFIG_TEMPLATE_NOTES:DELETE:TEMPLATE_NOT_FOUND'
                  -
                    description: 'Config template note not found'
                    type: object
                    example:
                      message: 'Config template note not found'
                      code: 'CONFIG_TEMPLATE_NOTES:DELETE:NOTE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Config template note not found'
                      code:
                        type: string
                        example: 'CONFIG_TEMPLATE_NOTES:DELETE:NOTE_NOT_FOUND'
      tags:
        - 'Config Templates Notes'
    parameters:
      -
        in: path
        name: id
        description: 'Config template ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: noteId
        description: 'Config template note ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/custom-grips-templates:
    get:
      summary: 'List custom grips templates'
      operationId: listCustomGripsTemplates
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      user_id: 255
                      name: daugherty.vivien
                      initial_position: '[50, 50, 50, 50, 50]'
                      limit_position: '[900, 900, 900, 900, 900]'
                      active_fingers: '[0, 1, 1, 1, 1]'
                      created_at: '2026-01-12T16:48:04.000000Z'
                      updated_at: '2026-01-12T16:48:04.000000Z'
                    -
                      id: 2
                      user_id: 256
                      name: tess.frami
                      initial_position: '[50, 50, 50, 50, 50]'
                      limit_position: '[900, 900, 900, 900, 900]'
                      active_fingers: '[0, 1, 1, 1, 1]'
                      created_at: '2026-01-12T16:48:05.000000Z'
                      updated_at: '2026-01-12T16:48:05.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        user_id: 255
                        name: daugherty.vivien
                        initial_position: '[50, 50, 50, 50, 50]'
                        limit_position: '[900, 900, 900, 900, 900]'
                        active_fingers: '[0, 1, 1, 1, 1]'
                        created_at: '2026-01-12T16:48:04.000000Z'
                        updated_at: '2026-01-12T16:48:04.000000Z'
                      -
                        id: 2
                        user_id: 256
                        name: tess.frami
                        initial_position: '[50, 50, 50, 50, 50]'
                        limit_position: '[900, 900, 900, 900, 900]'
                        active_fingers: '[0, 1, 1, 1, 1]'
                        created_at: '2026-01-12T16:48:05.000000Z'
                        updated_at: '2026-01-12T16:48:05.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        user_id:
                          type: integer
                          example: 255
                        name:
                          type: string
                          example: daugherty.vivien
                        initial_position:
                          type: string
                          example: '[50, 50, 50, 50, 50]'
                        limit_position:
                          type: string
                          example: '[900, 900, 900, 900, 900]'
                        active_fingers:
                          type: string
                          example: '[0, 1, 1, 1, 1]'
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:04.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage custom grips templates'
                  code: 'CUSTOM_GRIPS_TEMPLATES:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage custom grips templates'
                  code:
                    type: string
                    example: 'CUSTOM_GRIPS_TEMPLATES:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - 'Custom Grips'
    post:
      summary: 'Create custom grip template'
      operationId: createCustomGripTemplate
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  user_id: 257
                  name: khackett
                  initial_position: '[50, 50, 50, 50, 50]'
                  limit_position: '[900, 900, 900, 900, 900]'
                  active_fingers: '[0, 1, 1, 1, 1]'
                  created_at: '2026-01-12T16:48:05.000000Z'
                  updated_at: '2026-01-12T16:48:05.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  user_id:
                    type: integer
                    example: 257
                  name:
                    type: string
                    example: khackett
                  initial_position:
                    type: string
                    example: '[50, 50, 50, 50, 50]'
                  limit_position:
                    type: string
                    example: '[900, 900, 900, 900, 900]'
                  active_fingers:
                    type: string
                    example: '[0, 1, 1, 1, 1]'
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage custom grips templates'
                      code: 'CUSTOM_GRIPS_TEMPLATES:CREATE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage custom grips templates'
                      code:
                        type: string
                        example: 'CUSTOM_GRIPS_TEMPLATES:CREATE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Custom grip template name in use'
                    type: object
                    example:
                      message: 'Custom grip template name already in use'
                      code: 'CUSTOM_GRIPS_TEMPLATES:CREATE:NAME_IN_USE'
                    properties:
                      message:
                        type: string
                        example: 'Custom grip template name already in use'
                      code:
                        type: string
                        example: 'CUSTOM_GRIPS_TEMPLATES:CREATE:NAME_IN_USE'
      tags:
        - 'Custom Grips'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of custom grip template.'
                  example: 'Custom Grip Template 1'
                initial_position:
                  type: string
                  description: 'Grip initial position. Value should be a string containing the array of values. Example: <code>"[50, 50, 50, 50, 50]"</code>. Must start with one of <code>[</code> Must end with one of <code>]</code>.'
                  example: '[50, 50, 50, 50, 50]'
                limit_position:
                  type: string
                  description: 'Grip limit position. Value should be a string containing the array of values. Example: <code>"[900, 900, 900, 900, 900]"</code>. Must start with one of <code>[</code> Must end with one of <code>]</code>.'
                  example: '[900, 900, 900, 900, 900]'
                active_fingers:
                  type: string
                  description: 'Grip active fingers. Value should be a string containing the array of values. Example: <code>"[0, 1, 1, 1, 1]"</code>. Must start with one of <code>[</code> Must end with one of <code>]</code>.'
                  example: '[0, 1, 1, 1, 1]'
              required:
                - name
                - initial_position
                - limit_position
                - active_fingers
  '/api/custom-grips-templates/{id}':
    delete:
      summary: 'Delete custom grip template'
      operationId: deleteCustomGripTemplate
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Custom grip deleted'
                  code: 'CUSTOM_GRIPS_TEMPLATES:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Custom grip deleted'
                  code:
                    type: string
                    example: 'CUSTOM_GRIPS_TEMPLATES:DELETE:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage custom grips templates'
                  code: 'CUSTOM_GRIPS_TEMPLATES:DELETE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage custom grips templates'
                  code:
                    type: string
                    example: 'CUSTOM_GRIPS_TEMPLATES:DELETE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Custom grip template not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Custom grip template not found'
                  code: 'CUSTOM_GRIPS_TEMPLATES:DELETE:TEMPLATE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Custom grip template not found'
                  code:
                    type: string
                    example: 'CUSTOM_GRIPS_TEMPLATES:DELETE:TEMPLATE_NOT_FOUND'
      tags:
        - 'Custom Grips'
    parameters:
      -
        in: path
        name: id
        description: 'Custom Grip Template ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/custom-grips':
    get:
      summary: 'List custom grips'
      operationId: listCustomGrips
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      device_id: 130
                      name: kgutkowski
                      opposed: 1
                      grip_number: 0
                      created_at: '2026-01-12T16:48:05.000000Z'
                      updated_at: '2026-01-12T16:48:05.000000Z'
                    -
                      id: 2
                      device_id: 131
                      name: valentina96
                      opposed: 1
                      grip_number: 0
                      created_at: '2026-01-12T16:48:05.000000Z'
                      updated_at: '2026-01-12T16:48:05.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        device_id: 130
                        name: kgutkowski
                        opposed: 1
                        grip_number: 0
                        created_at: '2026-01-12T16:48:05.000000Z'
                        updated_at: '2026-01-12T16:48:05.000000Z'
                      -
                        id: 2
                        device_id: 131
                        name: valentina96
                        opposed: 1
                        grip_number: 0
                        created_at: '2026-01-12T16:48:05.000000Z'
                        updated_at: '2026-01-12T16:48:05.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        device_id:
                          type: integer
                          example: 130
                        name:
                          type: string
                          example: kgutkowski
                        opposed:
                          type: integer
                          example: 1
                        grip_number:
                          type: integer
                          example: 0
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:05.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:05.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view custom grips'
                  code: 'CUSTOM_GRIPS:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view custom grips'
                  code:
                    type: string
                    example: 'CUSTOM_GRIPS:LIST:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'CUSTOM_GRIPS:LIST:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'CUSTOM_GRIPS:LIST:DEVICE_NOT_FOUND'
      tags:
        - 'Custom Grips'
    post:
      summary: 'Create custom grip'
      operationId: createCustomGrip
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  device_id: 132
                  name: jordan91
                  opposed: 1
                  grip_number: 0
                  created_at: '2026-01-12T16:48:05.000000Z'
                  updated_at: '2026-01-12T16:48:05.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  device_id:
                    type: integer
                    example: 132
                  name:
                    type: string
                    example: jordan91
                  opposed:
                    type: integer
                    example: 1
                  grip_number:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage custom grips'
                      code: 'CUSTOM_GRIPS:CREATE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage custom grips'
                      code:
                        type: string
                        example: 'CUSTOM_GRIPS:CREATE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Custom grip name in use'
                    type: object
                    example:
                      message: 'Custom grip name already in use'
                      code: 'CUSTOM_GRIPS:CREATE:NAME_IN_USE'
                    properties:
                      message:
                        type: string
                        example: 'Custom grip name already in use'
                      code:
                        type: string
                        example: 'CUSTOM_GRIPS:CREATE:NAME_IN_USE'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'CUSTOM_GRIPS:CREATE:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'CUSTOM_GRIPS:CREATE:DEVICE_NOT_FOUND'
      tags:
        - 'Custom Grips'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of custom grip.'
                  example: 'Custom Grip 1'
                opposed:
                  type: boolean
                  description: 'Grip opposed status.'
                  example: true
                grip_number:
                  type: integer
                  description: 'Grip number (not ID).'
                  example: 1
              required:
                - name
                - opposed
                - grip_number
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{deviceId}/custom-grips/{gripId}':
    put:
      summary: 'Update custom grip'
      operationId: updateCustomGrip
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  device_id: 133
                  name: maureen.windler
                  opposed: 1
                  grip_number: 0
                  created_at: '2026-01-12T16:48:05.000000Z'
                  updated_at: '2026-01-12T16:48:05.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  device_id:
                    type: integer
                    example: 133
                  name:
                    type: string
                    example: maureen.windler
                  opposed:
                    type: integer
                    example: 1
                  grip_number:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage custom grips'
                      code: 'CUSTOM_GRIPS:UPDATE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage custom grips'
                      code:
                        type: string
                        example: 'CUSTOM_GRIPS:UPDATE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Custom grip name in use'
                    type: object
                    example:
                      message: 'Custom grip name already in use'
                      code: 'CUSTOM_GRIPS:UPDATE:NAME_IN_USE'
                    properties:
                      message:
                        type: string
                        example: 'Custom grip name already in use'
                      code:
                        type: string
                        example: 'CUSTOM_GRIPS:UPDATE:NAME_IN_USE'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CUSTOM_GRIPS:UPDATE:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CUSTOM_GRIPS:UPDATE:DEVICE_NOT_FOUND'
                  -
                    description: 'Custom grip not found'
                    type: object
                    example:
                      message: 'Custom grip not found'
                      code: 'CUSTOM_GRIPS:UPDATE:GRIP_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Custom grip not found'
                      code:
                        type: string
                        example: 'CUSTOM_GRIPS:UPDATE:GRIP_NOT_FOUND'
      tags:
        - 'Custom Grips'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of custom grip.'
                  example: 'Custom Grip 1'
                opposed:
                  type: boolean
                  description: 'Grip opposed status.'
                  example: true
                grip_number:
                  type: integer
                  description: 'Grip number (not ID).'
                  example: 1
    delete:
      summary: 'Delete custom grip'
      operationId: deleteCustomGrip
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Custom grip template deleted'
                  code: 'CUSTOM_GRIPS:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Custom grip template deleted'
                  code:
                    type: string
                    example: 'CUSTOM_GRIPS:DELETE:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage custom grips'
                  code: 'CUSTOM_GRIPS:DELETE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage custom grips'
                  code:
                    type: string
                    example: 'CUSTOM_GRIPS:DELETE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'CUSTOM_GRIPS:DELETE:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'CUSTOM_GRIPS:DELETE:DEVICE_NOT_FOUND'
                  -
                    description: 'Custom grip not found'
                    type: object
                    example:
                      message: 'Custom grip not found'
                      code: 'CUSTOM_GRIPS:DELETE:GRIP_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Custom grip not found'
                      code:
                        type: string
                        example: 'CUSTOM_GRIPS:DELETE:GRIP_NOT_FOUND'
      tags:
        - 'Custom Grips'
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: gripId
        description: 'Custom Grip ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/devices/models:
    get:
      summary: 'Get device models list'
      operationId: getDeviceModelsList
      description: ''
      parameters:
        -
          in: query
          name: active
          description: 'Filter device models by active status (available: 0 - only inactive, 1 - only active, any - all users). Default: 1.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Filter device models by active status (available: 0 - only inactive, 1 - only active, any - all users). Default: 1.'
            example: 1
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 3
                    name:
                      type: string
                      example: 'Zeus hand v1'
                    type:
                      type: string
                      example: arm
                    orientation:
                      type: string
                      example: right
                    active:
                      type: integer
                      example: 1
                    created_at:
                      type: string
                      example: '2026-01-12T16:47:44.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:47:44.000000Z'
                example:
                  -
                    id: 3
                    name: 'Zeus hand v1'
                    type: arm
                    orientation: right
                    active: 1
                    created_at: '2026-01-12T16:47:44.000000Z'
                    updated_at: '2026-01-12T16:47:44.000000Z'
                  -
                    id: 4
                    name: 'Zeus hand v1'
                    type: arm
                    orientation: left
                    active: 1
                    created_at: '2026-01-12T16:47:44.000000Z'
                    updated_at: '2026-01-12T16:47:44.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list device models'
                  code: 'DEVICE_MODELS:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list device models'
                  code:
                    type: string
                    example: 'DEVICE_MODELS:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - 'Device Models'
    post:
      summary: 'Create device model'
      operationId: createDeviceModel
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 5
                  name: 'Zeus hand v1'
                  type: arm
                  orientation: left
                  active: 1
                  created_at: '2026-01-12T16:47:44.000000Z'
                  updated_at: '2026-01-12T16:47:44.000000Z'
                properties:
                  id:
                    type: integer
                    example: 5
                  name:
                    type: string
                    example: 'Zeus hand v1'
                  type:
                    type: string
                    example: arm
                  orientation:
                    type: string
                    example: left
                  active:
                    type: integer
                    example: 1
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:44.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:44.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to create device model'
                  code: 'DEVICE_MODELS:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to create device model'
                  code:
                    type: string
                    example: 'DEVICE_MODELS:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - 'Device Models'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Model name.'
                  example: 'Zeus hand v1'
                type:
                  type: string
                  description: 'Model type (e.g. hand).'
                  example: hand
                orientation:
                  type: string
                  description: 'Model orientation if specified.'
                  example: left
                active:
                  type: boolean
                  description: 'Device model active status (0 - inactive, 1 - active).'
                  example: true
              required:
                - name
  '/api/devices/models/{id}':
    put:
      summary: 'Update device model'
      operationId: updateDeviceModel
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 6
                  name: 'Zeus hand v1'
                  type: arm
                  orientation: right
                  active: 1
                  created_at: '2026-01-12T16:47:44.000000Z'
                  updated_at: '2026-01-12T16:47:44.000000Z'
                properties:
                  id:
                    type: integer
                    example: 6
                  name:
                    type: string
                    example: 'Zeus hand v1'
                  type:
                    type: string
                    example: arm
                  orientation:
                    type: string
                    example: right
                  active:
                    type: integer
                    example: 1
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:44.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:44.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update device model'
                  code: 'DEVICE_MODELS:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update device model'
                  code:
                    type: string
                    example: 'DEVICE_MODELS:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device model not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device model not found'
                  code: 'DEVICE_MODELS:UPDATE:MODEL_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device model not found'
                  code:
                    type: string
                    example: 'DEVICE_MODELS:UPDATE:MODEL_NOT_FOUND'
      tags:
        - 'Device Models'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Model name.'
                  example: 'Zeus hand v1'
                type:
                  type: string
                  description: 'Model type (e.g. hand).'
                  example: hand
                orientation:
                  type: string
                  description: 'Model orientation if specified.'
                  example: left
                active:
                  type: boolean
                  description: 'Device model active status (0 - inactive, 1 - active).'
                  example: true
    parameters:
      -
        in: path
        name: id
        description: 'DeviceModel ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/check/{serial}':
    get:
      summary: 'Check serial number or bluetooth ID'
      operationId: checkSerialNumberOrBluetoothID
      description: "Public endpoint responding with status of given device serial number or bluetooth ID.\n\t\tIf any of these numbers can be found in database, status will be true.\n\t\tOtherwise, status will be false (device does not exist)."
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  status: true
                properties:
                  status:
                    type: boolean
                    example: true
      tags:
        - Devices
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                type:
                  type: string
                  description: 'Type of checked identifier.'
                  example: serial
                  enum:
                    - serial
                    - bluetooth_id
      security: []
    parameters:
      -
        in: path
        name: serial
        description: 'Device serial number or bluetooth ID.'
        example: S3R1AL-NUM83R
        required: true
        schema:
          type: string
  /api/devices:
    get:
      summary: 'Get devices list'
      operationId: getDevicesList
      description: "Possible extend options:\n\t\t<ul>\n\t\t\t<li>model - device model details</li>\n\t\t\t<li>amputee - end-user assigned to device</li>\n\t\t\t<li>clinicians - list of clinicians assigned to the device</li>\n\t\t\t<li>firmwareVersion - device firmware version</li>\n\t\t\t<li>pcbVersion - PCB version</li>\n\t\t</ul>"
      parameters:
        -
          in: query
          name: search
          description: 'Filter devices by searching in: serial number, bluetooth ID.'
          example: S3R1AL-NUM83R
          required: false
          schema:
            type: string
            description: 'Filter devices by searching in: serial number, bluetooth ID.'
            example: S3R1AL-NUM83R
        -
          in: query
          name: active
          description: 'Filter devices by active status (available: 0 - only inactive, 1 - only active, -1 - all users). Default: 1.'
          example: -1
          required: false
          schema:
            type: integer
            description: 'Filter devices by active status (available: 0 - only inactive, 1 - only active, -1 - all users). Default: 1.'
            example: -1
        -
          in: query
          name: amputee
          description: "Filter devices by amputees.\n\t\tProvide single ID (<code>amputee=1</code>), array of IDs (<code>amputee[]=1&amputee[]=2</code>) or comma-separated list of IDs (<code>amputee=1,2</code>).\n\t\tPass value 0 to get devices unassigned to any amputee."
          example: 1
          required: false
          schema:
            type: string
            description: "Filter devices by amputees.\n\t\tProvide single ID (<code>amputee=1</code>), array of IDs (<code>amputee[]=1&amputee[]=2</code>) or comma-separated list of IDs (<code>amputee=1,2</code>).\n\t\tPass value 0 to get devices unassigned to any amputee."
            example: 1
        -
          in: query
          name: clinician
          description: "Filter devices by clinicians.\n\t\tProvide single ID (<code>clinician=1</code>), array of IDs (<code>clinician[]=1&clinician[]=2</code>) or comma-separated list of IDs (<code>clinician=1,2</code>).\n\t\tPass value 0 to get devices unassigned to any clinician."
          example: 1
          required: false
          schema:
            type: string
            description: "Filter devices by clinicians.\n\t\tProvide single ID (<code>clinician=1</code>), array of IDs (<code>clinician[]=1&clinician[]=2</code>) or comma-separated list of IDs (<code>clinician=1,2</code>).\n\t\tPass value 0 to get devices unassigned to any clinician."
            example: 1
        -
          in: query
          name: model
          description: "Filter devices by device models.\n\t\tProvide single ID (<code>model=1</code>), array of IDs (<code>model[]=1&model[]=2</code>) or comma-separated list of IDs (<code>model=1,2</code>).\n\t\tPass value 0 to get devices without model."
          example: 1
          required: false
          schema:
            type: string
            description: "Filter devices by device models.\n\t\tProvide single ID (<code>model=1</code>), array of IDs (<code>model[]=1&model[]=2</code>) or comma-separated list of IDs (<code>model=1,2</code>).\n\t\tPass value 0 to get devices without model."
            example: 1
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>model</code>, <code>amputee</code>, <code>clinicians</code>, <code>firmwareVersion</code>, <code>pcbVersion</code>, <code>config</code>, <code>joinedDevices</code>, <code>joinedElectrodes</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>model</code>, <code>amputee</code>, <code>clinicians</code>, <code>firmwareVersion</code>, <code>pcbVersion</code>, <code>config</code>, <code>joinedDevices</code>, <code>joinedElectrodes</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>serial</code>, <code>amputee_name</code>, <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>serial</code>, <code>amputee_name</code>, <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 5
                      serial: ea336b6c-c8e3-3eb8-bdff-2579670e8a9f
                      bluetooth_id: 4fb66cbd-382c-3d92-a574-955e739c0dad
                      company_id: null
                      model_id: 7
                      amputee_id: 34
                      clinician_id: null
                      firmware_version_id: null
                      pcb_version_id: null
                      reverse_magnets: 0
                      is_electrode: 0
                      active: 1
                      last_activity_at: '0000-00-00 00:00:00'
                      created_at: '2026-01-12T16:47:44.000000Z'
                      updated_at: '2026-01-12T16:47:44.000000Z'
                      model:
                        id: 7
                        name: 'Zeus hand v1'
                        type: arm
                        orientation: right
                        active: 1
                        created_at: '2026-01-12T16:47:44.000000Z'
                        updated_at: '2026-01-12T16:47:44.000000Z'
                      amputee:
                        id: 34
                        mrn: 4R4ILZ7M1768236464
                        name: 'Jerome Koepp'
                        email: 1768236464durgan.candice@example.org
                        language: en
                        phone: 540.519.5503
                        phone_country: ES
                        phone_verified_at: null
                        address1: '978 Hauck Glens'
                        address2: 'West Luciennehaven, CO 71363-2930'
                        postal_code: 21168-9728
                        city: 'Price PLC'
                        clinic_name: 'South Chethaven'
                        clinic_location: "929 Christophe Avenue\nEast Gertrude, VA 84326"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:44.000000Z'
                        updated_at: '2026-01-12T16:47:44.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                    -
                      id: 6
                      serial: b93e7e0e-03c5-397f-b309-a30100773ddf
                      bluetooth_id: 152e6c0c-d107-396c-b982-2cd2966ba152
                      company_id: null
                      model_id: 8
                      amputee_id: 35
                      clinician_id: null
                      firmware_version_id: null
                      pcb_version_id: null
                      reverse_magnets: 0
                      is_electrode: 0
                      active: 1
                      last_activity_at: '0000-00-00 00:00:00'
                      created_at: '2026-01-12T16:47:44.000000Z'
                      updated_at: '2026-01-12T16:47:44.000000Z'
                      model:
                        id: 8
                        name: 'Zeus hand v1'
                        type: leg
                        orientation: left
                        active: 1
                        created_at: '2026-01-12T16:47:44.000000Z'
                        updated_at: '2026-01-12T16:47:44.000000Z'
                      amputee:
                        id: 35
                        mrn: ZQSU4C5P1768236464
                        name: 'Rashawn Herzog'
                        email: 1768236464marvin49@example.org
                        language: en
                        phone: +1-862-698-2566
                        phone_country: UA
                        phone_verified_at: null
                        address1: '149 Bergnaum Bypass Apt. 181'
                        address2: 'Port Krystel, IL 54124-8131'
                        postal_code: 60688-2482
                        city: 'Feest and Sons'
                        clinic_name: Neldaton
                        clinic_location: "83487 Eichmann Fall\nDurganshire, KY 64708"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:44.000000Z'
                        updated_at: '2026-01-12T16:47:44.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 5
                        serial: ea336b6c-c8e3-3eb8-bdff-2579670e8a9f
                        bluetooth_id: 4fb66cbd-382c-3d92-a574-955e739c0dad
                        company_id: null
                        model_id: 7
                        amputee_id: 34
                        clinician_id: null
                        firmware_version_id: null
                        pcb_version_id: null
                        reverse_magnets: 0
                        is_electrode: 0
                        active: 1
                        last_activity_at: '0000-00-00 00:00:00'
                        created_at: '2026-01-12T16:47:44.000000Z'
                        updated_at: '2026-01-12T16:47:44.000000Z'
                        model:
                          id: 7
                          name: 'Zeus hand v1'
                          type: arm
                          orientation: right
                          active: 1
                          created_at: '2026-01-12T16:47:44.000000Z'
                          updated_at: '2026-01-12T16:47:44.000000Z'
                        amputee:
                          id: 34
                          mrn: 4R4ILZ7M1768236464
                          name: 'Jerome Koepp'
                          email: 1768236464durgan.candice@example.org
                          language: en
                          phone: 540.519.5503
                          phone_country: ES
                          phone_verified_at: null
                          address1: '978 Hauck Glens'
                          address2: 'West Luciennehaven, CO 71363-2930'
                          postal_code: 21168-9728
                          city: 'Price PLC'
                          clinic_name: 'South Chethaven'
                          clinic_location: "929 Christophe Avenue\nEast Gertrude, VA 84326"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:44.000000Z'
                          updated_at: '2026-01-12T16:47:44.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                      -
                        id: 6
                        serial: b93e7e0e-03c5-397f-b309-a30100773ddf
                        bluetooth_id: 152e6c0c-d107-396c-b982-2cd2966ba152
                        company_id: null
                        model_id: 8
                        amputee_id: 35
                        clinician_id: null
                        firmware_version_id: null
                        pcb_version_id: null
                        reverse_magnets: 0
                        is_electrode: 0
                        active: 1
                        last_activity_at: '0000-00-00 00:00:00'
                        created_at: '2026-01-12T16:47:44.000000Z'
                        updated_at: '2026-01-12T16:47:44.000000Z'
                        model:
                          id: 8
                          name: 'Zeus hand v1'
                          type: leg
                          orientation: left
                          active: 1
                          created_at: '2026-01-12T16:47:44.000000Z'
                          updated_at: '2026-01-12T16:47:44.000000Z'
                        amputee:
                          id: 35
                          mrn: ZQSU4C5P1768236464
                          name: 'Rashawn Herzog'
                          email: 1768236464marvin49@example.org
                          language: en
                          phone: +1-862-698-2566
                          phone_country: UA
                          phone_verified_at: null
                          address1: '149 Bergnaum Bypass Apt. 181'
                          address2: 'Port Krystel, IL 54124-8131'
                          postal_code: 60688-2482
                          city: 'Feest and Sons'
                          clinic_name: Neldaton
                          clinic_location: "83487 Eichmann Fall\nDurganshire, KY 64708"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:44.000000Z'
                          updated_at: '2026-01-12T16:47:44.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 5
                        serial:
                          type: string
                          example: ea336b6c-c8e3-3eb8-bdff-2579670e8a9f
                        bluetooth_id:
                          type: string
                          example: 4fb66cbd-382c-3d92-a574-955e739c0dad
                        company_id:
                          type: string
                          example: null
                        model_id:
                          type: integer
                          example: 7
                        amputee_id:
                          type: integer
                          example: 34
                        clinician_id:
                          type: string
                          example: null
                        firmware_version_id:
                          type: string
                          example: null
                        pcb_version_id:
                          type: string
                          example: null
                        reverse_magnets:
                          type: integer
                          example: 0
                        is_electrode:
                          type: integer
                          example: 0
                        active:
                          type: integer
                          example: 1
                        last_activity_at:
                          type: string
                          example: '0000-00-00 00:00:00'
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:44.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:44.000000Z'
                        model:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 7
                            name:
                              type: string
                              example: 'Zeus hand v1'
                            type:
                              type: string
                              example: arm
                            orientation:
                              type: string
                              example: right
                            active:
                              type: integer
                              example: 1
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:44.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:44.000000Z'
                        amputee:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 34
                            mrn:
                              type: string
                              example: 4R4ILZ7M1768236464
                            name:
                              type: string
                              example: 'Jerome Koepp'
                            email:
                              type: string
                              example: 1768236464durgan.candice@example.org
                            language:
                              type: string
                              example: en
                            phone:
                              type: string
                              example: 540.519.5503
                            phone_country:
                              type: string
                              example: ES
                            phone_verified_at:
                              type: string
                              example: null
                            address1:
                              type: string
                              example: '978 Hauck Glens'
                            address2:
                              type: string
                              example: 'West Luciennehaven, CO 71363-2930'
                            postal_code:
                              type: string
                              example: 21168-9728
                            city:
                              type: string
                              example: 'Price PLC'
                            clinic_name:
                              type: string
                              example: 'South Chethaven'
                            clinic_location:
                              type: string
                              example: "929 Christophe Avenue\nEast Gertrude, VA 84326"
                            image:
                              type: string
                              example: null
                            mfa_enabled:
                              type: integer
                              example: 0
                            mfa_method:
                              type: string
                              example: null
                            mfa_verified_to:
                              type: string
                              example: null
                            location_id:
                              type: string
                              example: null
                            created_by:
                              type: string
                              example: null
                            active:
                              type: integer
                              example: 1
                            notifications_timezone:
                              type: string
                              example: null
                            notifications_at:
                              type: string
                              example: null
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:44.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:44.000000Z'
                            invitation_status:
                              type: string
                              example: null
                            acadle_invitation_status:
                              type: string
                              example: null
                            roles:
                              type: array
                              example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list devices'
                  code: 'DEVICES:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list devices'
                  code:
                    type: string
                    example: 'DEVICES:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - Devices
  '/api/device/{id}':
    get:
      summary: 'Get device information'
      operationId: getDeviceInformation
      description: ''
      parameters:
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>model</code>, <code>amputee</code>, <code>firmwareVersion</code>, <code>pcbVersion</code>, <code>clinicians</code>, <code>joinedDevices</code>, <code>joinedElectrodes</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>model</code>, <code>amputee</code>, <code>firmwareVersion</code>, <code>pcbVersion</code>, <code>clinicians</code>, <code>joinedDevices</code>, <code>joinedElectrodes</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 7
                  serial: 0a4b3d47-fcd0-3303-88fe-6d64e409ea7b
                  bluetooth_id: d6aa8c59-e759-337a-bc82-e45468158cb5
                  company_id: null
                  model_id: 9
                  amputee_id: 36
                  clinician_id: null
                  firmware_version_id: 1
                  pcb_version_id: 1
                  reverse_magnets: 0
                  is_electrode: 0
                  active: 1
                  last_activity_at: '0000-00-00 00:00:00'
                  created_at: '2026-01-12T16:47:45.000000Z'
                  updated_at: '2026-01-12T16:47:45.000000Z'
                  model:
                    id: 9
                    name: 'Zeus hand v1'
                    type: arm
                    orientation: right
                    active: 1
                    created_at: '2026-01-12T16:47:44.000000Z'
                    updated_at: '2026-01-12T16:47:44.000000Z'
                  amputee:
                    id: 36
                    mrn: AS5CLXZV1768236464
                    name: 'Christa Reinger'
                    email: 1768236464efrain51@example.net
                    language: en
                    phone: 402.329.1100
                    phone_country: IR
                    phone_verified_at: null
                    address1: '98256 Giovanni Shoal'
                    address2: 'Evertton, TN 35870'
                    postal_code: '49259'
                    city: 'Kris PLC'
                    clinic_name: Framibury
                    clinic_location: "1520 Rick Common Suite 788\nSidneybury, SD 99721"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:45.000000Z'
                    updated_at: '2026-01-12T16:47:45.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  pcb_version:
                    id: 1
                    name: 3.16.36
                    hardware_id: ''
                    created_at: '2026-01-12T16:47:45.000000Z'
                    updated_at: '2026-01-12T16:47:45.000000Z'
                properties:
                  id:
                    type: integer
                    example: 7
                  serial:
                    type: string
                    example: 0a4b3d47-fcd0-3303-88fe-6d64e409ea7b
                  bluetooth_id:
                    type: string
                    example: d6aa8c59-e759-337a-bc82-e45468158cb5
                  company_id:
                    type: string
                    example: null
                  model_id:
                    type: integer
                    example: 9
                  amputee_id:
                    type: integer
                    example: 36
                  clinician_id:
                    type: string
                    example: null
                  firmware_version_id:
                    type: integer
                    example: 1
                  pcb_version_id:
                    type: integer
                    example: 1
                  reverse_magnets:
                    type: integer
                    example: 0
                  is_electrode:
                    type: integer
                    example: 0
                  active:
                    type: integer
                    example: 1
                  last_activity_at:
                    type: string
                    example: '0000-00-00 00:00:00'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
                  model:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 9
                      name:
                        type: string
                        example: 'Zeus hand v1'
                      type:
                        type: string
                        example: arm
                      orientation:
                        type: string
                        example: right
                      active:
                        type: integer
                        example: 1
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:44.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:44.000000Z'
                  amputee:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 36
                      mrn:
                        type: string
                        example: AS5CLXZV1768236464
                      name:
                        type: string
                        example: 'Christa Reinger'
                      email:
                        type: string
                        example: 1768236464efrain51@example.net
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 402.329.1100
                      phone_country:
                        type: string
                        example: IR
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '98256 Giovanni Shoal'
                      address2:
                        type: string
                        example: 'Evertton, TN 35870'
                      postal_code:
                        type: string
                        example: '49259'
                      city:
                        type: string
                        example: 'Kris PLC'
                      clinic_name:
                        type: string
                        example: Framibury
                      clinic_location:
                        type: string
                        example: "1520 Rick Common Suite 788\nSidneybury, SD 99721"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:45.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:45.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  pcb_version:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 1
                      name:
                        type: string
                        example: 3.16.36
                      hardware_id:
                        type: string
                        example: ''
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:45.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:45.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view device data'
                  code: 'DEVICES:GET:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view device data'
                  code:
                    type: string
                    example: 'DEVICES:GET:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'DEVICES:GET:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'DEVICES:GET:DEVICE_NOT_FOUND'
      tags:
        - Devices
    put:
      summary: 'Update device'
      operationId: updateDevice
      description: "Amputee of device can update only these fields:\n\t\t<code>serial</code>, <code>bluetooth_id</code>, <code>firmware_version_id</code>, <code>pcb_version_id</code>"
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 9
                  serial: 63f77360-c4a2-3b3d-8da8-a55dddd7736c
                  bluetooth_id: 5ba587d3-4f4a-3bf5-9928-b828042db014
                  company_id: null
                  model_id: null
                  amputee_id: null
                  clinician_id: null
                  firmware_version_id: null
                  pcb_version_id: null
                  reverse_magnets: 0
                  is_electrode: 0
                  active: 1
                  last_activity_at: '0000-00-00 00:00:00'
                  created_at: '2026-01-12T16:47:45.000000Z'
                  updated_at: '2026-01-12T16:47:45.000000Z'
                properties:
                  id:
                    type: integer
                    example: 9
                  serial:
                    type: string
                    example: 63f77360-c4a2-3b3d-8da8-a55dddd7736c
                  bluetooth_id:
                    type: string
                    example: 5ba587d3-4f4a-3bf5-9928-b828042db014
                  company_id:
                    type: string
                    example: null
                  model_id:
                    type: string
                    example: null
                  amputee_id:
                    type: string
                    example: null
                  clinician_id:
                    type: string
                    example: null
                  firmware_version_id:
                    type: string
                    example: null
                  pcb_version_id:
                    type: string
                    example: null
                  reverse_magnets:
                    type: integer
                    example: 0
                  is_electrode:
                    type: integer
                    example: 0
                  active:
                    type: integer
                    example: 1
                  last_activity_at:
                    type: string
                    example: '0000-00-00 00:00:00'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to update device'
                      code: 'DEVICES:UPDATE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to update device'
                      code:
                        type: string
                        example: 'DEVICES:UPDATE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Firmware has no schema'
                    type: object
                    example:
                      message: 'Cannot update: firmware has no schema'
                      code: 'DEVICES:UPDATE:NO_FIRMWARE_SCHEMA'
                    properties:
                      message:
                        type: string
                        example: 'Cannot update: firmware has no schema'
                      code:
                        type: string
                        example: 'DEVICES:UPDATE:NO_FIRMWARE_SCHEMA'
                  -
                    description: ''
                    type: object
                    example:
                      message: 'Cannot update: no clinicians left for patient relation'
                      code: 'DEVICES:UPDATE:NO_CLINICIANS'
                    properties:
                      message:
                        type: string
                        example: 'Cannot update: no clinicians left for patient relation'
                      code:
                        type: string
                        example: 'DEVICES:UPDATE:NO_CLINICIANS'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'DEVICES:UPDATE:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'DEVICES:UPDATE:DEVICE_NOT_FOUND'
      tags:
        - Devices
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                serial:
                  type: string
                  description: 'Device serial number.'
                  example: S3R1AL-NUM83R
                bluetooth_id:
                  type: string
                  description: 'Device Bluetooth ID.'
                  example: BL0123456789
                model_id:
                  type: string
                  description: 'Device Model ID. The <code>id</code> of an existing record in the App\Models\DeviceModel table.'
                  example: 1
                amputee_id:
                  type: string
                  description: 'Device amputee ID. Pass <code>null</code> to remove assignment. The <code>id</code> of an existing record in the App\Models\User table.'
                  example: 1
                  nullable: true
                clinicians:
                  type: array
                  description: 'Clinician ID. The <code>id</code> of an existing record in the App\Models\User table.'
                  example:
                    - 2
                  items:
                    type: integer
                firmware_version_id:
                  type: string
                  description: 'Firmware Version ID. The <code>id</code> of an existing record in the App\Models\FirmwareVersion table.'
                  example: 1
                  nullable: true
                pcb_version_id:
                  type: string
                  description: 'PCB Version ID. The <code>id</code> of an existing record in the App\Models\PCBVersion table.'
                  example: 1
                  nullable: true
                reverse_magnets:
                  type: boolean
                  description: 'Device reverse magnets. Default: 0.'
                  example: false
                is_electrode:
                  type: boolean
                  description: '<strong>Super Admin only:</strong> Device is electrode. Default: 0.'
                  example: false
                active:
                  type: boolean
                  description: 'Device active status (0 - inactive, 1 - active).'
                  example: true
                last_activity_at:
                  type: string
                  description: 'Device last activity date. Update this value each time device connects to the mobile app. Always shift local datetime to UTC timezone. Must be a valid date in the format <code>Y-m-d H:i:s</code>.'
                  example: '2022-08-15 12:00:00'
    delete:
      summary: 'Delete device'
      operationId: deleteDevice
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device deleted'
                  code: 'DEVICES:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Device deleted'
                  code:
                    type: string
                    example: 'DEVICES:DELETE:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to delete device'
                  code: 'DEVICES:DELETE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to delete device'
                  code:
                    type: string
                    example: 'DEVICES:DELETE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'DEVICES:DELETE:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'DEVICES:DELETE:DEVICE_NOT_FOUND'
      tags:
        - Devices
    parameters:
      -
        in: path
        name: id
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/device:
    post:
      summary: 'Create new device'
      operationId: createNewDevice
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 8
                  serial: 8533771a-fd47-3579-8e9a-bf55856afde4
                  bluetooth_id: b8471698-7b6b-32f3-9fa9-755975ac1013
                  company_id: null
                  model_id: null
                  amputee_id: null
                  clinician_id: null
                  firmware_version_id: null
                  pcb_version_id: null
                  reverse_magnets: 0
                  is_electrode: 0
                  active: 1
                  last_activity_at: '0000-00-00 00:00:00'
                  created_at: '2026-01-12T16:47:45.000000Z'
                  updated_at: '2026-01-12T16:47:45.000000Z'
                properties:
                  id:
                    type: integer
                    example: 8
                  serial:
                    type: string
                    example: 8533771a-fd47-3579-8e9a-bf55856afde4
                  bluetooth_id:
                    type: string
                    example: b8471698-7b6b-32f3-9fa9-755975ac1013
                  company_id:
                    type: string
                    example: null
                  model_id:
                    type: string
                    example: null
                  amputee_id:
                    type: string
                    example: null
                  clinician_id:
                    type: string
                    example: null
                  firmware_version_id:
                    type: string
                    example: null
                  pcb_version_id:
                    type: string
                    example: null
                  reverse_magnets:
                    type: integer
                    example: 0
                  is_electrode:
                    type: integer
                    example: 0
                  active:
                    type: integer
                    example: 1
                  last_activity_at:
                    type: string
                    example: '0000-00-00 00:00:00'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to create device'
                      code: 'DEVICES:CREATE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to create device'
                      code:
                        type: string
                        example: 'DEVICES:CREATE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Firmware has no schema'
                    type: object
                    example:
                      message: 'Cannot create: firmware has no schema'
                      code: 'DEVICES:CREATE:NO_FIRMWARE_SCHEMA'
                    properties:
                      message:
                        type: string
                        example: 'Cannot create: firmware has no schema'
                      code:
                        type: string
                        example: 'DEVICES:CREATE:NO_FIRMWARE_SCHEMA'
        500:
          description: 'Server error'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Server error: device not created'
                  code: 'DEVICES:CREATE:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Server error: device not created'
                  code:
                    type: string
                    example: 'DEVICES:CREATE:SERVER_ERROR'
      tags:
        - Devices
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                serial:
                  type: string
                  description: 'Device serial number.'
                  example: S3R1AL-NUM83R
                bluetooth_id:
                  type: string
                  description: 'Device Bluetooth ID.'
                  example: BL0123456789
                model_id:
                  type: string
                  description: 'Device Model ID. The <code>id</code> of an existing record in the App\Models\DeviceModel table.'
                  example: 1
                amputee_id:
                  type: string
                  description: 'Device amputee ID. The <code>id</code> of an existing record in the App\Models\User table.'
                  example: 1
                  nullable: true
                clinicians:
                  type: array
                  description: 'Clinician ID. The <code>id</code> of an existing record in the App\Models\User table.'
                  example:
                    - 2
                  items:
                    type: integer
                firmware_version_id:
                  type: string
                  description: 'Firmware Version ID. The <code>id</code> of an existing record in the App\Models\FirmwareVersion table.'
                  example: 1
                  nullable: true
                pcb_version_id:
                  type: string
                  description: 'PCB Version ID. The <code>id</code> of an existing record in the App\Models\PCBVersion table.'
                  example: 1
                  nullable: true
                reverse_magnets:
                  type: boolean
                  description: 'Device reverse magnets. Default: 0.'
                  example: false
                is_electrode:
                  type: boolean
                  description: '<strong>Super Admin only:</strong> Device is electrode. Default: 0.'
                  example: false
                active:
                  type: boolean
                  description: 'Device active status (0 - inactive, 1 - active).'
                  example: true
                last_activity_at:
                  type: string
                  description: 'Device last activity date. Update this value each time device connects to the mobile app. Always shift local datetime to UTC timezone. Must be a valid date in the format <code>Y-m-d H:i:s</code>.'
                  example: '2022-08-15 12:00:00'
              required:
                - serial
                - bluetooth_id
                - model_id
  '/api/device/{id}/hash':
    get:
      summary: 'Get device hashes'
      operationId: getDeviceHashes
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  hash_global: '123456789012345'
                  hash_common_settings: '123456789012345'
                  hash_common_grips: '123456789012345'
                  hash_mode1: '123456789012345'
                  hash_mode2: '123456789012345'
                  hash_mode3: '123456789012345'
                properties:
                  hash_global:
                    type: string
                    example: '123456789012345'
                  hash_common_settings:
                    type: string
                    example: '123456789012345'
                  hash_common_grips:
                    type: string
                    example: '123456789012345'
                  hash_mode1:
                    type: string
                    example: '123456789012345'
                  hash_mode2:
                    type: string
                    example: '123456789012345'
                  hash_mode3:
                    type: string
                    example: '123456789012345'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to access device hashes'
                  code: 'DEVICES:GET_HASHES:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to access device hashes'
                  code:
                    type: string
                    example: 'DEVICES:GET_HASHES:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'DEVICES:GET_HASHES:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'DEVICES:GET_HASHES:DEVICE_NOT_FOUND'
      tags:
        - Devices
    post:
      summary: 'Update device hashes'
      operationId: updateDeviceHashes
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  hash_global: '123456789012345'
                  hash_common_settings: '123456789012345'
                  hash_common_grips: '123456789012345'
                  hash_mode1: '123456789012345'
                  hash_mode2: '123456789012345'
                  hash_mode3: '123456789012345'
                properties:
                  hash_global:
                    type: string
                    example: '123456789012345'
                  hash_common_settings:
                    type: string
                    example: '123456789012345'
                  hash_common_grips:
                    type: string
                    example: '123456789012345'
                  hash_mode1:
                    type: string
                    example: '123456789012345'
                  hash_mode2:
                    type: string
                    example: '123456789012345'
                  hash_mode3:
                    type: string
                    example: '123456789012345'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to access device hashes'
                  code: 'DEVICES:SET_HASHES:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to access device hashes'
                  code:
                    type: string
                    example: 'DEVICES:SET_HASHES:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'DEVICES:SET_HASHES:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'DEVICES:SET_HASHES:DEVICE_NOT_FOUND'
      tags:
        - Devices
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                hash_global:
                  type: string
                  description: 'Global hash.'
                  example: '123456789012345'
                hash_common_settings:
                  type: string
                  description: 'Common settings hash.'
                  example: '123456789012345'
                hash_common_grips:
                  type: string
                  description: 'Common grips hash.'
                  example: '123456789012345'
                hash_mode1:
                  type: string
                  description: 'Mode 1 hash.'
                  example: '123456789012345'
                hash_mode2:
                  type: string
                  description: 'Mode 2 hash.'
                  example: '123456789012345'
                hash_mode3:
                  type: string
                  description: 'Mode 3 hash.'
                  example: '123456789012345'
    parameters:
      -
        in: path
        name: id
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/{id}/detach':
    post:
      summary: 'Detach device'
      operationId: detachDevice
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device detached'
                  code: 'DEVICES:DETACH:DETACHED'
                properties:
                  message:
                    type: string
                    example: 'Device detached'
                  code:
                    type: string
                    example: 'DEVICES:DETACH:DETACHED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to detach device'
                  code: 'DEVICES:DETACH:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to detach device'
                  code:
                    type: string
                    example: 'DEVICES:DETACH:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'DEVICES:DETACH:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'DEVICES:DETACH:DEVICE_NOT_FOUND'
      tags:
        - Devices
    parameters:
      -
        in: path
        name: id
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/add/{serial}':
    post:
      summary: 'Add device'
      operationId: addDevice
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 10
                  serial: b5182146-e146-3002-a9fd-b36e46e731e1
                  bluetooth_id: b33adf6f-88e3-321f-b8c3-3a2a4d4355e4
                  company_id: null
                  model_id: null
                  amputee_id: null
                  clinician_id: null
                  firmware_version_id: null
                  pcb_version_id: null
                  reverse_magnets: 0
                  is_electrode: 0
                  active: 1
                  last_activity_at: '0000-00-00 00:00:00'
                  created_at: '2026-01-12T16:47:45.000000Z'
                  updated_at: '2026-01-12T16:47:45.000000Z'
                properties:
                  id:
                    type: integer
                    example: 10
                  serial:
                    type: string
                    example: b5182146-e146-3002-a9fd-b36e46e731e1
                  bluetooth_id:
                    type: string
                    example: b33adf6f-88e3-321f-b8c3-3a2a4d4355e4
                  company_id:
                    type: string
                    example: null
                  model_id:
                    type: string
                    example: null
                  amputee_id:
                    type: string
                    example: null
                  clinician_id:
                    type: string
                    example: null
                  firmware_version_id:
                    type: string
                    example: null
                  pcb_version_id:
                    type: string
                    example: null
                  reverse_magnets:
                    type: integer
                    example: 0
                  is_electrode:
                    type: integer
                    example: 0
                  active:
                    type: integer
                    example: 1
                  last_activity_at:
                    type: string
                    example: '0000-00-00 00:00:00'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to assign devices with code'
                      code: 'DEVICES:ASSIGN:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to assign devices with code'
                      code:
                        type: string
                        example: 'DEVICES:ASSIGN:INSUFFICIENT_PERMISSION'
                  -
                    description: 'User reached the temporary limit of attached devices'
                    type: object
                    example:
                      message: 'Reached the limit of assigned devices'
                      code: 'DEVICES:ASSIGN:LIMIT_REACHED'
                    properties:
                      message:
                        type: string
                        example: 'Reached the limit of assigned devices'
                      code:
                        type: string
                        example: 'DEVICES:ASSIGN:LIMIT_REACHED'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'DEVICES:ASSIGN:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'DEVICES:ASSIGN:DEVICE_NOT_FOUND'
      tags:
        - Devices
    parameters:
      -
        in: path
        name: serial
        description: 'Device serial number or bluetooth ID.'
        example: S3R1AL-NUM83R
        required: true
        schema:
          type: string
  '/api/device/connect/{id}':
    post:
      summary: 'Connect device'
      operationId: connectDevice
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device connected'
                  code: 'DEVICES:CONNECT:CONNECTED'
                properties:
                  message:
                    type: string
                    example: 'Device connected'
                  code:
                    type: string
                    example: 'DEVICES:CONNECT:CONNECTED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view device data'
                  code: 'DEVICES:CONNECT:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view device data'
                  code:
                    type: string
                    example: 'DEVICES:CONNECT:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'DEVICES:CONNECT:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'DEVICES:CONNECT:DEVICE_NOT_FOUND'
      tags:
        - Devices
    parameters:
      -
        in: path
        name: id
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/disconnect/{id}':
    post:
      summary: 'Disconnect device'
      operationId: disconnectDevice
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device disconnected'
                  code: 'DEVICES:DISCONNECT:DISCONNECTED'
                properties:
                  message:
                    type: string
                    example: 'Device disconnected'
                  code:
                    type: string
                    example: 'DEVICES:DISCONNECT:DISCONNECTED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view device data'
                  code: 'DEVICES:DISCONNECT:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view device data'
                  code:
                    type: string
                    example: 'DEVICES:DISCONNECT:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'DEVICES:DISCONNECT:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'DEVICES:DISCONNECT:DEVICE_NOT_FOUND'
      tags:
        - Devices
    parameters:
      -
        in: path
        name: id
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/device/join/{deviceId}/{electrodeId}':
    post:
      summary: 'Join devices'
      operationId: joinDevices
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 11
                  serial: 3cd8b286-58b7-3c67-8bf0-11d8c7e2f100
                  bluetooth_id: 4b6b4450-03ca-3836-9640-e719ca401bdf
                  company_id: null
                  model_id: null
                  amputee_id: null
                  clinician_id: null
                  firmware_version_id: null
                  pcb_version_id: null
                  reverse_magnets: 0
                  is_electrode: 0
                  active: 1
                  last_activity_at: '0000-00-00 00:00:00'
                  created_at: '2026-01-12T16:47:45.000000Z'
                  updated_at: '2026-01-12T16:47:45.000000Z'
                  joined_devices:
                    -
                      id: 12
                      serial: 8148e4bd-0b72-34a5-bd4a-e2e20d0e43b3
                      bluetooth_id: 143b1a27-eaf2-38d7-a6ba-5cdf772bfd1e
                      company_id: null
                      model_id: null
                      amputee_id: null
                      clinician_id: null
                      firmware_version_id: null
                      pcb_version_id: null
                      reverse_magnets: 0
                      is_electrode: 0
                      active: 1
                      last_activity_at: '0000-00-00 00:00:00'
                      created_at: '2026-01-12T16:47:45.000000Z'
                      updated_at: '2026-01-12T16:47:45.000000Z'
                      pivot:
                        electrode_id: 11
                        device_id: 12
                        created_at: '2026-01-12T16:47:45.000000Z'
                        updated_at: '2026-01-12T16:47:45.000000Z'
                  joined_electrodes:
                    -
                      id: 13
                      serial: 54135211-e287-3fcc-aba1-a1048145afab
                      bluetooth_id: b9202f3e-e446-350b-b4b8-950a6b163b05
                      company_id: null
                      model_id: null
                      amputee_id: null
                      clinician_id: null
                      firmware_version_id: null
                      pcb_version_id: null
                      reverse_magnets: 0
                      is_electrode: 0
                      active: 1
                      last_activity_at: '0000-00-00 00:00:00'
                      created_at: '2026-01-12T16:47:45.000000Z'
                      updated_at: '2026-01-12T16:47:45.000000Z'
                      pivot:
                        device_id: 11
                        electrode_id: 13
                        created_at: '2026-01-12T16:47:45.000000Z'
                        updated_at: '2026-01-12T16:47:45.000000Z'
                properties:
                  id:
                    type: integer
                    example: 11
                  serial:
                    type: string
                    example: 3cd8b286-58b7-3c67-8bf0-11d8c7e2f100
                  bluetooth_id:
                    type: string
                    example: 4b6b4450-03ca-3836-9640-e719ca401bdf
                  company_id:
                    type: string
                    example: null
                  model_id:
                    type: string
                    example: null
                  amputee_id:
                    type: string
                    example: null
                  clinician_id:
                    type: string
                    example: null
                  firmware_version_id:
                    type: string
                    example: null
                  pcb_version_id:
                    type: string
                    example: null
                  reverse_magnets:
                    type: integer
                    example: 0
                  is_electrode:
                    type: integer
                    example: 0
                  active:
                    type: integer
                    example: 1
                  last_activity_at:
                    type: string
                    example: '0000-00-00 00:00:00'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:45.000000Z'
                  joined_devices:
                    type: array
                    example:
                      -
                        id: 12
                        serial: 8148e4bd-0b72-34a5-bd4a-e2e20d0e43b3
                        bluetooth_id: 143b1a27-eaf2-38d7-a6ba-5cdf772bfd1e
                        company_id: null
                        model_id: null
                        amputee_id: null
                        clinician_id: null
                        firmware_version_id: null
                        pcb_version_id: null
                        reverse_magnets: 0
                        is_electrode: 0
                        active: 1
                        last_activity_at: '0000-00-00 00:00:00'
                        created_at: '2026-01-12T16:47:45.000000Z'
                        updated_at: '2026-01-12T16:47:45.000000Z'
                        pivot:
                          electrode_id: 11
                          device_id: 12
                          created_at: '2026-01-12T16:47:45.000000Z'
                          updated_at: '2026-01-12T16:47:45.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 12
                        serial:
                          type: string
                          example: 8148e4bd-0b72-34a5-bd4a-e2e20d0e43b3
                        bluetooth_id:
                          type: string
                          example: 143b1a27-eaf2-38d7-a6ba-5cdf772bfd1e
                        company_id:
                          type: string
                          example: null
                        model_id:
                          type: string
                          example: null
                        amputee_id:
                          type: string
                          example: null
                        clinician_id:
                          type: string
                          example: null
                        firmware_version_id:
                          type: string
                          example: null
                        pcb_version_id:
                          type: string
                          example: null
                        reverse_magnets:
                          type: integer
                          example: 0
                        is_electrode:
                          type: integer
                          example: 0
                        active:
                          type: integer
                          example: 1
                        last_activity_at:
                          type: string
                          example: '0000-00-00 00:00:00'
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:45.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:45.000000Z'
                        pivot:
                          type: object
                          properties:
                            electrode_id:
                              type: integer
                              example: 11
                            device_id:
                              type: integer
                              example: 12
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:45.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:45.000000Z'
                  joined_electrodes:
                    type: array
                    example:
                      -
                        id: 13
                        serial: 54135211-e287-3fcc-aba1-a1048145afab
                        bluetooth_id: b9202f3e-e446-350b-b4b8-950a6b163b05
                        company_id: null
                        model_id: null
                        amputee_id: null
                        clinician_id: null
                        firmware_version_id: null
                        pcb_version_id: null
                        reverse_magnets: 0
                        is_electrode: 0
                        active: 1
                        last_activity_at: '0000-00-00 00:00:00'
                        created_at: '2026-01-12T16:47:45.000000Z'
                        updated_at: '2026-01-12T16:47:45.000000Z'
                        pivot:
                          device_id: 11
                          electrode_id: 13
                          created_at: '2026-01-12T16:47:45.000000Z'
                          updated_at: '2026-01-12T16:47:45.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 13
                        serial:
                          type: string
                          example: 54135211-e287-3fcc-aba1-a1048145afab
                        bluetooth_id:
                          type: string
                          example: b9202f3e-e446-350b-b4b8-950a6b163b05
                        company_id:
                          type: string
                          example: null
                        model_id:
                          type: string
                          example: null
                        amputee_id:
                          type: string
                          example: null
                        clinician_id:
                          type: string
                          example: null
                        firmware_version_id:
                          type: string
                          example: null
                        pcb_version_id:
                          type: string
                          example: null
                        reverse_magnets:
                          type: integer
                          example: 0
                        is_electrode:
                          type: integer
                          example: 0
                        active:
                          type: integer
                          example: 1
                        last_activity_at:
                          type: string
                          example: '0000-00-00 00:00:00'
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:45.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:45.000000Z'
                        pivot:
                          type: object
                          properties:
                            device_id:
                              type: integer
                              example: 11
                            electrode_id:
                              type: integer
                              example: 13
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:45.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:45.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to join devices'
                      code: 'DEVICES:JOIN:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to join devices'
                      code:
                        type: string
                        example: 'DEVICES:JOIN:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Devices already joined'
                    type: object
                    example:
                      message: 'Device and electrode already joined'
                      code: 'DEVICES:JOIN:ALREADY_JOINED'
                    properties:
                      message:
                        type: string
                        example: 'Device and electrode already joined'
                      code:
                        type: string
                        example: 'DEVICES:JOIN:ALREADY_JOINED'
                  -
                    description: 'Server error'
                    type: object
                    example:
                      message: 'Server error'
                      code: 'DEVICES:JOIN:SERVER_ERROR'
                    properties:
                      message:
                        type: string
                        example: 'Server error'
                      code:
                        type: string
                        example: 'DEVICES:JOIN:SERVER_ERROR'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device not found'
                    type: object
                    example:
                      message: 'Device not found'
                      code: 'DEVICES:JOIN:DEVICE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device not found'
                      code:
                        type: string
                        example: 'DEVICES:JOIN:DEVICE_NOT_FOUND'
                  -
                    description: 'Device 1 cannot be an electrode'
                    type: object
                    example:
                      message: 'Device 1 cannot be an electrode'
                      code: 'DEVICES:JOIN:INCORRECT_DEVICE1_TYPE'
                    properties:
                      message:
                        type: string
                        example: 'Device 1 cannot be an electrode'
                      code:
                        type: string
                        example: 'DEVICES:JOIN:INCORRECT_DEVICE1_TYPE'
                  -
                    description: 'Device 2 must be an electrode'
                    type: object
                    example:
                      message: 'Device 1 must be an electrode'
                      code: 'DEVICES:JOIN:INCORRECT_DEVICE2_TYPE'
                    properties:
                      message:
                        type: string
                        example: 'Device 1 must be an electrode'
                      code:
                        type: string
                        example: 'DEVICES:JOIN:INCORRECT_DEVICE2_TYPE'
      tags:
        - Devices
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID (hand).'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: electrodeId
        description: 'Device ID (electrode).'
        example: 2
        required: true
        schema:
          type: integer
  '/api/device/unjoin/{deviceId}/{electrodeId}':
    post:
      summary: 'Detach joined devices'
      operationId: detachJoinedDevices
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Devices unjoined'
                  code: 'DEVICES:UNJOIN:UNJOINED'
                properties:
                  message:
                    type: string
                    example: 'Devices unjoined'
                  code:
                    type: string
                    example: 'DEVICES:UNJOIN:UNJOINED'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to join devices'
                      code: 'DEVICES:UNJOIN:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to join devices'
                      code:
                        type: string
                        example: 'DEVICES:UNJOIN:INSUFFICIENT_PERMISSION'
                  -
                    description: OK
                    type: object
                    example:
                      message: 'Devices are not joined'
                      code: 'DEVICES:UNJOIN:NOT_JOINED'
                    properties:
                      message:
                        type: string
                        example: 'Devices are not joined'
                      code:
                        type: string
                        example: 'DEVICES:UNJOIN:NOT_JOINED'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'DEVICES:UNJOIN:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'DEVICES:UNJOIN:DEVICE_NOT_FOUND'
      tags:
        - Devices
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: electrodeId
        description: 'Electrode ID.'
        example: 2
        required: true
        schema:
          type: integer
  '/api/device/{id}/dummy-patient':
    post:
      summary: 'Create demo patient'
      operationId: createDemoPatient
      description: ''
      parameters: []
      responses:
        201:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  email: SERIAL@gmail.com
                  password: Demo@123
                properties:
                  email:
                    type: string
                    example: SERIAL@gmail.com
                  password:
                    type: string
                    example: Demo@123
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to create dummy patient'
                      code: 'DEVICES:DUMMY_PATIENT:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to create dummy patient'
                      code:
                        type: string
                        example: 'DEVICES:DUMMY_PATIENT:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Device already has a patient'
                    type: object
                    example:
                      message: 'Device already has a patient'
                      code: 'DEVICES:DUMMY_PATIENT:PATIENT_EXISTS'
                    properties:
                      message:
                        type: string
                        example: 'Device already has a patient'
                      code:
                        type: string
                        example: 'DEVICES:DUMMY_PATIENT:PATIENT_EXISTS'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'DEVICES:DUMMY_PATIENT:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'DEVICES:DUMMY_PATIENT:DEVICE_NOT_FOUND'
        500:
          description: 'Server error'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Server error: dummy patient not created'
                  code: 'DEVICES:DUMMY_PATIENT:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Server error: dummy patient not created'
                  code:
                    type: string
                    example: 'DEVICES:DUMMY_PATIENT:SERVER_ERROR'
      tags:
        - Devices
    parameters:
      -
        in: path
        name: id
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/documents:
    get:
      summary: 'List documents'
      operationId: listDocuments
      description: ''
      parameters:
        -
          in: query
          name: type
          description: 'Filter documents by type.'
          example: web
          required: false
          schema:
            type: string
            description: 'Filter documents by type.'
            example: web
            enum:
              - web
              - mobile
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      name: 'Valve Repairer OR Regulator Repairer'
                      type: mobile
                      created_at: '2026-01-12T16:48:04.000000Z'
                      updated_at: '2026-01-12T16:48:04.000000Z'
                    -
                      id: 2
                      name: 'Business Teacher'
                      type: web
                      created_at: '2026-01-12T16:48:04.000000Z'
                      updated_at: '2026-01-12T16:48:04.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        name: 'Valve Repairer OR Regulator Repairer'
                        type: mobile
                        created_at: '2026-01-12T16:48:04.000000Z'
                        updated_at: '2026-01-12T16:48:04.000000Z'
                      -
                        id: 2
                        name: 'Business Teacher'
                        type: web
                        created_at: '2026-01-12T16:48:04.000000Z'
                        updated_at: '2026-01-12T16:48:04.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'Valve Repairer OR Regulator Repairer'
                        type:
                          type: string
                          example: mobile
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:04.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage documents'
                  code: 'DOCUMENTS:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage documents'
                  code:
                    type: string
                    example: 'DOCUMENTS:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - Documents
    post:
      summary: 'Create document'
      operationId: createDocument
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  name: 'Speech-Language Pathologist'
                  type: mobile
                  created_at: '2026-01-12T16:48:04.000000Z'
                  updated_at: '2026-01-12T16:48:04.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  name:
                    type: string
                    example: 'Speech-Language Pathologist'
                  type:
                    type: string
                    example: mobile
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage documents'
                  code: 'DOCUMENTS:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage documents'
                  code:
                    type: string
                    example: 'DOCUMENTS:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - Documents
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Document name.'
                  example: 'Privacy Policy'
                type:
                  type: string
                  description: 'Document destination.'
                  example: web
                  enum:
                    - web
                    - mobile
              required:
                - name
                - type
  '/api/documents/{documentId}':
    delete:
      summary: 'Delete document'
      operationId: deleteDocument
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Document deleted'
                  code: 'DOCUMENTS:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Document deleted'
                  code:
                    type: string
                    example: 'DOCUMENTS:DELETE:DELETED'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage documents'
                      code: 'DOCUMENTS:DELETE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage documents'
                      code:
                        type: string
                        example: 'DOCUMENTS:DELETE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Document has existing versions'
                    type: object
                    example:
                      message: 'Cannot delete: document has existing versions (1)'
                      code: 'DOCUMENTS:DELETE:HAS_VERSIONS'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete: document has existing versions (1)'
                      code:
                        type: string
                        example: 'DOCUMENTS:DELETE:HAS_VERSIONS'
        404:
          description: 'Document not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Document not found'
                  code: 'DOCUMENTS:DELETE:DOCUMENT_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Document not found'
                  code:
                    type: string
                    example: 'DOCUMENTS:DELETE:DOCUMENT_NOT_FOUND'
      tags:
        - Documents
    parameters:
      -
        in: path
        name: documentId
        description: 'Document ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/documents/{documentId}/versions':
    get:
      summary: 'List document versions'
      operationId: listDocumentVersions
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 1
                    document_id:
                      type: string
                      example: null
                    index:
                      type: integer
                      example: 22
                    file:
                      type: string
                      example: 'http://pagac.org/asperiores-similique-omnis-esse-recusandae-rerum'
                    created_at:
                      type: string
                      example: '2026-01-12T16:48:04.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:48:04.000000Z'
                example:
                  -
                    id: 1
                    document_id: null
                    index: 22
                    file: 'http://pagac.org/asperiores-similique-omnis-esse-recusandae-rerum'
                    created_at: '2026-01-12T16:48:04.000000Z'
                    updated_at: '2026-01-12T16:48:04.000000Z'
                  -
                    id: 2
                    document_id: null
                    index: 85408546
                    file: 'http://towne.com/praesentium-officiis-at-sequi-quos-veritatis'
                    created_at: '2026-01-12T16:48:04.000000Z'
                    updated_at: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage documents'
                  code: 'DOCUMENTS:LIST_VERSIONS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage documents'
                  code:
                    type: string
                    example: 'DOCUMENTS:LIST_VERSIONS:INSUFFICIENT_PERMISSION'
        404:
          description: 'Document not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Document not found'
                  code: 'DOCUMENTS:LIST_VERSIONS:DOCUMENT_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Document not found'
                  code:
                    type: string
                    example: 'DOCUMENTS:LIST_VERSIONS:DOCUMENT_NOT_FOUND'
      tags:
        - Documents
    post:
      summary: 'Create document version'
      operationId: createDocumentVersion
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  document_id: null
                  index: 526885221
                  file: 'http://koss.info/'
                  created_at: '2026-01-12T16:48:04.000000Z'
                  updated_at: '2026-01-12T16:48:04.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  document_id:
                    type: string
                    example: null
                  index:
                    type: integer
                    example: 526885221
                  file:
                    type: string
                    example: 'http://koss.info/'
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage documents'
                  code: 'DOCUMENTS:CREATE_VERSION:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage documents'
                  code:
                    type: string
                    example: 'DOCUMENTS:CREATE_VERSION:INSUFFICIENT_PERMISSION'
        404:
          description: 'Document not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Document not found'
                  code: 'DOCUMENTS:CREATE_VERSION:DOCUMENT_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Document not found'
                  code:
                    type: string
                    example: 'DOCUMENTS:CREATE_VERSION:DOCUMENT_NOT_FOUND'
      tags:
        - Documents
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                file:
                  type: string
                  description: 'URL to document file. Must be a valid URL.'
                  example: 'https://www.aetherbiomedical.com/privacy-policy'
              required:
                - file
    parameters:
      -
        in: path
        name: documentId
        description: 'Document ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/documents/{documentId}/versions/{versionId}':
    delete:
      summary: 'Delete document version'
      operationId: deleteDocumentVersion
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Document version deleted'
                  code: 'DOCUMENTS:DELETE_VERSION:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Document version deleted'
                  code:
                    type: string
                    example: 'DOCUMENTS:DELETE_VERSION:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage documents'
                  code: 'DOCUMENTS:DELETE_VERSION:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage documents'
                  code:
                    type: string
                    example: 'DOCUMENTS:DELETE_VERSION:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Document not found'
                    type: object
                    example:
                      message: 'Document not found'
                      code: 'DOCUMENTS:DELETE_VERSION:DOCUMENT_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Document not found'
                      code:
                        type: string
                        example: 'DOCUMENTS:DELETE_VERSION:DOCUMENT_NOT_FOUND'
                  -
                    description: 'Document version not found'
                    type: object
                    example:
                      message: 'Document version not found'
                      code: 'DOCUMENTS:DELETE_VERSION:VERSION_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Document version not found'
                      code:
                        type: string
                        example: 'DOCUMENTS:DELETE_VERSION:VERSION_NOT_FOUND'
      tags:
        - Documents
    parameters:
      -
        in: path
        name: documentId
        description: 'Document ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: versionId
        description: 'DocumentVersion ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/documents/status:
    get:
      summary: 'Get documents status'
      operationId: getDocumentsStatus
      description: "Any document on the list has to be accepted. Use <code>POST /documents/accept</code> endpoint to mark them as accepted once user agrees to that.\n\t\tEmpty list means that user is up-to-date with all required documents and nothing has to be accepted."
      parameters:
        -
          in: query
          name: type
          description: 'Filter documents by type.'
          example: web
          required: false
          schema:
            type: string
            description: 'Filter documents by type.'
            example: web
            enum:
              - web
              - mobile
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  documents: []
                  texts:
                    title: 'Changes to the Privacy Policy'
                    description: 'Due to the addition of a new data processing entity, please familiarize yourself with and accept the new privacy policy'
                    checkbox: 'I declare that I have read the content of the Privacy Policy and the Terms and Conditions and accept their provisions. I understand that acceptance is a condition for using the application.'
                properties:
                  documents:
                    type: array
                    example: []
                  texts:
                    type: object
                    properties:
                      title:
                        type: string
                        example: 'Changes to the Privacy Policy'
                      description:
                        type: string
                        example: 'Due to the addition of a new data processing entity, please familiarize yourself with and accept the new privacy policy'
                      checkbox:
                        type: string
                        example: 'I declare that I have read the content of the Privacy Policy and the Terms and Conditions and accept their provisions. I understand that acceptance is a condition for using the application.'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view documents status'
                  code: 'DOCUMENTS:STATUS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view documents status'
                  code:
                    type: string
                    example: 'DOCUMENTS:STATUS:INSUFFICIENT_PERMISSION'
      tags:
        - Documents
  /api/documents/accept:
    post:
      summary: 'Accept documents'
      operationId: acceptDocuments
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Accepted 1 document(s)'
                  code: 'DOCUMENTS:ACCEPT:ACCEPTED'
                properties:
                  message:
                    type: string
                    example: 'Accepted 1 document(s)'
                  code:
                    type: string
                    example: 'DOCUMENTS:ACCEPT:ACCEPTED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update documents status'
                  code: 'DOCUMENTS:ACCEPT:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update documents status'
                  code:
                    type: string
                    example: 'DOCUMENTS:ACCEPT:INSUFFICIENT_PERMISSION'
      tags:
        - Documents
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                documents:
                  type: array
                  description: 'Document Version ID. The <code>id</code> of an existing record in the App\Models\DocumentVersion table.'
                  example:
                    - 1
                  items:
                    type: integer
              required:
                - documents
  '/api/feedback/{token}/check':
    post:
      summary: 'Check feedback token'
      operationId: checkFeedbackToken
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  valid: true
                properties:
                  valid:
                    type: boolean
                    example: true
      tags:
        - Feedback
      security: []
    parameters:
      -
        in: path
        name: token
        description: 'Authentication token'
        example: 4KJ2YLM0MA64Y6D6FUY2OFY690IICO1OJ2DHR6T68IZNI528H3SKUFJMY0C5DHOA
        required: true
        schema:
          type: string
  '/api/feedback/{token}':
    post:
      summary: 'Send feedback with token'
      operationId: sendFeedbackWithToken
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  user_id: 6
                  type: on_demand
                  trigger: firmware_update
                  platform: mobile
                  rate: 3
                  description: 'Consectetur ut autem dicta impedit et quasi nam eligendi.'
                  skipped: 0
                  created_at: '2026-01-12T16:47:41.000000Z'
                  updated_at: '2026-01-12T16:47:41.000000Z'
                properties:
                  id:
                    type: integer
                    example: 1
                  user_id:
                    type: integer
                    example: 6
                  type:
                    type: string
                    example: on_demand
                  trigger:
                    type: string
                    example: firmware_update
                  platform:
                    type: string
                    example: mobile
                  rate:
                    type: integer
                    example: 3
                  description:
                    type: string
                    example: 'Consectetur ut autem dicta impedit et quasi nam eligendi.'
                  skipped:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:41.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:41.000000Z'
        403:
          description: 'Invalid token'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invalid token'
                  code: 'FEEDBACK:SEND_WITH_TOKEN:INVALID_TOKEN'
                properties:
                  message:
                    type: string
                    example: 'Invalid token'
                  code:
                    type: string
                    example: 'FEEDBACK:SEND_WITH_TOKEN:INVALID_TOKEN'
      tags:
        - Feedback
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                rate:
                  type: integer
                  description: "User's rating. MINIMUM:NUMBER:0 MAXIMUM:NUMBER:5."
                  example: 5
                description:
                  type: string
                  description: "User's description."
                  example: 'That was amazing!'
                skipped:
                  type: boolean
                  description: 'Feedback skipped by the user.'
                  example: false
      security: []
    parameters:
      -
        in: path
        name: token
        description: 'Authentication token'
        example: 4KJ2YLM0MA64Y6D6FUY2OFY690IICO1OJ2DHR6T68IZNI528H3SKUFJMY0C5DHOA
        required: true
        schema:
          type: string
  /api/feedback/status:
    get:
      summary: 'Get feedback status'
      operationId: getFeedbackStatus
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  remote_session: true
                  firmware_update: true
                  local_session: true
                  async_session: true
                  patient_create: false
                  clinician_invite: true
                properties:
                  remote_session:
                    type: boolean
                    example: true
                  firmware_update:
                    type: boolean
                    example: true
                  local_session:
                    type: boolean
                    example: true
                  async_session:
                    type: boolean
                    example: true
                  patient_create:
                    type: boolean
                    example: false
                  clinician_invite:
                    type: boolean
                    example: true
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to check feedback status'
                  code: 'FEEDBACK:STATUS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to check feedback status'
                  code:
                    type: string
                    example: 'FEEDBACK:STATUS:INSUFFICIENT_PERMISSION'
      tags:
        - Feedback
  /api/feedback:
    post:
      summary: 'Send feedback'
      operationId: sendFeedback
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 2
                  user_id: 306
                  type: contextual
                  trigger: patient_create
                  platform: web
                  rate: 4
                  description: 'Non ad quis ut quibusdam repudiandae.'
                  skipped: 0
                  created_at: '2026-01-12T16:48:09.000000Z'
                  updated_at: '2026-01-12T16:48:09.000000Z'
                properties:
                  id:
                    type: integer
                    example: 2
                  user_id:
                    type: integer
                    example: 306
                  type:
                    type: string
                    example: contextual
                  trigger:
                    type: string
                    example: patient_create
                  platform:
                    type: string
                    example: web
                  rate:
                    type: integer
                    example: 4
                  description:
                    type: string
                    example: 'Non ad quis ut quibusdam repudiandae.'
                  skipped:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:09.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:09.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to send feedback'
                  code: 'FEEDBACK:SEND:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to send feedback'
                  code:
                    type: string
                    example: 'FEEDBACK:SEND:INSUFFICIENT_PERMISSION'
      tags:
        - Feedback
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                type:
                  type: string
                  description: 'Type of feedback.'
                  example: contextual
                  enum:
                    - contextual
                    - on_demand
                    - periodic
                trigger:
                  type: string
                  description: 'Feedback trigger.'
                  example: remote_session
                  enum:
                    - remote_session
                    - local_session
                    - async_session
                    - patient_create
                    - clinician_invite
                    - firmware_update
                    - new_config
                    - grip_change
                platform:
                  type: string
                  description: 'Feedback platform.'
                  example: web
                  enum:
                    - web
                    - mobile
                rate:
                  type: integer
                  description: "User's rating. MINIMUM:NUMBER:0 MAXIMUM:NUMBER:5."
                  example: 5
                description:
                  type: string
                  description: "User's description."
                  example: 'That was amazing!'
                skipped:
                  type: boolean
                  description: 'Feedback skipped by the user.'
                  example: false
              required:
                - type
                - platform
    get:
      summary: 'List feedback'
      operationId: listFeedback
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 25
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 3
                      user_id: 307
                      type: contextual
                      trigger: clinician_invite
                      platform: web
                      rate: 2
                      description: 'Ea et autem adipisci ut excepturi.'
                      skipped: 1
                      created_at: '2026-01-12T16:48:10.000000Z'
                      updated_at: '2026-01-12T16:48:10.000000Z'
                    -
                      id: 4
                      user_id: 308
                      type: periodic
                      trigger: patient_create
                      platform: mobile
                      rate: 3
                      description: 'Cupiditate modi aperiam odit in rem.'
                      skipped: 0
                      created_at: '2026-01-12T16:48:10.000000Z'
                      updated_at: '2026-01-12T16:48:10.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 25
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 3
                        user_id: 307
                        type: contextual
                        trigger: clinician_invite
                        platform: web
                        rate: 2
                        description: 'Ea et autem adipisci ut excepturi.'
                        skipped: 1
                        created_at: '2026-01-12T16:48:10.000000Z'
                        updated_at: '2026-01-12T16:48:10.000000Z'
                      -
                        id: 4
                        user_id: 308
                        type: periodic
                        trigger: patient_create
                        platform: mobile
                        rate: 3
                        description: 'Cupiditate modi aperiam odit in rem.'
                        skipped: 0
                        created_at: '2026-01-12T16:48:10.000000Z'
                        updated_at: '2026-01-12T16:48:10.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 3
                        user_id:
                          type: integer
                          example: 307
                        type:
                          type: string
                          example: contextual
                        trigger:
                          type: string
                          example: clinician_invite
                        platform:
                          type: string
                          example: web
                        rate:
                          type: integer
                          example: 2
                        description:
                          type: string
                          example: 'Ea et autem adipisci ut excepturi.'
                        skipped:
                          type: integer
                          example: 1
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:10.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:10.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list feedback'
                  code: 'FEEDBACK:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list feedback'
                  code:
                    type: string
                    example: 'FEEDBACK:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - Feedback
  /api/feedback/csv:
    get:
      summary: 'Export feedback to CSV'
      operationId: exportFeedbackToCSV
      description: ''
      parameters: []
      responses:
        200:
          description: 'CSV file'
          content:
            application/json:
              schema:
                type: object
                example:
                  file: 'https://staging-us-east-2-aether-biomedical-s3-us-bucket.s3.us-east-2.amazonaws.com/feedback/feedback-1759228216.csv'
                  expires: '2025-09-30 10:40:00'
                properties:
                  file:
                    type: string
                    example: 'https://staging-us-east-2-aether-biomedical-s3-us-bucket.s3.us-east-2.amazonaws.com/feedback/feedback-1759228216.csv'
                  expires:
                    type: string
                    example: '2025-09-30 10:40:00'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to export feedback'
                  code: 'FEEDBACK:EXPORT_CSV:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to export feedback'
                  code:
                    type: string
                    example: 'FEEDBACK:EXPORT_CSV:INSUFFICIENT_PERMISSION'
      tags:
        - Feedback
  /api/feedback/cooldowns:
    get:
      summary: 'Get feedback cooldowns'
      operationId: getFeedbackCooldowns
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  remote_session: 1
                  local_session: 1
                  async_session: 1
                  patient_create: 1
                  clinician_invite: 1
                  firmware_update: 1
                  new_config: 1
                  grip_change: 1
                properties:
                  remote_session:
                    type: integer
                    example: 1
                  local_session:
                    type: integer
                    example: 1
                  async_session:
                    type: integer
                    example: 1
                  patient_create:
                    type: integer
                    example: 1
                  clinician_invite:
                    type: integer
                    example: 1
                  firmware_update:
                    type: integer
                    example: 1
                  new_config:
                    type: integer
                    example: 1
                  grip_change:
                    type: integer
                    example: 1
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage feedback cooldowns'
                  code: 'FEEDBACK:GET_COOLDOWNS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage feedback cooldowns'
                  code:
                    type: string
                    example: 'FEEDBACK:GET_COOLDOWNS:INSUFFICIENT_PERMISSION'
      tags:
        - Feedback
    put:
      summary: 'Update feedback cooldowns'
      operationId: updateFeedbackCooldowns
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  remote_session: 1
                  local_session: 1
                  async_session: 1
                  patient_create: 1
                  clinician_invite: 1
                  firmware_update: 1
                  new_config: 1
                  grip_change: 1
                properties:
                  remote_session:
                    type: integer
                    example: 1
                  local_session:
                    type: integer
                    example: 1
                  async_session:
                    type: integer
                    example: 1
                  patient_create:
                    type: integer
                    example: 1
                  clinician_invite:
                    type: integer
                    example: 1
                  firmware_update:
                    type: integer
                    example: 1
                  new_config:
                    type: integer
                    example: 1
                  grip_change:
                    type: integer
                    example: 1
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage feedback cooldowns'
                  code: 'FEEDBACK:UPDATE_COOLDOWNS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage feedback cooldowns'
                  code:
                    type: string
                    example: 'FEEDBACK:UPDATE_COOLDOWNS:INSUFFICIENT_PERMISSION'
      tags:
        - Feedback
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                remote_session:
                  type: integer
                  description: 'Cooldown for remote session trigger. MINIMUM:NUMBER:1.'
                  example: 1
                local_session:
                  type: integer
                  description: 'Cooldown for local session trigger. MINIMUM:NUMBER:1.'
                  example: 1
                async_session:
                  type: integer
                  description: 'Cooldown for async session trigger. MINIMUM:NUMBER:1.'
                  example: 1
                patient_create:
                  type: integer
                  description: 'Cooldown for patient create trigger. MINIMUM:NUMBER:1.'
                  example: 1
                clinician_invite:
                  type: integer
                  description: 'Cooldown for clinician invite trigger. MINIMUM:NUMBER:1.'
                  example: 1
                firmware_update:
                  type: integer
                  description: 'Cooldown for firmware update trigger. MINIMUM:NUMBER:1.'
                  example: 1
                new_config:
                  type: integer
                  description: 'Cooldown for new config trigger. MINIMUM:NUMBER:1.'
                  example: 1
                grip_change:
                  type: integer
                  description: 'Cooldown for grip change trigger. MINIMUM:NUMBER:1.'
                  example: 1
  /api/timezones:
    get:
      summary: 'Get supported timezones list'
      operationId: getSupportedTimezonesList
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
                example:
                  - Africa/Abidjan
                  - Africa/Accra
                  - Africa/Addis_Ababa
                  - Africa/Algiers
                  - Africa/Asmara
                  - Africa/Bamako
                  - Africa/Bangui
                  - Africa/Banjul
                  - Africa/Bissau
                  - Africa/Blantyre
                  - Africa/Brazzaville
                  - Africa/Bujumbura
                  - Africa/Cairo
                  - Africa/Casablanca
                  - Africa/Ceuta
                  - Africa/Conakry
                  - Africa/Dakar
                  - Africa/Dar_es_Salaam
                  - Africa/Djibouti
                  - Africa/Douala
                  - Africa/El_Aaiun
                  - Africa/Freetown
                  - Africa/Gaborone
                  - Africa/Harare
                  - Africa/Johannesburg
                  - Africa/Juba
                  - Africa/Kampala
                  - Africa/Khartoum
                  - Africa/Kigali
                  - Africa/Kinshasa
                  - Africa/Lagos
                  - Africa/Libreville
                  - Africa/Lome
                  - Africa/Luanda
                  - Africa/Lubumbashi
                  - Africa/Lusaka
                  - Africa/Malabo
                  - Africa/Maputo
                  - Africa/Maseru
                  - Africa/Mbabane
                  - Africa/Mogadishu
                  - Africa/Monrovia
                  - Africa/Nairobi
                  - Africa/Ndjamena
                  - Africa/Niamey
                  - Africa/Nouakchott
                  - Africa/Ouagadougou
                  - Africa/Porto-Novo
                  - Africa/Sao_Tome
                  - Africa/Tripoli
                  - Africa/Tunis
                  - Africa/Windhoek
                  - America/Adak
                  - America/Anchorage
                  - America/Anguilla
                  - America/Antigua
                  - America/Araguaina
                  - America/Argentina/Buenos_Aires
                  - America/Argentina/Catamarca
                  - America/Argentina/Cordoba
                  - America/Argentina/Jujuy
                  - America/Argentina/La_Rioja
                  - America/Argentina/Mendoza
                  - America/Argentina/Rio_Gallegos
                  - America/Argentina/Salta
                  - America/Argentina/San_Juan
                  - America/Argentina/San_Luis
                  - America/Argentina/Tucuman
                  - America/Argentina/Ushuaia
                  - America/Aruba
                  - America/Asuncion
                  - America/Atikokan
                  - America/Bahia
                  - America/Bahia_Banderas
                  - America/Barbados
                  - America/Belem
                  - America/Belize
                  - America/Blanc-Sablon
                  - America/Boa_Vista
                  - America/Bogota
                  - America/Boise
                  - America/Cambridge_Bay
                  - America/Campo_Grande
                  - America/Cancun
                  - America/Caracas
                  - America/Cayenne
                  - America/Cayman
                  - America/Chicago
                  - America/Chihuahua
                  - America/Costa_Rica
                  - America/Creston
                  - America/Cuiaba
                  - America/Curacao
                  - America/Danmarkshavn
                  - America/Dawson
                  - America/Dawson_Creek
                  - America/Denver
                  - America/Detroit
                  - America/Dominica
                  - America/Edmonton
                  - America/Eirunepe
                  - America/El_Salvador
                  - America/Fort_Nelson
                  - America/Fortaleza
                  - America/Glace_Bay
                  - America/Goose_Bay
                  - America/Grand_Turk
                  - America/Grenada
                  - America/Guadeloupe
                  - America/Guatemala
                  - America/Guayaquil
                  - America/Guyana
                  - America/Halifax
                  - America/Havana
                  - America/Hermosillo
                  - America/Indiana/Indianapolis
                  - America/Indiana/Knox
                  - America/Indiana/Marengo
                  - America/Indiana/Petersburg
                  - America/Indiana/Tell_City
                  - America/Indiana/Vevay
                  - America/Indiana/Vincennes
                  - America/Indiana/Winamac
                  - America/Inuvik
                  - America/Iqaluit
                  - America/Jamaica
                  - America/Juneau
                  - America/Kentucky/Louisville
                  - America/Kentucky/Monticello
                  - America/Kralendijk
                  - America/La_Paz
                  - America/Lima
                  - America/Los_Angeles
                  - America/Lower_Princes
                  - America/Maceio
                  - America/Managua
                  - America/Manaus
                  - America/Marigot
                  - America/Martinique
                  - America/Matamoros
                  - America/Mazatlan
                  - America/Menominee
                  - America/Merida
                  - America/Metlakatla
                  - America/Mexico_City
                  - America/Miquelon
                  - America/Moncton
                  - America/Monterrey
                  - America/Montevideo
                  - America/Montserrat
                  - America/Nassau
                  - America/New_York
                  - America/Nipigon
                  - America/Nome
                  - America/Noronha
                  - America/North_Dakota/Beulah
                  - America/North_Dakota/Center
                  - America/North_Dakota/New_Salem
                  - America/Nuuk
                  - America/Ojinaga
                  - America/Panama
                  - America/Pangnirtung
                  - America/Paramaribo
                  - America/Phoenix
                  - America/Port-au-Prince
                  - America/Port_of_Spain
                  - America/Porto_Velho
                  - America/Puerto_Rico
                  - America/Punta_Arenas
                  - America/Rainy_River
                  - America/Rankin_Inlet
                  - America/Recife
                  - America/Regina
                  - America/Resolute
                  - America/Rio_Branco
                  - America/Santarem
                  - America/Santiago
                  - America/Santo_Domingo
                  - America/Sao_Paulo
                  - America/Scoresbysund
                  - America/Sitka
                  - America/St_Barthelemy
                  - America/St_Johns
                  - America/St_Kitts
                  - America/St_Lucia
                  - America/St_Thomas
                  - America/St_Vincent
                  - America/Swift_Current
                  - America/Tegucigalpa
                  - America/Thule
                  - America/Thunder_Bay
                  - America/Tijuana
                  - America/Toronto
                  - America/Tortola
                  - America/Vancouver
                  - America/Whitehorse
                  - America/Winnipeg
                  - America/Yakutat
                  - America/Yellowknife
                  - Antarctica/Casey
                  - Antarctica/Davis
                  - Antarctica/DumontDUrville
                  - Antarctica/Macquarie
                  - Antarctica/Mawson
                  - Antarctica/McMurdo
                  - Antarctica/Palmer
                  - Antarctica/Rothera
                  - Antarctica/Syowa
                  - Antarctica/Troll
                  - Antarctica/Vostok
                  - Arctic/Longyearbyen
                  - Asia/Aden
                  - Asia/Almaty
                  - Asia/Amman
                  - Asia/Anadyr
                  - Asia/Aqtau
                  - Asia/Aqtobe
                  - Asia/Ashgabat
                  - Asia/Atyrau
                  - Asia/Baghdad
                  - Asia/Bahrain
                  - Asia/Baku
                  - Asia/Bangkok
                  - Asia/Barnaul
                  - Asia/Beirut
                  - Asia/Bishkek
                  - Asia/Brunei
                  - Asia/Chita
                  - Asia/Choibalsan
                  - Asia/Colombo
                  - Asia/Damascus
                  - Asia/Dhaka
                  - Asia/Dili
                  - Asia/Dubai
                  - Asia/Dushanbe
                  - Asia/Famagusta
                  - Asia/Gaza
                  - Asia/Hebron
                  - Asia/Ho_Chi_Minh
                  - Asia/Hong_Kong
                  - Asia/Hovd
                  - Asia/Irkutsk
                  - Asia/Jakarta
                  - Asia/Jayapura
                  - Asia/Jerusalem
                  - Asia/Kabul
                  - Asia/Kamchatka
                  - Asia/Karachi
                  - Asia/Kathmandu
                  - Asia/Khandyga
                  - Asia/Kolkata
                  - Asia/Krasnoyarsk
                  - Asia/Kuala_Lumpur
                  - Asia/Kuching
                  - Asia/Kuwait
                  - Asia/Macau
                  - Asia/Magadan
                  - Asia/Makassar
                  - Asia/Manila
                  - Asia/Muscat
                  - Asia/Nicosia
                  - Asia/Novokuznetsk
                  - Asia/Novosibirsk
                  - Asia/Omsk
                  - Asia/Oral
                  - Asia/Phnom_Penh
                  - Asia/Pontianak
                  - Asia/Pyongyang
                  - Asia/Qatar
                  - Asia/Qostanay
                  - Asia/Qyzylorda
                  - Asia/Riyadh
                  - Asia/Sakhalin
                  - Asia/Samarkand
                  - Asia/Seoul
                  - Asia/Shanghai
                  - Asia/Singapore
                  - Asia/Srednekolymsk
                  - Asia/Taipei
                  - Asia/Tashkent
                  - Asia/Tbilisi
                  - Asia/Tehran
                  - Asia/Thimphu
                  - Asia/Tokyo
                  - Asia/Tomsk
                  - Asia/Ulaanbaatar
                  - Asia/Urumqi
                  - Asia/Ust-Nera
                  - Asia/Vientiane
                  - Asia/Vladivostok
                  - Asia/Yakutsk
                  - Asia/Yangon
                  - Asia/Yekaterinburg
                  - Asia/Yerevan
                  - Atlantic/Azores
                  - Atlantic/Bermuda
                  - Atlantic/Canary
                  - Atlantic/Cape_Verde
                  - Atlantic/Faroe
                  - Atlantic/Madeira
                  - Atlantic/Reykjavik
                  - Atlantic/South_Georgia
                  - Atlantic/St_Helena
                  - Atlantic/Stanley
                  - Australia/Adelaide
                  - Australia/Brisbane
                  - Australia/Broken_Hill
                  - Australia/Darwin
                  - Australia/Eucla
                  - Australia/Hobart
                  - Australia/Lindeman
                  - Australia/Lord_Howe
                  - Australia/Melbourne
                  - Australia/Perth
                  - Australia/Sydney
                  - Europe/Amsterdam
                  - Europe/Andorra
                  - Europe/Astrakhan
                  - Europe/Athens
                  - Europe/Belgrade
                  - Europe/Berlin
                  - Europe/Bratislava
                  - Europe/Brussels
                  - Europe/Bucharest
                  - Europe/Budapest
                  - Europe/Busingen
                  - Europe/Chisinau
                  - Europe/Copenhagen
                  - Europe/Dublin
                  - Europe/Gibraltar
                  - Europe/Guernsey
                  - Europe/Helsinki
                  - Europe/Isle_of_Man
                  - Europe/Istanbul
                  - Europe/Jersey
                  - Europe/Kaliningrad
                  - Europe/Kiev
                  - Europe/Kirov
                  - Europe/Lisbon
                  - Europe/Ljubljana
                  - Europe/London
                  - Europe/Luxembourg
                  - Europe/Madrid
                  - Europe/Malta
                  - Europe/Mariehamn
                  - Europe/Minsk
                  - Europe/Monaco
                  - Europe/Moscow
                  - Europe/Oslo
                  - Europe/Paris
                  - Europe/Podgorica
                  - Europe/Prague
                  - Europe/Riga
                  - Europe/Rome
                  - Europe/Samara
                  - Europe/San_Marino
                  - Europe/Sarajevo
                  - Europe/Saratov
                  - Europe/Simferopol
                  - Europe/Skopje
                  - Europe/Sofia
                  - Europe/Stockholm
                  - Europe/Tallinn
                  - Europe/Tirane
                  - Europe/Ulyanovsk
                  - Europe/Uzhgorod
                  - Europe/Vaduz
                  - Europe/Vatican
                  - Europe/Vienna
                  - Europe/Vilnius
                  - Europe/Volgograd
                  - Europe/Warsaw
                  - Europe/Zagreb
                  - Europe/Zaporozhye
                  - Europe/Zurich
                  - Indian/Antananarivo
                  - Indian/Chagos
                  - Indian/Christmas
                  - Indian/Cocos
                  - Indian/Comoro
                  - Indian/Kerguelen
                  - Indian/Mahe
                  - Indian/Maldives
                  - Indian/Mauritius
                  - Indian/Mayotte
                  - Indian/Reunion
                  - Pacific/Apia
                  - Pacific/Auckland
                  - Pacific/Bougainville
                  - Pacific/Chatham
                  - Pacific/Chuuk
                  - Pacific/Easter
                  - Pacific/Efate
                  - Pacific/Fakaofo
                  - Pacific/Fiji
                  - Pacific/Funafuti
                  - Pacific/Galapagos
                  - Pacific/Gambier
                  - Pacific/Guadalcanal
                  - Pacific/Guam
                  - Pacific/Honolulu
                  - Pacific/Kanton
                  - Pacific/Kiritimati
                  - Pacific/Kosrae
                  - Pacific/Kwajalein
                  - Pacific/Majuro
                  - Pacific/Marquesas
                  - Pacific/Midway
                  - Pacific/Nauru
                  - Pacific/Niue
                  - Pacific/Norfolk
                  - Pacific/Noumea
                  - Pacific/Pago_Pago
                  - Pacific/Palau
                  - Pacific/Pitcairn
                  - Pacific/Pohnpei
                  - Pacific/Port_Moresby
                  - Pacific/Rarotonga
                  - Pacific/Saipan
                  - Pacific/Tahiti
                  - Pacific/Tarawa
                  - Pacific/Tongatapu
                  - Pacific/Wake
                  - Pacific/Wallis
                  - UTC
      tags:
        - GeoData
      security: []
  /api/grips:
    get:
      summary: 'List grips'
      operationId: listGrips
      description: ''
      parameters:
        -
          in: query
          name: model
          description: "Device Model ID. Use this parameter to receive the correct grip images in the <code>image</code> field.\n\t\tWhen not present, all images will be listed in <code>images</code> array."
          example: 1
          required: false
          schema:
            type: integer
            description: "Device Model ID. Use this parameter to receive the correct grip images in the <code>image</code> field.\n\t\tWhen not present, all images will be listed in <code>images</code> array."
            example: 1
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 1
                    number:
                      type: integer
                      example: 4550
                    name:
                      type: string
                      example: 'cupiditate grip'
                    description:
                      type: string
                      example: null
                    opposed:
                      type: integer
                      example: 0
                    created_at:
                      type: string
                      example: '2026-01-12T16:48:04.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:48:04.000000Z'
                example:
                  -
                    id: 1
                    number: 4550
                    name: 'cupiditate grip'
                    description: null
                    opposed: 0
                    created_at: '2026-01-12T16:48:04.000000Z'
                    updated_at: '2026-01-12T16:48:04.000000Z'
                  -
                    id: 2
                    number: 7735
                    name: 'excepturi grip'
                    description: null
                    opposed: 0
                    created_at: '2026-01-12T16:48:04.000000Z'
                    updated_at: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view grips'
                  code: 'GOALS:LIST_GRIPS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view grips'
                  code:
                    type: string
                    example: 'GOALS:LIST_GRIPS:INSUFFICIENT_PERMISSION'
      tags:
        - Goals
  /api/exercises:
    get:
      summary: 'List exercises'
      operationId: listExercises
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      name: 'exercises.Boyer Tunnel'
                      description: 'exercises.Voluptas quia perferendis officia est.'
                      icon: 😨
                      created_at: '2026-01-12T16:48:05.000000Z'
                      updated_at: '2026-01-12T16:48:05.000000Z'
                    -
                      id: 2
                      name: 'exercises.Franecki Loaf'
                      description: 'exercises.Aperiam explicabo aut ea nostrum sunt et molestiae.'
                      icon: 😌
                      created_at: '2026-01-12T16:48:05.000000Z'
                      updated_at: '2026-01-12T16:48:05.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        name: 'exercises.Boyer Tunnel'
                        description: 'exercises.Voluptas quia perferendis officia est.'
                        icon: 😨
                        created_at: '2026-01-12T16:48:05.000000Z'
                        updated_at: '2026-01-12T16:48:05.000000Z'
                      -
                        id: 2
                        name: 'exercises.Franecki Loaf'
                        description: 'exercises.Aperiam explicabo aut ea nostrum sunt et molestiae.'
                        icon: 😌
                        created_at: '2026-01-12T16:48:05.000000Z'
                        updated_at: '2026-01-12T16:48:05.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'exercises.Boyer Tunnel'
                        description:
                          type: string
                          example: 'exercises.Voluptas quia perferendis officia est.'
                        icon:
                          type: string
                          example: 😨
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:05.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:05.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view exercises'
                  code: 'GOALS:LIST_EXERCISES:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view exercises'
                  code:
                    type: string
                    example: 'GOALS:LIST_EXERCISES:INSUFFICIENT_PERMISSION'
      tags:
        - Goals
    post:
      summary: 'Create exercise'
      operationId: createExercise
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  name: 'exercises.Yundt Tunnel'
                  description: 'exercises.Ea est voluptates quam voluptas suscipit doloremque.'
                  icon: 😬
                  created_at: '2026-01-12T16:48:05.000000Z'
                  updated_at: '2026-01-12T16:48:05.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  name:
                    type: string
                    example: 'exercises.Yundt Tunnel'
                  description:
                    type: string
                    example: 'exercises.Ea est voluptates quam voluptas suscipit doloremque.'
                  icon:
                    type: string
                    example: 😬
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage exercises'
                  code: 'GOALS:CREATE_EXERCISE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage exercises'
                  code:
                    type: string
                    example: 'GOALS:CREATE_EXERCISE:INSUFFICIENT_PERMISSION'
      tags:
        - Goals
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Exercise name.'
                  example: 'Water plants'
                description:
                  type: string
                  description: 'Exercise description.'
                  example: 'Use Tripod Close Grip and water your plants'
                icon:
                  type: string
                  description: 'Emoji icon.'
                  example: 🪴
              required:
                - name
                - description
                - icon
  '/api/exercises/{exerciseId}':
    put:
      summary: 'Update exercise'
      operationId: updateExercise
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  name: 'exercises.Rodriguez Pike'
                  description: 'exercises.Officiis voluptatum laborum quod voluptates doloremque molestiae inventore quos.'
                  icon: 😟
                  created_at: '2026-01-12T16:48:05.000000Z'
                  updated_at: '2026-01-12T16:48:05.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  name:
                    type: string
                    example: 'exercises.Rodriguez Pike'
                  description:
                    type: string
                    example: 'exercises.Officiis voluptatum laborum quod voluptates doloremque molestiae inventore quos.'
                  icon:
                    type: string
                    example: 😟
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage exercises'
                  code: 'GOALS:UPDATE_EXERCISE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage exercises'
                  code:
                    type: string
                    example: 'GOALS:UPDATE_EXERCISE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Exercise not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Exercise not found'
                  code: 'GOALS:UPDATE_EXERCISE:EXERCISE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Exercise not found'
                  code:
                    type: string
                    example: 'GOALS:UPDATE_EXERCISE:EXERCISE_NOT_FOUND'
      tags:
        - Goals
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Exercise name.'
                  example: 'Water plants'
                description:
                  type: string
                  description: 'Exercise description.'
                  example: 'Use Tripod Close Grip and water your plants'
                icon:
                  type: string
                  description: 'Emoji icon.'
                  example: 🪴
    delete:
      summary: 'Delete exercise'
      operationId: deleteExercise
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Exercise deleted'
                  code: 'GOALS:DELETE_EXERCISE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Exercise deleted'
                  code:
                    type: string
                    example: 'GOALS:DELETE_EXERCISE:DELETED'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage exercises'
                      code: 'GOALS:DELETE_EXERCISE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage exercises'
                      code:
                        type: string
                        example: 'GOALS:DELETE_EXERCISE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Exercise is used in goals'
                    type: object
                    example:
                      message: 'Cannot delete: exercise is used in goals (1)'
                      code: 'GOALS:DELETE_EXERCISE:HAS_GOALS'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete: exercise is used in goals (1)'
                      code:
                        type: string
                        example: 'GOALS:DELETE_EXERCISE:HAS_GOALS'
        404:
          description: 'Exercise not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Exercise not found'
                  code: 'GOALS:DELETE_EXERCISE:EXERCISE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Exercise not found'
                  code:
                    type: string
                    example: 'GOALS:DELETE_EXERCISE:EXERCISE_NOT_FOUND'
      tags:
        - Goals
    parameters:
      -
        in: path
        name: exerciseId
        description: 'Exercise ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/user/{userId}/goals':
    get:
      summary: 'List user goals'
      operationId: listUserGoals
      description: ''
      parameters:
        -
          in: query
          name: active
          description: 'Goal active status.'
          example: 1
          required: false
          schema:
            type: boolean
            description: 'Goal active status.'
            example: 1
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>start_date</code>). Default: start_date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>start_date</code>). Default: start_date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      amputee_id: 258
                      clinician_id: 259
                      start_date: '2011-11-19'
                      end_date: '1989-09-08'
                      active: 1
                      created_at: '2026-01-12T16:48:05.000000Z'
                      updated_at: '2026-01-12T16:48:05.000000Z'
                    -
                      id: 2
                      amputee_id: 260
                      clinician_id: 261
                      start_date: '1976-08-19'
                      end_date: '1998-01-24'
                      active: 0
                      created_at: '2026-01-12T16:48:05.000000Z'
                      updated_at: '2026-01-12T16:48:05.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        amputee_id: 258
                        clinician_id: 259
                        start_date: '2011-11-19'
                        end_date: '1989-09-08'
                        active: 1
                        created_at: '2026-01-12T16:48:05.000000Z'
                        updated_at: '2026-01-12T16:48:05.000000Z'
                      -
                        id: 2
                        amputee_id: 260
                        clinician_id: 261
                        start_date: '1976-08-19'
                        end_date: '1998-01-24'
                        active: 0
                        created_at: '2026-01-12T16:48:05.000000Z'
                        updated_at: '2026-01-12T16:48:05.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        amputee_id:
                          type: integer
                          example: 258
                        clinician_id:
                          type: integer
                          example: 259
                        start_date:
                          type: string
                          example: '2011-11-19'
                        end_date:
                          type: string
                          example: '1989-09-08'
                        active:
                          type: integer
                          example: 1
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:05.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:05.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view user goals'
                  code: 'GOALS:LIST_GOALS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view user goals'
                  code:
                    type: string
                    example: 'GOALS:LIST_GOALS:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'GOALS:LIST_GOALS:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'GOALS:LIST_GOALS:USER_NOT_FOUND'
      tags:
        - Goals
    post:
      summary: 'Create user goal'
      operationId: createUserGoal
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  amputee_id: 262
                  clinician_id: 263
                  start_date: '1984-09-10'
                  end_date: '1984-05-27'
                  active: 0
                  created_at: '2026-01-12T16:48:05.000000Z'
                  updated_at: '2026-01-12T16:48:05.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  amputee_id:
                    type: integer
                    example: 262
                  clinician_id:
                    type: integer
                    example: 263
                  start_date:
                    type: string
                    example: '1984-09-10'
                  end_date:
                    type: string
                    example: '1984-05-27'
                  active:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage user goals'
                  code: 'GOALS:CREATE_GOAL:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage user goals'
                  code:
                    type: string
                    example: 'GOALS:CREATE_GOAL:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'GOALS:CREATE_GOAL:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'GOALS:CREATE_GOAL:USER_NOT_FOUND'
      tags:
        - Goals
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                start_date:
                  type: string
                  description: 'Start date of the goal tracking. MUST_BE_DATE Must be a valid date in the format <code>Y-m-d</code>. MUST_BE_AFTER_OR_EQUAL:<code>today</code>.'
                  example: '2023-05-12'
                end_date:
                  type: string
                  description: 'End date of goal tracking. MUST_BE_DATE Must be a valid date in the format <code>Y-m-d</code>. MUST_BE_AFTER:<code>start_date</code>.'
                  example: '2023-05-15'
                active:
                  type: boolean
                  description: 'Status of goal activity.'
                  example: true
              required:
                - start_date
                - end_date
    parameters:
      -
        in: path
        name: userId
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/user/{userId}/goals/{goalId}':
    put:
      summary: 'Update user goal'
      operationId: updateUserGoal
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  amputee_id: 264
                  clinician_id: 265
                  start_date: '2015-11-06'
                  end_date: '2014-10-22'
                  active: 0
                  created_at: '2026-01-12T16:48:05.000000Z'
                  updated_at: '2026-01-12T16:48:05.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  amputee_id:
                    type: integer
                    example: 264
                  clinician_id:
                    type: integer
                    example: 265
                  start_date:
                    type: string
                    example: '2015-11-06'
                  end_date:
                    type: string
                    example: '2014-10-22'
                  active:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:05.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage user goals'
                      code: 'GOALS:UPDATE_GOAL:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage user goals'
                      code:
                        type: string
                        example: 'GOALS:UPDATE_GOAL:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Cannot activate ongoing goal'
                    type: object
                    example:
                      message: 'Cannot activate ongoing goal'
                      code: 'GOALS:UPDATE_GOAL:GOAL_IS_ONGOING'
                    properties:
                      message:
                        type: string
                        example: 'Cannot activate ongoing goal'
                      code:
                        type: string
                        example: 'GOALS:UPDATE_GOAL:GOAL_IS_ONGOING'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'User not found'
                    type: object
                    example:
                      message: 'User not found'
                      code: 'GOALS:UPDATE_GOAL:USER_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User not found'
                      code:
                        type: string
                        example: 'GOALS:UPDATE_GOAL:USER_NOT_FOUND'
                  -
                    description: 'Goal not found'
                    type: object
                    example:
                      message: 'Goal not found'
                      code: 'GOALS:UPDATE_GOAL:GOAL_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Goal not found'
                      code:
                        type: string
                        example: 'GOALS:UPDATE_GOAL:GOAL_NOT_FOUND'
      tags:
        - Goals
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                start_date:
                  type: string
                  description: 'Start date of the goal tracking. MUST_BE_DATE Must be a valid date in the format <code>Y-m-d</code>. MUST_BE_AFTER_OR_EQUAL:<code>today</code>.'
                  example: '2023-05-12'
                end_date:
                  type: string
                  description: 'End date of goal tracking. MUST_BE_DATE Must be a valid date in the format <code>Y-m-d</code>. MUST_BE_AFTER:<code>start_date</code>.'
                  example: '2023-05-15'
                active:
                  type: boolean
                  description: 'Status of goal activity.'
                  example: true
    delete:
      summary: 'Delete user goal'
      operationId: deleteUserGoal
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Goal deleted'
                  code: 'GOALS:DELETE_GOAL:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Goal deleted'
                  code:
                    type: string
                    example: 'GOALS:DELETE_GOAL:DELETED'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage user goals'
                      code: 'GOALS:DELETE_GOAL:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage user goals'
                      code:
                        type: string
                        example: 'GOALS:DELETE_GOAL:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Cannot delete ongoing goal'
                    type: object
                    example:
                      message: 'Cannot delete active ongoing goal'
                      code: 'GOALS:DELETE_GOAL:GOAL_IS_ONGOING'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete active ongoing goal'
                      code:
                        type: string
                        example: 'GOALS:DELETE_GOAL:GOAL_IS_ONGOING'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'User not found'
                    type: object
                    example:
                      message: 'User not found'
                      code: 'GOALS:DELETE_GOAL:USER_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User not found'
                      code:
                        type: string
                        example: 'GOALS:DELETE_GOAL:USER_NOT_FOUND'
                  -
                    description: 'Goal not found'
                    type: object
                    example:
                      message: 'Goal not found'
                      code: 'GOALS:DELETE_GOAL:GOAL_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Goal not found'
                      code:
                        type: string
                        example: 'GOALS:DELETE_GOAL:GOAL_NOT_FOUND'
      tags:
        - Goals
    parameters:
      -
        in: path
        name: userId
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: goalId
        description: 'Goal ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/user/{userId}/goals/{goalId}/conditions':
    get:
      summary: 'List user goal conditions'
      operationId: listUserGoalConditions
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      goal_id: 5
                      type: grip
                      grip_id: 3
                      grips_frequency: d
                      grips_count: 591
                      switches_frequency: d
                      switches_count: 455
                      exercise_id: 5
                      exercise_frequency: d
                      exercise_count: 8
                      created_at: '2026-01-12T16:48:06.000000Z'
                      updated_at: '2026-01-12T16:48:06.000000Z'
                    -
                      id: 2
                      goal_id: 6
                      type: switch
                      grip_id: 4
                      grips_frequency: a
                      grips_count: 165
                      switches_frequency: m
                      switches_count: 608
                      exercise_id: 6
                      exercise_frequency: m
                      exercise_count: 9
                      created_at: '2026-01-12T16:48:06.000000Z'
                      updated_at: '2026-01-12T16:48:06.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        goal_id: 5
                        type: grip
                        grip_id: 3
                        grips_frequency: d
                        grips_count: 591
                        switches_frequency: d
                        switches_count: 455
                        exercise_id: 5
                        exercise_frequency: d
                        exercise_count: 8
                        created_at: '2026-01-12T16:48:06.000000Z'
                        updated_at: '2026-01-12T16:48:06.000000Z'
                      -
                        id: 2
                        goal_id: 6
                        type: switch
                        grip_id: 4
                        grips_frequency: a
                        grips_count: 165
                        switches_frequency: m
                        switches_count: 608
                        exercise_id: 6
                        exercise_frequency: m
                        exercise_count: 9
                        created_at: '2026-01-12T16:48:06.000000Z'
                        updated_at: '2026-01-12T16:48:06.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        goal_id:
                          type: integer
                          example: 5
                        type:
                          type: string
                          example: grip
                        grip_id:
                          type: integer
                          example: 3
                        grips_frequency:
                          type: string
                          example: d
                        grips_count:
                          type: integer
                          example: 591
                        switches_frequency:
                          type: string
                          example: d
                        switches_count:
                          type: integer
                          example: 455
                        exercise_id:
                          type: integer
                          example: 5
                        exercise_frequency:
                          type: string
                          example: d
                        exercise_count:
                          type: integer
                          example: 8
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:06.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:06.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view user goals'
                  code: 'GOALS:LIST_CONDITIONS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view user goals'
                  code:
                    type: string
                    example: 'GOALS:LIST_CONDITIONS:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'User not found'
                    type: object
                    example:
                      message: 'User not found'
                      code: 'GOALS:LIST_CONDITIONS:USER_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User not found'
                      code:
                        type: string
                        example: 'GOALS:LIST_CONDITIONS:USER_NOT_FOUND'
                  -
                    description: 'Goal not found'
                    type: object
                    example:
                      message: 'Goal not found'
                      code: 'GOALS:LIST_CONDITIONS:GOAL_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Goal not found'
                      code:
                        type: string
                        example: 'GOALS:LIST_CONDITIONS:GOAL_NOT_FOUND'
      tags:
        - Goals
    post:
      summary: 'Create user goal condition'
      operationId: createUserGoalCondition
      description: "<div><p>Each goal condition could be one of type: <code>grip</code>, <code>switch</code> or <code>exercise</code>.</p>\n\t\t<p>If goal condition is type of <code>grip</code>, fill only <code>grip_id</code> (optional), <code>grips_frequency</code> and <code>grips_count</code>.<br />\n\t\tIf <code>grip_id</code> is null or missing, patient can perform any grip to fulfill objective.</p>\n\t\t<p>If goal condition is type of <code>switch</code>, fill only <code>switches_frequency</code> and <code>switches_count</code>.</p>\n\t\t<p>If goal condition is type of <code>exercise</code>, fill only <code>exercise_id</code>, <code>exercise_frequency</code> and <code>exercise_count</code>.</p>\n\t\t<br />\n\t\t<p>Restrictions:</p>\n\t\t<ul>\n\t\t\t<li>you can add one grip-any condition (<code>grip_id=null</code>, any grip is counted)\n\t\t\tand many grip-specific conditions (for example: grip 1 - 100 times and grip 2 - 50 times),</li>\n\t\t\t<li>all grips conditions must have same frequency (<code>grips_frequency</code> field),</li>\n\t\t\t<li>sum of grip-specific conditions (<code>grips_count</code> field) cannot be greater than grip-any condition for same goal</li>\n\t\t\t<li>you can add only one switch condition for same goal,</li>\n\t\t\t<li>you can add multiple exercise conditions, but each exercise can be used only once.</li>\n\t\t</ul></div>"
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  goal_id: 7
                  type: exercise
                  grip_id: 5
                  grips_frequency: m
                  grips_count: 991
                  switches_frequency: m
                  switches_count: 152
                  exercise_id: 7
                  exercise_frequency: d
                  exercise_count: 10
                  created_at: '2026-01-12T16:48:06.000000Z'
                  updated_at: '2026-01-12T16:48:06.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  goal_id:
                    type: integer
                    example: 7
                  type:
                    type: string
                    example: exercise
                  grip_id:
                    type: integer
                    example: 5
                  grips_frequency:
                    type: string
                    example: m
                  grips_count:
                    type: integer
                    example: 991
                  switches_frequency:
                    type: string
                    example: m
                  switches_count:
                    type: integer
                    example: 152
                  exercise_id:
                    type: integer
                    example: 7
                  exercise_frequency:
                    type: string
                    example: d
                  exercise_count:
                    type: integer
                    example: 10
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:06.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:06.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage user goals'
                      code: 'GOALS:CREATE_CONDITION:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage user goals'
                      code:
                        type: string
                        example: 'GOALS:CREATE_CONDITION:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Cannot create condition: all grip conditions have to be same frequency'
                    type: object
                    example:
                      message: 'Cannot create condition: all grip conditions have to be same frequency'
                      code: 'GOALS:CREATE_CONDITION:INVALID_FREQUENCY'
                    properties:
                      message:
                        type: string
                        example: 'Cannot create condition: all grip conditions have to be same frequency'
                      code:
                        type: string
                        example: 'GOALS:CREATE_CONDITION:INVALID_FREQUENCY'
                  -
                    description: 'Cannot create condition: grip-any condition for this goal already exist'
                    type: object
                    example:
                      message: 'Cannot create condition: grip-any condition for this goal already exist'
                      code: 'GOALS:CREATE_CONDITION:GRIP_ANY_ALREADY_EXISTS'
                    properties:
                      message:
                        type: string
                        example: 'Cannot create condition: grip-any condition for this goal already exist'
                      code:
                        type: string
                        example: 'GOALS:CREATE_CONDITION:GRIP_ANY_ALREADY_EXISTS'
                  -
                    description: 'Cannot create condition: condition with this grip already exist'
                    type: object
                    example:
                      message: 'Cannot create condition: condition with this grip already exist'
                      code: 'GOALS:CREATE_CONDITION:GRIP_CONDITION_ALREADY_EXISTS'
                    properties:
                      message:
                        type: string
                        example: 'Cannot create condition: condition with this grip already exist'
                      code:
                        type: string
                        example: 'GOALS:CREATE_CONDITION:GRIP_CONDITION_ALREADY_EXISTS'
                  -
                    description: 'Cannot create condition: grip-any value cannot be lower than sum of grip-specific conditions'
                    type: object
                    example:
                      message: 'Cannot create condition: grip-any value cannot be lower than sum of grip-specific conditions'
                      code: 'GOALS:CREATE_CONDITION:GRIP_ANY_LOWER_THAN_GRIPS_SUM'
                    properties:
                      message:
                        type: string
                        example: 'Cannot create condition: grip-any value cannot be lower than sum of grip-specific conditions'
                      code:
                        type: string
                        example: 'GOALS:CREATE_CONDITION:GRIP_ANY_LOWER_THAN_GRIPS_SUM'
                  -
                    description: 'Cannot create condition: sum of grip-specific conditions cannot be greater than value of grip-any condition'
                    type: object
                    example:
                      message: 'Cannot create condition: sum of grip-specific conditions cannot be greater than value of grip-any condition'
                      code: 'GOALS:CREATE_CONDITION:GRIPS_SUM_GREATER_THAN_GRIP_ANY'
                    properties:
                      message:
                        type: string
                        example: 'Cannot create condition: sum of grip-specific conditions cannot be greater than value of grip-any condition'
                      code:
                        type: string
                        example: 'GOALS:CREATE_CONDITION:GRIPS_SUM_GREATER_THAN_GRIP_ANY'
                  -
                    description: 'Cannot create condition: switch condition for this goal already exist'
                    type: object
                    example:
                      message: 'Cannot create condition: switch condition for this goal already exist'
                      code: 'GOALS:CREATE_CONDITION:SWITCH_CONDITION_ALREADY_EXISTS'
                    properties:
                      message:
                        type: string
                        example: 'Cannot create condition: switch condition for this goal already exist'
                      code:
                        type: string
                        example: 'GOALS:CREATE_CONDITION:SWITCH_CONDITION_ALREADY_EXISTS'
                  -
                    description: 'Cannot create condition: condition with this exercise already exist'
                    type: object
                    example:
                      message: 'Cannot create condition: condition with this exercise already exist'
                      code: 'GOALS:CREATE_CONDITION:EXERCISE_CONDITION_ALREADY_EXISTS'
                    properties:
                      message:
                        type: string
                        example: 'Cannot create condition: condition with this exercise already exist'
                      code:
                        type: string
                        example: 'GOALS:CREATE_CONDITION:EXERCISE_CONDITION_ALREADY_EXISTS'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'User not found'
                    type: object
                    example:
                      message: 'User not found'
                      code: 'GOALS:CREATE_CONDITION:USER_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User not found'
                      code:
                        type: string
                        example: 'GOALS:CREATE_CONDITION:USER_NOT_FOUND'
                  -
                    description: 'Goal not found'
                    type: object
                    example:
                      message: 'Goal not found'
                      code: 'GOALS:CREATE_CONDITION:GOAL_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Goal not found'
                      code:
                        type: string
                        example: 'GOALS:CREATE_CONDITION:GOAL_NOT_FOUND'
      tags:
        - Goals
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                type:
                  type: string
                  description: 'Goal condition type.'
                  example: grip
                  enum:
                    - grip
                    - switch
                    - exercise
                grip_id:
                  type: integer
                  description: 'Grip number required for condition. Pass <code>null</code> to allow any grip. The <code>id</code> of an existing record in the App\Models\Grip table.'
                  example: 1
                  nullable: true
                grips_frequency:
                  type: string
                  description: 'Grips frequency unit. <code>d</code> - daily, <code>w</code> - weekly, <code>m</code> - monthly, <code>a</code> - all time (within goal). This field is required when <code>type</code> is <code>grip</code>.'
                  example: d
                  enum:
                    - d
                    - w
                    - m
                    - a
                grips_count:
                  type: integer
                  description: 'Required number of grips per frequency unit. This field is required when <code>type</code> is <code>grip</code>. MINIMUM:NUMBER:1.'
                  example: 100
                switches_frequency:
                  type: string
                  description: 'Switches frequency unit. <code>d</code> - daily, <code>w</code> - weekly, <code>m</code> - monthly, <code>a</code> - all time (within goal). This field is required when <code>type</code> is <code>switch</code>.'
                  example: d
                  enum:
                    - d
                    - w
                    - m
                    - a
                switches_count:
                  type: integer
                  description: 'Required number of switches per frequency unit. This field is required when <code>type</code> is <code>switch</code>. MINIMUM:NUMBER:1.'
                  example: 100
                exercise_id:
                  type: integer
                  description: 'Exercise ID. This field is required when <code>type</code> is <code>exercise</code>. The <code>id</code> of an existing record in the App\Models\Exercise table.'
                  example: 1
                exercise_frequency:
                  type: string
                  description: 'Exercise frequency unit. <code>d</code> - daily, <code>w</code> - weekly, <code>m</code> - monthly. This field is required when <code>type</code> is <code>exercise</code>.'
                  example: d
                  enum:
                    - d
                    - w
                    - m
                exercise_count:
                  type: integer
                  description: 'Required number of performed exercises per frequency unit. This field is required when <code>type</code> is <code>exercise</code>. MINIMUM:NUMBER:1.'
                  example: 5
              required:
                - type
    parameters:
      -
        in: path
        name: userId
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: goalId
        description: 'Goal ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/user/{userId}/goals/{goalId}/conditions/{conditionId}':
    delete:
      summary: 'Delete user goal condition'
      operationId: deleteUserGoalCondition
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Goal condition deleted'
                  code: 'GOALS:DELETE_CONDITION:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Goal condition deleted'
                  code:
                    type: string
                    example: 'GOALS:DELETE_CONDITION:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage user goals'
                  code: 'GOALS:DELETE_CONDITION:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage user goals'
                  code:
                    type: string
                    example: 'GOALS:DELETE_CONDITION:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'User not found'
                    type: object
                    example:
                      message: 'User not found'
                      code: 'GOALS:DELETE_CONDITION:USER_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User not found'
                      code:
                        type: string
                        example: 'GOALS:DELETE_CONDITION:USER_NOT_FOUND'
                  -
                    description: 'Goal not found'
                    type: object
                    example:
                      message: 'Goal not found'
                      code: 'GOALS:DELETE_CONDITION:GOAL_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Goal not found'
                      code:
                        type: string
                        example: 'GOALS:DELETE_CONDITION:GOAL_NOT_FOUND'
      tags:
        - Goals
    parameters:
      -
        in: path
        name: userId
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: goalId
        description: 'Goal ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: conditionId
        description: 'Goal condition ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/goals/{goalId}/progress':
    get:
      summary: 'Get user goal progress'
      operationId: getUserGoalProgress
      description: "<div>Data is grouped into three parts:\n\t\t<ul>\n\t\t\t<li><code>grips</code> - data about grips progress,</li>\n\t\t\t<li><code>switches</code> - data about switches progress,</li>\n\t\t\t<li><code>exercises</code> - data about exercises progress and attempts made.</li>\n\t\t</ul>\n\n\t\tFor grips and switches there is summary, which is divided into 4 parts:\n\t\t<ul>\n\t\t\t<li><code>overall</code> - summary of whole goal time-frame,</li>\n\t\t\t<li><code>period</code> - summary of given period, according to frequency\n\t\t\t(for example: if frequency of conditions is \"weekly\", these data is summary of current's week).</li>\n\t\t\t<li><code>today</code> - summary of today's, used mainly to send daily summary notifications,</li>\n\t\t\t<li><code>conditions</code> - goal conditions with progress for each one.</li>\n\t\t</ul>\n\n\t\tThere are also extra fields inside the summary parts:\n\t\t<ul>\n\t\t\t<li><code>type</code> for grips overall summary, which points which conditions were used to calculate the summary.\n\t\t\tIf grip-any condition exists, it has priority over grip-specific conditions, otherwise summary contains sum of all\n\t\t\tgrip-specific conditions,</li>\n\t\t\t<li><code>frequency</code>, <code>frequency_from</code> and <code>frequency_to</code> for period summary for both\n\t\t\tgrips and switches, which describe time-frame of frequency and period,</li>\n\t\t\t<li><code>done</code> for today's summary for both grips and switches, indicates if today's goal is reached\n\t\t\t(it's calculated only for conditions of frequency \"daily\").</li>\n\t\t</ul></div>"
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  grips:
                    meta:
                      overall:
                        from: '2023-09-01 00:00:00'
                        to: '2023-08-30 23:59:59'
                      period:
                        from: '2023-09-15 23:59:59'
                        to: '2023-09-21 23:59:59'
                        frequency: w
                    summary:
                      type: grips-specific
                      progress: 222
                      goal: 2535
                    progress:
                      -
                        grip:
                          id: 1
                          number: 0
                          name: 'Rest Opposition'
                          description: null
                          created_at: '2023-08-30T12:20:00.000000Z'
                          updated_at: '2023-08-30T12:20:00.000000Z'
                        overall:
                          progress: 125
                          goal: 200
                        period:
                          progress: 22
                          goal: 50
                      -
                        grip:
                          id: 2
                          number: 1
                          name: Power
                          description: null
                          created_at: '2023-05-18T11:24:11.000000Z'
                          updated_at: '2023-05-18T11:24:11.000000Z'
                        overall:
                          progress: 90
                          goal: 150
                        period:
                          progress: 10
                          goal: 30
                      -
                        grip: null
                        overall:
                          progress: 78
                          goal: 1250
                        period:
                          progress: 17
                          goal: 240
                    today:
                      performed: 0
                      goal: 0
                      done: true
                  switches:
                    overall:
                      performed: 55
                      goal: 300
                    period:
                      performed: 25
                      goal: 30
                      frequency: d
                      frequency_from: '2023-09-20 00:00:00'
                      frequency_to: '2023-09-20 23:59:59'
                    today:
                      performed: 25
                      goal: 30
                      done: false
                    condition:
                      type: switch
                      switches_frequency: d
                      switches_count: 30
                  exercises:
                    performed: 1
                    goal: 3
                    done: false
                    conditions:
                      -
                        type: exercise
                        exercise_id: 1
                        exercise_frequency: d
                        exercise_count: 3
                        attempts:
                          -
                            date_from: '2023-06-06'
                            date_to: '2023-06-12'
                            count_done: 1
                            count_not_done: 1
                          -
                            date_from: '2023-06-13'
                            date_to: '2023-06-19'
                            count_done: 0
                            count_not_done: 0
                          -
                            date_from: '2023-06-20'
                            date_to: '2023-06-26'
                            count_done: 0
                            count_not_done: 0
                          -
                            date_from: '2023-06-27'
                            date_to: '2023-07-03'
                            count_done: 0
                            count_not_done: 0
                        exercise:
                          id: 1
                          name: 'Water plants'
                          description: 'Use Tripod Grip and water your plants'
                          icon: 🪴
                          created_at: '2023-05-19T10:25:37.000000Z'
                          updated_at: '2023-05-19T10:25:37.000000Z'
                properties:
                  grips:
                    type: object
                    properties:
                      meta:
                        type: object
                        properties:
                          overall:
                            type: object
                            properties:
                              from:
                                type: string
                                example: '2023-09-01 00:00:00'
                              to:
                                type: string
                                example: '2023-08-30 23:59:59'
                          period:
                            type: object
                            properties:
                              from:
                                type: string
                                example: '2023-09-15 23:59:59'
                              to:
                                type: string
                                example: '2023-09-21 23:59:59'
                              frequency:
                                type: string
                                example: w
                      summary:
                        type: object
                        properties:
                          type:
                            type: string
                            example: grips-specific
                          progress:
                            type: integer
                            example: 222
                          goal:
                            type: integer
                            example: 2535
                      progress:
                        type: array
                        example:
                          -
                            grip:
                              id: 1
                              number: 0
                              name: 'Rest Opposition'
                              description: null
                              created_at: '2023-08-30T12:20:00.000000Z'
                              updated_at: '2023-08-30T12:20:00.000000Z'
                            overall:
                              progress: 125
                              goal: 200
                            period:
                              progress: 22
                              goal: 50
                          -
                            grip:
                              id: 2
                              number: 1
                              name: Power
                              description: null
                              created_at: '2023-05-18T11:24:11.000000Z'
                              updated_at: '2023-05-18T11:24:11.000000Z'
                            overall:
                              progress: 90
                              goal: 150
                            period:
                              progress: 10
                              goal: 30
                          -
                            grip: null
                            overall:
                              progress: 78
                              goal: 1250
                            period:
                              progress: 17
                              goal: 240
                        items:
                          type: object
                          properties:
                            grip:
                              type: object
                              properties:
                                id:
                                  type: integer
                                  example: 1
                                number:
                                  type: integer
                                  example: 0
                                name:
                                  type: string
                                  example: 'Rest Opposition'
                                description:
                                  type: string
                                  example: null
                                created_at:
                                  type: string
                                  example: '2023-08-30T12:20:00.000000Z'
                                updated_at:
                                  type: string
                                  example: '2023-08-30T12:20:00.000000Z'
                            overall:
                              type: object
                              properties:
                                progress:
                                  type: integer
                                  example: 125
                                goal:
                                  type: integer
                                  example: 200
                            period:
                              type: object
                              properties:
                                progress:
                                  type: integer
                                  example: 22
                                goal:
                                  type: integer
                                  example: 50
                      today:
                        type: object
                        properties:
                          performed:
                            type: integer
                            example: 0
                          goal:
                            type: integer
                            example: 0
                          done:
                            type: boolean
                            example: true
                  switches:
                    type: object
                    properties:
                      overall:
                        type: object
                        properties:
                          performed:
                            type: integer
                            example: 55
                          goal:
                            type: integer
                            example: 300
                      period:
                        type: object
                        properties:
                          performed:
                            type: integer
                            example: 25
                          goal:
                            type: integer
                            example: 30
                          frequency:
                            type: string
                            example: d
                          frequency_from:
                            type: string
                            example: '2023-09-20 00:00:00'
                          frequency_to:
                            type: string
                            example: '2023-09-20 23:59:59'
                      today:
                        type: object
                        properties:
                          performed:
                            type: integer
                            example: 25
                          goal:
                            type: integer
                            example: 30
                          done:
                            type: boolean
                            example: false
                      condition:
                        type: object
                        properties:
                          type:
                            type: string
                            example: switch
                          switches_frequency:
                            type: string
                            example: d
                          switches_count:
                            type: integer
                            example: 30
                  exercises:
                    type: object
                    properties:
                      performed:
                        type: integer
                        example: 1
                      goal:
                        type: integer
                        example: 3
                      done:
                        type: boolean
                        example: false
                      conditions:
                        type: array
                        example:
                          -
                            type: exercise
                            exercise_id: 1
                            exercise_frequency: d
                            exercise_count: 3
                            attempts:
                              -
                                date_from: '2023-06-06'
                                date_to: '2023-06-12'
                                count_done: 1
                                count_not_done: 1
                              -
                                date_from: '2023-06-13'
                                date_to: '2023-06-19'
                                count_done: 0
                                count_not_done: 0
                              -
                                date_from: '2023-06-20'
                                date_to: '2023-06-26'
                                count_done: 0
                                count_not_done: 0
                              -
                                date_from: '2023-06-27'
                                date_to: '2023-07-03'
                                count_done: 0
                                count_not_done: 0
                            exercise:
                              id: 1
                              name: 'Water plants'
                              description: 'Use Tripod Grip and water your plants'
                              icon: 🪴
                              created_at: '2023-05-19T10:25:37.000000Z'
                              updated_at: '2023-05-19T10:25:37.000000Z'
                        items:
                          type: object
                          properties:
                            type:
                              type: string
                              example: exercise
                            exercise_id:
                              type: integer
                              example: 1
                            exercise_frequency:
                              type: string
                              example: d
                            exercise_count:
                              type: integer
                              example: 3
                            attempts:
                              type: array
                              example:
                                -
                                  date_from: '2023-06-06'
                                  date_to: '2023-06-12'
                                  count_done: 1
                                  count_not_done: 1
                                -
                                  date_from: '2023-06-13'
                                  date_to: '2023-06-19'
                                  count_done: 0
                                  count_not_done: 0
                                -
                                  date_from: '2023-06-20'
                                  date_to: '2023-06-26'
                                  count_done: 0
                                  count_not_done: 0
                                -
                                  date_from: '2023-06-27'
                                  date_to: '2023-07-03'
                                  count_done: 0
                                  count_not_done: 0
                              items:
                                type: object
                                properties:
                                  date_from:
                                    type: string
                                    example: '2023-06-06'
                                  date_to:
                                    type: string
                                    example: '2023-06-12'
                                  count_done:
                                    type: integer
                                    example: 1
                                  count_not_done:
                                    type: integer
                                    example: 1
                            exercise:
                              type: object
                              properties:
                                id:
                                  type: integer
                                  example: 1
                                name:
                                  type: string
                                  example: 'Water plants'
                                description:
                                  type: string
                                  example: 'Use Tripod Grip and water your plants'
                                icon:
                                  type: string
                                  example: 🪴
                                created_at:
                                  type: string
                                  example: '2023-05-19T10:25:37.000000Z'
                                updated_at:
                                  type: string
                                  example: '2023-05-19T10:25:37.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view goal progress'
                  code: 'GOALS:GET_PROGRESS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view goal progress'
                  code:
                    type: string
                    example: 'GOALS:GET_PROGRESS:INSUFFICIENT_PERMISSION'
        404:
          description: 'Goal not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Goal not found'
                  code: 'GOALS:GET_PROGRESS:GOAL_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Goal not found'
                  code:
                    type: string
                    example: 'GOALS:GET_PROGRESS:GOAL_NOT_FOUND'
      tags:
        - Goals
    post:
      summary: 'Update user goal progress'
      operationId: updateUserGoalProgress
      description: 'Use this endpoint to update goal progress as patient. Add exercise attempts and mark them as done or not done.'
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  user_id: 272
                  goal_id: 8
                  type: exercise
                  grip_id: null
                  grips: 472
                  switches: 737
                  exercise_id: 8
                  exercise_done: 0
                  created_at: '2026-01-12T16:48:06.000000Z'
                  updated_at: '2026-01-12T16:48:06.000000Z'
                properties:
                  id:
                    type: integer
                    example: 1
                  user_id:
                    type: integer
                    example: 272
                  goal_id:
                    type: integer
                    example: 8
                  type:
                    type: string
                    example: exercise
                  grip_id:
                    type: string
                    example: null
                  grips:
                    type: integer
                    example: 472
                  switches:
                    type: integer
                    example: 737
                  exercise_id:
                    type: integer
                    example: 8
                  exercise_done:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:06.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:06.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update goal progress'
                  code: 'GOALS:UPDATE_PROGRESS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update goal progress'
                  code:
                    type: string
                    example: 'GOALS:UPDATE_PROGRESS:INSUFFICIENT_PERMISSION'
        404:
          description: 'Goal not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Goal not found'
                  code: 'GOALS:UPDATE_PROGRESS:GOAL_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Goal not found'
                  code:
                    type: string
                    example: 'GOALS:UPDATE_PROGRESS:GOAL_NOT_FOUND'
        422:
          description: 'User timezone not set'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User timezone not set'
                  code: 'GOALS:UPDATE_PROGRESS:NO_TIMEZONE'
                properties:
                  message:
                    type: string
                    example: 'User timezone not set'
                  code:
                    type: string
                    example: 'GOALS:UPDATE_PROGRESS:NO_TIMEZONE'
      tags:
        - Goals
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                exercise_id:
                  type: integer
                  description: 'Exercise ID. The <code>id</code> of an existing record in the App\Models\Exercise table.'
                  example: 1
                exercise_done:
                  type: boolean
                  description: 'Status of exercise attempt.'
                  example: true
              required:
                - exercise_id
    parameters:
      -
        in: path
        name: goalId
        description: 'Goal ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/invite/accept:
    post:
      summary: 'Accept clinician invitation'
      operationId: acceptClinicianInvitation
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  mrn: 0ZK0H3S51768236461
                  name: 'Dr. Zander Pacocha PhD'
                  email: 1768236461marvin.efren@example.org
                  language: en
                  phone: 1-651-849-7055
                  phone_country: ET
                  phone_verified_at: null
                  address1: '33453 Bergnaum Ville Apt. 852'
                  address2: 'West Laurine, SC 31532'
                  postal_code: '23481'
                  city: 'Bartoletti, Volkman and Gorczany'
                  clinic_name: 'East Arlieburgh'
                  clinic_location: "5869 Farrell Field\nSouth Freeman, MO 29516-6003"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:47:41.000000Z'
                  updated_at: '2026-01-12T16:47:41.000000Z'
                  invitation_status: null
                  acadle_invitation_status: accepted
                  roles:
                    -
                      id: 6
                      name: AcadleUser
                properties:
                  id:
                    type: integer
                    example: 4
                  mrn:
                    type: string
                    example: 0ZK0H3S51768236461
                  name:
                    type: string
                    example: 'Dr. Zander Pacocha PhD'
                  email:
                    type: string
                    example: 1768236461marvin.efren@example.org
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: 1-651-849-7055
                  phone_country:
                    type: string
                    example: ET
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '33453 Bergnaum Ville Apt. 852'
                  address2:
                    type: string
                    example: 'West Laurine, SC 31532'
                  postal_code:
                    type: string
                    example: '23481'
                  city:
                    type: string
                    example: 'Bartoletti, Volkman and Gorczany'
                  clinic_name:
                    type: string
                    example: 'East Arlieburgh'
                  clinic_location:
                    type: string
                    example: "5869 Farrell Field\nSouth Freeman, MO 29516-6003"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:41.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:41.000000Z'
                  invitation_status:
                    type: string
                    example: null
                  acadle_invitation_status:
                    type: string
                    example: accepted
                  roles:
                    type: array
                    example:
                      -
                        id: 6
                        name: AcadleUser
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 6
                        name:
                          type: string
                          example: AcadleUser
        403:
          description: 'Invitation expired'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invitation expired'
                  code: 'INVITATIONS:ACCEPT:INVITATION_EXPIRED'
                properties:
                  message:
                    type: string
                    example: 'Invitation expired'
                  code:
                    type: string
                    example: 'INVITATIONS:ACCEPT:INVITATION_EXPIRED'
        404:
          description: 'Invitation not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invitation not found'
                  code: 'INVITATIONS:ACCEPT:INVITATION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Invitation not found'
                  code:
                    type: string
                    example: 'INVITATIONS:ACCEPT:INVITATION_NOT_FOUND'
        500:
          description: 'Server error'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Server error: invitation not accepted'
                  code: 'INVITATIONS:ACCEPT:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Server error: invitation not accepted'
                  code:
                    type: string
                    example: 'INVITATIONS:ACCEPT:SERVER_ERROR'
      tags:
        - Invitations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: 'Invitation token sent by e-mail. SIZE:STRING_LENGTH:24.'
                  example: ABC123DEF456GHI789JKL0
                email:
                  type: string
                  description: 'User e-mail. MUST_BE_EMAIL The <code>email</code> of an existing record in the App\Models\User table.'
                  example: example@domain.com
                password:
                  type: string
                  description: 'User password.'
                  example: Test123!
                language:
                  type: string
                  description: 'User language.'
                  example: en
                name:
                  type: string
                  description: 'User name.'
                  example: 'Tom Smith'
                clinic_name:
                  type: string
                  description: 'Clinic name.'
                  example: 'My clinic Ltd'
                clinic_location:
                  type: string
                  description: 'Clinic location.'
                  example: 'Example St 1/345 New York, NY'
                address1:
                  type: string
                  description: 'User address line 1.'
                  example: '1092 Giles Spurs Apt. 136'
                address2:
                  type: string
                  description: 'User address line 2.'
                  example: 'Lake Bradley, KY 82146'
                mfa_enabled:
                  type: boolean
                  description: 'MFA enabled.'
                  example: true
                mfa_method:
                  type: string
                  description: 'MFA method.'
                  example: email
                  enum:
                    - email
                    - sms
              required:
                - token
                - email
                - password
                - language
                - name
      security: []
  /api/invite/acadle/accept:
    post:
      summary: 'Accept Acadle invitation'
      operationId: acceptAcadleInvitation
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 5
                  mrn: RC2PJQTW1768236461
                  name: 'Flo Hudson'
                  email: 1768236461nrosenbaum@example.net
                  language: en
                  phone: 626.493.4370
                  phone_country: TW
                  phone_verified_at: null
                  address1: '953 Isaias Drive Apt. 357'
                  address2: 'Port Meghan, KS 88477'
                  postal_code: 54187-2539
                  city: 'Farrell, Gislason and Mann'
                  clinic_name: Tiannaborough
                  clinic_location: "7649 Cormier Station\nBernitaview, LA 36515-9253"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:47:41.000000Z'
                  updated_at: '2026-01-12T16:47:41.000000Z'
                  invitation_status: null
                  acadle_invitation_status: null
                  roles:
                    -
                      id: 1
                      name: SuperAdmin
                properties:
                  id:
                    type: integer
                    example: 5
                  mrn:
                    type: string
                    example: RC2PJQTW1768236461
                  name:
                    type: string
                    example: 'Flo Hudson'
                  email:
                    type: string
                    example: 1768236461nrosenbaum@example.net
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: 626.493.4370
                  phone_country:
                    type: string
                    example: TW
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '953 Isaias Drive Apt. 357'
                  address2:
                    type: string
                    example: 'Port Meghan, KS 88477'
                  postal_code:
                    type: string
                    example: 54187-2539
                  city:
                    type: string
                    example: 'Farrell, Gislason and Mann'
                  clinic_name:
                    type: string
                    example: Tiannaborough
                  clinic_location:
                    type: string
                    example: "7649 Cormier Station\nBernitaview, LA 36515-9253"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:41.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:41.000000Z'
                  invitation_status:
                    type: string
                    example: null
                  acadle_invitation_status:
                    type: string
                    example: null
                  roles:
                    type: array
                    example:
                      -
                        id: 1
                        name: SuperAdmin
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: SuperAdmin
        403:
          description: 'Invitation expired'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invitation expired'
                  code: 'INVITATIONS_ACADLE:ACCEPT:INVITATION_EXPIRED'
                properties:
                  message:
                    type: string
                    example: 'Invitation expired'
                  code:
                    type: string
                    example: 'INVITATIONS_ACADLE:ACCEPT:INVITATION_EXPIRED'
        404:
          description: 'Invitation not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Invitation not found'
                  code: 'INVITATIONS_ACADLE:ACCEPT:INVITATION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Invitation not found'
                  code:
                    type: string
                    example: 'INVITATIONS_ACADLE:ACCEPT:INVITATION_NOT_FOUND'
        500:
          description: 'Server error'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Server error: invitation not accepted'
                  code: 'INVITATIONS_ACADLE:ACCEPT:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Server error: invitation not accepted'
                  code:
                    type: string
                    example: 'INVITATIONS_ACADLE:ACCEPT:SERVER_ERROR'
      tags:
        - Invitations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                token:
                  type: string
                  description: 'Invitation token. SIZE:STRING_LENGTH:24.'
                  example: a1b2c3d4e5f6g7h8i9j0k1l2m3
                email:
                  type: string
                  description: 'Email address of the Acadle user. MUST_BE_EMAIL The <code>email</code> of an existing record in the App\Models\User table.'
                  example: user@example.com
                password:
                  type: string
                  description: 'User password.'
                  example: securePassword123
                phone:
                  type: string
                  description: 'User phone number.'
                  example: 541.346.1790
                phone_country:
                  type: string
                  description: "Phone number's country (2 characters). SIZE:STRING_LENGTH:2."
                  example: US
                name:
                  type: string
                  description: 'User name.'
                  example: 'John Doe'
                language:
                  type: string
                  description: 'User preferred language.'
                  example: en
              required:
                - token
                - email
                - password
                - phone
                - phone_country
                - name
                - language
  /api/invite/users:
    get:
      summary: 'List users for invitations'
      operationId: listUsersForInvitations
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>clinicians</code>, <code>patients</code>, <code>devices</code>, <code>devicesAsClinician</code>, <code>roles</code>, <code>permissions</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>clinicians</code>, <code>patients</code>, <code>devices</code>, <code>devicesAsClinician</code>, <code>roles</code>, <code>permissions</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 15
                      mrn: ZOF51SH51768236462
                      name: 'Fritz Kassulke'
                      email: 1768236462btremblay@example.com
                      language: en
                      phone: '(240) 765-3989'
                      phone_country: AW
                      phone_verified_at: null
                      address1: '31049 Nola Circle Apt. 422'
                      address2: 'West Frieda, DC 78306-6938'
                      postal_code: 57071-1444
                      city: Moen-Connelly
                      clinic_name: Shayleefurt
                      clinic_location: "8316 Bartell Plaza Suite 432\nOrenberg, IA 80771"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:47:42.000000Z'
                      updated_at: '2026-01-12T16:47:42.000000Z'
                      invitation_status: accepted
                      acadle_invitation_status: null
                      roles:
                        -
                          id: 2
                          name: ClinicAdmin
                    -
                      id: 16
                      mrn: 7HW4YU2D1768236462
                      name: 'Trevor Hermiston IV'
                      email: 1768236462wunsch.lauretta@example.com
                      language: en
                      phone: 1-989-322-0325
                      phone_country: CX
                      phone_verified_at: null
                      address1: '668 Boehm Summit Suite 456'
                      address2: 'New Bradleymouth, WV 22261-0244'
                      postal_code: 42860-4573
                      city: Schinner-Gulgowski
                      clinic_name: 'Lake Ismael'
                      clinic_location: "725 Ignacio Lodge\nBeahanside, WA 70642-6490"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:47:42.000000Z'
                      updated_at: '2026-01-12T16:47:42.000000Z'
                      invitation_status: accepted
                      acadle_invitation_status: null
                      roles:
                        -
                          id: 3
                          name: Clinician
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 15
                        mrn: ZOF51SH51768236462
                        name: 'Fritz Kassulke'
                        email: 1768236462btremblay@example.com
                        language: en
                        phone: '(240) 765-3989'
                        phone_country: AW
                        phone_verified_at: null
                        address1: '31049 Nola Circle Apt. 422'
                        address2: 'West Frieda, DC 78306-6938'
                        postal_code: 57071-1444
                        city: Moen-Connelly
                        clinic_name: Shayleefurt
                        clinic_location: "8316 Bartell Plaza Suite 432\nOrenberg, IA 80771"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:42.000000Z'
                        updated_at: '2026-01-12T16:47:42.000000Z'
                        invitation_status: accepted
                        acadle_invitation_status: null
                        roles:
                          -
                            id: 2
                            name: ClinicAdmin
                      -
                        id: 16
                        mrn: 7HW4YU2D1768236462
                        name: 'Trevor Hermiston IV'
                        email: 1768236462wunsch.lauretta@example.com
                        language: en
                        phone: 1-989-322-0325
                        phone_country: CX
                        phone_verified_at: null
                        address1: '668 Boehm Summit Suite 456'
                        address2: 'New Bradleymouth, WV 22261-0244'
                        postal_code: 42860-4573
                        city: Schinner-Gulgowski
                        clinic_name: 'Lake Ismael'
                        clinic_location: "725 Ignacio Lodge\nBeahanside, WA 70642-6490"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:42.000000Z'
                        updated_at: '2026-01-12T16:47:42.000000Z'
                        invitation_status: accepted
                        acadle_invitation_status: null
                        roles:
                          -
                            id: 3
                            name: Clinician
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 15
                        mrn:
                          type: string
                          example: ZOF51SH51768236462
                        name:
                          type: string
                          example: 'Fritz Kassulke'
                        email:
                          type: string
                          example: 1768236462btremblay@example.com
                        language:
                          type: string
                          example: en
                        phone:
                          type: string
                          example: '(240) 765-3989'
                        phone_country:
                          type: string
                          example: AW
                        phone_verified_at:
                          type: string
                          example: null
                        address1:
                          type: string
                          example: '31049 Nola Circle Apt. 422'
                        address2:
                          type: string
                          example: 'West Frieda, DC 78306-6938'
                        postal_code:
                          type: string
                          example: 57071-1444
                        city:
                          type: string
                          example: Moen-Connelly
                        clinic_name:
                          type: string
                          example: Shayleefurt
                        clinic_location:
                          type: string
                          example: "8316 Bartell Plaza Suite 432\nOrenberg, IA 80771"
                        image:
                          type: string
                          example: null
                        mfa_enabled:
                          type: integer
                          example: 0
                        mfa_method:
                          type: string
                          example: null
                        mfa_verified_to:
                          type: string
                          example: null
                        location_id:
                          type: string
                          example: null
                        created_by:
                          type: string
                          example: null
                        active:
                          type: integer
                          example: 1
                        notifications_timezone:
                          type: string
                          example: null
                        notifications_at:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:42.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:42.000000Z'
                        invitation_status:
                          type: string
                          example: accepted
                        acadle_invitation_status:
                          type: string
                          example: null
                        roles:
                          type: array
                          example:
                            -
                              id: 2
                              name: ClinicAdmin
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 2
                              name:
                                type: string
                                example: ClinicAdmin
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list users for invitations'
                  code: 'INVITATIONS:USERS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list users for invitations'
                  code:
                    type: string
                    example: 'INVITATIONS:USERS:INSUFFICIENT_PERMISSION'
      tags:
        - Invitations
  /api/invite:
    post:
      summary: 'Create clinician invitations'
      operationId: createClinicianInvitations
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 10
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 17
                      mrn: T3C5TLDP1768236462
                      name: 'Myrna Grimes V'
                      email: 1768236462bechtelar.curtis@example.com
                      language: en
                      phone: 531.807.0254
                      phone_country: SA
                      phone_verified_at: null
                      address1: '391 Jerde Locks Apt. 909'
                      address2: 'Valentinaburgh, OR 57524'
                      postal_code: 52981-3364
                      city: 'Schaefer, Okuneva and Braun'
                      clinic_name: Chetburgh
                      clinic_location: "81710 Emmanuelle Circles Suite 427\nFlavieside, NC 45397"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:47:42.000000Z'
                      updated_at: '2026-01-12T16:47:42.000000Z'
                      invitation_status: null
                      acadle_invitation_status: accepted
                      invitations:
                        -
                          id: 1
                          user_id: 18
                          invited_user_id: 17
                          type: clinician
                          training_confirmed: 1
                          created_at: '2026-01-12T16:47:43.000000Z'
                          updated_at: '2026-01-12T16:47:43.000000Z'
                      roles:
                        -
                          id: 6
                          name: AcadleUser
                    -
                      id: 20
                      mrn: MPVEGM1A1768236463
                      name: 'Breana Witting MD'
                      email: 1768236463west.grant@example.org
                      language: en
                      phone: +1.629.507.1948
                      phone_country: MH
                      phone_verified_at: null
                      address1: '6759 Stroman Avenue Suite 088'
                      address2: 'New Lois, OK 99709-5426'
                      postal_code: 17923-2128
                      city: Vandervort-Watsica
                      clinic_name: Kuhicville
                      clinic_location: "650 Lavina Stravenue\nWest Reyes, VA 67759"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:47:43.000000Z'
                      updated_at: '2026-01-12T16:47:43.000000Z'
                      invitation_status: null
                      acadle_invitation_status: null
                      invitations:
                        -
                          id: 2
                          user_id: 21
                          invited_user_id: 20
                          type: clinician
                          training_confirmed: 1
                          created_at: '2026-01-12T16:47:43.000000Z'
                          updated_at: '2026-01-12T16:47:43.000000Z'
                      roles:
                        -
                          id: 1
                          name: SuperAdmin
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 10
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 17
                        mrn: T3C5TLDP1768236462
                        name: 'Myrna Grimes V'
                        email: 1768236462bechtelar.curtis@example.com
                        language: en
                        phone: 531.807.0254
                        phone_country: SA
                        phone_verified_at: null
                        address1: '391 Jerde Locks Apt. 909'
                        address2: 'Valentinaburgh, OR 57524'
                        postal_code: 52981-3364
                        city: 'Schaefer, Okuneva and Braun'
                        clinic_name: Chetburgh
                        clinic_location: "81710 Emmanuelle Circles Suite 427\nFlavieside, NC 45397"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:42.000000Z'
                        updated_at: '2026-01-12T16:47:42.000000Z'
                        invitation_status: null
                        acadle_invitation_status: accepted
                        invitations:
                          -
                            id: 1
                            user_id: 18
                            invited_user_id: 17
                            type: clinician
                            training_confirmed: 1
                            created_at: '2026-01-12T16:47:43.000000Z'
                            updated_at: '2026-01-12T16:47:43.000000Z'
                        roles:
                          -
                            id: 6
                            name: AcadleUser
                      -
                        id: 20
                        mrn: MPVEGM1A1768236463
                        name: 'Breana Witting MD'
                        email: 1768236463west.grant@example.org
                        language: en
                        phone: +1.629.507.1948
                        phone_country: MH
                        phone_verified_at: null
                        address1: '6759 Stroman Avenue Suite 088'
                        address2: 'New Lois, OK 99709-5426'
                        postal_code: 17923-2128
                        city: Vandervort-Watsica
                        clinic_name: Kuhicville
                        clinic_location: "650 Lavina Stravenue\nWest Reyes, VA 67759"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:43.000000Z'
                        updated_at: '2026-01-12T16:47:43.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        invitations:
                          -
                            id: 2
                            user_id: 21
                            invited_user_id: 20
                            type: clinician
                            training_confirmed: 1
                            created_at: '2026-01-12T16:47:43.000000Z'
                            updated_at: '2026-01-12T16:47:43.000000Z'
                        roles:
                          -
                            id: 1
                            name: SuperAdmin
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 17
                        mrn:
                          type: string
                          example: T3C5TLDP1768236462
                        name:
                          type: string
                          example: 'Myrna Grimes V'
                        email:
                          type: string
                          example: 1768236462bechtelar.curtis@example.com
                        language:
                          type: string
                          example: en
                        phone:
                          type: string
                          example: 531.807.0254
                        phone_country:
                          type: string
                          example: SA
                        phone_verified_at:
                          type: string
                          example: null
                        address1:
                          type: string
                          example: '391 Jerde Locks Apt. 909'
                        address2:
                          type: string
                          example: 'Valentinaburgh, OR 57524'
                        postal_code:
                          type: string
                          example: 52981-3364
                        city:
                          type: string
                          example: 'Schaefer, Okuneva and Braun'
                        clinic_name:
                          type: string
                          example: Chetburgh
                        clinic_location:
                          type: string
                          example: "81710 Emmanuelle Circles Suite 427\nFlavieside, NC 45397"
                        image:
                          type: string
                          example: null
                        mfa_enabled:
                          type: integer
                          example: 0
                        mfa_method:
                          type: string
                          example: null
                        mfa_verified_to:
                          type: string
                          example: null
                        location_id:
                          type: string
                          example: null
                        created_by:
                          type: string
                          example: null
                        active:
                          type: integer
                          example: 1
                        notifications_timezone:
                          type: string
                          example: null
                        notifications_at:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:42.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:42.000000Z'
                        invitation_status:
                          type: string
                          example: null
                        acadle_invitation_status:
                          type: string
                          example: accepted
                        invitations:
                          type: array
                          example:
                            -
                              id: 1
                              user_id: 18
                              invited_user_id: 17
                              type: clinician
                              training_confirmed: 1
                              created_at: '2026-01-12T16:47:43.000000Z'
                              updated_at: '2026-01-12T16:47:43.000000Z'
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 1
                              user_id:
                                type: integer
                                example: 18
                              invited_user_id:
                                type: integer
                                example: 17
                              type:
                                type: string
                                example: clinician
                              training_confirmed:
                                type: integer
                                example: 1
                              created_at:
                                type: string
                                example: '2026-01-12T16:47:43.000000Z'
                              updated_at:
                                type: string
                                example: '2026-01-12T16:47:43.000000Z'
                        roles:
                          type: array
                          example:
                            -
                              id: 6
                              name: AcadleUser
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 6
                              name:
                                type: string
                                example: AcadleUser
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to create invitations'
                      code: 'INVITATIONS:CREATE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to create invitations'
                      code:
                        type: string
                        example: 'INVITATIONS:CREATE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'No access to given patient'
                    type: object
                    example:
                      message: 'No access to given patient'
                      code: 'INVITATIONS:CREATE:NO_ACCESS_TO_PATIENT'
                    properties:
                      message:
                        type: string
                        example: 'No access to given patient'
                      code:
                        type: string
                        example: 'INVITATIONS:CREATE:NO_ACCESS_TO_PATIENT'
      tags:
        - Invitations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                patient_id:
                  type: string
                  description: 'Patient user ID. The <code>id</code> of an existing record in the App\Models\User table.'
                  example: 1
                invitations:
                  type: array
                  description: 'List of invitations (maximum entries: 10, array of objects).'
                  example:
                    - []
                  items:
                    type: object
                    properties:
                      user_id:
                        type: integer
                        description: 'Invited user ID. Use only for existing users. Don''t use together with <code>user_email</code>. This field is required when <code>invitations.*.user_email</code> is not present. The <code>id</code> of an existing record in the App\Models\User table.'
                        example: 1
                      user_email:
                        type: string
                        description: "Invited user e-mail. Use only for non-existing users. Don't use together with <code>user_id</code>. This field is required when <code>invitations.*.user_id</code> is not present. MUST_BE_EMAIL."
                        example: newuser@domain.com
                      role:
                        type: string
                        description: 'Invited user role. Use only for non-existing users. This field is required when <code>invitations.*.user_id</code> is not present.'
                        example: Clinician
                        enum:
                          - ClinicAdmin
                          - Clinician
                          - ClinicianSupport
                      training_confirmed:
                        type: boolean
                        description: 'Confirmation that invited user was properly trained to use ADP. Must be accepted.'
                        example: true
                      permissions:
                        type: array
                        description: 'List of permissions to assign to the user (use that for ClinicianSupport role).'
                        example:
                          - quis
                        items:
                          type: string
                      'permissions[]':
                        type: string
                        description: 'Permission name.'
                        example: qui
                    required:
                      - training_confirmed
              required:
                - patient_id
                - invitations
  '/api/invite/{userId}/resend':
    post:
      summary: 'Resend invitation'
      operationId: resendInvitation
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 23
                  mrn: Z56N2D9U1768236463
                  name: 'Prof. Alvena Muller'
                  email: 1768236463juanita.leffler@example.org
                  language: en
                  phone: +1.469.893.7474
                  phone_country: VU
                  phone_verified_at: null
                  address1: '5455 Loyce Ways'
                  address2: 'North Theresa, NJ 00134'
                  postal_code: 72540-9312
                  city: 'Ferry, Gleason and Skiles'
                  clinic_name: 'North Carlottamouth'
                  clinic_location: "82764 Ardith Cove Apt. 307\nNorth Mathiasland, KY 62022-4367"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:47:43.000000Z'
                  updated_at: '2026-01-12T16:47:43.000000Z'
                  invitation_status: accepted
                  acadle_invitation_status: null
                  invitations:
                    -
                      id: 3
                      user_id: 24
                      invited_user_id: 23
                      type: clinician
                      training_confirmed: 0
                      created_at: '2026-01-12T16:47:43.000000Z'
                      updated_at: '2026-01-12T16:47:43.000000Z'
                  roles:
                    -
                      id: 4
                      name: ClinicianSupport
                properties:
                  id:
                    type: integer
                    example: 23
                  mrn:
                    type: string
                    example: Z56N2D9U1768236463
                  name:
                    type: string
                    example: 'Prof. Alvena Muller'
                  email:
                    type: string
                    example: 1768236463juanita.leffler@example.org
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: +1.469.893.7474
                  phone_country:
                    type: string
                    example: VU
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '5455 Loyce Ways'
                  address2:
                    type: string
                    example: 'North Theresa, NJ 00134'
                  postal_code:
                    type: string
                    example: 72540-9312
                  city:
                    type: string
                    example: 'Ferry, Gleason and Skiles'
                  clinic_name:
                    type: string
                    example: 'North Carlottamouth'
                  clinic_location:
                    type: string
                    example: "82764 Ardith Cove Apt. 307\nNorth Mathiasland, KY 62022-4367"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:43.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:43.000000Z'
                  invitation_status:
                    type: string
                    example: accepted
                  acadle_invitation_status:
                    type: string
                    example: null
                  invitations:
                    type: array
                    example:
                      -
                        id: 3
                        user_id: 24
                        invited_user_id: 23
                        type: clinician
                        training_confirmed: 0
                        created_at: '2026-01-12T16:47:43.000000Z'
                        updated_at: '2026-01-12T16:47:43.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 3
                        user_id:
                          type: integer
                          example: 24
                        invited_user_id:
                          type: integer
                          example: 23
                        type:
                          type: string
                          example: clinician
                        training_confirmed:
                          type: integer
                          example: 0
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:43.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:43.000000Z'
                  roles:
                    type: array
                    example:
                      -
                        id: 4
                        name: ClinicianSupport
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 4
                        name:
                          type: string
                          example: ClinicianSupport
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to resend invitations'
                      code: 'INVITATIONS:RESEND:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to resend invitations'
                      code:
                        type: string
                        example: 'INVITATIONS:RESEND:INSUFFICIENT_PERMISSION'
                  -
                    description: 'User not found'
                    type: object
                    example:
                      message: 'User not found'
                      code: 'INVITATIONS:RESEND:USER_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User not found'
                      code:
                        type: string
                        example: 'INVITATIONS:RESEND:USER_NOT_FOUND'
                  -
                    description: 'Invitation already accepted'
                    type: object
                    example:
                      message: 'Invitation already accepted'
                      code: 'INVITATIONS:RESEND:INVITATION_ALREADY_ACCEPTED'
                    properties:
                      message:
                        type: string
                        example: 'Invitation already accepted'
                      code:
                        type: string
                        example: 'INVITATIONS:RESEND:INVITATION_ALREADY_ACCEPTED'
      tags:
        - Invitations
    parameters:
      -
        in: path
        name: userId
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/invite/acadle/users:
    get:
      summary: 'List all users invited to Acadle'
      operationId: listAllUsersInvitedToAcadle
      description: ''
      parameters:
        -
          in: query
          name: search
          description: 'Filter users by searching in: user name, user email, contact name, contact surname, contact email, CPO number.'
          example: john
          required: false
          schema:
            type: string
            description: 'Filter users by searching in: user name, user email, contact name, contact surname, contact email, CPO number.'
            example: john
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>roles</code>, <code>acadleSurvey</code>, <code>latestAcadleSurvey</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>roles</code>, <code>acadleSurvey</code>, <code>latestAcadleSurvey</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>survey_completion_date</code>). Default: survey_completion_date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>survey_completion_date</code>). Default: survey_completion_date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 26
                      mrn: UXZINV7U1768236463
                      name: 'Courtney Fay'
                      email: 1768236463shanny.robel@example.com
                      language: en
                      phone: 1-458-352-4859
                      phone_country: MW
                      phone_verified_at: null
                      address1: '9559 Viola Ways Apt. 259'
                      address2: 'Reynoldsborough, DE 76304'
                      postal_code: 49074-1302
                      city: "O'Kon-Windler"
                      clinic_name: Franzbury
                      clinic_location: "224 Labadie Avenue\nWest Immanuel, LA 17322"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:47:43.000000Z'
                      updated_at: '2026-01-12T16:47:43.000000Z'
                      invitation_status: null
                      acadle_invitation_status: null
                      roles:
                        -
                          id: 1
                          name: SuperAdmin
                    -
                      id: 27
                      mrn: MNZPEIC81768236463
                      name: 'Ms. Ruthie Fahey DDS'
                      email: 1768236463dlockman@example.org
                      language: en
                      phone: +1-520-218-3842
                      phone_country: TL
                      phone_verified_at: null
                      address1: '640 Sauer Rest Suite 131'
                      address2: 'Creminfurt, OK 93641'
                      postal_code: 09109-2968
                      city: 'Larson Group'
                      clinic_name: 'West Lourdesville'
                      clinic_location: "3168 Shanelle Stravenue\nTreviontown, AL 53441-0149"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:47:43.000000Z'
                      updated_at: '2026-01-12T16:47:43.000000Z'
                      invitation_status: accepted
                      acadle_invitation_status: null
                      roles:
                        -
                          id: 2
                          name: ClinicAdmin
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 26
                        mrn: UXZINV7U1768236463
                        name: 'Courtney Fay'
                        email: 1768236463shanny.robel@example.com
                        language: en
                        phone: 1-458-352-4859
                        phone_country: MW
                        phone_verified_at: null
                        address1: '9559 Viola Ways Apt. 259'
                        address2: 'Reynoldsborough, DE 76304'
                        postal_code: 49074-1302
                        city: "O'Kon-Windler"
                        clinic_name: Franzbury
                        clinic_location: "224 Labadie Avenue\nWest Immanuel, LA 17322"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:43.000000Z'
                        updated_at: '2026-01-12T16:47:43.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles:
                          -
                            id: 1
                            name: SuperAdmin
                      -
                        id: 27
                        mrn: MNZPEIC81768236463
                        name: 'Ms. Ruthie Fahey DDS'
                        email: 1768236463dlockman@example.org
                        language: en
                        phone: +1-520-218-3842
                        phone_country: TL
                        phone_verified_at: null
                        address1: '640 Sauer Rest Suite 131'
                        address2: 'Creminfurt, OK 93641'
                        postal_code: 09109-2968
                        city: 'Larson Group'
                        clinic_name: 'West Lourdesville'
                        clinic_location: "3168 Shanelle Stravenue\nTreviontown, AL 53441-0149"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:43.000000Z'
                        updated_at: '2026-01-12T16:47:43.000000Z'
                        invitation_status: accepted
                        acadle_invitation_status: null
                        roles:
                          -
                            id: 2
                            name: ClinicAdmin
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 26
                        mrn:
                          type: string
                          example: UXZINV7U1768236463
                        name:
                          type: string
                          example: 'Courtney Fay'
                        email:
                          type: string
                          example: 1768236463shanny.robel@example.com
                        language:
                          type: string
                          example: en
                        phone:
                          type: string
                          example: 1-458-352-4859
                        phone_country:
                          type: string
                          example: MW
                        phone_verified_at:
                          type: string
                          example: null
                        address1:
                          type: string
                          example: '9559 Viola Ways Apt. 259'
                        address2:
                          type: string
                          example: 'Reynoldsborough, DE 76304'
                        postal_code:
                          type: string
                          example: 49074-1302
                        city:
                          type: string
                          example: "O'Kon-Windler"
                        clinic_name:
                          type: string
                          example: Franzbury
                        clinic_location:
                          type: string
                          example: "224 Labadie Avenue\nWest Immanuel, LA 17322"
                        image:
                          type: string
                          example: null
                        mfa_enabled:
                          type: integer
                          example: 0
                        mfa_method:
                          type: string
                          example: null
                        mfa_verified_to:
                          type: string
                          example: null
                        location_id:
                          type: string
                          example: null
                        created_by:
                          type: string
                          example: null
                        active:
                          type: integer
                          example: 1
                        notifications_timezone:
                          type: string
                          example: null
                        notifications_at:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:43.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:43.000000Z'
                        invitation_status:
                          type: string
                          example: null
                        acadle_invitation_status:
                          type: string
                          example: null
                        roles:
                          type: array
                          example:
                            -
                              id: 1
                              name: SuperAdmin
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 1
                              name:
                                type: string
                                example: SuperAdmin
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list users for invitations'
                  code: 'INVITATIONS_ACADLE:USERS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list users for invitations'
                  code:
                    type: string
                    example: 'INVITATIONS_ACADLE:USERS:INSUFFICIENT_PERMISSION'
      tags:
        - Invitations
  /api/invite/acadle:
    post:
      summary: 'Create Acadle invitation'
      operationId: createAcadleInvitation
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 28
                  mrn: 9Z82F4TO1768236463
                  name: 'Giuseppe Lang'
                  email: 1768236463gillian.osinski@example.com
                  language: en
                  phone: +1.562.645.2328
                  phone_country: TG
                  phone_verified_at: null
                  address1: '296 Watsica Fork'
                  address2: 'Earlenefurt, OH 11386'
                  postal_code: 09942-3082
                  city: 'Roberts, Deckow and Hyatt'
                  clinic_name: Williambury
                  clinic_location: "8703 Stark Light Suite 494\nGaylordhaven, NV 26822-6657"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:47:43.000000Z'
                  updated_at: '2026-01-12T16:47:43.000000Z'
                  invitation_status: accepted
                  acadle_invitation_status: null
                  invitations:
                    -
                      id: 4
                      user_id: 29
                      invited_user_id: 28
                      type: clinician
                      training_confirmed: 1
                      created_at: '2026-01-12T16:47:44.000000Z'
                      updated_at: '2026-01-12T16:47:44.000000Z'
                  roles:
                    -
                      id: 2
                      name: ClinicAdmin
                properties:
                  id:
                    type: integer
                    example: 28
                  mrn:
                    type: string
                    example: 9Z82F4TO1768236463
                  name:
                    type: string
                    example: 'Giuseppe Lang'
                  email:
                    type: string
                    example: 1768236463gillian.osinski@example.com
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: +1.562.645.2328
                  phone_country:
                    type: string
                    example: TG
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '296 Watsica Fork'
                  address2:
                    type: string
                    example: 'Earlenefurt, OH 11386'
                  postal_code:
                    type: string
                    example: 09942-3082
                  city:
                    type: string
                    example: 'Roberts, Deckow and Hyatt'
                  clinic_name:
                    type: string
                    example: Williambury
                  clinic_location:
                    type: string
                    example: "8703 Stark Light Suite 494\nGaylordhaven, NV 26822-6657"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:43.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:43.000000Z'
                  invitation_status:
                    type: string
                    example: accepted
                  acadle_invitation_status:
                    type: string
                    example: null
                  invitations:
                    type: array
                    example:
                      -
                        id: 4
                        user_id: 29
                        invited_user_id: 28
                        type: clinician
                        training_confirmed: 1
                        created_at: '2026-01-12T16:47:44.000000Z'
                        updated_at: '2026-01-12T16:47:44.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 4
                        user_id:
                          type: integer
                          example: 29
                        invited_user_id:
                          type: integer
                          example: 28
                        type:
                          type: string
                          example: clinician
                        training_confirmed:
                          type: integer
                          example: 1
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:44.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:44.000000Z'
                  roles:
                    type: array
                    example:
                      -
                        id: 2
                        name: ClinicAdmin
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 2
                        name:
                          type: string
                          example: ClinicAdmin
        400:
          description: 'User already exists'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User with this email already exists in the system'
                  code: 'INVITATIONS_ACADLE:CREATE:USER_ALREADY_EXISTS'
                properties:
                  message:
                    type: string
                    example: 'User with this email already exists in the system'
                  code:
                    type: string
                    example: 'INVITATIONS_ACADLE:CREATE:USER_ALREADY_EXISTS'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to create invitations'
                  code: 'INVITATIONS_ACADLE:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to create invitations'
                  code:
                    type: string
                    example: 'INVITATIONS_ACADLE:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - Invitations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'Email address of the Acadle user.'
                  example: icollier@example.com
              required:
                - email
  '/api/invite/acadle/{userId}/resend':
    post:
      summary: 'Resend Acadle invitation'
      operationId: resendAcadleInvitation
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 31
                  mrn: 9U7UKJRT1768236464
                  name: 'Lavonne Bruen DDS'
                  email: 1768236464jackson12@example.com
                  language: en
                  phone: '+12608028835'
                  phone_country: SX
                  phone_verified_at: null
                  address1: '1097 Angel Orchard'
                  address2: 'West Yasmeen, MT 16172-0483'
                  postal_code: 00460-7809
                  city: Heller-Kerluke
                  clinic_name: 'North Lauraview'
                  clinic_location: "74584 Dietrich Islands\nSouth Talonville, NH 97344-5960"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:47:44.000000Z'
                  updated_at: '2026-01-12T16:47:44.000000Z'
                  invitation_status: null
                  acadle_invitation_status: null
                  invitations:
                    -
                      id: 5
                      user_id: 32
                      invited_user_id: 31
                      type: clinician
                      training_confirmed: 1
                      created_at: '2026-01-12T16:47:44.000000Z'
                      updated_at: '2026-01-12T16:47:44.000000Z'
                  roles:
                    -
                      id: 1
                      name: SuperAdmin
                properties:
                  id:
                    type: integer
                    example: 31
                  mrn:
                    type: string
                    example: 9U7UKJRT1768236464
                  name:
                    type: string
                    example: 'Lavonne Bruen DDS'
                  email:
                    type: string
                    example: 1768236464jackson12@example.com
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: '+12608028835'
                  phone_country:
                    type: string
                    example: SX
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '1097 Angel Orchard'
                  address2:
                    type: string
                    example: 'West Yasmeen, MT 16172-0483'
                  postal_code:
                    type: string
                    example: 00460-7809
                  city:
                    type: string
                    example: Heller-Kerluke
                  clinic_name:
                    type: string
                    example: 'North Lauraview'
                  clinic_location:
                    type: string
                    example: "74584 Dietrich Islands\nSouth Talonville, NH 97344-5960"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:44.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:44.000000Z'
                  invitation_status:
                    type: string
                    example: null
                  acadle_invitation_status:
                    type: string
                    example: null
                  invitations:
                    type: array
                    example:
                      -
                        id: 5
                        user_id: 32
                        invited_user_id: 31
                        type: clinician
                        training_confirmed: 1
                        created_at: '2026-01-12T16:47:44.000000Z'
                        updated_at: '2026-01-12T16:47:44.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 5
                        user_id:
                          type: integer
                          example: 32
                        invited_user_id:
                          type: integer
                          example: 31
                        type:
                          type: string
                          example: clinician
                        training_confirmed:
                          type: integer
                          example: 1
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:44.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:44.000000Z'
                  roles:
                    type: array
                    example:
                      -
                        id: 1
                        name: SuperAdmin
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: SuperAdmin
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to resend invitations'
                      code: 'INVITATIONS_ACADLE:RESEND:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to resend invitations'
                      code:
                        type: string
                        example: 'INVITATIONS_ACADLE:RESEND:INSUFFICIENT_PERMISSION'
                  -
                    description: 'User not found'
                    type: object
                    example:
                      message: 'User not found'
                      code: 'INVITATIONS_ACADLE:RESEND:USER_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User not found'
                      code:
                        type: string
                        example: 'INVITATIONS_ACADLE:RESEND:USER_NOT_FOUND'
                  -
                    description: 'Invitation already accepted'
                    type: object
                    example:
                      message: 'Invitation already accepted'
                      code: 'INVITATIONS_ACADLE:RESEND:INVITATION_ALREADY_ACCEPTED'
                    properties:
                      message:
                        type: string
                        example: 'Invitation already accepted'
                      code:
                        type: string
                        example: 'INVITATIONS_ACADLE:RESEND:INVITATION_ALREADY_ACCEPTED'
      tags:
        - Invitations
    parameters:
      -
        in: path
        name: userId
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/invite/tokens/{userId}':
    get:
      summary: 'Admin access to invitation tokens'
      operationId: adminAccessToInvitationTokens
      description: '<strong>Requires <code>admin.invitations_tokens_access</code> permission.</strong><br />Fetches only non-accepted and non-expired invitations.'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 1
                    user_id:
                      type: integer
                      example: 1
                    invited_user_id:
                      type: integer
                      example: 2
                    token:
                      type: string
                      example: I0V25NUVMHC0F8RRF1YEY5BT
                    training_confirmed:
                      type: integer
                      example: 1
                    created_at:
                      type: string
                      example: '2025-05-12T12:00:00.000000Z'
                    updated_at:
                      type: string
                      example: '2025-05-12T12:00:00.000000Z'
                example:
                  -
                    id: 1
                    user_id: 1
                    invited_user_id: 2
                    token: I0V25NUVMHC0F8RRF1YEY5BT
                    training_confirmed: 1
                    created_at: '2025-05-12T12:00:00.000000Z'
                    updated_at: '2025-05-12T12:00:00.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to get invitation tokens'
                  code: 'INVITATIONS:ADMIN_TOKENS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to get invitation tokens'
                  code:
                    type: string
                    example: 'INVITATIONS:ADMIN_TOKENS:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'INVITATIONS:ADMIN_TOKENS:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'INVITATIONS:ADMIN_TOKENS:USER_NOT_FOUND'
      tags:
        - Invitations
    parameters:
      -
        in: path
        name: userId
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/logs:
    get:
      summary: 'Get events log'
      operationId: getEventsLog
      description: "user - user account that performed the action<br />\n\t\telement - element model that has been affected by the action"
      parameters:
        -
          in: query
          name: search
          description: "Filter logs by related element data:\n\t\t<ul>\n\t\t\t<li>for users: search by <code>name</code> or <code>email</code></li>\n\t\t\t<li>for devices: search by <code>serial</code> or <code>bluetooth_id</code></li>\n\t\t\t<li>for P2P sessions: search by <code>amputee_uuid</code> or <code>clinician_uuid</code></li>\n\t\t</ul>"
          example: Test
          required: false
          schema:
            type: string
            description: "Filter logs by related element data:\n\t\t<ul>\n\t\t\t<li>for users: search by <code>name</code> or <code>email</code></li>\n\t\t\t<li>for devices: search by <code>serial</code> or <code>bluetooth_id</code></li>\n\t\t\t<li>for P2P sessions: search by <code>amputee_uuid</code> or <code>clinician_uuid</code></li>\n\t\t</ul>"
            example: Test
        -
          in: query
          name: ip
          description: 'Filter logs by IP address.'
          example: 200.200.100.5
          required: false
          schema:
            type: string
            description: 'Filter logs by IP address.'
            example: 200.200.100.5
        -
          in: query
          name: user
          description: 'Filter logs by user.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Filter logs by user.'
            example: 1
        -
          in: query
          name: type
          description: 'Filter logs by event type (available: <code>user</code>, <code>device</code>, <code>p2p_session</code>.'
          example: user
          required: false
          schema:
            type: string
            description: 'Filter logs by event type (available: <code>user</code>, <code>device</code>, <code>p2p_session</code>.'
            example: user
        -
          in: query
          name: date_from
          description: 'Filter logs from date (timestamp).'
          example: 1642003200
          required: false
          schema:
            type: integer
            description: 'Filter logs from date (timestamp).'
            example: 1642003200
        -
          in: query
          name: date_to
          description: 'Filter logs to date (timestamp).'
          example: 1642003200
          required: false
          schema:
            type: integer
            description: 'Filter logs to date (timestamp).'
            example: 1642003200
        -
          in: query
          name: include_sessions
          description: 'Login and logout events are filtered out by default. Set this parameter to 1 to include these events.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Login and logout events are filtered out by default. Set this parameter to 1 to include these events.'
            example: 1
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>type</code>, <code>username</code>, <code>ip_address</code>, <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>type</code>, <code>username</code>, <code>ip_address</code>, <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      user_id: 277
                      event_name: event_factory
                      element_type: App\Models\User
                      element_id: 276
                      comments: ''
                      ip_address: 111.202.64.126
                      created_at: '2004-08-04T12:40:08.000000Z'
                      updated_at: '2026-01-12T16:48:07.000000Z'
                      user:
                        id: 277
                        mrn: 7TR97DV21768236486
                        name: 'Emily Gutkowski'
                        email: 1768236486hartmann.germaine@example.com
                        language: en
                        phone: '(413) 599-0482'
                        phone_country: AF
                        phone_verified_at: null
                        address1: '93063 Kshlerin Throughway'
                        address2: 'Roxannemouth, LA 33861'
                        postal_code: 98728-3288
                        city: Waters-Moen
                        clinic_name: 'North Elwyntown'
                        clinic_location: "11729 Johanna Terrace\nGorczanyborough, WI 91820-6738"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:07.000000Z'
                        updated_at: '2026-01-12T16:48:07.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                      element:
                        id: 276
                        mrn: N55EF71U1768236486
                        name: 'Dagmar Carter'
                        email: 1768236486armstrong.sheldon@example.com
                        language: en
                        phone: '(848) 963-9125'
                        phone_country: VA
                        phone_verified_at: null
                        address1: '1058 Madonna Summit Suite 768'
                        address2: 'West Ruben, MD 84436'
                        postal_code: '15202'
                        city: Kessler-Davis
                        clinic_name: Rosenbaumberg
                        clinic_location: "71429 Price Ranch\nSouth Alexismouth, TN 25059"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:06.000000Z'
                        updated_at: '2026-01-12T16:48:06.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                    -
                      id: 2
                      user_id: 280
                      event_name: event_factory
                      element_type: App\Models\User
                      element_id: 279
                      comments: ''
                      ip_address: 152.79.104.144
                      created_at: '2008-05-01T12:58:50.000000Z'
                      updated_at: '2026-01-12T16:48:07.000000Z'
                      user:
                        id: 280
                        mrn: DRPD797P1768236487
                        name: 'Concepcion Swaniawski'
                        email: 1768236487xlubowitz@example.org
                        language: en
                        phone: '+1 (785) 352-6291'
                        phone_country: MX
                        phone_verified_at: null
                        address1: '2475 Howell Landing'
                        address2: 'Deckowmouth, WY 52906-4708'
                        postal_code: 99415-8237
                        city: Weber-Schinner
                        clinic_name: 'Lake Conniebury'
                        clinic_location: "668 Emmett Center\nRusselton, NM 74107"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:07.000000Z'
                        updated_at: '2026-01-12T16:48:07.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                      element:
                        id: 279
                        mrn: 8QE6HDIB1768236487
                        name: 'Dr. Jed Beatty'
                        email: 1768236487monica85@example.org
                        language: en
                        phone: 484.581.2859
                        phone_country: UM
                        phone_verified_at: null
                        address1: '586 Kihn Port Apt. 542'
                        address2: 'South Rexborough, AL 71167'
                        postal_code: 04262-8945
                        city: Keebler-Dach
                        clinic_name: 'East Madonnaberg'
                        clinic_location: "95038 Dan Road Apt. 114\nJerroldborough, CO 51000-1887"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:48:07.000000Z'
                        updated_at: '2026-01-12T16:48:07.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        user_id: 277
                        event_name: event_factory
                        element_type: App\Models\User
                        element_id: 276
                        comments: ''
                        ip_address: 111.202.64.126
                        created_at: '2004-08-04T12:40:08.000000Z'
                        updated_at: '2026-01-12T16:48:07.000000Z'
                        user:
                          id: 277
                          mrn: 7TR97DV21768236486
                          name: 'Emily Gutkowski'
                          email: 1768236486hartmann.germaine@example.com
                          language: en
                          phone: '(413) 599-0482'
                          phone_country: AF
                          phone_verified_at: null
                          address1: '93063 Kshlerin Throughway'
                          address2: 'Roxannemouth, LA 33861'
                          postal_code: 98728-3288
                          city: Waters-Moen
                          clinic_name: 'North Elwyntown'
                          clinic_location: "11729 Johanna Terrace\nGorczanyborough, WI 91820-6738"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:48:07.000000Z'
                          updated_at: '2026-01-12T16:48:07.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                        element:
                          id: 276
                          mrn: N55EF71U1768236486
                          name: 'Dagmar Carter'
                          email: 1768236486armstrong.sheldon@example.com
                          language: en
                          phone: '(848) 963-9125'
                          phone_country: VA
                          phone_verified_at: null
                          address1: '1058 Madonna Summit Suite 768'
                          address2: 'West Ruben, MD 84436'
                          postal_code: '15202'
                          city: Kessler-Davis
                          clinic_name: Rosenbaumberg
                          clinic_location: "71429 Price Ranch\nSouth Alexismouth, TN 25059"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:48:06.000000Z'
                          updated_at: '2026-01-12T16:48:06.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                      -
                        id: 2
                        user_id: 280
                        event_name: event_factory
                        element_type: App\Models\User
                        element_id: 279
                        comments: ''
                        ip_address: 152.79.104.144
                        created_at: '2008-05-01T12:58:50.000000Z'
                        updated_at: '2026-01-12T16:48:07.000000Z'
                        user:
                          id: 280
                          mrn: DRPD797P1768236487
                          name: 'Concepcion Swaniawski'
                          email: 1768236487xlubowitz@example.org
                          language: en
                          phone: '+1 (785) 352-6291'
                          phone_country: MX
                          phone_verified_at: null
                          address1: '2475 Howell Landing'
                          address2: 'Deckowmouth, WY 52906-4708'
                          postal_code: 99415-8237
                          city: Weber-Schinner
                          clinic_name: 'Lake Conniebury'
                          clinic_location: "668 Emmett Center\nRusselton, NM 74107"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:48:07.000000Z'
                          updated_at: '2026-01-12T16:48:07.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                        element:
                          id: 279
                          mrn: 8QE6HDIB1768236487
                          name: 'Dr. Jed Beatty'
                          email: 1768236487monica85@example.org
                          language: en
                          phone: 484.581.2859
                          phone_country: UM
                          phone_verified_at: null
                          address1: '586 Kihn Port Apt. 542'
                          address2: 'South Rexborough, AL 71167'
                          postal_code: 04262-8945
                          city: Keebler-Dach
                          clinic_name: 'East Madonnaberg'
                          clinic_location: "95038 Dan Road Apt. 114\nJerroldborough, CO 51000-1887"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:48:07.000000Z'
                          updated_at: '2026-01-12T16:48:07.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        user_id:
                          type: integer
                          example: 277
                        event_name:
                          type: string
                          example: event_factory
                        element_type:
                          type: string
                          example: App\Models\User
                        element_id:
                          type: integer
                          example: 276
                        comments:
                          type: string
                          example: ''
                        ip_address:
                          type: string
                          example: 111.202.64.126
                        created_at:
                          type: string
                          example: '2004-08-04T12:40:08.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:07.000000Z'
                        user:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 277
                            mrn:
                              type: string
                              example: 7TR97DV21768236486
                            name:
                              type: string
                              example: 'Emily Gutkowski'
                            email:
                              type: string
                              example: 1768236486hartmann.germaine@example.com
                            language:
                              type: string
                              example: en
                            phone:
                              type: string
                              example: '(413) 599-0482'
                            phone_country:
                              type: string
                              example: AF
                            phone_verified_at:
                              type: string
                              example: null
                            address1:
                              type: string
                              example: '93063 Kshlerin Throughway'
                            address2:
                              type: string
                              example: 'Roxannemouth, LA 33861'
                            postal_code:
                              type: string
                              example: 98728-3288
                            city:
                              type: string
                              example: Waters-Moen
                            clinic_name:
                              type: string
                              example: 'North Elwyntown'
                            clinic_location:
                              type: string
                              example: "11729 Johanna Terrace\nGorczanyborough, WI 91820-6738"
                            image:
                              type: string
                              example: null
                            mfa_enabled:
                              type: integer
                              example: 0
                            mfa_method:
                              type: string
                              example: null
                            mfa_verified_to:
                              type: string
                              example: null
                            location_id:
                              type: string
                              example: null
                            created_by:
                              type: string
                              example: null
                            active:
                              type: integer
                              example: 1
                            notifications_timezone:
                              type: string
                              example: null
                            notifications_at:
                              type: string
                              example: null
                            created_at:
                              type: string
                              example: '2026-01-12T16:48:07.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:48:07.000000Z'
                            invitation_status:
                              type: string
                              example: null
                            acadle_invitation_status:
                              type: string
                              example: null
                            roles:
                              type: array
                              example: []
                        element:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 276
                            mrn:
                              type: string
                              example: N55EF71U1768236486
                            name:
                              type: string
                              example: 'Dagmar Carter'
                            email:
                              type: string
                              example: 1768236486armstrong.sheldon@example.com
                            language:
                              type: string
                              example: en
                            phone:
                              type: string
                              example: '(848) 963-9125'
                            phone_country:
                              type: string
                              example: VA
                            phone_verified_at:
                              type: string
                              example: null
                            address1:
                              type: string
                              example: '1058 Madonna Summit Suite 768'
                            address2:
                              type: string
                              example: 'West Ruben, MD 84436'
                            postal_code:
                              type: string
                              example: '15202'
                            city:
                              type: string
                              example: Kessler-Davis
                            clinic_name:
                              type: string
                              example: Rosenbaumberg
                            clinic_location:
                              type: string
                              example: "71429 Price Ranch\nSouth Alexismouth, TN 25059"
                            image:
                              type: string
                              example: null
                            mfa_enabled:
                              type: integer
                              example: 0
                            mfa_method:
                              type: string
                              example: null
                            mfa_verified_to:
                              type: string
                              example: null
                            location_id:
                              type: string
                              example: null
                            created_by:
                              type: string
                              example: null
                            active:
                              type: integer
                              example: 1
                            notifications_timezone:
                              type: string
                              example: null
                            notifications_at:
                              type: string
                              example: null
                            created_at:
                              type: string
                              example: '2026-01-12T16:48:06.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:48:06.000000Z'
                            invitation_status:
                              type: string
                              example: null
                            acadle_invitation_status:
                              type: string
                              example: null
                            roles:
                              type: array
                              example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to access event logs'
                  code: 'EVENT_LOGS:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to access event logs'
                  code:
                    type: string
                    example: 'EVENT_LOGS:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - Logs
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                date_from:
                  type: string
                  description: ''
                  example: null
                date_to:
                  type: string
                  description: ''
                  example: null
  /api/messages:
    get:
      summary: 'Get user messages list'
      operationId: getUserMessagesList
      description: ''
      parameters:
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      user_id: null
                      message_id: 1
                      is_read: 0
                      is_archived: 0
                      is_deleted: 0
                      message:
                        id: 1
                        sender_id: null
                        title: 'Et nemo quidem sit et expedita earum.'
                        content: 'Sit cumque et autem et et qui est.'
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                        sender: null
                    -
                      id: 2
                      user_id: null
                      message_id: 2
                      is_read: 0
                      is_archived: 0
                      is_deleted: 0
                      message:
                        id: 2
                        sender_id: null
                        title: 'Debitis autem nulla iure omnis est.'
                        content: 'Amet quo unde est voluptas ut.'
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                        sender: null
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        user_id: null
                        message_id: 1
                        is_read: 0
                        is_archived: 0
                        is_deleted: 0
                        message:
                          id: 1
                          sender_id: null
                          title: 'Et nemo quidem sit et expedita earum.'
                          content: 'Sit cumque et autem et et qui est.'
                          created_at: '2026-01-12T16:47:54.000000Z'
                          updated_at: '2026-01-12T16:47:54.000000Z'
                          sender: null
                      -
                        id: 2
                        user_id: null
                        message_id: 2
                        is_read: 0
                        is_archived: 0
                        is_deleted: 0
                        message:
                          id: 2
                          sender_id: null
                          title: 'Debitis autem nulla iure omnis est.'
                          content: 'Amet quo unde est voluptas ut.'
                          created_at: '2026-01-12T16:47:54.000000Z'
                          updated_at: '2026-01-12T16:47:54.000000Z'
                          sender: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        user_id:
                          type: string
                          example: null
                        message_id:
                          type: integer
                          example: 1
                        is_read:
                          type: integer
                          example: 0
                        is_archived:
                          type: integer
                          example: 0
                        is_deleted:
                          type: integer
                          example: 0
                        message:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            sender_id:
                              type: string
                              example: null
                            title:
                              type: string
                              example: 'Et nemo quidem sit et expedita earum.'
                            content:
                              type: string
                              example: 'Sit cumque et autem et et qui est.'
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:54.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:54.000000Z'
                            sender:
                              type: string
                              example: null
      tags:
        - Messages
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                filter:
                  type: string
                  description: 'Filter results by message status (available: <code>archived</code>, <code>all</code>). Defaults to non-archived only.'
                  example: all
  /api/message:
    post:
      summary: 'Send message to multiple users'
      operationId: sendMessageToMultipleUsers
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Messages sent'
                  count: 3
                  code: 'MESSAGES:SEND:SENT'
                properties:
                  message:
                    type: string
                    example: 'Messages sent'
                  count:
                    type: integer
                    example: 3
                  code:
                    type: string
                    example: 'MESSAGES:SEND:SENT'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to send messages'
                  code: 'MESSAGES:SEND:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to send messages'
                  code:
                    type: string
                    example: 'MESSAGES:SEND:INSUFFICIENT_PERMISSION'
      tags:
        - Messages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Message title. MINIMUM:STRING_LENGTH:3.'
                  example: 'Reminder about your vaccination'
                content:
                  type: string
                  description: 'Message content text.'
                  example: 'Lorem ipsum dolor sit amet'
                roles:
                  type: string
                  description: 'Filter recipients with given role (comma-separated).'
                  example: 'Clinician,Amputee'
              required:
                - title
  '/api/message/{id}/read':
    post:
      summary: 'Mark message as read'
      operationId: markMessageAsRead
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  user_id: 143
                  message_id: 3
                  is_read: 0
                  is_archived: 0
                  is_deleted: 0
                properties:
                  id:
                    type: integer
                    example: 3
                  user_id:
                    type: integer
                    example: 143
                  message_id:
                    type: integer
                    example: 3
                  is_read:
                    type: integer
                    example: 0
                  is_archived:
                    type: integer
                    example: 0
                  is_deleted:
                    type: integer
                    example: 0
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to mark this message as read'
                  code: 'MESSAGES:READ:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to mark this message as read'
                  code:
                    type: string
                    example: 'MESSAGES:READ:INSUFFICIENT_PERMISSION'
        404:
          description: 'Message not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Message not found'
                  code: 'MESSAGES:READ:MESSAGE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Message not found'
                  code:
                    type: string
                    example: 'MESSAGES:READ:MESSAGE_NOT_FOUND'
      tags:
        - Messages
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                state:
                  type: boolean
                  description: 'Explicit read state. Default: 1 (true).'
                  example: true
    parameters:
      -
        in: path
        name: id
        description: 'User Message ID (id from messages list; do not confuse with message_id).'
        example: 1
        required: true
        schema:
          type: integer
  '/api/message/{id}/archive':
    post:
      summary: 'Mark message as archived'
      operationId: markMessageAsArchived
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  user_id: 144
                  message_id: 4
                  is_read: 0
                  is_archived: 0
                  is_deleted: 0
                properties:
                  id:
                    type: integer
                    example: 4
                  user_id:
                    type: integer
                    example: 144
                  message_id:
                    type: integer
                    example: 4
                  is_read:
                    type: integer
                    example: 0
                  is_archived:
                    type: integer
                    example: 0
                  is_deleted:
                    type: integer
                    example: 0
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to mark this message as archived'
                  code: 'MESSAGES:ARCHIVE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to mark this message as archived'
                  code:
                    type: string
                    example: 'MESSAGES:ARCHIVE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Message not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Message not found'
                  code: 'MESSAGES:ARCHIVE:MESSAGE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Message not found'
                  code:
                    type: string
                    example: 'MESSAGES:ARCHIVE:MESSAGE_NOT_FOUND'
      tags:
        - Messages
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                state:
                  type: boolean
                  description: 'Explicit archived state. Default: 1 (true).'
                  example: true
    parameters:
      -
        in: path
        name: id
        description: 'User Message ID (id from messages list; do not confuse with message_id).'
        example: 1
        required: true
        schema:
          type: integer
  /api/messages-and-tickets:
    get:
      summary: 'List of messages and tickets'
      operationId: listOfMessagesAndTickets
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 2
                  items:
                    -
                      type: UserMessage
                      date: '2024-11-02T10:00:00.000000Z'
                      item:
                        id: 1
                        user_id: 1
                        message_id: 1
                        is_read: 0
                        is_archived: 0
                        is_deleted: 0
                        message:
                          id: 1
                          sender_id: 1
                          title: 'Message title'
                          content: 'Message content'
                          created_at: '2024-11-02T10:00:00.000000Z'
                          updated_at: '2024-11-02T10:00:00.000000Z'
                          sender:
                            id: 1
                            mrn: MRN
                            name: 'User name'
                            email: user@domain.com
                            language: en
                            phone: ''
                            phone_verified_at: null
                            address1: ''
                            address2: ''
                            postal_code: ''
                            city: ''
                            clinic_name: 'Test Company'
                            clinic_location: 'Test Company Location'
                            image: null
                            mfa_enabled: 0
                            mfa_method: email
                            mfa_verified_to: null
                            created_by: null
                            active: 1
                            notifications_timezone: Europe/Warsaw
                            notifications_at: '08:00:00'
                            created_at: '2024-09-01T15:00:00.000000Z'
                            updated_at: '2024-10-10T10:30:00.000000Z'
                            invitation_status: accepted
                            roles:
                              -
                                id: 3
                                name: Clinician
                                guard_name: web
                                created_at: '2024-01-01T12:00:00.000000Z'
                                updated_at: '2024-01-01T12:00:00.000000Z'
                                pivot:
                                  model_id: 1
                                  role_id: 3
                                  model_type: App\Models\User
                    -
                      type: SupportTicket
                      date: '2024-11-01T15:15:00.000000Z'
                      item:
                        id: 1
                        sender_id: 1
                        recipient_id: 999
                        device_id: null
                        meeting_date: '2024-11-10T15:00:00.000000Z'
                        meeting_type: none
                        contact_email: null
                        status: new
                        created_at: '2024-11-01T15:15:00.000000Z'
                        updated_at: '2024-11-01T15:15:00.000000Z'
                        sender:
                          id: 1
                          mrn: MRN
                          name: 'User name'
                          email: user@domain.com
                          language: en
                          phone: ''
                          phone_verified_at: null
                          address1: ''
                          address2: ''
                          postal_code: ''
                          city: ''
                          clinic_name: 'Test Company'
                          clinic_location: 'Test Company Location'
                          image: null
                          mfa_enabled: 0
                          mfa_method: email
                          mfa_verified_to: null
                          created_by: null
                          active: 1
                          notifications_timezone: Europe/Warsaw
                          notifications_at: '08:00:00'
                          created_at: '2024-09-01T15:00:00.000000Z'
                          updated_at: '2024-10-10T10:30:00.000000Z'
                          invitation_status: accepted
                          roles:
                            -
                              id: 3
                              name: Clinician
                              guard_name: web
                              created_at: '2024-01-01T12:00:00.000000Z'
                              updated_at: '2024-01-01T12:00:00.000000Z'
                              pivot:
                                model_id: 1
                                role_id: 3
                                model_type: App\Models\User
                        recipient:
                          id: 2
                          mrn: MRN2
                          name: Patient
                          email: patient4@domain.com
                          language: en
                          phone: ''
                          phone_verified_at: null
                          address1: ''
                          address2: ''
                          postal_code: ''
                          city: ''
                          clinic_name: null
                          clinic_location: null
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          created_by: 1
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2024-10-01T15:00:00.000000Z'
                          updated_at: '2024-10-10T10:30:00.000000Z'
                          invitation_status: null
                          roles:
                            -
                              id: 5
                              name: Amputee
                              guard_name: web
                              created_at: '2024-01-01T12:00:00.000000Z'
                              updated_at: '2024-01-01T12:00:00.000000Z'
                              pivot:
                                model_id: 2
                                role_id: 5
                                model_type: App\Models\User
                        device: null
                        messages:
                          -
                            id: 1
                            ticket_id: 1
                            sender_id: 1
                            title: 'Communication channel'
                            content: 'Welcome to the digital platform. Please use this channel for communicating with your clinician.'
                            is_read: false
                            created_at: '2024-11-01T15:15:00.000000Z'
                            updated_at: '2024-11-01T15:15:00.000000Z'
                            attachments: []
                            sender:
                              id: 1
                              mrn: MRN
                              name: 'User name'
                              email: user@domain.com
                              language: en
                              phone: ''
                              phone_verified_at: null
                              address1: ''
                              address2: ''
                              postal_code: ''
                              city: ''
                              clinic_name: 'Test Company'
                              clinic_location: 'Test Company Location'
                              image: null
                              mfa_enabled: 0
                              mfa_method: email
                              mfa_verified_to: null
                              created_by: null
                              active: 1
                              notifications_timezone: Europe/Warsaw
                              notifications_at: '08:00:00'
                              created_at: '2024-09-01T15:00:00.000000Z'
                              updated_at: '2024-10-10T10:30:00.000000Z'
                              invitation_status: accepted
                              roles:
                                -
                                  id: 3
                                  name: Clinician
                                  guard_name: web
                                  created_at: '2024-01-01T12:00:00.000000Z'
                                  updated_at: '2024-01-01T12:00:00.000000Z'
                                  pivot:
                                    model_id: 1
                                    role_id: 3
                                    model_type: App\Models\User
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 2
                  items:
                    type: array
                    example:
                      -
                        type: UserMessage
                        date: '2024-11-02T10:00:00.000000Z'
                        item:
                          id: 1
                          user_id: 1
                          message_id: 1
                          is_read: 0
                          is_archived: 0
                          is_deleted: 0
                          message:
                            id: 1
                            sender_id: 1
                            title: 'Message title'
                            content: 'Message content'
                            created_at: '2024-11-02T10:00:00.000000Z'
                            updated_at: '2024-11-02T10:00:00.000000Z'
                            sender:
                              id: 1
                              mrn: MRN
                              name: 'User name'
                              email: user@domain.com
                              language: en
                              phone: ''
                              phone_verified_at: null
                              address1: ''
                              address2: ''
                              postal_code: ''
                              city: ''
                              clinic_name: 'Test Company'
                              clinic_location: 'Test Company Location'
                              image: null
                              mfa_enabled: 0
                              mfa_method: email
                              mfa_verified_to: null
                              created_by: null
                              active: 1
                              notifications_timezone: Europe/Warsaw
                              notifications_at: '08:00:00'
                              created_at: '2024-09-01T15:00:00.000000Z'
                              updated_at: '2024-10-10T10:30:00.000000Z'
                              invitation_status: accepted
                              roles:
                                -
                                  id: 3
                                  name: Clinician
                                  guard_name: web
                                  created_at: '2024-01-01T12:00:00.000000Z'
                                  updated_at: '2024-01-01T12:00:00.000000Z'
                                  pivot:
                                    model_id: 1
                                    role_id: 3
                                    model_type: App\Models\User
                      -
                        type: SupportTicket
                        date: '2024-11-01T15:15:00.000000Z'
                        item:
                          id: 1
                          sender_id: 1
                          recipient_id: 999
                          device_id: null
                          meeting_date: '2024-11-10T15:00:00.000000Z'
                          meeting_type: none
                          contact_email: null
                          status: new
                          created_at: '2024-11-01T15:15:00.000000Z'
                          updated_at: '2024-11-01T15:15:00.000000Z'
                          sender:
                            id: 1
                            mrn: MRN
                            name: 'User name'
                            email: user@domain.com
                            language: en
                            phone: ''
                            phone_verified_at: null
                            address1: ''
                            address2: ''
                            postal_code: ''
                            city: ''
                            clinic_name: 'Test Company'
                            clinic_location: 'Test Company Location'
                            image: null
                            mfa_enabled: 0
                            mfa_method: email
                            mfa_verified_to: null
                            created_by: null
                            active: 1
                            notifications_timezone: Europe/Warsaw
                            notifications_at: '08:00:00'
                            created_at: '2024-09-01T15:00:00.000000Z'
                            updated_at: '2024-10-10T10:30:00.000000Z'
                            invitation_status: accepted
                            roles:
                              -
                                id: 3
                                name: Clinician
                                guard_name: web
                                created_at: '2024-01-01T12:00:00.000000Z'
                                updated_at: '2024-01-01T12:00:00.000000Z'
                                pivot:
                                  model_id: 1
                                  role_id: 3
                                  model_type: App\Models\User
                          recipient:
                            id: 2
                            mrn: MRN2
                            name: Patient
                            email: patient4@domain.com
                            language: en
                            phone: ''
                            phone_verified_at: null
                            address1: ''
                            address2: ''
                            postal_code: ''
                            city: ''
                            clinic_name: null
                            clinic_location: null
                            image: null
                            mfa_enabled: 0
                            mfa_method: null
                            mfa_verified_to: null
                            created_by: 1
                            active: 1
                            notifications_timezone: null
                            notifications_at: null
                            created_at: '2024-10-01T15:00:00.000000Z'
                            updated_at: '2024-10-10T10:30:00.000000Z'
                            invitation_status: null
                            roles:
                              -
                                id: 5
                                name: Amputee
                                guard_name: web
                                created_at: '2024-01-01T12:00:00.000000Z'
                                updated_at: '2024-01-01T12:00:00.000000Z'
                                pivot:
                                  model_id: 2
                                  role_id: 5
                                  model_type: App\Models\User
                          device: null
                          messages:
                            -
                              id: 1
                              ticket_id: 1
                              sender_id: 1
                              title: 'Communication channel'
                              content: 'Welcome to the digital platform. Please use this channel for communicating with your clinician.'
                              is_read: false
                              created_at: '2024-11-01T15:15:00.000000Z'
                              updated_at: '2024-11-01T15:15:00.000000Z'
                              attachments: []
                              sender:
                                id: 1
                                mrn: MRN
                                name: 'User name'
                                email: user@domain.com
                                language: en
                                phone: ''
                                phone_verified_at: null
                                address1: ''
                                address2: ''
                                postal_code: ''
                                city: ''
                                clinic_name: 'Test Company'
                                clinic_location: 'Test Company Location'
                                image: null
                                mfa_enabled: 0
                                mfa_method: email
                                mfa_verified_to: null
                                created_by: null
                                active: 1
                                notifications_timezone: Europe/Warsaw
                                notifications_at: '08:00:00'
                                created_at: '2024-09-01T15:00:00.000000Z'
                                updated_at: '2024-10-10T10:30:00.000000Z'
                                invitation_status: accepted
                                roles:
                                  -
                                    id: 3
                                    name: Clinician
                                    guard_name: web
                                    created_at: '2024-01-01T12:00:00.000000Z'
                                    updated_at: '2024-01-01T12:00:00.000000Z'
                                    pivot:
                                      model_id: 1
                                      role_id: 3
                                      model_type: App\Models\User
                    items:
                      type: object
                      properties:
                        type:
                          type: string
                          example: UserMessage
                        date:
                          type: string
                          example: '2024-11-02T10:00:00.000000Z'
                        item:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            user_id:
                              type: integer
                              example: 1
                            message_id:
                              type: integer
                              example: 1
                            is_read:
                              type: integer
                              example: 0
                            is_archived:
                              type: integer
                              example: 0
                            is_deleted:
                              type: integer
                              example: 0
                            message:
                              type: object
                              properties:
                                id:
                                  type: integer
                                  example: 1
                                sender_id:
                                  type: integer
                                  example: 1
                                title:
                                  type: string
                                  example: 'Message title'
                                content:
                                  type: string
                                  example: 'Message content'
                                created_at:
                                  type: string
                                  example: '2024-11-02T10:00:00.000000Z'
                                updated_at:
                                  type: string
                                  example: '2024-11-02T10:00:00.000000Z'
                                sender:
                                  type: object
                                  properties:
                                    id:
                                      type: integer
                                      example: 1
                                    mrn:
                                      type: string
                                      example: MRN
                                    name:
                                      type: string
                                      example: 'User name'
                                    email:
                                      type: string
                                      example: user@domain.com
                                    language:
                                      type: string
                                      example: en
                                    phone:
                                      type: string
                                      example: ''
                                    phone_verified_at:
                                      type: string
                                      example: null
                                    address1:
                                      type: string
                                      example: ''
                                    address2:
                                      type: string
                                      example: ''
                                    postal_code:
                                      type: string
                                      example: ''
                                    city:
                                      type: string
                                      example: ''
                                    clinic_name:
                                      type: string
                                      example: 'Test Company'
                                    clinic_location:
                                      type: string
                                      example: 'Test Company Location'
                                    image:
                                      type: string
                                      example: null
                                    mfa_enabled:
                                      type: integer
                                      example: 0
                                    mfa_method:
                                      type: string
                                      example: email
                                    mfa_verified_to:
                                      type: string
                                      example: null
                                    created_by:
                                      type: string
                                      example: null
                                    active:
                                      type: integer
                                      example: 1
                                    notifications_timezone:
                                      type: string
                                      example: Europe/Warsaw
                                    notifications_at:
                                      type: string
                                      example: '08:00:00'
                                    created_at:
                                      type: string
                                      example: '2024-09-01T15:00:00.000000Z'
                                    updated_at:
                                      type: string
                                      example: '2024-10-10T10:30:00.000000Z'
                                    invitation_status:
                                      type: string
                                      example: accepted
                                    roles:
                                      type: array
                                      example: [{ id: 3, name: Clinician, guard_name: web, created_at: '2024-01-01T12:00:00.000000Z', updated_at: '2024-01-01T12:00:00.000000Z', pivot: { model_id: 1, role_id: 3, model_type: App\Models\User } }]
                                      items: { type: object, properties: { id: { type: integer, example: 3 }, name: { type: string, example: Clinician }, guard_name: { type: string, example: web }, created_at: { type: string, example: '2024-01-01T12:00:00.000000Z' }, updated_at: { type: string, example: '2024-01-01T12:00:00.000000Z' }, pivot: { type: object, properties: { model_id: { type: integer, example: 1 }, role_id: { type: integer, example: 3 }, model_type: { type: string, example: App\Models\User } } } } }
      tags:
        - Messages
  /api/mobile-logs:
    post:
      summary: 'Store log'
      operationId: storeLog
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  user_id: 281
                  device_id: 134
                  file: /tmp/fakerazzFcK
                  date_start: '1998-08-29 21:37:04'
                  date_end: '2010-12-16 09:37:11'
                  created_at: '2026-01-12T16:48:07.000000Z'
                  updated_at: '2026-01-12T16:48:07.000000Z'
                properties:
                  id:
                    type: integer
                    example: 1
                  user_id:
                    type: integer
                    example: 281
                  device_id:
                    type: integer
                    example: 134
                  file:
                    type: string
                    example: /tmp/fakerazzFcK
                  date_start:
                    type: string
                    example: '1998-08-29 21:37:04'
                  date_end:
                    type: string
                    example: '2010-12-16 09:37:11'
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:07.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:07.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to write mobile logs'
                  code: 'MOBILE_LOGS:STORE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to write mobile logs'
                  code:
                    type: string
                    example: 'MOBILE_LOGS:STORE:INSUFFICIENT_PERMISSION'
      tags:
        - 'Mobile logs'
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                device_id:
                  type: string
                  description: 'Device ID. The <code>id</code> of an existing record in the App\Models\Device table.'
                  example: 1
                file:
                  type: string
                  format: binary
                  description: 'Log file. Must be a file. MAXIMUM:FILE_KB:102400.'
                date_start:
                  type: string
                  description: 'Log start date. MUST_BE_DATE Must be a valid date in the format <code>Y-m-d H:i:s</code>.'
                  example: '2005-08-07 10:32:33'
                date_end:
                  type: string
                  description: 'Log end date. MUST_BE_DATE Must be a valid date in the format <code>Y-m-d H:i:s</code>. MUST_BE_AFTER:<code>date_start</code>.'
                  example: '1991-11-24 09:05:14'
                encrypt_key:
                  type: string
                  description: 'Encryption key.'
                  example: provident
                encrypt_iv:
                  type: string
                  description: 'Encryption IV (Initialization Vector).'
                  example: in
              required:
                - file
                - date_start
                - date_end
                - encrypt_key
                - encrypt_iv
    get:
      summary: 'Get logs'
      operationId: getLogs
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>device</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>device</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 2
                      user_id: 282
                      device_id: 135
                      file: /tmp/fakerkvQVJu
                      date_start: '1973-11-10 17:59:07'
                      date_end: '1974-02-17 11:07:01'
                      created_at: '2026-01-12T16:48:07.000000Z'
                      updated_at: '2026-01-12T16:48:07.000000Z'
                    -
                      id: 3
                      user_id: 283
                      device_id: 136
                      file: /tmp/fakera4p3mN
                      date_start: '2018-01-10 01:15:09'
                      date_end: '1998-04-26 19:36:46'
                      created_at: '2026-01-12T16:48:07.000000Z'
                      updated_at: '2026-01-12T16:48:07.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 2
                        user_id: 282
                        device_id: 135
                        file: /tmp/fakerkvQVJu
                        date_start: '1973-11-10 17:59:07'
                        date_end: '1974-02-17 11:07:01'
                        created_at: '2026-01-12T16:48:07.000000Z'
                        updated_at: '2026-01-12T16:48:07.000000Z'
                      -
                        id: 3
                        user_id: 283
                        device_id: 136
                        file: /tmp/fakera4p3mN
                        date_start: '2018-01-10 01:15:09'
                        date_end: '1998-04-26 19:36:46'
                        created_at: '2026-01-12T16:48:07.000000Z'
                        updated_at: '2026-01-12T16:48:07.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 2
                        user_id:
                          type: integer
                          example: 282
                        device_id:
                          type: integer
                          example: 135
                        file:
                          type: string
                          example: /tmp/fakerkvQVJu
                        date_start:
                          type: string
                          example: '1973-11-10 17:59:07'
                        date_end:
                          type: string
                          example: '1974-02-17 11:07:01'
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:07.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:07.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view mobile logs'
                  code: 'MOBILE_LOGS:GET:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view mobile logs'
                  code:
                    type: string
                    example: 'MOBILE_LOGS:GET:INSUFFICIENT_PERMISSION'
      tags:
        - 'Mobile logs'
  '/api/mobile-logs/user/{userId}':
    get:
      summary: 'Get logs by user'
      operationId: getLogsByUser
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>device</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>device</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 4
                      user_id: 284
                      device_id: 137
                      file: /tmp/fakermw6aTV
                      date_start: '1981-08-14 13:00:20'
                      date_end: '1999-10-03 22:15:14'
                      created_at: '2026-01-12T16:48:07.000000Z'
                      updated_at: '2026-01-12T16:48:07.000000Z'
                    -
                      id: 5
                      user_id: 285
                      device_id: 138
                      file: /tmp/fakerVZBXDP
                      date_start: '2007-04-02 04:59:28'
                      date_end: '1978-12-23 03:28:07'
                      created_at: '2026-01-12T16:48:07.000000Z'
                      updated_at: '2026-01-12T16:48:07.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 4
                        user_id: 284
                        device_id: 137
                        file: /tmp/fakermw6aTV
                        date_start: '1981-08-14 13:00:20'
                        date_end: '1999-10-03 22:15:14'
                        created_at: '2026-01-12T16:48:07.000000Z'
                        updated_at: '2026-01-12T16:48:07.000000Z'
                      -
                        id: 5
                        user_id: 285
                        device_id: 138
                        file: /tmp/fakerVZBXDP
                        date_start: '2007-04-02 04:59:28'
                        date_end: '1978-12-23 03:28:07'
                        created_at: '2026-01-12T16:48:07.000000Z'
                        updated_at: '2026-01-12T16:48:07.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 4
                        user_id:
                          type: integer
                          example: 284
                        device_id:
                          type: integer
                          example: 137
                        file:
                          type: string
                          example: /tmp/fakermw6aTV
                        date_start:
                          type: string
                          example: '1981-08-14 13:00:20'
                        date_end:
                          type: string
                          example: '1999-10-03 22:15:14'
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:07.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:07.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view mobile logs'
                  code: 'MOBILE_LOGS:GET_BY_USER:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view mobile logs'
                  code:
                    type: string
                    example: 'MOBILE_LOGS:GET_BY_USER:INSUFFICIENT_PERMISSION'
      tags:
        - 'Mobile logs'
    parameters:
      -
        in: path
        name: userId
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/mobile-logs/device/{deviceId}':
    get:
      summary: 'Get logs by device'
      operationId: getLogsByDevice
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 6
                      user_id: 286
                      device_id: 139
                      file: /tmp/fakerGR224D
                      date_start: '2019-05-06 22:42:39'
                      date_end: '1988-11-12 20:02:21'
                      created_at: '2026-01-12T16:48:07.000000Z'
                      updated_at: '2026-01-12T16:48:07.000000Z'
                    -
                      id: 7
                      user_id: 287
                      device_id: 140
                      file: /tmp/fakereYNi8P
                      date_start: '1987-09-11 07:13:46'
                      date_end: '1980-08-21 16:55:28'
                      created_at: '2026-01-12T16:48:07.000000Z'
                      updated_at: '2026-01-12T16:48:07.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 6
                        user_id: 286
                        device_id: 139
                        file: /tmp/fakerGR224D
                        date_start: '2019-05-06 22:42:39'
                        date_end: '1988-11-12 20:02:21'
                        created_at: '2026-01-12T16:48:07.000000Z'
                        updated_at: '2026-01-12T16:48:07.000000Z'
                      -
                        id: 7
                        user_id: 287
                        device_id: 140
                        file: /tmp/fakereYNi8P
                        date_start: '1987-09-11 07:13:46'
                        date_end: '1980-08-21 16:55:28'
                        created_at: '2026-01-12T16:48:07.000000Z'
                        updated_at: '2026-01-12T16:48:07.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 6
                        user_id:
                          type: integer
                          example: 286
                        device_id:
                          type: integer
                          example: 139
                        file:
                          type: string
                          example: /tmp/fakerGR224D
                        date_start:
                          type: string
                          example: '2019-05-06 22:42:39'
                        date_end:
                          type: string
                          example: '1988-11-12 20:02:21'
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:07.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:07.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view mobile logs'
                  code: 'MOBILE_LOGS:GET_BY_DEVICE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view mobile logs'
                  code:
                    type: string
                    example: 'MOBILE_LOGS:GET_BY_DEVICE:INSUFFICIENT_PERMISSION'
      tags:
        - 'Mobile logs'
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/p2p/{clinicianId}/{amputeeId}':
    get:
      summary: 'Get active session data'
      operationId: getActiveSessionData
      description: 'Returns P2P sessions with status "waiting_for_decision" or "in_progress".'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  amputee_id: null
                  device_id: null
                  clinician_id: null
                  amputee_uuid: b21c867b-66ca-3668-9eb2-eb8ede5892f5
                  clinician_uuid: fe97a983-5e83-3944-8250-cdb945f1e80c
                  token: WWSRGF2AW2IFEM8EMMFLHI8C93JRWU13YY6FEU41KRE7VL98EMMMTAHCYRYFWBMD
                  status: waiting_for_decision
                  created_at: '2026-01-12T16:47:52.000000Z'
                  updated_at: '2026-01-12T16:47:52.000000Z'
                properties:
                  id:
                    type: integer
                    example: 1
                  amputee_id:
                    type: string
                    example: null
                  device_id:
                    type: string
                    example: null
                  clinician_id:
                    type: string
                    example: null
                  amputee_uuid:
                    type: string
                    example: b21c867b-66ca-3668-9eb2-eb8ede5892f5
                  clinician_uuid:
                    type: string
                    example: fe97a983-5e83-3944-8250-cdb945f1e80c
                  token:
                    type: string
                    example: WWSRGF2AW2IFEM8EMMFLHI8C93JRWU13YY6FEU41KRE7VL98EMMMTAHCYRYFWBMD
                  status:
                    type: string
                    example: waiting_for_decision
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:52.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:52.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view active P2P session'
                  code: 'P2P_SESSIONS:GET_ACTIVE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view active P2P session'
                  code:
                    type: string
                    example: 'P2P_SESSIONS:GET_ACTIVE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Session not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'P2P session not found'
                  code: 'P2P_SESSIONS:GET_ACTIVE:SESSION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'P2P session not found'
                  code:
                    type: string
                    example: 'P2P_SESSIONS:GET_ACTIVE:SESSION_NOT_FOUND'
      tags:
        - 'P2P Sessions'
    parameters:
      -
        in: path
        name: clinicianId
        description: 'User clinician ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: amputeeId
        description: 'User amputee entry ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/p2p/{id}':
    get:
      summary: 'Get session data'
      operationId: getSessionData
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 2
                  amputee_id: null
                  device_id: null
                  clinician_id: null
                  amputee_uuid: e7187bac-1fb3-3506-a12d-b61ceaf55dec
                  clinician_uuid: f210c25e-38ff-3963-88d1-98d3e57f5d48
                  token: FIZT7JXIXD0E2Z4SNDG59P186URQ58M6F7NJFHV7R4D5N9SKS276V00C5JG56ESN
                  status: waiting_for_decision
                  created_at: '2026-01-12T16:47:52.000000Z'
                  updated_at: '2026-01-12T16:47:52.000000Z'
                properties:
                  id:
                    type: integer
                    example: 2
                  amputee_id:
                    type: string
                    example: null
                  device_id:
                    type: string
                    example: null
                  clinician_id:
                    type: string
                    example: null
                  amputee_uuid:
                    type: string
                    example: e7187bac-1fb3-3506-a12d-b61ceaf55dec
                  clinician_uuid:
                    type: string
                    example: f210c25e-38ff-3963-88d1-98d3e57f5d48
                  token:
                    type: string
                    example: FIZT7JXIXD0E2Z4SNDG59P186URQ58M6F7NJFHV7R4D5N9SKS276V00C5JG56ESN
                  status:
                    type: string
                    example: waiting_for_decision
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:52.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:52.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view P2P session'
                  code: 'P2P_SESSIONS:GET:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view P2P session'
                  code:
                    type: string
                    example: 'P2P_SESSIONS:GET:INSUFFICIENT_PERMISSION'
        404:
          description: 'Session not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'P2P session not found'
                  code: 'P2P_SESSIONS:GET:SESSION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'P2P session not found'
                  code:
                    type: string
                    example: 'P2P_SESSIONS:GET:SESSION_NOT_FOUND'
      tags:
        - 'P2P Sessions'
    parameters:
      -
        in: path
        name: id
        description: 'P2P session ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/p2p/create:
    post:
      summary: 'Create new P2P session'
      operationId: createNewP2PSession
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  amputee_id: 118
                  device_id: null
                  clinician_id: 119
                  amputee_uuid: d4cc7334-3eb2-3b48-8ef9-a100aa51675a
                  clinician_uuid: 9760b2af-b1a6-3339-9d1a-96b33cdef4b2
                  token: RD78LVWJA5H5IS737O4PUG1IHTFBTPH0FNSY9PES41BHLE9NCUEA9QRP7VQH50C6
                  status: waiting_for_decision
                  created_at: '2026-01-12T16:47:52.000000Z'
                  updated_at: '2026-01-12T16:47:52.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  amputee_id:
                    type: integer
                    example: 118
                  device_id:
                    type: string
                    example: null
                  clinician_id:
                    type: integer
                    example: 119
                  amputee_uuid:
                    type: string
                    example: d4cc7334-3eb2-3b48-8ef9-a100aa51675a
                  clinician_uuid:
                    type: string
                    example: 9760b2af-b1a6-3339-9d1a-96b33cdef4b2
                  token:
                    type: string
                    example: RD78LVWJA5H5IS737O4PUG1IHTFBTPH0FNSY9PES41BHLE9NCUEA9QRP7VQH50C6
                  status:
                    type: string
                    example: waiting_for_decision
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:52.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:52.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to create P2P session'
                      code: 'P2P_SESSIONS:CREATE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to create P2P session'
                      code:
                        type: string
                        example: 'P2P_SESSIONS:CREATE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Device not assigned to patient'
                    type: object
                    example:
                      message: 'Device is not assigned to the patient'
                      code: 'P2P_SESSIONS:CREATE:DEVICE_NOT_ASSIGNED'
                    properties:
                      message:
                        type: string
                        example: 'Device is not assigned to the patient'
                      code:
                        type: string
                        example: 'P2P_SESSIONS:CREATE:DEVICE_NOT_ASSIGNED'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'P2P_SESSIONS:CREATE:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'P2P_SESSIONS:CREATE:USER_NOT_FOUND'
      tags:
        - 'P2P Sessions'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                amputee_id:
                  type: string
                  description: 'Amputee ID. The <code>id</code> of an existing record in the App\Models\User table.'
                  example: 2
                device_id:
                  type: string
                  description: 'Device ID. The <code>id</code> of an existing record in the App\Models\Device table.'
                  example: 5
                amputee_uuid:
                  type: string
                  description: "Amputee's UUID generated by integration platform."
                  example: 7cb48aff-c482-39fd-ade2-345a48e18631
                clinician_uuid:
                  type: string
                  description: "Clinician's UUID generated by integration platform."
                  example: df655341-276e-3be6-b05e-83738c2ba999
              required:
                - amputee_id
                - device_id
                - amputee_uuid
                - clinician_uuid
  '/api/p2p/{id}/update':
    post:
      summary: 'Update P2P session'
      operationId: updateP2PSession
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  amputee_id: null
                  device_id: null
                  clinician_id: null
                  amputee_uuid: d16ec4ba-e5a1-332c-ae1d-c6e99d0bbc43
                  clinician_uuid: e2179afc-73b8-317b-be92-3680458ad0f5
                  token: NPNEN77ZJ3XN5UXC84M1X5OABJ0O1JPD6WI7WWN4H5K8G627FDAQN1W1LAV1RWP5
                  status: waiting_for_decision
                  created_at: '2026-01-12T16:47:52.000000Z'
                  updated_at: '2026-01-12T16:47:52.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  amputee_id:
                    type: string
                    example: null
                  device_id:
                    type: string
                    example: null
                  clinician_id:
                    type: string
                    example: null
                  amputee_uuid:
                    type: string
                    example: d16ec4ba-e5a1-332c-ae1d-c6e99d0bbc43
                  clinician_uuid:
                    type: string
                    example: e2179afc-73b8-317b-be92-3680458ad0f5
                  token:
                    type: string
                    example: NPNEN77ZJ3XN5UXC84M1X5OABJ0O1JPD6WI7WWN4H5K8G627FDAQN1W1LAV1RWP5
                  status:
                    type: string
                    example: waiting_for_decision
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:52.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:52.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update P2P session'
                  code: 'P2P_SESSIONS:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update P2P session'
                  code:
                    type: string
                    example: 'P2P_SESSIONS:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Session not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'P2P session not found'
                  code: 'P2P_SESSIONS:UPDATE:SESSION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'P2P session not found'
                  code:
                    type: string
                    example: 'P2P_SESSIONS:UPDATE:SESSION_NOT_FOUND'
      tags:
        - 'P2P Sessions'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                status:
                  type: string
                  description: 'Session status.'
                  example: closed
                  enum:
                    - waiting_for_decision
                    - in_progress
                    - closed
              required:
                - status
    parameters:
      -
        in: path
        name: id
        description: 'P2P session ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/product/features:
    get:
      summary: 'List product features'
      operationId: listProductFeatures
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 1
                    name:
                      type: string
                      example: white
                    slug:
                      type: string
                      example: quia-totam-nisi-et
                    created_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                example:
                  -
                    id: 1
                    name: white
                    slug: quia-totam-nisi-et
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
                  -
                    id: 2
                    name: lime
                    slug: dignissimos-et-voluptatem-dolores-expedita
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view product features and toggles'
                  code: 'PRODUCT_FEATURES:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view product features and toggles'
                  code:
                    type: string
                    example: 'PRODUCT_FEATURES:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - 'Product features and toggles'
    post:
      summary: 'Create product feature'
      operationId: createProductFeature
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  name: blue
                  slug: sed-illum-tenetur-totam-itaque-dolores
                  created_at: '2026-01-12T16:48:03.000000Z'
                  updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  name:
                    type: string
                    example: blue
                  slug:
                    type: string
                    example: sed-illum-tenetur-totam-itaque-dolores
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage product features and toggles'
                  code: 'PRODUCT_FEATURES:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage product features and toggles'
                  code:
                    type: string
                    example: 'PRODUCT_FEATURES:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - 'Product features and toggles'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of product feature.'
                  example: 'Remote config'
                slug:
                  type: string
                  description: 'Simplified name of product feature without spaces (e.g. remote_config for Remote config name).'
                  example: remote_config
              required:
                - name
                - slug
  '/api/product/features/{id}':
    put:
      summary: 'Update product feature'
      operationId: updateProductFeature
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  name: olive
                  slug: quidem-dolores-omnis-aut-assumenda-odit-itaque-quia
                  created_at: '2026-01-12T16:48:03.000000Z'
                  updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  name:
                    type: string
                    example: olive
                  slug:
                    type: string
                    example: quidem-dolores-omnis-aut-assumenda-odit-itaque-quia
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage product features and toggles'
                  code: 'PRODUCT_FEATURES:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage product features and toggles'
                  code:
                    type: string
                    example: 'PRODUCT_FEATURES:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Product feature not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Product feature not found'
                  code: 'PRODUCT_FEATURES:UPDATE:FEATURE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Product feature not found'
                  code:
                    type: string
                    example: 'PRODUCT_FEATURES:UPDATE:FEATURE_NOT_FOUND'
      tags:
        - 'Product features and toggles'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of product feature.'
                  example: 'Remote config'
                slug:
                  type: string
                  description: 'Simplified name of product feature without spaces (e.g. remote_config for Remote config name).'
                  example: remote_config
    delete:
      summary: 'Delete product feature'
      operationId: deleteProductFeature
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Product feature deleted'
                  code: 'PRODUCT_FEATURES:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Product feature deleted'
                  code:
                    type: string
                    example: 'PRODUCT_FEATURES:DELETE:DELETED'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage product features and toggles'
                      code: 'PRODUCT_FEATURES:DELETE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage product features and toggles'
                      code:
                        type: string
                        example: 'PRODUCT_FEATURES:DELETE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Product feature belongs to compatibility entries'
                    type: object
                    example:
                      message: 'Cannot delete: product feature belongs to existing compatibility entries (1)'
                      code: 'PRODUCT_FEATURES:DELETE:HAS_COMPATIBILITY_ENTRIES'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete: product feature belongs to existing compatibility entries (1)'
                      code:
                        type: string
                        example: 'PRODUCT_FEATURES:DELETE:HAS_COMPATIBILITY_ENTRIES'
        404:
          description: 'Product feature not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Product feature not found'
                  code: 'PRODUCT_FEATURES:DELETE:FEATURE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Product feature not found'
                  code:
                    type: string
                    example: 'PRODUCT_FEATURES:DELETE:FEATURE_NOT_FOUND'
      tags:
        - 'Product features and toggles'
    parameters:
      -
        in: path
        name: id
        description: 'Product Feature ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/product/toggles:
    get:
      summary: 'List product toggles'
      operationId: listProductToggles
      description: "This endpoint returns list of global toggles.\n\t\tFor some users there could exist user toggle which overrides these settings."
      parameters:
        -
          in: query
          name: global
          description: 'Pass value <code>1</code> to fetch list of global toggles without user overrides'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Pass value <code>1</code> to fetch list of global toggles without user overrides'
            example: 1
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 1
                    name:
                      type: string
                      example: black
                    slug:
                      type: string
                      example: ratione-sed-voluptatem-pariatur-esse-nobis-doloremque
                    enabled:
                      type: integer
                      example: 1
                    created_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                example:
                  -
                    id: 1
                    name: black
                    slug: ratione-sed-voluptatem-pariatur-esse-nobis-doloremque
                    enabled: 1
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
                  -
                    id: 2
                    name: teal
                    slug: dolor-occaecati-aliquid-ut-facilis-possimus-aut-facere
                    enabled: 0
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view product features and toggles'
                  code: 'PRODUCT_TOGGLES:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view product features and toggles'
                  code:
                    type: string
                    example: 'PRODUCT_TOGGLES:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - 'Product features and toggles'
    post:
      summary: 'Create product toggle'
      operationId: createProductToggle
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  name: purple
                  slug: qui-commodi-est-eius-provident
                  enabled: 0
                  created_at: '2026-01-12T16:48:03.000000Z'
                  updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  name:
                    type: string
                    example: purple
                  slug:
                    type: string
                    example: qui-commodi-est-eius-provident
                  enabled:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage product features and toggles'
                  code: 'PRODUCT_TOGGLES:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage product features and toggles'
                  code:
                    type: string
                    example: 'PRODUCT_TOGGLES:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - 'Product features and toggles'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of product toggle.'
                  example: 'Remote config'
                slug:
                  type: string
                  description: 'Simplified name of product toggle without spaces (e.g. remote_config for Remote config name).'
                  example: remote_config
                enabled:
                  type: boolean
                  description: 'Is toggle enabled on this environment?.'
                  example: true
              required:
                - name
                - slug
                - enabled
  '/api/product/toggles/{id}':
    put:
      summary: 'Update product toggle'
      operationId: updateProductToggle
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  name: yellow
                  slug: velit-iste-doloribus-rerum-ipsam-quia-voluptatum-aspernatur
                  enabled: 1
                  created_at: '2026-01-12T16:48:03.000000Z'
                  updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  name:
                    type: string
                    example: yellow
                  slug:
                    type: string
                    example: velit-iste-doloribus-rerum-ipsam-quia-voluptatum-aspernatur
                  enabled:
                    type: integer
                    example: 1
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage product features and toggles'
                  code: 'PRODUCT_TOGGLES:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage product features and toggles'
                  code:
                    type: string
                    example: 'PRODUCT_TOGGLES:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Product toggle not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Product toggle not found'
                  code: 'PRODUCT_TOGGLES:UPDATE:TOGGLE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Product toggle not found'
                  code:
                    type: string
                    example: 'PRODUCT_TOGGLES:UPDATE:TOGGLE_NOT_FOUND'
      tags:
        - 'Product features and toggles'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of product toggle.'
                  example: 'Remote config'
                slug:
                  type: string
                  description: 'Simplified name of product toggle without spaces (e.g. remote_config for Remote config name).'
                  example: remote_config
                enabled:
                  type: boolean
                  description: 'Is toggle enabled on this environment?.'
                  example: true
    delete:
      summary: 'Delete product toggle'
      operationId: deleteProductToggle
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Product toggle deleted'
                  code: 'PRODUCT_TOGGLES:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Product toggle deleted'
                  code:
                    type: string
                    example: 'PRODUCT_TOGGLES:DELETE:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage product features and toggles'
                  code: 'PRODUCT_TOGGLES:DELETE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage product features and toggles'
                  code:
                    type: string
                    example: 'PRODUCT_TOGGLES:DELETE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Product toggle not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Product toggle not found'
                  code: 'PRODUCT_TOGGLES:DELETE:TOGGLE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Product toggle not found'
                  code:
                    type: string
                    example: 'PRODUCT_TOGGLES:DELETE:TOGGLE_NOT_FOUND'
      tags:
        - 'Product features and toggles'
    parameters:
      -
        in: path
        name: id
        description: 'Product Toggle ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/product/faq:
    get:
      summary: 'List product FAQ'
      operationId: listProductFAQ
      description: 'This endpoint returns list of product FAQ.'
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      question: 'Natus est atque fugiat labore nesciunt. Rem perspiciatis non hic aut rem accusamus dolorem. Cum a at porro natus dolorem.'
                      answer: 'Quia harum fugiat mollitia. Aut doloremque est eum aut maxime. Iure vero totam modi asperiores adipisci praesentium est delectus. Ducimus quia aspernatur recusandae deserunt a beatae aut.'
                      created_at: '2026-01-12T16:48:03.000000Z'
                      updated_at: '2026-01-12T16:48:03.000000Z'
                    -
                      id: 2
                      question: 'Qui eveniet deserunt ut iste. Eveniet nesciunt rerum impedit id. Delectus mollitia tempora et natus cumque. Consequatur ut labore facilis magnam accusamus.'
                      answer: 'Ut perferendis quia sequi temporibus sunt dignissimos enim. Deserunt nihil cum dicta dicta modi. Repudiandae minus et reprehenderit aut officiis.'
                      created_at: '2026-01-12T16:48:03.000000Z'
                      updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        question: 'Natus est atque fugiat labore nesciunt. Rem perspiciatis non hic aut rem accusamus dolorem. Cum a at porro natus dolorem.'
                        answer: 'Quia harum fugiat mollitia. Aut doloremque est eum aut maxime. Iure vero totam modi asperiores adipisci praesentium est delectus. Ducimus quia aspernatur recusandae deserunt a beatae aut.'
                        created_at: '2026-01-12T16:48:03.000000Z'
                        updated_at: '2026-01-12T16:48:03.000000Z'
                      -
                        id: 2
                        question: 'Qui eveniet deserunt ut iste. Eveniet nesciunt rerum impedit id. Delectus mollitia tempora et natus cumque. Consequatur ut labore facilis magnam accusamus.'
                        answer: 'Ut perferendis quia sequi temporibus sunt dignissimos enim. Deserunt nihil cum dicta dicta modi. Repudiandae minus et reprehenderit aut officiis.'
                        created_at: '2026-01-12T16:48:03.000000Z'
                        updated_at: '2026-01-12T16:48:03.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        question:
                          type: string
                          example: 'Natus est atque fugiat labore nesciunt. Rem perspiciatis non hic aut rem accusamus dolorem. Cum a at porro natus dolorem.'
                        answer:
                          type: string
                          example: 'Quia harum fugiat mollitia. Aut doloremque est eum aut maxime. Iure vero totam modi asperiores adipisci praesentium est delectus. Ducimus quia aspernatur recusandae deserunt a beatae aut.'
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:03.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view product features and toggles'
                  code: 'FAQ:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view product features and toggles'
                  code:
                    type: string
                    example: 'FAQ:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - 'Product features and toggles'
  '/api/user/{userId}/toggles':
    get:
      summary: 'List user toggles'
      operationId: listUserToggles
      description: 'This endpoint returns list of user toggles with their global toggles.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 1
                    toggle_id:
                      type: integer
                      example: 6
                    user_id:
                      type: integer
                      example: 251
                    enabled:
                      type: integer
                      example: 0
                    created_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                    toggle:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 6
                        name:
                          type: string
                          example: silver
                        slug:
                          type: string
                          example: quas-distinctio-voluptas-praesentium-sunt-culpa-asperiores-doloremque
                        enabled:
                          type: integer
                          example: 1
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:03.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:03.000000Z'
                example:
                  -
                    id: 1
                    toggle_id: 6
                    user_id: 251
                    enabled: 0
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
                    toggle:
                      id: 6
                      name: silver
                      slug: quas-distinctio-voluptas-praesentium-sunt-culpa-asperiores-doloremque
                      enabled: 1
                      created_at: '2026-01-12T16:48:03.000000Z'
                      updated_at: '2026-01-12T16:48:03.000000Z'
                  -
                    id: 2
                    toggle_id: 8
                    user_id: 252
                    enabled: 0
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
                    toggle:
                      id: 8
                      name: green
                      slug: aut-incidunt-temporibus-earum-quisquam-reiciendis-necessitatibus-et-numquam
                      enabled: 1
                      created_at: '2026-01-12T16:48:03.000000Z'
                      updated_at: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view product features and toggles'
                  code: 'USER_TOGGLES:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view product features and toggles'
                  code:
                    type: string
                    example: 'USER_TOGGLES:LIST:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USER_TOGGLES:LIST:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USER_TOGGLES:LIST:USER_NOT_FOUND'
      tags:
        - 'Product features and toggles'
    post:
      summary: 'Create user toggle'
      operationId: createUserToggle
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  toggle_id: 9
                  user_id: 253
                  enabled: 1
                  created_at: '2026-01-12T16:48:03.000000Z'
                  updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  toggle_id:
                    type: integer
                    example: 9
                  user_id:
                    type: integer
                    example: 253
                  enabled:
                    type: integer
                    example: 1
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage product features and toggles'
                  code: 'USER_TOGGLES:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage product features and toggles'
                  code:
                    type: string
                    example: 'USER_TOGGLES:CREATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USER_TOGGLES:CREATE:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USER_TOGGLES:CREATE:USER_NOT_FOUND'
      tags:
        - 'Product features and toggles'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                toggle_id:
                  type: integer
                  description: 'Product toggle ID. The <code>id</code> of an existing record in the App\Models\ProductToggle table.'
                  example: 1
                enabled:
                  type: boolean
                  description: 'Is user toggle enabled on this environment?.'
                  example: true
              required:
                - toggle_id
                - enabled
    parameters:
      -
        in: path
        name: userId
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/user/{userId}/toggles/{toggleId}':
    put:
      summary: 'Update user toggle'
      operationId: updateUserToggle
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  toggle_id: 10
                  user_id: 254
                  enabled: 0
                  created_at: '2026-01-12T16:48:03.000000Z'
                  updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  toggle_id:
                    type: integer
                    example: 10
                  user_id:
                    type: integer
                    example: 254
                  enabled:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage product features and toggles'
                  code: 'USER_TOGGLES:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage product features and toggles'
                  code:
                    type: string
                    example: 'USER_TOGGLES:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'User not found'
                    type: object
                    example:
                      message: 'User not found'
                      code: 'USER_TOGGLES:UPDATE:USER_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User not found'
                      code:
                        type: string
                        example: 'USER_TOGGLES:UPDATE:USER_NOT_FOUND'
                  -
                    description: 'User toggle not found'
                    type: object
                    example:
                      message: 'User toggle not found'
                      code: 'USER_TOGGLES:UPDATE:TOGGLE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User toggle not found'
                      code:
                        type: string
                        example: 'USER_TOGGLES:UPDATE:TOGGLE_NOT_FOUND'
      tags:
        - 'Product features and toggles'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                enabled:
                  type: boolean
                  description: 'Is user toggle enabled on this environment?.'
                  example: true
    delete:
      summary: 'Delete user toggle'
      operationId: deleteUserToggle
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User toggle deleted'
                  code: 'USER_TOGGLES:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'User toggle deleted'
                  code:
                    type: string
                    example: 'USER_TOGGLES:DELETE:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage product features and toggles'
                  code: 'USER_TOGGLES:DELETE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage product features and toggles'
                  code:
                    type: string
                    example: 'USER_TOGGLES:DELETE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'User not found'
                    type: object
                    example:
                      message: 'User not found'
                      code: 'USER_TOGGLES:DELETE:USER_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User not found'
                      code:
                        type: string
                        example: 'USER_TOGGLES:DELETE:USER_NOT_FOUND'
                  -
                    description: 'User toggle not found'
                    type: object
                    example:
                      message: 'User toggle not found'
                      code: 'USER_TOGGLES:DELETE:TOGGLE_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'User toggle not found'
                      code:
                        type: string
                        example: 'USER_TOGGLES:DELETE:TOGGLE_NOT_FOUND'
      tags:
        - 'Product features and toggles'
    parameters:
      -
        in: path
        name: userId
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: toggleId
        description: 'User Toggle ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/releases:
    get:
      summary: 'List releases'
      operationId: listReleases
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      version_type: App\Models\SoftwareVersion
                      version_id: 14
                      description: 'Aut et id quis et autem quia expedita. Dolores repellat aut dicta est voluptatem alias non optio. Nobis odio nihil earum aut accusamus.'
                      created_at: '2026-01-12T16:48:04.000000Z'
                      updated_at: '2026-01-12T16:48:04.000000Z'
                      version:
                        id: 14
                        name: 1.22.1
                        created_at: '2026-01-12T16:48:04.000000Z'
                        updated_at: '2026-01-12T16:48:04.000000Z'
                    -
                      id: 2
                      version_type: App\Models\SoftwareVersion
                      version_id: 15
                      description: 'Omnis aut cumque dolores mollitia totam repellendus voluptatem. Eum reprehenderit voluptas consequatur veniam quis. Est autem quia quo eum tenetur earum exercitationem.'
                      created_at: '2026-01-12T16:48:04.000000Z'
                      updated_at: '2026-01-12T16:48:04.000000Z'
                      version:
                        id: 15
                        name: 1.95.18
                        created_at: '2026-01-12T16:48:04.000000Z'
                        updated_at: '2026-01-12T16:48:04.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        version_type: App\Models\SoftwareVersion
                        version_id: 14
                        description: 'Aut et id quis et autem quia expedita. Dolores repellat aut dicta est voluptatem alias non optio. Nobis odio nihil earum aut accusamus.'
                        created_at: '2026-01-12T16:48:04.000000Z'
                        updated_at: '2026-01-12T16:48:04.000000Z'
                        version:
                          id: 14
                          name: 1.22.1
                          created_at: '2026-01-12T16:48:04.000000Z'
                          updated_at: '2026-01-12T16:48:04.000000Z'
                      -
                        id: 2
                        version_type: App\Models\SoftwareVersion
                        version_id: 15
                        description: 'Omnis aut cumque dolores mollitia totam repellendus voluptatem. Eum reprehenderit voluptas consequatur veniam quis. Est autem quia quo eum tenetur earum exercitationem.'
                        created_at: '2026-01-12T16:48:04.000000Z'
                        updated_at: '2026-01-12T16:48:04.000000Z'
                        version:
                          id: 15
                          name: 1.95.18
                          created_at: '2026-01-12T16:48:04.000000Z'
                          updated_at: '2026-01-12T16:48:04.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        version_type:
                          type: string
                          example: App\Models\SoftwareVersion
                        version_id:
                          type: integer
                          example: 14
                        description:
                          type: string
                          example: 'Aut et id quis et autem quia expedita. Dolores repellat aut dicta est voluptatem alias non optio. Nobis odio nihil earum aut accusamus.'
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:04.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:04.000000Z'
                        version:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 14
                            name:
                              type: string
                              example: 1.22.1
                            created_at:
                              type: string
                              example: '2026-01-12T16:48:04.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list releases'
                  code: 'RELEASES:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list releases'
                  code:
                    type: string
                    example: 'RELEASES:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - Releases
    post:
      summary: 'Create release'
      operationId: createRelease
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  version_type: App\Models\SoftwareVersion
                  version_id: 17
                  description: 'Mollitia et voluptate voluptatem expedita. Deleniti in minima ea dolore. Dolorem laborum qui et eveniet et molestiae necessitatibus. Quibusdam et nesciunt ut est totam.'
                  created_at: '2026-01-12T16:48:04.000000Z'
                  updated_at: '2026-01-12T16:48:04.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  version_type:
                    type: string
                    example: App\Models\SoftwareVersion
                  version_id:
                    type: integer
                    example: 17
                  description:
                    type: string
                    example: 'Mollitia et voluptate voluptatem expedita. Deleniti in minima ea dolore. Dolorem laborum qui et eveniet et molestiae necessitatibus. Quibusdam et nesciunt ut est totam.'
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to create release'
                  code: 'RELEASES:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to create release'
                  code:
                    type: string
                    example: 'RELEASES:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - Releases
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                version_type:
                  type: string
                  description: 'Version type.'
                  example: SoftwareVersion
                  enum:
                    - DeviceModel
                    - SoftwareVersion
                    - FirmwareVersion
                    - PCBVersion
                version_id:
                  type: integer
                  description: 'Version ID.'
                  example: 1
                description:
                  type: string
                  description: 'Release description.'
                  example: 'This version fixes minor bugs.'
              required:
                - version_type
                - version_id
  '/api/releases/{id}':
    get:
      summary: 'Get release'
      operationId: getRelease
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  version_type: App\Models\SoftwareVersion
                  version_id: 16
                  description: 'Recusandae cupiditate delectus eaque enim aut. Sit aperiam natus consequatur. Et dolores et aut voluptate quo temporibus. Sint est quis omnis rerum eius.'
                  created_at: '2026-01-12T16:48:04.000000Z'
                  updated_at: '2026-01-12T16:48:04.000000Z'
                  version:
                    id: 16
                    name: 2.63.50
                    created_at: '2026-01-12T16:48:04.000000Z'
                    updated_at: '2026-01-12T16:48:04.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  version_type:
                    type: string
                    example: App\Models\SoftwareVersion
                  version_id:
                    type: integer
                    example: 16
                  description:
                    type: string
                    example: 'Recusandae cupiditate delectus eaque enim aut. Sit aperiam natus consequatur. Et dolores et aut voluptate quo temporibus. Sint est quis omnis rerum eius.'
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
                  version:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 16
                      name:
                        type: string
                        example: 2.63.50
                      created_at:
                        type: string
                        example: '2026-01-12T16:48:04.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view release'
                  code: 'RELEASES:GET:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view release'
                  code:
                    type: string
                    example: 'RELEASES:GET:INSUFFICIENT_PERMISSION'
        404:
          description: 'Release not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Release not found'
                  code: 'RELEASES:GET:RELEASE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Release not found'
                  code:
                    type: string
                    example: 'RELEASES:GET:RELEASE_NOT_FOUND'
      tags:
        - Releases
    put:
      summary: 'Update release'
      operationId: updateRelease
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 5
                  version_type: App\Models\SoftwareVersion
                  version_id: 18
                  description: 'Magni cumque incidunt corrupti magnam nemo a natus. Consequuntur ducimus quo qui mollitia autem enim culpa. Corrupti dignissimos nihil soluta ut. Reprehenderit et et similique ipsam.'
                  created_at: '2026-01-12T16:48:04.000000Z'
                  updated_at: '2026-01-12T16:48:04.000000Z'
                properties:
                  id:
                    type: integer
                    example: 5
                  version_type:
                    type: string
                    example: App\Models\SoftwareVersion
                  version_id:
                    type: integer
                    example: 18
                  description:
                    type: string
                    example: 'Magni cumque incidunt corrupti magnam nemo a natus. Consequuntur ducimus quo qui mollitia autem enim culpa. Corrupti dignissimos nihil soluta ut. Reprehenderit et et similique ipsam.'
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update release'
                  code: 'RELEASES:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update release'
                  code:
                    type: string
                    example: 'RELEASES:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Release not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Release not found'
                  code: 'RELEASES:UPDATE:RELEASE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Release not found'
                  code:
                    type: string
                    example: 'RELEASES:UPDATE:RELEASE_NOT_FOUND'
      tags:
        - Releases
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                version_type:
                  type: string
                  description: 'Version type.'
                  example: SoftwareVersion
                  enum:
                    - DeviceModel
                    - SoftwareVersion
                    - FirmwareVersion
                    - PCBVersion
                version_id:
                  type: integer
                  description: 'Version ID.'
                  example: 1
                description:
                  type: string
                  description: 'Release description.'
                  example: 'This version fixes minor bugs.'
    delete:
      summary: 'Delete release'
      operationId: deleteRelease
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Version deleted'
                  code: 'RELEASES:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Version deleted'
                  code:
                    type: string
                    example: 'RELEASES:DELETE:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to delete release'
                  code: 'RELEASES:DELETE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to delete release'
                  code:
                    type: string
                    example: 'RELEASES:DELETE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Release not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Release not found'
                  code: 'RELEASES:DELETE:RELEASE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Release not found'
                  code:
                    type: string
                    example: 'RELEASES:DELETE:RELEASE_NOT_FOUND'
      tags:
        - Releases
    parameters:
      -
        in: path
        name: id
        description: 'Release ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/search:
    get:
      summary: Search
      operationId: search
      description: "<div>Searches in:\n\t\t<ul>\n\t\t\t<li>users (by name and email)</li>\n\t\t\t<li>devices (by serial number)</li>\n\t\t</ul>\n\t\t<p>Returned collection contains entries of type <code>User</code> or <code>Device</code>.</p>\n\t\t<p>If the device has a patient assigned, this patient is included in the results as an entry of type User.\n\t\tIf the device has no patient, the device is included in the results.</p>\n\t\t<p>Users included in the results, but not found directly have \"devices\" relation filled in with the devices that match the search query.</p></div>"
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      type: User
                      item:
                        id: 1
                        mrn: MRN
                        name: 'User name'
                        email: user@domain.com
                        language: en
                        phone: ''
                        phone_verified_at: null
                        address1: ''
                        address2: ''
                        postal_code: ''
                        city: ''
                        clinic_name: 'Test Company'
                        clinic_location: 'Test Company Location'
                        image: null
                        mfa_enabled: 0
                        mfa_method: email
                        mfa_verified_to: null
                        created_by: null
                        active: 1
                        notifications_timezone: Europe/Warsaw
                        notifications_at: '08:00:00'
                        created_at: '2024-09-01T15:00:00.000000Z'
                        updated_at: '2024-10-10T10:30:00.000000Z'
                        invitation_status: accepted
                        pivot:
                          assigned_user_id: 2
                          user_id: 1
                        devices: []
                        roles:
                          -
                            id: 5
                            name: Amputee
                            guard_name: web
                            created_at: '2024-01-01T12:00:00.000000Z'
                            updated_at: '2024-01-01T12:00:00.000000Z'
                            pivot:
                              model_id: 1
                              role_id: 5
                              model_type: App\Models\User
                    -
                      type: Device
                      item:
                        id: 1
                        serial: SERIAL-NUMBER
                        bluetooth_id: BLUETOOTH_ID
                        model_id: 1
                        amputee_id: 1
                        firmware_version_id: 1
                        pcb_version_id: 1
                        active: 1
                        last_activity_at: '2024-11-11 12:00:00'
                        created_at: '2024-08-30T15:00:00.000000Z'
                        updated_at: '2024-09-01T16:00:00.000000Z'
                        pivot:
                          user_id: 2
                          device_id: 1
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        type: User
                        item:
                          id: 1
                          mrn: MRN
                          name: 'User name'
                          email: user@domain.com
                          language: en
                          phone: ''
                          phone_verified_at: null
                          address1: ''
                          address2: ''
                          postal_code: ''
                          city: ''
                          clinic_name: 'Test Company'
                          clinic_location: 'Test Company Location'
                          image: null
                          mfa_enabled: 0
                          mfa_method: email
                          mfa_verified_to: null
                          created_by: null
                          active: 1
                          notifications_timezone: Europe/Warsaw
                          notifications_at: '08:00:00'
                          created_at: '2024-09-01T15:00:00.000000Z'
                          updated_at: '2024-10-10T10:30:00.000000Z'
                          invitation_status: accepted
                          pivot:
                            assigned_user_id: 2
                            user_id: 1
                          devices: []
                          roles:
                            -
                              id: 5
                              name: Amputee
                              guard_name: web
                              created_at: '2024-01-01T12:00:00.000000Z'
                              updated_at: '2024-01-01T12:00:00.000000Z'
                              pivot:
                                model_id: 1
                                role_id: 5
                                model_type: App\Models\User
                      -
                        type: Device
                        item:
                          id: 1
                          serial: SERIAL-NUMBER
                          bluetooth_id: BLUETOOTH_ID
                          model_id: 1
                          amputee_id: 1
                          firmware_version_id: 1
                          pcb_version_id: 1
                          active: 1
                          last_activity_at: '2024-11-11 12:00:00'
                          created_at: '2024-08-30T15:00:00.000000Z'
                          updated_at: '2024-09-01T16:00:00.000000Z'
                          pivot:
                            user_id: 2
                            device_id: 1
                    items:
                      type: object
                      properties:
                        type:
                          type: string
                          example: User
                        item:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            mrn:
                              type: string
                              example: MRN
                            name:
                              type: string
                              example: 'User name'
                            email:
                              type: string
                              example: user@domain.com
                            language:
                              type: string
                              example: en
                            phone:
                              type: string
                              example: ''
                            phone_verified_at:
                              type: string
                              example: null
                            address1:
                              type: string
                              example: ''
                            address2:
                              type: string
                              example: ''
                            postal_code:
                              type: string
                              example: ''
                            city:
                              type: string
                              example: ''
                            clinic_name:
                              type: string
                              example: 'Test Company'
                            clinic_location:
                              type: string
                              example: 'Test Company Location'
                            image:
                              type: string
                              example: null
                            mfa_enabled:
                              type: integer
                              example: 0
                            mfa_method:
                              type: string
                              example: email
                            mfa_verified_to:
                              type: string
                              example: null
                            created_by:
                              type: string
                              example: null
                            active:
                              type: integer
                              example: 1
                            notifications_timezone:
                              type: string
                              example: Europe/Warsaw
                            notifications_at:
                              type: string
                              example: '08:00:00'
                            created_at:
                              type: string
                              example: '2024-09-01T15:00:00.000000Z'
                            updated_at:
                              type: string
                              example: '2024-10-10T10:30:00.000000Z'
                            invitation_status:
                              type: string
                              example: accepted
                            pivot:
                              type: object
                              properties:
                                assigned_user_id:
                                  type: integer
                                  example: 2
                                user_id:
                                  type: integer
                                  example: 1
                            devices:
                              type: array
                              example: []
                            roles:
                              type: array
                              example:
                                -
                                  id: 5
                                  name: Amputee
                                  guard_name: web
                                  created_at: '2024-01-01T12:00:00.000000Z'
                                  updated_at: '2024-01-01T12:00:00.000000Z'
                                  pivot:
                                    model_id: 1
                                    role_id: 5
                                    model_type: App\Models\User
                              items:
                                type: object
                                properties:
                                  id:
                                    type: integer
                                    example: 5
                                  name:
                                    type: string
                                    example: Amputee
                                  guard_name:
                                    type: string
                                    example: web
                                  created_at:
                                    type: string
                                    example: '2024-01-01T12:00:00.000000Z'
                                  updated_at:
                                    type: string
                                    example: '2024-01-01T12:00:00.000000Z'
                                  pivot:
                                    type: object
                                    properties:
                                      model_id: { type: integer, example: 1 }
                                      role_id: { type: integer, example: 5 }
                                      model_type: { type: string, example: App\Models\User }
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to search'
                  code: 'SEARCH:SEARCH:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to search'
                  code:
                    type: string
                    example: 'SEARCH:SEARCH:INSUFFICIENT_PERMISSION'
      tags:
        - Search
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                query:
                  type: string
                  description: 'Search query. MINIMUM:STRING_LENGTH:3.'
                  example: Tom
              required:
                - query
  /api/servicing/parts:
    get:
      summary: 'List of parts'
      operationId: listOfParts
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      device_model: null
                      name: 'Discover Card'
                      created_at: '2026-01-12T16:47:54.000000Z'
                      updated_at: '2026-01-12T16:47:54.000000Z'
                    -
                      id: 2
                      device_model: null
                      name: Visa
                      created_at: '2026-01-12T16:47:54.000000Z'
                      updated_at: '2026-01-12T16:47:54.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        device_model: null
                        name: 'Discover Card'
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                      -
                        id: 2
                        device_model: null
                        name: Visa
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        device_model:
                          type: string
                          example: null
                        name:
                          type: string
                          example: 'Discover Card'
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:54.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:54.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list service parts'
                  code: 'SERVICING:LIST_PARTS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list service parts'
                  code:
                    type: string
                    example: 'SERVICING:LIST_PARTS:INSUFFICIENT_PERMISSION'
      tags:
        - Servicing
  /api/servicing/repair:
    post:
      summary: 'Report service repair'
      operationId: reportServiceRepair
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  user_id: 136
                  device_id: 115
                  created_at: '2026-01-12T16:47:54.000000Z'
                  updated_at: '2026-01-12T16:47:54.000000Z'
                  parts:
                    -
                      id: 1
                      repair_id: 1
                      part_id: 3
                      reason: 'Dolor nostrum maiores tenetur rerum. Et et voluptatem amet totam autem. Ex molestias ea sequi et consequatur. Voluptas similique voluptatem est laudantium ut.'
                      created_at: '2026-01-12T16:47:54.000000Z'
                      updated_at: '2026-01-12T16:47:54.000000Z'
                      part:
                        id: 3
                        device_model: null
                        name: 'Visa Retired'
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                    -
                      id: 2
                      repair_id: 1
                      part_id: 4
                      reason: 'Aut distinctio et quia expedita consequatur ex. Nulla dolor quas explicabo ducimus. Sed ut saepe facere cum. Necessitatibus omnis inventore alias suscipit.'
                      created_at: '2026-01-12T16:47:54.000000Z'
                      updated_at: '2026-01-12T16:47:54.000000Z'
                      part:
                        id: 4
                        device_model: null
                        name: MasterCard
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                    -
                      id: 3
                      repair_id: 1
                      part_id: 5
                      reason: 'Ratione id deserunt illum fugiat. Ad eius non iusto tempora rerum asperiores. Quidem praesentium quod et ut.'
                      created_at: '2026-01-12T16:47:54.000000Z'
                      updated_at: '2026-01-12T16:47:54.000000Z'
                      part:
                        id: 5
                        device_model: null
                        name: MasterCard
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                  attachments:
                    -
                      id: 1
                      repair_id: 1
                      file: /tmp/fakerXd4tVp
                      created_at: '2026-01-12T16:47:54.000000Z'
                      updated_at: '2026-01-12T16:47:54.000000Z'
                    -
                      id: 2
                      repair_id: 1
                      file: /tmp/fakerOBt3Re
                      created_at: '2026-01-12T16:47:54.000000Z'
                      updated_at: '2026-01-12T16:47:54.000000Z'
                    -
                      id: 3
                      repair_id: 1
                      file: /tmp/fakerrne8wT
                      created_at: '2026-01-12T16:47:54.000000Z'
                      updated_at: '2026-01-12T16:47:54.000000Z'
                properties:
                  id:
                    type: integer
                    example: 1
                  user_id:
                    type: integer
                    example: 136
                  device_id:
                    type: integer
                    example: 115
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:54.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:54.000000Z'
                  parts:
                    type: array
                    example:
                      -
                        id: 1
                        repair_id: 1
                        part_id: 3
                        reason: 'Dolor nostrum maiores tenetur rerum. Et et voluptatem amet totam autem. Ex molestias ea sequi et consequatur. Voluptas similique voluptatem est laudantium ut.'
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                        part:
                          id: 3
                          device_model: null
                          name: 'Visa Retired'
                          created_at: '2026-01-12T16:47:54.000000Z'
                          updated_at: '2026-01-12T16:47:54.000000Z'
                      -
                        id: 2
                        repair_id: 1
                        part_id: 4
                        reason: 'Aut distinctio et quia expedita consequatur ex. Nulla dolor quas explicabo ducimus. Sed ut saepe facere cum. Necessitatibus omnis inventore alias suscipit.'
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                        part:
                          id: 4
                          device_model: null
                          name: MasterCard
                          created_at: '2026-01-12T16:47:54.000000Z'
                          updated_at: '2026-01-12T16:47:54.000000Z'
                      -
                        id: 3
                        repair_id: 1
                        part_id: 5
                        reason: 'Ratione id deserunt illum fugiat. Ad eius non iusto tempora rerum asperiores. Quidem praesentium quod et ut.'
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                        part:
                          id: 5
                          device_model: null
                          name: MasterCard
                          created_at: '2026-01-12T16:47:54.000000Z'
                          updated_at: '2026-01-12T16:47:54.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        repair_id:
                          type: integer
                          example: 1
                        part_id:
                          type: integer
                          example: 3
                        reason:
                          type: string
                          example: 'Dolor nostrum maiores tenetur rerum. Et et voluptatem amet totam autem. Ex molestias ea sequi et consequatur. Voluptas similique voluptatem est laudantium ut.'
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:54.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:54.000000Z'
                        part:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 3
                            device_model:
                              type: string
                              example: null
                            name:
                              type: string
                              example: 'Visa Retired'
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:54.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:54.000000Z'
                  attachments:
                    type: array
                    example:
                      -
                        id: 1
                        repair_id: 1
                        file: /tmp/fakerXd4tVp
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                      -
                        id: 2
                        repair_id: 1
                        file: /tmp/fakerOBt3Re
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                      -
                        id: 3
                        repair_id: 1
                        file: /tmp/fakerrne8wT
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        repair_id:
                          type: integer
                          example: 1
                        file:
                          type: string
                          example: /tmp/fakerXd4tVp
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:54.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:54.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to report service repair'
                  code: 'SERVICING:REPORT_REPAIR:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to report service repair'
                  code:
                    type: string
                    example: 'SERVICING:REPORT_REPAIR:INSUFFICIENT_PERMISSION'
      tags:
        - Servicing
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                user_id:
                  type: integer
                  description: 'User ID.'
                  example: 1
                device_id:
                  type: integer
                  description: 'Device ID.'
                  example: 1
                files:
                  type: array
                  description: 'Array of attachment files.'
                  items:
                    type: string
                    format: binary
                parts:
                  type: array
                  description: 'Array of replaced parts.'
                  example:
                    - []
                  items:
                    type: object
                    properties:
                      part_id:
                        type: integer
                        description: 'Service part ID.'
                        example: 1
                      reason:
                        type: string
                        description: 'Reason of part replacement.'
                        example: 'Mechanical issue'
              required:
                - user_id
                - device_id
  /api/settings/app-version:
    get:
      summary: 'Get app version'
      operationId: getAppVersion
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  version: 1.6.0
                properties:
                  version:
                    type: string
                    example: 1.6.0
      tags:
        - Settings
    post:
      summary: 'Update app version'
      operationId: updateAppVersion
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  version: 1.6.0
                properties:
                  version:
                    type: string
                    example: 1.6.0
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update settings'
                  code: 'SETTINGS:UPDATE_APP_VERSION:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update settings'
                  code:
                    type: string
                    example: 'SETTINGS:UPDATE_APP_VERSION:INSUFFICIENT_PERMISSION'
      tags:
        - Settings
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                version:
                  type: string
                  description: 'App version.'
                  example: 1.6.0
  /api/settings/silent-push:
    get:
      summary: 'Get silent push timeout'
      operationId: getSilentPushTimeout
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  timeout: '15'
                properties:
                  timeout:
                    type: string
                    example: '15'
      tags:
        - Settings
    post:
      summary: 'Update silent push timeout'
      operationId: updateSilentPushTimeout
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  timeout: '15'
                properties:
                  timeout:
                    type: string
                    example: '15'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update settings'
                  code: 'SETTINGS:UPDATE_SILENT_PUSH:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update settings'
                  code:
                    type: string
                    example: 'SETTINGS:UPDATE_SILENT_PUSH:INSUFFICIENT_PERMISSION'
      tags:
        - Settings
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                timeout:
                  type: integer
                  description: 'Silent push timeout in minutes. Minimum value is <code>1</code> minute (<code>15</code> for production environment), maximum is <code>60</code> minutes. MINIMUM:NUMBER:1 MAXIMUM:NUMBER:60.'
                  example: 15
  /api/settings/languages:
    get:
      summary: 'Get available languages'
      operationId: getAvailableLanguages
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  languages:
                    - de
                    - en
                    - es
                    - it
                    - pl
                    - ru
                    - uk
                properties:
                  languages:
                    type: array
                    example:
                      - de
                      - en
                      - es
                      - it
                      - pl
                      - ru
                      - uk
                    items:
                      type: string
      tags:
        - Settings
  /api/mobile/versions:
    get:
      summary: 'Get mobile stores versions'
      operationId: getMobileStoresVersions
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  ios: '1.0'
                  android: '1.0'
                properties:
                  ios:
                    type: string
                    example: '1.0'
                  android:
                    type: string
                    example: '1.0'
      tags:
        - Settings
    post:
      summary: 'Update mobile stores versions'
      operationId: updateMobileStoresVersions
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  ios: '1.0'
                  android: '1.0'
                properties:
                  ios:
                    type: string
                    example: '1.0'
                  android:
                    type: string
                    example: '1.0'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update settings'
                  code: 'SETTINGS:UPDATE_MOBILE_STORES_VERSION:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update settings'
                  code:
                    type: string
                    example: 'SETTINGS:UPDATE_MOBILE_STORES_VERSION:INSUFFICIENT_PERMISSION'
      tags:
        - Settings
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                ios:
                  type: string
                  description: 'Apple AppStore current version.'
                  example: '1.1'
                android:
                  type: string
                  description: 'Google Play current version.'
                  example: '1.1'
  /api/tickets:
    get:
      summary: 'Get tickets list'
      operationId: getTicketsList
      description: "Possible extend options:\n\t\t<ul>\n\t\t\t<li>sender - the user who created ticket</li>\n\t\t\t<li>recipient - the user who was ticket recipient</li>\n\t\t\t<li>device - the device assigned to ticket</li>\n\t\t\t<li>messages - message allocated to ticket</li>\n\t\t\t<li>messages.attachments - list of attachments assigned to message and ticket</li>\n\t\t\t<li>messages.sender - the user who wrote the message</li>\n\t\t</ul>"
      parameters:
        -
          in: query
          name: status
          description: 'Filter tickets by status (available: <code>new</code>, <code>in_progress</code>, <code>closed</code>, <code>reopened</code>.'
          example: new
          required: false
          schema:
            type: string
            description: 'Filter tickets by status (available: <code>new</code>, <code>in_progress</code>, <code>closed</code>, <code>reopened</code>.'
            example: new
        -
          in: query
          name: sender
          description: 'Filter tickets by sender.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Filter tickets by sender.'
            example: 1
        -
          in: query
          name: recipient
          description: 'Filter tickets by recipient.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Filter tickets by recipient.'
            example: 1
        -
          in: query
          name: device
          description: 'Filter tickets by device.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Filter tickets by device.'
            example: 1
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>sender</code>, <code>recipient</code>, <code>device</code>, <code>messages</code>, <code>messages.attachments</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>sender</code>, <code>recipient</code>, <code>device</code>, <code>messages</code>, <code>messages.attachments</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>sender_name</code>, <code>recipient_name</code>, <code>date</code>, <code>last_message</code>). Default: last_message, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>sender_name</code>, <code>recipient_name</code>, <code>date</code>, <code>last_message</code>). Default: last_message, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 27
                      sender_id: 145
                      recipient_id: 146
                      device_id: 122
                      meeting_date: '2026-01-12 16:47:54'
                      meeting_type: online_meeting
                      contact_email: vswift@douglas.info
                      status: new
                      created_at: '2026-01-12T16:47:54.000000Z'
                      updated_at: '2026-01-12T16:47:54.000000Z'
                      sender:
                        id: 145
                        mrn: CLEGYJNX1768236474
                        name: 'Roscoe Stanton'
                        email: 1768236474emely.heathcote@example.com
                        language: en
                        phone: +1.904.492.6420
                        phone_country: PE
                        phone_verified_at: null
                        address1: '83669 Heathcote Drives Suite 334'
                        address2: 'Kielmouth, NV 15962'
                        postal_code: 54633-8300
                        city: 'Wilderman, Herman and Thompson'
                        clinic_name: Schmidtmouth
                        clinic_location: "8117 Walker Rue\nProhaskaview, VT 55597"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                      recipient:
                        id: 146
                        mrn: 124YAINZ1768236474
                        name: 'Katlyn Berge'
                        email: 1768236474jairo.volkman@example.com
                        language: en
                        phone: '+1 (234) 681-6879'
                        phone_country: DJ
                        phone_verified_at: null
                        address1: '6089 Shirley Rest Suite 824'
                        address2: 'West Maxwellmouth, WI 39329'
                        postal_code: 56714-1569
                        city: 'Bailey, Stiedemann and Thompson'
                        clinic_name: Bradtkeburgh
                        clinic_location: "60842 Elyse Stravenue\nCreminmouth, KY 23495"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                      device:
                        id: 122
                        serial: 73b16df2-ce83-3420-b9aa-5f33e718d177
                        bluetooth_id: 6a9bf13e-351b-3398-8edd-4adc3e5491f4
                        company_id: null
                        model_id: null
                        amputee_id: null
                        clinician_id: null
                        firmware_version_id: null
                        pcb_version_id: null
                        reverse_magnets: 0
                        is_electrode: 0
                        active: 1
                        last_activity_at: '0000-00-00 00:00:00'
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                      messages:
                        -
                          id: 15
                          ticket_id: 27
                          sender_id: 147
                          title: Mrs.
                          content: 'Rerum culpa dolorem consequuntur eos qui.'
                          is_read: false
                          created_at: '2026-01-12T16:47:55.000000Z'
                          updated_at: '2026-01-12T16:47:55.000000Z'
                    -
                      id: 35
                      sender_id: 159
                      recipient_id: 160
                      device_id: 123
                      meeting_date: '2026-01-12 16:47:55'
                      meeting_type: online_meeting
                      contact_email: noble46@hotmail.com
                      status: new
                      created_at: '2026-01-12T16:47:56.000000Z'
                      updated_at: '2026-01-12T16:47:56.000000Z'
                      sender:
                        id: 159
                        mrn: MV5LPQ0O1768236475
                        name: 'Mr. Braulio Rohan IV'
                        email: 1768236475christiansen.garnett@example.org
                        language: en
                        phone: +1.650.405.5858
                        phone_country: KP
                        phone_verified_at: null
                        address1: '46429 Green Canyon Apt. 493'
                        address2: 'East Danmouth, AR 75764-2615'
                        postal_code: '41665'
                        city: Kub-Bailey
                        clinic_name: Nashtown
                        clinic_location: "153 Koss Walk\nWest Orville, AZ 89986-5998"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:55.000000Z'
                        updated_at: '2026-01-12T16:47:55.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                      recipient:
                        id: 160
                        mrn: XKDLVGHZ1768236475
                        name: 'Rachael Crooks'
                        email: 1768236475gerhold.caterina@example.com
                        language: en
                        phone: 517.671.5301
                        phone_country: PT
                        phone_verified_at: null
                        address1: '8318 Weissnat Wells'
                        address2: 'North Berylville, FL 63127'
                        postal_code: 56932-2046
                        city: 'Hessel Inc'
                        clinic_name: 'West Arjunberg'
                        clinic_location: "57175 Darron Plains Suite 460\nWest Americamouth, OH 06298-8141"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:56.000000Z'
                        updated_at: '2026-01-12T16:47:56.000000Z'
                        invitation_status: null
                        acadle_invitation_status: null
                        roles: []
                      device:
                        id: 123
                        serial: fbaaf0cb-4c98-3cb2-bed4-e4867385a8dc
                        bluetooth_id: 4c556d64-3af7-3e4c-82c3-45940eaac355
                        company_id: null
                        model_id: null
                        amputee_id: null
                        clinician_id: null
                        firmware_version_id: null
                        pcb_version_id: null
                        reverse_magnets: 0
                        is_electrode: 0
                        active: 1
                        last_activity_at: '0000-00-00 00:00:00'
                        created_at: '2026-01-12T16:47:56.000000Z'
                        updated_at: '2026-01-12T16:47:56.000000Z'
                      messages:
                        -
                          id: 19
                          ticket_id: 35
                          sender_id: 161
                          title: Ms.
                          content: 'Id quaerat est nesciunt vel et.'
                          is_read: false
                          created_at: '2026-01-12T16:47:56.000000Z'
                          updated_at: '2026-01-12T16:47:56.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 27
                        sender_id: 145
                        recipient_id: 146
                        device_id: 122
                        meeting_date: '2026-01-12 16:47:54'
                        meeting_type: online_meeting
                        contact_email: vswift@douglas.info
                        status: new
                        created_at: '2026-01-12T16:47:54.000000Z'
                        updated_at: '2026-01-12T16:47:54.000000Z'
                        sender:
                          id: 145
                          mrn: CLEGYJNX1768236474
                          name: 'Roscoe Stanton'
                          email: 1768236474emely.heathcote@example.com
                          language: en
                          phone: +1.904.492.6420
                          phone_country: PE
                          phone_verified_at: null
                          address1: '83669 Heathcote Drives Suite 334'
                          address2: 'Kielmouth, NV 15962'
                          postal_code: 54633-8300
                          city: 'Wilderman, Herman and Thompson'
                          clinic_name: Schmidtmouth
                          clinic_location: "8117 Walker Rue\nProhaskaview, VT 55597"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:54.000000Z'
                          updated_at: '2026-01-12T16:47:54.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                        recipient:
                          id: 146
                          mrn: 124YAINZ1768236474
                          name: 'Katlyn Berge'
                          email: 1768236474jairo.volkman@example.com
                          language: en
                          phone: '+1 (234) 681-6879'
                          phone_country: DJ
                          phone_verified_at: null
                          address1: '6089 Shirley Rest Suite 824'
                          address2: 'West Maxwellmouth, WI 39329'
                          postal_code: 56714-1569
                          city: 'Bailey, Stiedemann and Thompson'
                          clinic_name: Bradtkeburgh
                          clinic_location: "60842 Elyse Stravenue\nCreminmouth, KY 23495"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:54.000000Z'
                          updated_at: '2026-01-12T16:47:54.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                        device:
                          id: 122
                          serial: 73b16df2-ce83-3420-b9aa-5f33e718d177
                          bluetooth_id: 6a9bf13e-351b-3398-8edd-4adc3e5491f4
                          company_id: null
                          model_id: null
                          amputee_id: null
                          clinician_id: null
                          firmware_version_id: null
                          pcb_version_id: null
                          reverse_magnets: 0
                          is_electrode: 0
                          active: 1
                          last_activity_at: '0000-00-00 00:00:00'
                          created_at: '2026-01-12T16:47:54.000000Z'
                          updated_at: '2026-01-12T16:47:54.000000Z'
                        messages:
                          -
                            id: 15
                            ticket_id: 27
                            sender_id: 147
                            title: Mrs.
                            content: 'Rerum culpa dolorem consequuntur eos qui.'
                            is_read: false
                            created_at: '2026-01-12T16:47:55.000000Z'
                            updated_at: '2026-01-12T16:47:55.000000Z'
                      -
                        id: 35
                        sender_id: 159
                        recipient_id: 160
                        device_id: 123
                        meeting_date: '2026-01-12 16:47:55'
                        meeting_type: online_meeting
                        contact_email: noble46@hotmail.com
                        status: new
                        created_at: '2026-01-12T16:47:56.000000Z'
                        updated_at: '2026-01-12T16:47:56.000000Z'
                        sender:
                          id: 159
                          mrn: MV5LPQ0O1768236475
                          name: 'Mr. Braulio Rohan IV'
                          email: 1768236475christiansen.garnett@example.org
                          language: en
                          phone: +1.650.405.5858
                          phone_country: KP
                          phone_verified_at: null
                          address1: '46429 Green Canyon Apt. 493'
                          address2: 'East Danmouth, AR 75764-2615'
                          postal_code: '41665'
                          city: Kub-Bailey
                          clinic_name: Nashtown
                          clinic_location: "153 Koss Walk\nWest Orville, AZ 89986-5998"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:55.000000Z'
                          updated_at: '2026-01-12T16:47:55.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                        recipient:
                          id: 160
                          mrn: XKDLVGHZ1768236475
                          name: 'Rachael Crooks'
                          email: 1768236475gerhold.caterina@example.com
                          language: en
                          phone: 517.671.5301
                          phone_country: PT
                          phone_verified_at: null
                          address1: '8318 Weissnat Wells'
                          address2: 'North Berylville, FL 63127'
                          postal_code: 56932-2046
                          city: 'Hessel Inc'
                          clinic_name: 'West Arjunberg'
                          clinic_location: "57175 Darron Plains Suite 460\nWest Americamouth, OH 06298-8141"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:56.000000Z'
                          updated_at: '2026-01-12T16:47:56.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          roles: []
                        device:
                          id: 123
                          serial: fbaaf0cb-4c98-3cb2-bed4-e4867385a8dc
                          bluetooth_id: 4c556d64-3af7-3e4c-82c3-45940eaac355
                          company_id: null
                          model_id: null
                          amputee_id: null
                          clinician_id: null
                          firmware_version_id: null
                          pcb_version_id: null
                          reverse_magnets: 0
                          is_electrode: 0
                          active: 1
                          last_activity_at: '0000-00-00 00:00:00'
                          created_at: '2026-01-12T16:47:56.000000Z'
                          updated_at: '2026-01-12T16:47:56.000000Z'
                        messages:
                          -
                            id: 19
                            ticket_id: 35
                            sender_id: 161
                            title: Ms.
                            content: 'Id quaerat est nesciunt vel et.'
                            is_read: false
                            created_at: '2026-01-12T16:47:56.000000Z'
                            updated_at: '2026-01-12T16:47:56.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 27
                        sender_id:
                          type: integer
                          example: 145
                        recipient_id:
                          type: integer
                          example: 146
                        device_id:
                          type: integer
                          example: 122
                        meeting_date:
                          type: string
                          example: '2026-01-12 16:47:54'
                        meeting_type:
                          type: string
                          example: online_meeting
                        contact_email:
                          type: string
                          example: vswift@douglas.info
                        status:
                          type: string
                          example: new
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:54.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:54.000000Z'
                        sender:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 145
                            mrn:
                              type: string
                              example: CLEGYJNX1768236474
                            name:
                              type: string
                              example: 'Roscoe Stanton'
                            email:
                              type: string
                              example: 1768236474emely.heathcote@example.com
                            language:
                              type: string
                              example: en
                            phone:
                              type: string
                              example: +1.904.492.6420
                            phone_country:
                              type: string
                              example: PE
                            phone_verified_at:
                              type: string
                              example: null
                            address1:
                              type: string
                              example: '83669 Heathcote Drives Suite 334'
                            address2:
                              type: string
                              example: 'Kielmouth, NV 15962'
                            postal_code:
                              type: string
                              example: 54633-8300
                            city:
                              type: string
                              example: 'Wilderman, Herman and Thompson'
                            clinic_name:
                              type: string
                              example: Schmidtmouth
                            clinic_location:
                              type: string
                              example: "8117 Walker Rue\nProhaskaview, VT 55597"
                            image:
                              type: string
                              example: null
                            mfa_enabled:
                              type: integer
                              example: 0
                            mfa_method:
                              type: string
                              example: null
                            mfa_verified_to:
                              type: string
                              example: null
                            location_id:
                              type: string
                              example: null
                            created_by:
                              type: string
                              example: null
                            active:
                              type: integer
                              example: 1
                            notifications_timezone:
                              type: string
                              example: null
                            notifications_at:
                              type: string
                              example: null
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:54.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:54.000000Z'
                            invitation_status:
                              type: string
                              example: null
                            acadle_invitation_status:
                              type: string
                              example: null
                            roles:
                              type: array
                              example: []
                        recipient:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 146
                            mrn:
                              type: string
                              example: 124YAINZ1768236474
                            name:
                              type: string
                              example: 'Katlyn Berge'
                            email:
                              type: string
                              example: 1768236474jairo.volkman@example.com
                            language:
                              type: string
                              example: en
                            phone:
                              type: string
                              example: '+1 (234) 681-6879'
                            phone_country:
                              type: string
                              example: DJ
                            phone_verified_at:
                              type: string
                              example: null
                            address1:
                              type: string
                              example: '6089 Shirley Rest Suite 824'
                            address2:
                              type: string
                              example: 'West Maxwellmouth, WI 39329'
                            postal_code:
                              type: string
                              example: 56714-1569
                            city:
                              type: string
                              example: 'Bailey, Stiedemann and Thompson'
                            clinic_name:
                              type: string
                              example: Bradtkeburgh
                            clinic_location:
                              type: string
                              example: "60842 Elyse Stravenue\nCreminmouth, KY 23495"
                            image:
                              type: string
                              example: null
                            mfa_enabled:
                              type: integer
                              example: 0
                            mfa_method:
                              type: string
                              example: null
                            mfa_verified_to:
                              type: string
                              example: null
                            location_id:
                              type: string
                              example: null
                            created_by:
                              type: string
                              example: null
                            active:
                              type: integer
                              example: 1
                            notifications_timezone:
                              type: string
                              example: null
                            notifications_at:
                              type: string
                              example: null
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:54.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:54.000000Z'
                            invitation_status:
                              type: string
                              example: null
                            acadle_invitation_status:
                              type: string
                              example: null
                            roles:
                              type: array
                              example: []
                        device:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 122
                            serial:
                              type: string
                              example: 73b16df2-ce83-3420-b9aa-5f33e718d177
                            bluetooth_id:
                              type: string
                              example: 6a9bf13e-351b-3398-8edd-4adc3e5491f4
                            company_id:
                              type: string
                              example: null
                            model_id:
                              type: string
                              example: null
                            amputee_id:
                              type: string
                              example: null
                            clinician_id:
                              type: string
                              example: null
                            firmware_version_id:
                              type: string
                              example: null
                            pcb_version_id:
                              type: string
                              example: null
                            reverse_magnets:
                              type: integer
                              example: 0
                            is_electrode:
                              type: integer
                              example: 0
                            active:
                              type: integer
                              example: 1
                            last_activity_at:
                              type: string
                              example: '0000-00-00 00:00:00'
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:54.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:54.000000Z'
                        messages:
                          type: array
                          example:
                            -
                              id: 15
                              ticket_id: 27
                              sender_id: 147
                              title: Mrs.
                              content: 'Rerum culpa dolorem consequuntur eos qui.'
                              is_read: false
                              created_at: '2026-01-12T16:47:55.000000Z'
                              updated_at: '2026-01-12T16:47:55.000000Z'
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 15
                              ticket_id:
                                type: integer
                                example: 27
                              sender_id:
                                type: integer
                                example: 147
                              title:
                                type: string
                                example: Mrs.
                              content:
                                type: string
                                example: 'Rerum culpa dolorem consequuntur eos qui.'
                              is_read:
                                type: boolean
                                example: false
                              created_at:
                                type: string
                                example: '2026-01-12T16:47:55.000000Z'
                              updated_at:
                                type: string
                                example: '2026-01-12T16:47:55.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list support tickets'
                  code: 'TICKETS:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list support tickets'
                  code:
                    type: string
                    example: 'TICKETS:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - 'Support Ticket'
    post:
      summary: 'Create new support ticket'
      operationId: createNewSupportTicket
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 53
                  sender_id: 191
                  recipient_id: 192
                  device_id: 125
                  meeting_date: '2026-01-12 16:47:58'
                  meeting_type: online_meeting
                  contact_email: zhackett@hotmail.com
                  status: new
                  created_at: '2026-01-12T16:47:58.000000Z'
                  updated_at: '2026-01-12T16:47:58.000000Z'
                  sender:
                    id: 191
                    mrn: 8WMY8YPA1768236478
                    name: "Prof. Kiara O'Hara"
                    email: 1768236478chaley@example.org
                    language: en
                    phone: +1.401.966.6807
                    phone_country: ST
                    phone_verified_at: null
                    address1: '8439 Pete Neck'
                    address2: 'Lake Beaulahhaven, IL 17918'
                    postal_code: 38293-5214
                    city: Ebert-Abernathy
                    clinic_name: 'Lake Isom'
                    clinic_location: "2973 Jenkins Corner Suite 416\nNolaberg, MA 62171-5738"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:58.000000Z'
                    updated_at: '2026-01-12T16:47:58.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  recipient:
                    id: 192
                    mrn: VYJEWNKP1768236478
                    name: 'Mr. Roger Rippin DVM'
                    email: 1768236478fwolf@example.org
                    language: en
                    phone: 1-615-713-4679
                    phone_country: PS
                    phone_verified_at: null
                    address1: '8818 Gutmann Summit'
                    address2: 'North Kasandra, PA 01292'
                    postal_code: 51811-9047
                    city: Upton-Blanda
                    clinic_name: Geraldton
                    clinic_location: "56976 Al Gardens\nWest Taylor, WV 79814-0229"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:58.000000Z'
                    updated_at: '2026-01-12T16:47:58.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  device:
                    id: 125
                    serial: c094af9b-5dde-3c09-9f21-17b79c2add95
                    bluetooth_id: 94ff6953-d9f7-3acb-8a5e-a808d3aaef62
                    company_id: null
                    model_id: null
                    amputee_id: null
                    clinician_id: null
                    firmware_version_id: null
                    pcb_version_id: null
                    reverse_magnets: 0
                    is_electrode: 0
                    active: 1
                    last_activity_at: '0000-00-00 00:00:00'
                    created_at: '2026-01-12T16:47:58.000000Z'
                    updated_at: '2026-01-12T16:47:58.000000Z'
                  messages:
                    -
                      id: 27
                      ticket_id: 53
                      sender_id: 193
                      title: Miss
                      content: 'Velit deleniti labore nobis mollitia nisi.'
                      is_read: false
                      created_at: '2026-01-12T16:47:58.000000Z'
                      updated_at: '2026-01-12T16:47:58.000000Z'
                properties:
                  id:
                    type: integer
                    example: 53
                  sender_id:
                    type: integer
                    example: 191
                  recipient_id:
                    type: integer
                    example: 192
                  device_id:
                    type: integer
                    example: 125
                  meeting_date:
                    type: string
                    example: '2026-01-12 16:47:58'
                  meeting_type:
                    type: string
                    example: online_meeting
                  contact_email:
                    type: string
                    example: zhackett@hotmail.com
                  status:
                    type: string
                    example: new
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:58.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:58.000000Z'
                  sender:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 191
                      mrn:
                        type: string
                        example: 8WMY8YPA1768236478
                      name:
                        type: string
                        example: "Prof. Kiara O'Hara"
                      email:
                        type: string
                        example: 1768236478chaley@example.org
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: +1.401.966.6807
                      phone_country:
                        type: string
                        example: ST
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '8439 Pete Neck'
                      address2:
                        type: string
                        example: 'Lake Beaulahhaven, IL 17918'
                      postal_code:
                        type: string
                        example: 38293-5214
                      city:
                        type: string
                        example: Ebert-Abernathy
                      clinic_name:
                        type: string
                        example: 'Lake Isom'
                      clinic_location:
                        type: string
                        example: "2973 Jenkins Corner Suite 416\nNolaberg, MA 62171-5738"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:58.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:58.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  recipient:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 192
                      mrn:
                        type: string
                        example: VYJEWNKP1768236478
                      name:
                        type: string
                        example: 'Mr. Roger Rippin DVM'
                      email:
                        type: string
                        example: 1768236478fwolf@example.org
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 1-615-713-4679
                      phone_country:
                        type: string
                        example: PS
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '8818 Gutmann Summit'
                      address2:
                        type: string
                        example: 'North Kasandra, PA 01292'
                      postal_code:
                        type: string
                        example: 51811-9047
                      city:
                        type: string
                        example: Upton-Blanda
                      clinic_name:
                        type: string
                        example: Geraldton
                      clinic_location:
                        type: string
                        example: "56976 Al Gardens\nWest Taylor, WV 79814-0229"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:58.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:58.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  device:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 125
                      serial:
                        type: string
                        example: c094af9b-5dde-3c09-9f21-17b79c2add95
                      bluetooth_id:
                        type: string
                        example: 94ff6953-d9f7-3acb-8a5e-a808d3aaef62
                      company_id:
                        type: string
                        example: null
                      model_id:
                        type: string
                        example: null
                      amputee_id:
                        type: string
                        example: null
                      clinician_id:
                        type: string
                        example: null
                      firmware_version_id:
                        type: string
                        example: null
                      pcb_version_id:
                        type: string
                        example: null
                      reverse_magnets:
                        type: integer
                        example: 0
                      is_electrode:
                        type: integer
                        example: 0
                      active:
                        type: integer
                        example: 1
                      last_activity_at:
                        type: string
                        example: '0000-00-00 00:00:00'
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:58.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:58.000000Z'
                  messages:
                    type: array
                    example:
                      -
                        id: 27
                        ticket_id: 53
                        sender_id: 193
                        title: Miss
                        content: 'Velit deleniti labore nobis mollitia nisi.'
                        is_read: false
                        created_at: '2026-01-12T16:47:58.000000Z'
                        updated_at: '2026-01-12T16:47:58.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 27
                        ticket_id:
                          type: integer
                          example: 53
                        sender_id:
                          type: integer
                          example: 193
                        title:
                          type: string
                          example: Miss
                        content:
                          type: string
                          example: 'Velit deleniti labore nobis mollitia nisi.'
                        is_read:
                          type: boolean
                          example: false
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:58.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:58.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to create support ticket'
                  code: 'TICKETS:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to create support ticket'
                  code:
                    type: string
                    example: 'TICKETS:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - 'Support Ticket'
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                recipient:
                  type: integer
                  description: 'User the support ticket is assigned to. For Amputee role main clinician will be automatically assigned instead. The <code>id</code> of an existing record in the App\Models\User table.'
                  example: 1
                device:
                  type: integer
                  description: 'Device the support ticket is assigned to. The <code>id</code> of an existing record in the App\Models\Device table.'
                  example: 1
                  nullable: true
                meeting_type:
                  type: string
                  description: 'Type of support meeting.'
                  example: online_meeting
                  enum:
                    - online_meeting
                    - phone_call
                    - personally
                    - none
                meeting_date:
                  type: string
                  description: 'Date of support meeting. MUST_BE_DATE.'
                  example: 2026-01-12T16:47:58.313891+00:00
                contact_email:
                  type: string
                  description: 'Email address for later contact. MUST_BE_EMAIL.'
                  example: arturo.cummings@goodwin.com
                message:
                  type: object
                  description: ''
                  example: []
                  properties:
                    content:
                      type: string
                      description: 'Content of message.'
                      example: 'Qui et qui minima reiciendis consequuntur sit accusamus.'
                    title:
                      type: string
                      description: 'Message title.'
                      example: 'Veniam excepturi sunt culpa.'
                    attachments:
                      type: array
                      description: 'Must be a file.'
                      items:
                        type: string
                        format: binary
              required:
                - recipient
                - meeting_type
                - meeting_date
  /api/tickets/status:
    get:
      summary: 'Get tickets status'
      operationId: getTicketsStatus
      description: 'Counts tickets by their status'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  unread: 1
                properties:
                  unread:
                    type: integer
                    example: 1
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list support tickets'
                  code: 'TICKETS:STATUS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list support tickets'
                  code:
                    type: string
                    example: 'TICKETS:STATUS:INSUFFICIENT_PERMISSION'
      tags:
        - 'Support Ticket'
  '/api/ticket/{id}':
    get:
      summary: 'Get support ticket'
      operationId: getSupportTicket
      description: 'Returns single support ticket in the response.'
      parameters:
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>sender</code>, <code>recipient</code>, <code>device</code>, <code>messages</code>, <code>messages.attachments</code>, <code>messages.sender</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>sender</code>, <code>recipient</code>, <code>device</code>, <code>messages</code>, <code>messages.attachments</code>, <code>messages.sender</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 43
                  sender_id: 173
                  recipient_id: 174
                  device_id: 124
                  meeting_date: '2026-01-12 16:47:56'
                  meeting_type: online_meeting
                  contact_email: bins.coy@hotmail.com
                  status: new
                  created_at: '2026-01-12T16:47:57.000000Z'
                  updated_at: '2026-01-12T16:47:57.000000Z'
                  sender:
                    id: 173
                    mrn: Z4WY6CLF1768236476
                    name: 'Ludwig Daugherty'
                    email: 1768236476ybarrows@example.org
                    language: en
                    phone: 281.664.2972
                    phone_country: MM
                    phone_verified_at: null
                    address1: '234 Watsica Shoal Apt. 375'
                    address2: 'Salvadorbury, SC 80237-8497'
                    postal_code: '62357'
                    city: "Beier-O'Connell"
                    clinic_name: Hillardmouth
                    clinic_location: "718 Eliezer Key\nNew Monserratestad, GA 13982-2920"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:56.000000Z'
                    updated_at: '2026-01-12T16:47:56.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  recipient:
                    id: 174
                    mrn: 5V4UR62J1768236476
                    name: 'Dr. Marjolaine Dibbert Jr.'
                    email: 1768236476hermann.bertram@example.org
                    language: en
                    phone: 689-226-1082
                    phone_country: RU
                    phone_verified_at: null
                    address1: '245 Alec Pine Suite 402'
                    address2: 'Derekport, MI 23127-8813'
                    postal_code: 28903-6425
                    city: Schoen-Glover
                    clinic_name: 'West Isadoreview'
                    clinic_location: "16842 Evelyn Radial Apt. 536\nPort Dimitri, OR 83657-4175"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:57.000000Z'
                    updated_at: '2026-01-12T16:47:57.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  device:
                    id: 124
                    serial: 2dff1fda-f9c1-3dd5-8d22-1851b4233e4d
                    bluetooth_id: 868eccf8-d576-3622-8b85-71d33d36e183
                    company_id: null
                    model_id: null
                    amputee_id: null
                    clinician_id: null
                    firmware_version_id: null
                    pcb_version_id: null
                    reverse_magnets: 0
                    is_electrode: 0
                    active: 1
                    last_activity_at: '0000-00-00 00:00:00'
                    created_at: '2026-01-12T16:47:57.000000Z'
                    updated_at: '2026-01-12T16:47:57.000000Z'
                  messages:
                    -
                      id: 23
                      ticket_id: 43
                      sender_id: 175
                      title: Mr.
                      content: 'Doloremque tempora et natus libero voluptatem.'
                      is_read: false
                      created_at: '2026-01-12T16:47:57.000000Z'
                      updated_at: '2026-01-12T16:47:57.000000Z'
                properties:
                  id:
                    type: integer
                    example: 43
                  sender_id:
                    type: integer
                    example: 173
                  recipient_id:
                    type: integer
                    example: 174
                  device_id:
                    type: integer
                    example: 124
                  meeting_date:
                    type: string
                    example: '2026-01-12 16:47:56'
                  meeting_type:
                    type: string
                    example: online_meeting
                  contact_email:
                    type: string
                    example: bins.coy@hotmail.com
                  status:
                    type: string
                    example: new
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:57.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:57.000000Z'
                  sender:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 173
                      mrn:
                        type: string
                        example: Z4WY6CLF1768236476
                      name:
                        type: string
                        example: 'Ludwig Daugherty'
                      email:
                        type: string
                        example: 1768236476ybarrows@example.org
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 281.664.2972
                      phone_country:
                        type: string
                        example: MM
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '234 Watsica Shoal Apt. 375'
                      address2:
                        type: string
                        example: 'Salvadorbury, SC 80237-8497'
                      postal_code:
                        type: string
                        example: '62357'
                      city:
                        type: string
                        example: "Beier-O'Connell"
                      clinic_name:
                        type: string
                        example: Hillardmouth
                      clinic_location:
                        type: string
                        example: "718 Eliezer Key\nNew Monserratestad, GA 13982-2920"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:56.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:56.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  recipient:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 174
                      mrn:
                        type: string
                        example: 5V4UR62J1768236476
                      name:
                        type: string
                        example: 'Dr. Marjolaine Dibbert Jr.'
                      email:
                        type: string
                        example: 1768236476hermann.bertram@example.org
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 689-226-1082
                      phone_country:
                        type: string
                        example: RU
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '245 Alec Pine Suite 402'
                      address2:
                        type: string
                        example: 'Derekport, MI 23127-8813'
                      postal_code:
                        type: string
                        example: 28903-6425
                      city:
                        type: string
                        example: Schoen-Glover
                      clinic_name:
                        type: string
                        example: 'West Isadoreview'
                      clinic_location:
                        type: string
                        example: "16842 Evelyn Radial Apt. 536\nPort Dimitri, OR 83657-4175"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:57.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:57.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  device:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 124
                      serial:
                        type: string
                        example: 2dff1fda-f9c1-3dd5-8d22-1851b4233e4d
                      bluetooth_id:
                        type: string
                        example: 868eccf8-d576-3622-8b85-71d33d36e183
                      company_id:
                        type: string
                        example: null
                      model_id:
                        type: string
                        example: null
                      amputee_id:
                        type: string
                        example: null
                      clinician_id:
                        type: string
                        example: null
                      firmware_version_id:
                        type: string
                        example: null
                      pcb_version_id:
                        type: string
                        example: null
                      reverse_magnets:
                        type: integer
                        example: 0
                      is_electrode:
                        type: integer
                        example: 0
                      active:
                        type: integer
                        example: 1
                      last_activity_at:
                        type: string
                        example: '0000-00-00 00:00:00'
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:57.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:57.000000Z'
                  messages:
                    type: array
                    example:
                      -
                        id: 23
                        ticket_id: 43
                        sender_id: 175
                        title: Mr.
                        content: 'Doloremque tempora et natus libero voluptatem.'
                        is_read: false
                        created_at: '2026-01-12T16:47:57.000000Z'
                        updated_at: '2026-01-12T16:47:57.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 23
                        ticket_id:
                          type: integer
                          example: 43
                        sender_id:
                          type: integer
                          example: 175
                        title:
                          type: string
                          example: Mr.
                        content:
                          type: string
                          example: 'Doloremque tempora et natus libero voluptatem.'
                        is_read:
                          type: boolean
                          example: false
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:57.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:57.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view support ticket'
                  code: 'TICKETS:GET:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view support ticket'
                  code:
                    type: string
                    example: 'TICKETS:GET:INSUFFICIENT_PERMISSION'
        404:
          description: 'Support ticket not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Support ticket not found'
                  code: 'TICKETS:GET:TICKET_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Support ticket not found'
                  code:
                    type: string
                    example: 'TICKETS:GET:TICKET_NOT_FOUND'
      tags:
        - 'Support Ticket'
    parameters:
      -
        in: path
        name: id
        description: 'Support ticket ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/ticket/{id}/history':
    get:
      summary: 'Get support ticket history'
      operationId: getSupportTicketHistory
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      ticket_id: 51
                      author_id: 188
                      action: qui
                      reason: 'Odio non et accusantium ex corrupti ut similique laudantium.'
                      created_at: '2026-01-12T16:47:58.000000Z'
                      updated_at: '2026-01-12T16:47:58.000000Z'
                    -
                      id: 2
                      ticket_id: 52
                      author_id: 190
                      action: beatae
                      reason: 'Repellat beatae alias nulla suscipit autem voluptatibus.'
                      created_at: '2026-01-12T16:47:58.000000Z'
                      updated_at: '2026-01-12T16:47:58.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        ticket_id: 51
                        author_id: 188
                        action: qui
                        reason: 'Odio non et accusantium ex corrupti ut similique laudantium.'
                        created_at: '2026-01-12T16:47:58.000000Z'
                        updated_at: '2026-01-12T16:47:58.000000Z'
                      -
                        id: 2
                        ticket_id: 52
                        author_id: 190
                        action: beatae
                        reason: 'Repellat beatae alias nulla suscipit autem voluptatibus.'
                        created_at: '2026-01-12T16:47:58.000000Z'
                        updated_at: '2026-01-12T16:47:58.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        ticket_id:
                          type: integer
                          example: 51
                        author_id:
                          type: integer
                          example: 188
                        action:
                          type: string
                          example: qui
                        reason:
                          type: string
                          example: 'Odio non et accusantium ex corrupti ut similique laudantium.'
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:58.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:58.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view support ticket'
                  code: 'TICKETS:HISTORY:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view support ticket'
                  code:
                    type: string
                    example: 'TICKETS:HISTORY:INSUFFICIENT_PERMISSION'
        404:
          description: 'Support ticket not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Support ticket not found'
                  code: 'TICKETS:HISTORY:TICKET_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Support ticket not found'
                  code:
                    type: string
                    example: 'TICKETS:HISTORY:TICKET_NOT_FOUND'
      tags:
        - 'Support Ticket'
    parameters:
      -
        in: path
        name: id
        description: 'Support ticket ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/tickets/available-filters:
    get:
      summary: 'Get support ticket available filters'
      operationId: getSupportTicketAvailableFilters
      description: ''
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  clinicians:
                    -
                      id: 95
                      mrn: null
                      name: Name
                      email: email
                      region: us
                      language: pl
                      phone: +48-555555555
                      phone_verified_at: null
                      address1: Address
                      address2: 'Address 2'
                      postal_code: ''
                      city: ''
                      clinic_name: Name
                      clinic_location: Name
                      image: 'https://aether-dev-bucket.s3.amazonaws.com/users/LDueuv1uG218G7owaiLAaWRkpaGxjB0jEFwzZsT1.png'
                      mfa_enabled: 0
                      mfa_method: sms
                      mfa_verified_to: null
                      location_id: 2
                      created_by: 1
                      active: 1
                      notifications_timezone: America/Adak
                      notifications_at: null
                      created_at: '2022-07-19T14:43:37.000000Z'
                      updated_at: '2024-09-27T05:52:51.000000Z'
                      invitation_status: expired
                      roles:
                        -
                          id: 2
                          name: Clinician
                          guard_name: web
                          created_at: '2022-03-21T17:15:47.000000Z'
                          updated_at: '2022-03-21T17:15:47.000000Z'
                          pivot:
                            model_id: 95
                            role_id: 2
                            model_type: App\Models\User
                properties:
                  clinicians:
                    type: array
                    example:
                      -
                        id: 95
                        mrn: null
                        name: Name
                        email: email
                        region: us
                        language: pl
                        phone: +48-555555555
                        phone_verified_at: null
                        address1: Address
                        address2: 'Address 2'
                        postal_code: ''
                        city: ''
                        clinic_name: Name
                        clinic_location: Name
                        image: 'https://aether-dev-bucket.s3.amazonaws.com/users/LDueuv1uG218G7owaiLAaWRkpaGxjB0jEFwzZsT1.png'
                        mfa_enabled: 0
                        mfa_method: sms
                        mfa_verified_to: null
                        location_id: 2
                        created_by: 1
                        active: 1
                        notifications_timezone: America/Adak
                        notifications_at: null
                        created_at: '2022-07-19T14:43:37.000000Z'
                        updated_at: '2024-09-27T05:52:51.000000Z'
                        invitation_status: expired
                        roles:
                          -
                            id: 2
                            name: Clinician
                            guard_name: web
                            created_at: '2022-03-21T17:15:47.000000Z'
                            updated_at: '2022-03-21T17:15:47.000000Z'
                            pivot:
                              model_id: 95
                              role_id: 2
                              model_type: App\Models\User
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 95
                        mrn:
                          type: string
                          example: null
                        name:
                          type: string
                          example: Name
                        email:
                          type: string
                          example: email
                        region:
                          type: string
                          example: us
                        language:
                          type: string
                          example: pl
                        phone:
                          type: string
                          example: +48-555555555
                        phone_verified_at:
                          type: string
                          example: null
                        address1:
                          type: string
                          example: Address
                        address2:
                          type: string
                          example: 'Address 2'
                        postal_code:
                          type: string
                          example: ''
                        city:
                          type: string
                          example: ''
                        clinic_name:
                          type: string
                          example: Name
                        clinic_location:
                          type: string
                          example: Name
                        image:
                          type: string
                          example: 'https://aether-dev-bucket.s3.amazonaws.com/users/LDueuv1uG218G7owaiLAaWRkpaGxjB0jEFwzZsT1.png'
                        mfa_enabled:
                          type: integer
                          example: 0
                        mfa_method:
                          type: string
                          example: sms
                        mfa_verified_to:
                          type: string
                          example: null
                        location_id:
                          type: integer
                          example: 2
                        created_by:
                          type: integer
                          example: 1
                        active:
                          type: integer
                          example: 1
                        notifications_timezone:
                          type: string
                          example: America/Adak
                        notifications_at:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2022-07-19T14:43:37.000000Z'
                        updated_at:
                          type: string
                          example: '2024-09-27T05:52:51.000000Z'
                        invitation_status:
                          type: string
                          example: expired
                        roles:
                          type: array
                          example:
                            -
                              id: 2
                              name: Clinician
                              guard_name: web
                              created_at: '2022-03-21T17:15:47.000000Z'
                              updated_at: '2022-03-21T17:15:47.000000Z'
                              pivot:
                                model_id: 95
                                role_id: 2
                                model_type: App\Models\User
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 2
                              name:
                                type: string
                                example: Clinician
                              guard_name:
                                type: string
                                example: web
                              created_at:
                                type: string
                                example: '2022-03-21T17:15:47.000000Z'
                              updated_at:
                                type: string
                                example: '2022-03-21T17:15:47.000000Z'
                              pivot:
                                type: object
                                properties:
                                  model_id:
                                    type: integer
                                    example: 95
                                  role_id:
                                    type: integer
                                    example: 2
                                  model_type:
                                    type: string
                                    example: App\Models\User
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to create support ticket'
                  code: 'TICKETS:AVAILABLE_FILTERS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to create support ticket'
                  code:
                    type: string
                    example: 'TICKETS:AVAILABLE_FILTERS:INSUFFICIENT_PERMISSION'
      tags:
        - 'Support Ticket'
  '/api/ticket/{id}/close':
    post:
      summary: 'Close support ticket'
      operationId: closeSupportTicket
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 61
                  sender_id: 205
                  recipient_id: 206
                  device_id: 126
                  meeting_date: '2026-01-12 16:47:59'
                  meeting_type: online_meeting
                  contact_email: reynolds.jed@gmail.com
                  status: new
                  created_at: '2026-01-12T16:47:59.000000Z'
                  updated_at: '2026-01-12T16:47:59.000000Z'
                  sender:
                    id: 205
                    mrn: VI6J1RQ91768236479
                    name: 'Marco Murazik'
                    email: 1768236479casper05@example.org
                    language: en
                    phone: '+1 (614) 465-7617'
                    phone_country: ET
                    phone_verified_at: null
                    address1: '535 Corene Coves'
                    address2: 'New Ford, MA 62781-8311'
                    postal_code: '19181'
                    city: Hamill-Bechtelar
                    clinic_name: Reneefort
                    clinic_location: "286 Hauck Vista Suite 506\nLake Murielview, KY 93714-5266"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:59.000000Z'
                    updated_at: '2026-01-12T16:47:59.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  recipient:
                    id: 206
                    mrn: S8OR7MS11768236479
                    name: 'Sibyl Wunsch'
                    email: 1768236479eleonore85@example.com
                    language: en
                    phone: '(980) 385-5568'
                    phone_country: KP
                    phone_verified_at: null
                    address1: '797 Stroman Flat'
                    address2: 'Abelport, SD 47431'
                    postal_code: '14481'
                    city: 'Johns, Lakin and Murphy'
                    clinic_name: Titohaven
                    clinic_location: "7022 Giles Court Apt. 655\nAlaynashire, OK 08086"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:59.000000Z'
                    updated_at: '2026-01-12T16:47:59.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  device:
                    id: 126
                    serial: 66a22c44-c602-3e99-8662-c5d8819e5306
                    bluetooth_id: 5d38b4af-3295-3929-a7bb-17081a540c0f
                    company_id: null
                    model_id: null
                    amputee_id: null
                    clinician_id: null
                    firmware_version_id: null
                    pcb_version_id: null
                    reverse_magnets: 0
                    is_electrode: 0
                    active: 1
                    last_activity_at: '0000-00-00 00:00:00'
                    created_at: '2026-01-12T16:47:59.000000Z'
                    updated_at: '2026-01-12T16:47:59.000000Z'
                  messages: []
                properties:
                  id:
                    type: integer
                    example: 61
                  sender_id:
                    type: integer
                    example: 205
                  recipient_id:
                    type: integer
                    example: 206
                  device_id:
                    type: integer
                    example: 126
                  meeting_date:
                    type: string
                    example: '2026-01-12 16:47:59'
                  meeting_type:
                    type: string
                    example: online_meeting
                  contact_email:
                    type: string
                    example: reynolds.jed@gmail.com
                  status:
                    type: string
                    example: new
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:59.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:59.000000Z'
                  sender:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 205
                      mrn:
                        type: string
                        example: VI6J1RQ91768236479
                      name:
                        type: string
                        example: 'Marco Murazik'
                      email:
                        type: string
                        example: 1768236479casper05@example.org
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: '+1 (614) 465-7617'
                      phone_country:
                        type: string
                        example: ET
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '535 Corene Coves'
                      address2:
                        type: string
                        example: 'New Ford, MA 62781-8311'
                      postal_code:
                        type: string
                        example: '19181'
                      city:
                        type: string
                        example: Hamill-Bechtelar
                      clinic_name:
                        type: string
                        example: Reneefort
                      clinic_location:
                        type: string
                        example: "286 Hauck Vista Suite 506\nLake Murielview, KY 93714-5266"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  recipient:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 206
                      mrn:
                        type: string
                        example: S8OR7MS11768236479
                      name:
                        type: string
                        example: 'Sibyl Wunsch'
                      email:
                        type: string
                        example: 1768236479eleonore85@example.com
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: '(980) 385-5568'
                      phone_country:
                        type: string
                        example: KP
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '797 Stroman Flat'
                      address2:
                        type: string
                        example: 'Abelport, SD 47431'
                      postal_code:
                        type: string
                        example: '14481'
                      city:
                        type: string
                        example: 'Johns, Lakin and Murphy'
                      clinic_name:
                        type: string
                        example: Titohaven
                      clinic_location:
                        type: string
                        example: "7022 Giles Court Apt. 655\nAlaynashire, OK 08086"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  device:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 126
                      serial:
                        type: string
                        example: 66a22c44-c602-3e99-8662-c5d8819e5306
                      bluetooth_id:
                        type: string
                        example: 5d38b4af-3295-3929-a7bb-17081a540c0f
                      company_id:
                        type: string
                        example: null
                      model_id:
                        type: string
                        example: null
                      amputee_id:
                        type: string
                        example: null
                      clinician_id:
                        type: string
                        example: null
                      firmware_version_id:
                        type: string
                        example: null
                      pcb_version_id:
                        type: string
                        example: null
                      reverse_magnets:
                        type: integer
                        example: 0
                      is_electrode:
                        type: integer
                        example: 0
                      active:
                        type: integer
                        example: 1
                      last_activity_at:
                        type: string
                        example: '0000-00-00 00:00:00'
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                  messages:
                    type: array
                    example: []
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to close support ticket'
                  code: 'TICKETS:CLOSE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to close support ticket'
                  code:
                    type: string
                    example: 'TICKETS:CLOSE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Support ticket not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Support ticket not found'
                  code: 'TICKETS:CLOSE:TICKET_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Support ticket not found'
                  code:
                    type: string
                    example: 'TICKETS:CLOSE:TICKET_NOT_FOUND'
      tags:
        - 'Support Ticket'
    parameters:
      -
        in: path
        name: id
        description: 'Support ticket ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/ticket/{id}/reopen':
    post:
      summary: 'Reopen support ticket'
      operationId: reopenSupportTicket
      description: "Patient (Amputee) role can reopen only non-config tickets.\n\t\tFor config tickets patients will get \"Insufficient permission\" response.\n\t\tFor patients role <code>reason</code> field is required."
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  ticket_id: 62
                  author_id: 208
                  action: voluptas
                  reason: 'Est sit et placeat voluptates est voluptatem nihil.'
                  created_at: '2026-01-12T16:47:59.000000Z'
                  updated_at: '2026-01-12T16:47:59.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  ticket_id:
                    type: integer
                    example: 62
                  author_id:
                    type: integer
                    example: 208
                  action:
                    type: string
                    example: voluptas
                  reason:
                    type: string
                    example: 'Est sit et placeat voluptates est voluptatem nihil.'
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:59.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:59.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to reopen support ticket'
                  code: 'TICKETS:REOPEN:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to reopen support ticket'
                  code:
                    type: string
                    example: 'TICKETS:REOPEN:INSUFFICIENT_PERMISSION'
        404:
          description: 'Support ticket not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Support ticket not found'
                  code: 'TICKETS:REOPEN:TICKET_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Support ticket not found'
                  code:
                    type: string
                    example: 'TICKETS:REOPEN:TICKET_NOT_FOUND'
      tags:
        - 'Support Ticket'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                reason:
                  type: string
                  description: 'Reason for reopen action.'
                  example: 'Something is still not working'
    parameters:
      -
        in: path
        name: id
        description: 'Support ticket ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/ticket/{id}/messages':
    post:
      summary: 'Create new support ticket message'
      operationId: createNewSupportTicketMessage
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 63
                  sender_id: 209
                  recipient_id: 210
                  device_id: 127
                  meeting_date: '2026-01-12 16:47:59'
                  meeting_type: online_meeting
                  contact_email: fschimmel@hotmail.com
                  status: new
                  created_at: '2026-01-12T16:47:59.000000Z'
                  updated_at: '2026-01-12T16:47:59.000000Z'
                  sender:
                    id: 209
                    mrn: 7DTSSBTE1768236479
                    name: 'Miss Taryn Kuhic'
                    email: 1768236479frami.maybelle@example.net
                    language: en
                    phone: 1-661-282-7044
                    phone_country: BG
                    phone_verified_at: null
                    address1: '61337 Purdy Skyway'
                    address2: 'Lake Lela, MA 19997'
                    postal_code: 82185-0769
                    city: Bauch-Stokes
                    clinic_name: Schroederville
                    clinic_location: "353 Herzog Island Apt. 314\nPort Alexander, OR 37646"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:59.000000Z'
                    updated_at: '2026-01-12T16:47:59.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  recipient:
                    id: 210
                    mrn: BKZ3K7RH1768236479
                    name: 'Eileen Jerde'
                    email: 1768236479fadel.rocky@example.com
                    language: en
                    phone: 757-866-5170
                    phone_country: KM
                    phone_verified_at: null
                    address1: '46981 Okuneva Hill Suite 035'
                    address2: 'Schinnerton, LA 00929-2367'
                    postal_code: 93637-3024
                    city: Stracke-Gerlach
                    clinic_name: 'West Jalon'
                    clinic_location: "782 Ruben Corner\nPort Mattfort, DE 53397-9062"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:47:59.000000Z'
                    updated_at: '2026-01-12T16:47:59.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  device:
                    id: 127
                    serial: 564fe6c8-3827-3d55-97e8-7a1d495c0886
                    bluetooth_id: ef2c26c9-b4f0-3eb7-a212-0754a8564214
                    company_id: null
                    model_id: null
                    amputee_id: null
                    clinician_id: null
                    firmware_version_id: null
                    pcb_version_id: null
                    reverse_magnets: 0
                    is_electrode: 0
                    active: 1
                    last_activity_at: '0000-00-00 00:00:00'
                    created_at: '2026-01-12T16:47:59.000000Z'
                    updated_at: '2026-01-12T16:47:59.000000Z'
                  messages:
                    -
                      id: 31
                      ticket_id: 63
                      sender_id: 211
                      title: Miss
                      content: 'Eveniet et non fuga quae voluptatem.'
                      is_read: false
                      created_at: '2026-01-12T16:48:00.000000Z'
                      updated_at: '2026-01-12T16:48:00.000000Z'
                properties:
                  id:
                    type: integer
                    example: 63
                  sender_id:
                    type: integer
                    example: 209
                  recipient_id:
                    type: integer
                    example: 210
                  device_id:
                    type: integer
                    example: 127
                  meeting_date:
                    type: string
                    example: '2026-01-12 16:47:59'
                  meeting_type:
                    type: string
                    example: online_meeting
                  contact_email:
                    type: string
                    example: fschimmel@hotmail.com
                  status:
                    type: string
                    example: new
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:59.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:59.000000Z'
                  sender:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 209
                      mrn:
                        type: string
                        example: 7DTSSBTE1768236479
                      name:
                        type: string
                        example: 'Miss Taryn Kuhic'
                      email:
                        type: string
                        example: 1768236479frami.maybelle@example.net
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 1-661-282-7044
                      phone_country:
                        type: string
                        example: BG
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '61337 Purdy Skyway'
                      address2:
                        type: string
                        example: 'Lake Lela, MA 19997'
                      postal_code:
                        type: string
                        example: 82185-0769
                      city:
                        type: string
                        example: Bauch-Stokes
                      clinic_name:
                        type: string
                        example: Schroederville
                      clinic_location:
                        type: string
                        example: "353 Herzog Island Apt. 314\nPort Alexander, OR 37646"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  recipient:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 210
                      mrn:
                        type: string
                        example: BKZ3K7RH1768236479
                      name:
                        type: string
                        example: 'Eileen Jerde'
                      email:
                        type: string
                        example: 1768236479fadel.rocky@example.com
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 757-866-5170
                      phone_country:
                        type: string
                        example: KM
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '46981 Okuneva Hill Suite 035'
                      address2:
                        type: string
                        example: 'Schinnerton, LA 00929-2367'
                      postal_code:
                        type: string
                        example: 93637-3024
                      city:
                        type: string
                        example: Stracke-Gerlach
                      clinic_name:
                        type: string
                        example: 'West Jalon'
                      clinic_location:
                        type: string
                        example: "782 Ruben Corner\nPort Mattfort, DE 53397-9062"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  device:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 127
                      serial:
                        type: string
                        example: 564fe6c8-3827-3d55-97e8-7a1d495c0886
                      bluetooth_id:
                        type: string
                        example: ef2c26c9-b4f0-3eb7-a212-0754a8564214
                      company_id:
                        type: string
                        example: null
                      model_id:
                        type: string
                        example: null
                      amputee_id:
                        type: string
                        example: null
                      clinician_id:
                        type: string
                        example: null
                      firmware_version_id:
                        type: string
                        example: null
                      pcb_version_id:
                        type: string
                        example: null
                      reverse_magnets:
                        type: integer
                        example: 0
                      is_electrode:
                        type: integer
                        example: 0
                      active:
                        type: integer
                        example: 1
                      last_activity_at:
                        type: string
                        example: '0000-00-00 00:00:00'
                      created_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:47:59.000000Z'
                  messages:
                    type: array
                    example:
                      -
                        id: 31
                        ticket_id: 63
                        sender_id: 211
                        title: Miss
                        content: 'Eveniet et non fuga quae voluptatem.'
                        is_read: false
                        created_at: '2026-01-12T16:48:00.000000Z'
                        updated_at: '2026-01-12T16:48:00.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 31
                        ticket_id:
                          type: integer
                          example: 63
                        sender_id:
                          type: integer
                          example: 211
                        title:
                          type: string
                          example: Miss
                        content:
                          type: string
                          example: 'Eveniet et non fuga quae voluptatem.'
                        is_read:
                          type: boolean
                          example: false
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:00.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:00.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to create support ticket'
                  code: 'TICKETS:CREATE_MESSAGE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to create support ticket'
                  code:
                    type: string
                    example: 'TICKETS:CREATE_MESSAGE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Support ticket not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Support ticket not found'
                  code: 'TICKETS:CREATE_MESSAGE:TICKET_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Support ticket not found'
                  code:
                    type: string
                    example: 'TICKETS:CREATE_MESSAGE:TICKET_NOT_FOUND'
      tags:
        - 'Support Ticket'
      requestBody:
        required: false
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                title:
                  type: string
                  description: 'Message title.'
                  example: 'Aut provident.'
                content:
                  type: string
                  description: 'Content of message.'
                  example: 'Iste sapiente sint in in.'
                attachments:
                  type: array
                  description: 'Must be a file.'
                  items:
                    type: string
                    format: binary
    parameters:
      -
        in: path
        name: id
        description: 'Support ticket ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/ticket/{id}/read':
    post:
      summary: 'Mark all messages as read'
      operationId: markAllMessagesAsRead
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 71
                  sender_id: 223
                  recipient_id: 224
                  device_id: 128
                  meeting_date: '2026-01-12 16:48:00'
                  meeting_type: online_meeting
                  contact_email: ebernier@hotmail.com
                  status: new
                  created_at: '2026-01-12T16:48:00.000000Z'
                  updated_at: '2026-01-12T16:48:00.000000Z'
                  sender:
                    id: 223
                    mrn: 7NGSZUVU1768236480
                    name: 'Mrs. Lilyan Littel'
                    email: 1768236480hermina.mueller@example.com
                    language: en
                    phone: 1-720-395-9007
                    phone_country: MM
                    phone_verified_at: null
                    address1: '7935 Lisandro Plains'
                    address2: 'Maymiestad, NV 54161-2896'
                    postal_code: '97818'
                    city: Weber-McLaughlin
                    clinic_name: Smithamside
                    clinic_location: "679 Konopelski Trace\nNorth Marlenhaven, NY 31019"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:48:00.000000Z'
                    updated_at: '2026-01-12T16:48:00.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  recipient:
                    id: 224
                    mrn: MALEGB4C1768236480
                    name: 'Santiago Tillman'
                    email: 1768236480rsipes@example.net
                    language: en
                    phone: '+13078897406'
                    phone_country: CU
                    phone_verified_at: null
                    address1: '94548 Micheal Lane Apt. 102'
                    address2: 'Lake Kennithside, ME 38978-4583'
                    postal_code: 39136-6258
                    city: Osinski-Considine
                    clinic_name: 'North Magdalena'
                    clinic_location: "67462 Roberts Isle\nAnselshire, MA 09040-8300"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:48:00.000000Z'
                    updated_at: '2026-01-12T16:48:00.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  device:
                    id: 128
                    serial: abf9aa29-e496-3174-86cb-2de8a0ffffdc
                    bluetooth_id: e6a46091-0af6-3b11-acb2-bd92e5ca9b8f
                    company_id: null
                    model_id: null
                    amputee_id: null
                    clinician_id: null
                    firmware_version_id: null
                    pcb_version_id: null
                    reverse_magnets: 0
                    is_electrode: 0
                    active: 1
                    last_activity_at: '0000-00-00 00:00:00'
                    created_at: '2026-01-12T16:48:00.000000Z'
                    updated_at: '2026-01-12T16:48:00.000000Z'
                  messages:
                    -
                      id: 35
                      ticket_id: 71
                      sender_id: 225
                      title: Miss
                      content: 'Dolores aut delectus vero dolores iusto adipisci officia est.'
                      is_read: false
                      created_at: '2026-01-12T16:48:01.000000Z'
                      updated_at: '2026-01-12T16:48:01.000000Z'
                properties:
                  id:
                    type: integer
                    example: 71
                  sender_id:
                    type: integer
                    example: 223
                  recipient_id:
                    type: integer
                    example: 224
                  device_id:
                    type: integer
                    example: 128
                  meeting_date:
                    type: string
                    example: '2026-01-12 16:48:00'
                  meeting_type:
                    type: string
                    example: online_meeting
                  contact_email:
                    type: string
                    example: ebernier@hotmail.com
                  status:
                    type: string
                    example: new
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:00.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:00.000000Z'
                  sender:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 223
                      mrn:
                        type: string
                        example: 7NGSZUVU1768236480
                      name:
                        type: string
                        example: 'Mrs. Lilyan Littel'
                      email:
                        type: string
                        example: 1768236480hermina.mueller@example.com
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 1-720-395-9007
                      phone_country:
                        type: string
                        example: MM
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '7935 Lisandro Plains'
                      address2:
                        type: string
                        example: 'Maymiestad, NV 54161-2896'
                      postal_code:
                        type: string
                        example: '97818'
                      city:
                        type: string
                        example: Weber-McLaughlin
                      clinic_name:
                        type: string
                        example: Smithamside
                      clinic_location:
                        type: string
                        example: "679 Konopelski Trace\nNorth Marlenhaven, NY 31019"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:48:00.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:48:00.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  recipient:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 224
                      mrn:
                        type: string
                        example: MALEGB4C1768236480
                      name:
                        type: string
                        example: 'Santiago Tillman'
                      email:
                        type: string
                        example: 1768236480rsipes@example.net
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: '+13078897406'
                      phone_country:
                        type: string
                        example: CU
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '94548 Micheal Lane Apt. 102'
                      address2:
                        type: string
                        example: 'Lake Kennithside, ME 38978-4583'
                      postal_code:
                        type: string
                        example: 39136-6258
                      city:
                        type: string
                        example: Osinski-Considine
                      clinic_name:
                        type: string
                        example: 'North Magdalena'
                      clinic_location:
                        type: string
                        example: "67462 Roberts Isle\nAnselshire, MA 09040-8300"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:48:00.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:48:00.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  device:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 128
                      serial:
                        type: string
                        example: abf9aa29-e496-3174-86cb-2de8a0ffffdc
                      bluetooth_id:
                        type: string
                        example: e6a46091-0af6-3b11-acb2-bd92e5ca9b8f
                      company_id:
                        type: string
                        example: null
                      model_id:
                        type: string
                        example: null
                      amputee_id:
                        type: string
                        example: null
                      clinician_id:
                        type: string
                        example: null
                      firmware_version_id:
                        type: string
                        example: null
                      pcb_version_id:
                        type: string
                        example: null
                      reverse_magnets:
                        type: integer
                        example: 0
                      is_electrode:
                        type: integer
                        example: 0
                      active:
                        type: integer
                        example: 1
                      last_activity_at:
                        type: string
                        example: '0000-00-00 00:00:00'
                      created_at:
                        type: string
                        example: '2026-01-12T16:48:00.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:48:00.000000Z'
                  messages:
                    type: array
                    example:
                      -
                        id: 35
                        ticket_id: 71
                        sender_id: 225
                        title: Miss
                        content: 'Dolores aut delectus vero dolores iusto adipisci officia est.'
                        is_read: false
                        created_at: '2026-01-12T16:48:01.000000Z'
                        updated_at: '2026-01-12T16:48:01.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 35
                        ticket_id:
                          type: integer
                          example: 71
                        sender_id:
                          type: integer
                          example: 225
                        title:
                          type: string
                          example: Miss
                        content:
                          type: string
                          example: 'Dolores aut delectus vero dolores iusto adipisci officia est.'
                        is_read:
                          type: boolean
                          example: false
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:01.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:01.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to read message'
                  code: 'TICKETS:READ_ALL:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to read message'
                  code:
                    type: string
                    example: 'TICKETS:READ_ALL:INSUFFICIENT_PERMISSION'
        404:
          description: 'Support ticket not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Support ticket not found'
                  code: 'TICKETS:READ_ALL:TICKET_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Support ticket not found'
                  code:
                    type: string
                    example: 'TICKETS:READ_ALL:TICKET_NOT_FOUND'
      tags:
        - 'Support Ticket'
    parameters:
      -
        in: path
        name: id
        description: 'Support ticket ID (id from ticket list; do not confuse with messages.id).'
        example: 1
        required: true
        schema:
          type: integer
  '/api/ticket/{id}/read/{messageId}':
    post:
      summary: 'Mark single message as read'
      operationId: markSingleMessageAsRead
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 79
                  sender_id: 237
                  recipient_id: 238
                  device_id: 129
                  meeting_date: '2026-01-12 16:48:02'
                  meeting_type: online_meeting
                  contact_email: bkshlerin@mitchell.info
                  status: new
                  created_at: '2026-01-12T16:48:02.000000Z'
                  updated_at: '2026-01-12T16:48:02.000000Z'
                  sender:
                    id: 237
                    mrn: ZAGLFHN61768236482
                    name: 'Sonny Stiedemann'
                    email: 1768236482ariane50@example.com
                    language: en
                    phone: '(757) 274-0605'
                    phone_country: VG
                    phone_verified_at: null
                    address1: '90105 Delbert Trace'
                    address2: 'North Aryannatown, HI 18538-7894'
                    postal_code: '35034'
                    city: Nolan-Fay
                    clinic_name: 'North Friedaview'
                    clinic_location: "7390 Baumbach Tunnel Apt. 783\nNorth Alaina, SC 56440"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:48:02.000000Z'
                    updated_at: '2026-01-12T16:48:02.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  recipient:
                    id: 238
                    mrn: 7WR42HP51768236482
                    name: 'Otto Zieme'
                    email: 1768236482padberg.keshawn@example.com
                    language: en
                    phone: 479.486.7651
                    phone_country: DZ
                    phone_verified_at: null
                    address1: '38926 Brenna Shores Apt. 492'
                    address2: 'Hollisbury, CT 38212-5779'
                    postal_code: '62491'
                    city: 'Bayer, Leannon and Murazik'
                    clinic_name: 'East Sam'
                    clinic_location: "47708 Earnestine Valleys Suite 357\nNew Ariel, DE 13127-7636"
                    image: null
                    mfa_enabled: 0
                    mfa_method: null
                    mfa_verified_to: null
                    location_id: null
                    created_by: null
                    active: 1
                    notifications_timezone: null
                    notifications_at: null
                    created_at: '2026-01-12T16:48:02.000000Z'
                    updated_at: '2026-01-12T16:48:02.000000Z'
                    invitation_status: null
                    acadle_invitation_status: null
                    roles: []
                  device:
                    id: 129
                    serial: 983a0936-359e-3acb-bab9-c7a7a8fdeade
                    bluetooth_id: 5c9dbc04-0b84-3409-8704-b4163c7eb1b1
                    company_id: null
                    model_id: null
                    amputee_id: null
                    clinician_id: null
                    firmware_version_id: null
                    pcb_version_id: null
                    reverse_magnets: 0
                    is_electrode: 0
                    active: 1
                    last_activity_at: '0000-00-00 00:00:00'
                    created_at: '2026-01-12T16:48:02.000000Z'
                    updated_at: '2026-01-12T16:48:02.000000Z'
                  messages:
                    -
                      id: 39
                      ticket_id: 79
                      sender_id: 239
                      title: Dr.
                      content: 'Voluptatem perferendis quo eaque quia.'
                      is_read: false
                      created_at: '2026-01-12T16:48:02.000000Z'
                      updated_at: '2026-01-12T16:48:02.000000Z'
                properties:
                  id:
                    type: integer
                    example: 79
                  sender_id:
                    type: integer
                    example: 237
                  recipient_id:
                    type: integer
                    example: 238
                  device_id:
                    type: integer
                    example: 129
                  meeting_date:
                    type: string
                    example: '2026-01-12 16:48:02'
                  meeting_type:
                    type: string
                    example: online_meeting
                  contact_email:
                    type: string
                    example: bkshlerin@mitchell.info
                  status:
                    type: string
                    example: new
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:02.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:02.000000Z'
                  sender:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 237
                      mrn:
                        type: string
                        example: ZAGLFHN61768236482
                      name:
                        type: string
                        example: 'Sonny Stiedemann'
                      email:
                        type: string
                        example: 1768236482ariane50@example.com
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: '(757) 274-0605'
                      phone_country:
                        type: string
                        example: VG
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '90105 Delbert Trace'
                      address2:
                        type: string
                        example: 'North Aryannatown, HI 18538-7894'
                      postal_code:
                        type: string
                        example: '35034'
                      city:
                        type: string
                        example: Nolan-Fay
                      clinic_name:
                        type: string
                        example: 'North Friedaview'
                      clinic_location:
                        type: string
                        example: "7390 Baumbach Tunnel Apt. 783\nNorth Alaina, SC 56440"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:48:02.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:48:02.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  recipient:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 238
                      mrn:
                        type: string
                        example: 7WR42HP51768236482
                      name:
                        type: string
                        example: 'Otto Zieme'
                      email:
                        type: string
                        example: 1768236482padberg.keshawn@example.com
                      language:
                        type: string
                        example: en
                      phone:
                        type: string
                        example: 479.486.7651
                      phone_country:
                        type: string
                        example: DZ
                      phone_verified_at:
                        type: string
                        example: null
                      address1:
                        type: string
                        example: '38926 Brenna Shores Apt. 492'
                      address2:
                        type: string
                        example: 'Hollisbury, CT 38212-5779'
                      postal_code:
                        type: string
                        example: '62491'
                      city:
                        type: string
                        example: 'Bayer, Leannon and Murazik'
                      clinic_name:
                        type: string
                        example: 'East Sam'
                      clinic_location:
                        type: string
                        example: "47708 Earnestine Valleys Suite 357\nNew Ariel, DE 13127-7636"
                      image:
                        type: string
                        example: null
                      mfa_enabled:
                        type: integer
                        example: 0
                      mfa_method:
                        type: string
                        example: null
                      mfa_verified_to:
                        type: string
                        example: null
                      location_id:
                        type: string
                        example: null
                      created_by:
                        type: string
                        example: null
                      active:
                        type: integer
                        example: 1
                      notifications_timezone:
                        type: string
                        example: null
                      notifications_at:
                        type: string
                        example: null
                      created_at:
                        type: string
                        example: '2026-01-12T16:48:02.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:48:02.000000Z'
                      invitation_status:
                        type: string
                        example: null
                      acadle_invitation_status:
                        type: string
                        example: null
                      roles:
                        type: array
                        example: []
                  device:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 129
                      serial:
                        type: string
                        example: 983a0936-359e-3acb-bab9-c7a7a8fdeade
                      bluetooth_id:
                        type: string
                        example: 5c9dbc04-0b84-3409-8704-b4163c7eb1b1
                      company_id:
                        type: string
                        example: null
                      model_id:
                        type: string
                        example: null
                      amputee_id:
                        type: string
                        example: null
                      clinician_id:
                        type: string
                        example: null
                      firmware_version_id:
                        type: string
                        example: null
                      pcb_version_id:
                        type: string
                        example: null
                      reverse_magnets:
                        type: integer
                        example: 0
                      is_electrode:
                        type: integer
                        example: 0
                      active:
                        type: integer
                        example: 1
                      last_activity_at:
                        type: string
                        example: '0000-00-00 00:00:00'
                      created_at:
                        type: string
                        example: '2026-01-12T16:48:02.000000Z'
                      updated_at:
                        type: string
                        example: '2026-01-12T16:48:02.000000Z'
                  messages:
                    type: array
                    example:
                      -
                        id: 39
                        ticket_id: 79
                        sender_id: 239
                        title: Dr.
                        content: 'Voluptatem perferendis quo eaque quia.'
                        is_read: false
                        created_at: '2026-01-12T16:48:02.000000Z'
                        updated_at: '2026-01-12T16:48:02.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 39
                        ticket_id:
                          type: integer
                          example: 79
                        sender_id:
                          type: integer
                          example: 239
                        title:
                          type: string
                          example: Dr.
                        content:
                          type: string
                          example: 'Voluptatem perferendis quo eaque quia.'
                        is_read:
                          type: boolean
                          example: false
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:02.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:02.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to read message'
                  code: 'TICKETS:READ_MESSAGE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to read message'
                  code:
                    type: string
                    example: 'TICKETS:READ_MESSAGE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Message not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Message not found'
                  code: 'TICKETS:READ_MESSAGE:MESSAGE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Message not found'
                  code:
                    type: string
                    example: 'TICKETS:READ_MESSAGE:MESSAGE_NOT_FOUND'
      tags:
        - 'Support Ticket'
    parameters:
      -
        in: path
        name: id
        description: 'Support ticket ID (id from ticket list; do not confuse with messages.id).'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: messageId
        description: 'Message ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/tooltips:
    get:
      summary: 'List tooltips'
      operationId: listTooltips
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      name: 'Kari Block'
                      type: video
                      language: cr
                      file: '0'
                      created_by: 301
                      created_at: '2026-01-12T16:48:09.000000Z'
                      updated_at: '2026-01-12T16:48:09.000000Z'
                      deleted_at: null
                    -
                      id: 2
                      name: 'Ophelia Schuppe'
                      type: image
                      language: ie
                      file: '0'
                      created_by: 302
                      created_at: '2026-01-12T16:48:09.000000Z'
                      updated_at: '2026-01-12T16:48:09.000000Z'
                      deleted_at: null
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        name: 'Kari Block'
                        type: video
                        language: cr
                        file: '0'
                        created_by: 301
                        created_at: '2026-01-12T16:48:09.000000Z'
                        updated_at: '2026-01-12T16:48:09.000000Z'
                        deleted_at: null
                      -
                        id: 2
                        name: 'Ophelia Schuppe'
                        type: image
                        language: ie
                        file: '0'
                        created_by: 302
                        created_at: '2026-01-12T16:48:09.000000Z'
                        updated_at: '2026-01-12T16:48:09.000000Z'
                        deleted_at: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        name:
                          type: string
                          example: 'Kari Block'
                        type:
                          type: string
                          example: video
                        language:
                          type: string
                          example: cr
                        file:
                          type: string
                          example: '0'
                        created_by:
                          type: integer
                          example: 301
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:09.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:09.000000Z'
                        deleted_at:
                          type: string
                          example: null
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list tooltips'
                  code: 'TOOLTIPS:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list tooltips'
                  code:
                    type: string
                    example: 'TOOLTIPS:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - Tooltips
    post:
      summary: 'Create new tooltip'
      operationId: createNewTooltip
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 5
                  name: 'Camylle Stracke'
                  type: video
                  language: tt
                  file: '0'
                  created_by: 305
                  created_at: '2026-01-12T16:48:09.000000Z'
                  updated_at: '2026-01-12T16:48:09.000000Z'
                  deleted_at: null
                properties:
                  id:
                    type: integer
                    example: 5
                  name:
                    type: string
                    example: 'Camylle Stracke'
                  type:
                    type: string
                    example: video
                  language:
                    type: string
                    example: tt
                  file:
                    type: string
                    example: '0'
                  created_by:
                    type: integer
                    example: 305
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:09.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:09.000000Z'
                  deleted_at:
                    type: string
                    example: null
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage tooltips'
                  code: 'TOOLTIPS:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage tooltips'
                  code:
                    type: string
                    example: 'TOOLTIPS:CREATE:INSUFFICIENT_PERMISSION'
        500:
          description: 'Server error'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Server error: tooltip not created'
                  code: 'TOOLTIPS:CREATE:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Server error: tooltip not created'
                  code:
                    type: string
                    example: 'TOOLTIPS:CREATE:SERVER_ERROR'
      tags:
        - Tooltips
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Tooltip name.'
                  example: 'Rigoberto Streets'
                type:
                  type: string
                  description: 'Tooltip content type.'
                  example: image
                  enum:
                    - image
                    - video
                language:
                  type: string
                  description: 'Tooltip content language.'
                  example: mk
                file:
                  type: string
                  format: binary
                  description: 'Tooltip content file. Must have one of the following MIME types: <code>webp</code>, <code>png</code>, <code>jpg</code>, <code>jpeg</code>, <code>mp4</code>. Must be a file. MAXIMUM:FILE_KB:102400.'
              required:
                - name
                - type
                - language
                - file
  /api/tooltips/archive:
    get:
      summary: 'List archived tooltips'
      operationId: listArchivedTooltips
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 3
                      name: 'Mr. Murphy Kshlerin Jr.'
                      type: video
                      language: hr
                      file: '0'
                      created_by: 303
                      created_at: '2026-01-12T16:48:09.000000Z'
                      updated_at: '2026-01-12T16:48:09.000000Z'
                      deleted_at: null
                    -
                      id: 4
                      name: 'Hilton Wunsch'
                      type: video
                      language: yo
                      file: '0'
                      created_by: 304
                      created_at: '2026-01-12T16:48:09.000000Z'
                      updated_at: '2026-01-12T16:48:09.000000Z'
                      deleted_at: null
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 3
                        name: 'Mr. Murphy Kshlerin Jr.'
                        type: video
                        language: hr
                        file: '0'
                        created_by: 303
                        created_at: '2026-01-12T16:48:09.000000Z'
                        updated_at: '2026-01-12T16:48:09.000000Z'
                        deleted_at: null
                      -
                        id: 4
                        name: 'Hilton Wunsch'
                        type: video
                        language: yo
                        file: '0'
                        created_by: 304
                        created_at: '2026-01-12T16:48:09.000000Z'
                        updated_at: '2026-01-12T16:48:09.000000Z'
                        deleted_at: null
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 3
                        name:
                          type: string
                          example: 'Mr. Murphy Kshlerin Jr.'
                        type:
                          type: string
                          example: video
                        language:
                          type: string
                          example: hr
                        file:
                          type: string
                          example: '0'
                        created_by:
                          type: integer
                          example: 303
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:09.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:09.000000Z'
                        deleted_at:
                          type: string
                          example: null
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage tooltips'
                  code: 'TOOLTIPS:LIST_ARCHIVE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage tooltips'
                  code:
                    type: string
                    example: 'TOOLTIPS:LIST_ARCHIVE:INSUFFICIENT_PERMISSION'
      tags:
        - Tooltips
  '/api/tooltips/{id}/archive':
    post:
      summary: 'Archive tooltip'
      operationId: archiveTooltip
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Tooltip archived'
                  code: 'TOOLTIPS:ARCHIVE:ARCHIVED'
                properties:
                  message:
                    type: string
                    example: 'Tooltip archived'
                  code:
                    type: string
                    example: 'TOOLTIPS:ARCHIVE:ARCHIVED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage tooltips'
                  code: 'TOOLTIPS:ARCHIVE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage tooltips'
                  code:
                    type: string
                    example: 'TOOLTIPS:ARCHIVE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Tooltip not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Tooltip not found'
                  code: 'TOOLTIPS:ARCHIVE:TOOLTIP_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Tooltip not found'
                  code:
                    type: string
                    example: 'TOOLTIPS:ARCHIVE:TOOLTIP_NOT_FOUND'
      tags:
        - Tooltips
    parameters:
      -
        in: path
        name: id
        description: 'Tooltip ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/tooltips/{id}/restore':
    post:
      summary: 'Restore archived tooltip'
      operationId: restoreArchivedTooltip
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Tooltip restored'
                  code: 'TOOLTIPS:RESTORE:RESTORED'
                properties:
                  message:
                    type: string
                    example: 'Tooltip restored'
                  code:
                    type: string
                    example: 'TOOLTIPS:RESTORE:RESTORED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to manage tooltips'
                  code: 'TOOLTIPS:RESTORE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to manage tooltips'
                  code:
                    type: string
                    example: 'TOOLTIPS:RESTORE:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Tooltip not found'
                    type: object
                    example:
                      message: 'Tooltip not found'
                      code: 'TOOLTIPS:RESTORE:TOOLTIP_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Tooltip not found'
                      code:
                        type: string
                        example: 'TOOLTIPS:RESTORE:TOOLTIP_NOT_FOUND'
                  -
                    description: 'Tooltip is not archived'
                    type: object
                    example:
                      message: 'Tooltip is not archived'
                      code: 'TOOLTIPS:RESTORE:TOOLTIP_NOT_ARCHIVED'
                    properties:
                      message:
                        type: string
                        example: 'Tooltip is not archived'
                      code:
                        type: string
                        example: 'TOOLTIPS:RESTORE:TOOLTIP_NOT_ARCHIVED'
      tags:
        - Tooltips
    parameters:
      -
        in: path
        name: id
        description: 'Tooltip ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/trainings/{trainingId}/user-badges':
    get:
      summary: 'Get user badges'
      operationId: getUserBadges
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    user_id:
                      type: integer
                      example: 310
                    badge_id:
                      type: integer
                      example: 2
                example:
                  -
                    user_id: 310
                    badge_id: 2
                  -
                    user_id: 312
                    badge_id: 4
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage user trainings'
                      code: 'TRAININGS:BADGES:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage user trainings'
                      code:
                        type: string
                        example: 'TRAININGS:BADGES:INSUFFICIENT_PERMISSION'
                  -
                    description: 'User has no training started'
                    type: object
                    example:
                      message: 'User has no training started'
                      code: 'TRAININGS:BADGES:NO_USER_TRAINING'
                    properties:
                      message:
                        type: string
                        example: 'User has no training started'
                      code:
                        type: string
                        example: 'TRAININGS:BADGES:NO_USER_TRAINING'
        404:
          description: 'Training not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Training not found'
                  code: 'TRAININGS:BADGES:TRAINING_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Training not found'
                  code:
                    type: string
                    example: 'TRAININGS:BADGES:TRAINING_NOT_FOUND'
      tags:
        - Trainings
    parameters:
      -
        in: path
        name: trainingId
        description: 'Training ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/trainings/start/{trainingId}':
    post:
      summary: 'Start user training'
      operationId: startUserTraining
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 1
                  user_id: 313
                  training_id: 1
                  created_at: '2026-01-12T16:48:10.000000Z'
                  updated_at: '2026-01-12T16:48:10.000000Z'
                properties:
                  id:
                    type: integer
                    example: 1
                  user_id:
                    type: integer
                    example: 313
                  training_id:
                    type: integer
                    example: 1
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:10.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:10.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage user trainings'
                      code: 'TRAININGS:START:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage user trainings'
                      code:
                        type: string
                        example: 'TRAININGS:START:INSUFFICIENT_PERMISSION'
                  -
                    description: 'User training already started'
                    type: object
                    example:
                      message: 'Cannot start: training already started'
                      code: 'TRAININGS:START:ALREADY_STARTED'
                    properties:
                      message:
                        type: string
                        example: 'Cannot start: training already started'
                      code:
                        type: string
                        example: 'TRAININGS:START:ALREADY_STARTED'
        404:
          description: 'Training not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Training not found'
                  code: 'TRAININGS:START:TRAINING_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Training not found'
                  code:
                    type: string
                    example: 'TRAININGS:START:TRAINING_NOT_FOUND'
      tags:
        - Trainings
    parameters:
      -
        in: path
        name: trainingId
        description: 'Training ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/trainings/progress/{trainingId}':
    get:
      summary: 'Get training progress'
      operationId: getTrainingProgress
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 2
                  user_id: 314
                  training_id: 2
                  created_at: '2026-01-12T16:48:10.000000Z'
                  updated_at: '2026-01-12T16:48:10.000000Z'
                properties:
                  id:
                    type: integer
                    example: 2
                  user_id:
                    type: integer
                    example: 314
                  training_id:
                    type: integer
                    example: 2
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:10.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:10.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage user trainings'
                      code: 'TRAININGS:PROGRESS:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage user trainings'
                      code:
                        type: string
                        example: 'TRAININGS:PROGRESS:INSUFFICIENT_PERMISSION'
                  -
                    description: 'User has no training started'
                    type: object
                    example:
                      message: 'User has no training started'
                      code: 'TRAININGS:PROGRESS:NO_USER_TRAINING'
                    properties:
                      message:
                        type: string
                        example: 'User has no training started'
                      code:
                        type: string
                        example: 'TRAININGS:PROGRESS:NO_USER_TRAINING'
        404:
          description: 'Training not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Training not found'
                  code: 'TRAININGS:PROGRESS:TRAINING_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Training not found'
                  code:
                    type: string
                    example: 'TRAININGS:PROGRESS:TRAINING_NOT_FOUND'
      tags:
        - Trainings
    parameters:
      -
        in: path
        name: trainingId
        description: 'Training ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/trainings/{trainingId}/day/{trainingDayId}/task/{trainingTaskId}':
    post:
      summary: 'Mark training task done'
      operationId: markTrainingTaskDone
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  user_id: 315
                  training_id: 3
                  created_at: '2026-01-12T16:48:10.000000Z'
                  updated_at: '2026-01-12T16:48:10.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  user_id:
                    type: integer
                    example: 315
                  training_id:
                    type: integer
                    example: 3
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:10.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:10.000000Z'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to manage user trainings'
                      code: 'TRAININGS:MARK_DONE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to manage user trainings'
                      code:
                        type: string
                        example: 'TRAININGS:MARK_DONE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'User has no training started'
                    type: object
                    example:
                      message: 'User has no training started'
                      code: 'TRAININGS:MARK_DONE:NO_USER_TRAINING'
                    properties:
                      message:
                        type: string
                        example: 'User has no training started'
                      code:
                        type: string
                        example: 'TRAININGS:MARK_DONE:NO_USER_TRAINING'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Training not found'
                    type: object
                    example:
                      message: 'Training not found'
                      code: 'TRAININGS:MARK_DONE:TRAINING_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Training not found'
                      code:
                        type: string
                        example: 'TRAININGS:MARK_DONE:TRAINING_NOT_FOUND'
                  -
                    description: 'Training day not found'
                    type: object
                    example:
                      message: 'Training day not found'
                      code: 'TRAININGS:MARK_DONE:TRAINING_DAY_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Training day not found'
                      code:
                        type: string
                        example: 'TRAININGS:MARK_DONE:TRAINING_DAY_NOT_FOUND'
                  -
                    description: 'Training task not found'
                    type: object
                    example:
                      message: 'Training task not found'
                      code: 'TRAININGS:MARK_DONE:TRAINING_TASK_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Training task not found'
                      code:
                        type: string
                        example: 'TRAININGS:MARK_DONE:TRAINING_TASK_NOT_FOUND'
      tags:
        - Trainings
    parameters:
      -
        in: path
        name: trainingId
        description: 'Training ID.'
        example: 1
        required: true
        schema:
          type: integer
      -
        in: path
        name: trainingDayId
        description: 'Training Day ID.'
        example: 2
        required: true
        schema:
          type: integer
      -
        in: path
        name: trainingTaskId
        description: 'Training Task ID.'
        example: 3
        required: true
        schema:
          type: integer
  /api/users:
    get:
      summary: 'Get users list'
      operationId: getUsersList
      description: "Possible extend options:\n\t\t<ul>\n\t\t\t<li>clinicians - users assigned to this user as clinicians (for Amputee role)</li>\n\t\t\t<li>patients - users assigned to this user as patients (for ClinicAdmin/Clinician/ClinicianSupport role)</li>\n\t\t\t<li>devices - products assigned to user (for Amputee role)</li>\n\t\t\t<li>devicesAsClinician - products assigned to user as clinician (for ClinicAdmin/Clinician/ClinicianSupport role)</li>\n\t\t\t<li>roles - user roles</li>\n\t\t\t<li>permissions - user permissions (for ClinicianSupport role)</li>\n\t\t</ul>"
      parameters:
        -
          in: query
          name: search
          description: 'Filter users by name. For SuperAdmin role it filters by UUID.'
          example: Tom
          required: false
          schema:
            type: string
            description: 'Filter users by name. For SuperAdmin role it filters by UUID.'
            example: Tom
        -
          in: query
          name: active
          description: 'Filter users by active status (available: 0 - only inactive, 1 - only active, -1 - all users). Default: 1.'
          example: -1
          required: false
          schema:
            type: integer
            description: 'Filter users by active status (available: 0 - only inactive, 1 - only active, -1 - all users). Default: 1.'
            example: -1
        -
          in: query
          name: clinician
          description: "Filter users by clinician.\n\t\tProvide single ID (<code>clinician=1</code>), array of IDs (<code>clinician[]=1&clinician[]=2</code>) or comma-separated list of IDs (<code>clinician=1,2</code>)."
          example:
            - 16
          required: false
          schema:
            type: array
            description: "Filter users by clinician.\n\t\tProvide single ID (<code>clinician=1</code>), array of IDs (<code>clinician[]=1&clinician[]=2</code>) or comma-separated list of IDs (<code>clinician=1,2</code>)."
            example:
              - 16
            items:
              type: integer
        -
          in: query
          name: roles
          description: 'Filter users by roles (comma-separated).'
          example: 'Clinician,Amputee'
          required: false
          schema:
            type: string
            description: 'Filter users by roles (comma-separated).'
            example: 'Clinician,Amputee'
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>clinicians</code>, <code>patients</code>, <code>devices</code>, <code>devicesAsClinician</code>, <code>roles</code>, <code>permissions</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>clinicians</code>, <code>patients</code>, <code>devices</code>, <code>devicesAsClinician</code>, <code>roles</code>, <code>permissions</code>).'
            example: null
        -
          in: query
          name: sortby
          description: 'Sort by field (available: <code>user_mrn</code>, <code>user_name</code>, <code>role_name</code>, <code>date</code>). Default: date, desc.'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort by field (available: <code>user_mrn</code>, <code>user_name</code>, <code>role_name</code>, <code>date</code>). Default: date, desc.'
            example: null
        -
          in: query
          name: sortdir
          description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Sort direction (available: <code>asc</code>, <code>desc</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 7
                      mrn: ONA3ZOT71768236461
                      name: 'Miss Caitlyn Fadel I'
                      email: 1768236461jayda37@example.net
                      language: en
                      phone: '+12813339549'
                      phone_country: SC
                      phone_verified_at: null
                      address1: '6805 Boyer Estate Apt. 696'
                      address2: 'Lake Margarita, ND 38512'
                      postal_code: '35287'
                      city: Little-Ernser
                      clinic_name: Dietrichfort
                      clinic_location: "56354 Wyman Rue Suite 759\nRonnyport, ME 71556"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:47:41.000000Z'
                      updated_at: '2026-01-12T16:47:41.000000Z'
                      invitation_status: accepted
                      acadle_invitation_status: null
                      clinicians:
                        -
                          id: 8
                          mrn: NVW8B4XI1768236461
                          name: 'Allene Gorczany'
                          email: 1768236461aliya.schroeder@example.net
                          language: en
                          phone: 1-820-224-0730
                          phone_country: MZ
                          phone_verified_at: null
                          address1: '515 Alan Islands'
                          address2: 'Revabury, CO 52309-0250'
                          postal_code: '99170'
                          city: Lynch-Dickens
                          clinic_name: Hoppemouth
                          clinic_location: "603 Carole Island\nWest Francesco, FL 04204-5898"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:41.000000Z'
                          updated_at: '2026-01-12T16:47:41.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          pivot:
                            user_id: 7
                            assigned_user_id: 8
                          roles: []
                      devices:
                        -
                          id: 1
                          serial: 9b907de8-ac7f-35f6-808b-0799e86182b7
                          bluetooth_id: 5258daba-0996-35d7-925c-140adf8c693a
                          company_id: null
                          model_id: null
                          amputee_id: 7
                          clinician_id: null
                          firmware_version_id: null
                          pcb_version_id: null
                          reverse_magnets: 0
                          is_electrode: 0
                          active: 1
                          last_activity_at: '0000-00-00 00:00:00'
                          created_at: '2026-01-12T16:47:41.000000Z'
                          updated_at: '2026-01-12T16:47:41.000000Z'
                      roles:
                        -
                          id: 2
                          name: ClinicAdmin
                    -
                      id: 9
                      mrn: EC71BOLB1768236461
                      name: 'Mr. Robb Kuvalis IV'
                      email: 1768236461tcasper@example.org
                      language: en
                      phone: '(531) 956-2255'
                      phone_country: OM
                      phone_verified_at: null
                      address1: '689 Jeremie Turnpike Suite 226'
                      address2: 'East Kaciburgh, TN 74313'
                      postal_code: 65646-7644
                      city: 'Thiel Group'
                      clinic_name: 'North Maryburgh'
                      clinic_location: "8341 Quitzon Estates\nAydenberg, CO 65178-0431"
                      image: null
                      mfa_enabled: 0
                      mfa_method: null
                      mfa_verified_to: null
                      location_id: null
                      created_by: null
                      active: 1
                      notifications_timezone: null
                      notifications_at: null
                      created_at: '2026-01-12T16:47:41.000000Z'
                      updated_at: '2026-01-12T16:47:41.000000Z'
                      invitation_status: accepted
                      acadle_invitation_status: null
                      clinicians:
                        -
                          id: 10
                          mrn: UN5P81Y91768236461
                          name: 'Chyna Moore'
                          email: 1768236461heller.phoebe@example.net
                          language: en
                          phone: '(252) 915-1877'
                          phone_country: CY
                          phone_verified_at: null
                          address1: '98039 Davis River'
                          address2: 'Lake Irving, KS 05406'
                          postal_code: 26181-3467
                          city: 'Metz PLC'
                          clinic_name: Yostchester
                          clinic_location: "9821 Runolfsson Divide\nNew Alvertaview, AL 56697"
                          image: null
                          mfa_enabled: 0
                          mfa_method: null
                          mfa_verified_to: null
                          location_id: null
                          created_by: null
                          active: 1
                          notifications_timezone: null
                          notifications_at: null
                          created_at: '2026-01-12T16:47:41.000000Z'
                          updated_at: '2026-01-12T16:47:41.000000Z'
                          invitation_status: null
                          acadle_invitation_status: null
                          pivot:
                            user_id: 9
                            assigned_user_id: 10
                          roles: []
                      devices:
                        -
                          id: 2
                          serial: a73fa59f-f7ed-329a-8f22-9696c02f5d77
                          bluetooth_id: 20c09a65-ae6d-301b-83d8-ffe30326d562
                          company_id: null
                          model_id: null
                          amputee_id: 9
                          clinician_id: null
                          firmware_version_id: null
                          pcb_version_id: null
                          reverse_magnets: 0
                          is_electrode: 0
                          active: 1
                          last_activity_at: '0000-00-00 00:00:00'
                          created_at: '2026-01-12T16:47:41.000000Z'
                          updated_at: '2026-01-12T16:47:41.000000Z'
                      roles:
                        -
                          id: 3
                          name: Clinician
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 7
                        mrn: ONA3ZOT71768236461
                        name: 'Miss Caitlyn Fadel I'
                        email: 1768236461jayda37@example.net
                        language: en
                        phone: '+12813339549'
                        phone_country: SC
                        phone_verified_at: null
                        address1: '6805 Boyer Estate Apt. 696'
                        address2: 'Lake Margarita, ND 38512'
                        postal_code: '35287'
                        city: Little-Ernser
                        clinic_name: Dietrichfort
                        clinic_location: "56354 Wyman Rue Suite 759\nRonnyport, ME 71556"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:41.000000Z'
                        updated_at: '2026-01-12T16:47:41.000000Z'
                        invitation_status: accepted
                        acadle_invitation_status: null
                        clinicians:
                          -
                            id: 8
                            mrn: NVW8B4XI1768236461
                            name: 'Allene Gorczany'
                            email: 1768236461aliya.schroeder@example.net
                            language: en
                            phone: 1-820-224-0730
                            phone_country: MZ
                            phone_verified_at: null
                            address1: '515 Alan Islands'
                            address2: 'Revabury, CO 52309-0250'
                            postal_code: '99170'
                            city: Lynch-Dickens
                            clinic_name: Hoppemouth
                            clinic_location: "603 Carole Island\nWest Francesco, FL 04204-5898"
                            image: null
                            mfa_enabled: 0
                            mfa_method: null
                            mfa_verified_to: null
                            location_id: null
                            created_by: null
                            active: 1
                            notifications_timezone: null
                            notifications_at: null
                            created_at: '2026-01-12T16:47:41.000000Z'
                            updated_at: '2026-01-12T16:47:41.000000Z'
                            invitation_status: null
                            acadle_invitation_status: null
                            pivot:
                              user_id: 7
                              assigned_user_id: 8
                            roles: []
                        devices:
                          -
                            id: 1
                            serial: 9b907de8-ac7f-35f6-808b-0799e86182b7
                            bluetooth_id: 5258daba-0996-35d7-925c-140adf8c693a
                            company_id: null
                            model_id: null
                            amputee_id: 7
                            clinician_id: null
                            firmware_version_id: null
                            pcb_version_id: null
                            reverse_magnets: 0
                            is_electrode: 0
                            active: 1
                            last_activity_at: '0000-00-00 00:00:00'
                            created_at: '2026-01-12T16:47:41.000000Z'
                            updated_at: '2026-01-12T16:47:41.000000Z'
                        roles:
                          -
                            id: 2
                            name: ClinicAdmin
                      -
                        id: 9
                        mrn: EC71BOLB1768236461
                        name: 'Mr. Robb Kuvalis IV'
                        email: 1768236461tcasper@example.org
                        language: en
                        phone: '(531) 956-2255'
                        phone_country: OM
                        phone_verified_at: null
                        address1: '689 Jeremie Turnpike Suite 226'
                        address2: 'East Kaciburgh, TN 74313'
                        postal_code: 65646-7644
                        city: 'Thiel Group'
                        clinic_name: 'North Maryburgh'
                        clinic_location: "8341 Quitzon Estates\nAydenberg, CO 65178-0431"
                        image: null
                        mfa_enabled: 0
                        mfa_method: null
                        mfa_verified_to: null
                        location_id: null
                        created_by: null
                        active: 1
                        notifications_timezone: null
                        notifications_at: null
                        created_at: '2026-01-12T16:47:41.000000Z'
                        updated_at: '2026-01-12T16:47:41.000000Z'
                        invitation_status: accepted
                        acadle_invitation_status: null
                        clinicians:
                          -
                            id: 10
                            mrn: UN5P81Y91768236461
                            name: 'Chyna Moore'
                            email: 1768236461heller.phoebe@example.net
                            language: en
                            phone: '(252) 915-1877'
                            phone_country: CY
                            phone_verified_at: null
                            address1: '98039 Davis River'
                            address2: 'Lake Irving, KS 05406'
                            postal_code: 26181-3467
                            city: 'Metz PLC'
                            clinic_name: Yostchester
                            clinic_location: "9821 Runolfsson Divide\nNew Alvertaview, AL 56697"
                            image: null
                            mfa_enabled: 0
                            mfa_method: null
                            mfa_verified_to: null
                            location_id: null
                            created_by: null
                            active: 1
                            notifications_timezone: null
                            notifications_at: null
                            created_at: '2026-01-12T16:47:41.000000Z'
                            updated_at: '2026-01-12T16:47:41.000000Z'
                            invitation_status: null
                            acadle_invitation_status: null
                            pivot:
                              user_id: 9
                              assigned_user_id: 10
                            roles: []
                        devices:
                          -
                            id: 2
                            serial: a73fa59f-f7ed-329a-8f22-9696c02f5d77
                            bluetooth_id: 20c09a65-ae6d-301b-83d8-ffe30326d562
                            company_id: null
                            model_id: null
                            amputee_id: 9
                            clinician_id: null
                            firmware_version_id: null
                            pcb_version_id: null
                            reverse_magnets: 0
                            is_electrode: 0
                            active: 1
                            last_activity_at: '0000-00-00 00:00:00'
                            created_at: '2026-01-12T16:47:41.000000Z'
                            updated_at: '2026-01-12T16:47:41.000000Z'
                        roles:
                          -
                            id: 3
                            name: Clinician
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 7
                        mrn:
                          type: string
                          example: ONA3ZOT71768236461
                        name:
                          type: string
                          example: 'Miss Caitlyn Fadel I'
                        email:
                          type: string
                          example: 1768236461jayda37@example.net
                        language:
                          type: string
                          example: en
                        phone:
                          type: string
                          example: '+12813339549'
                        phone_country:
                          type: string
                          example: SC
                        phone_verified_at:
                          type: string
                          example: null
                        address1:
                          type: string
                          example: '6805 Boyer Estate Apt. 696'
                        address2:
                          type: string
                          example: 'Lake Margarita, ND 38512'
                        postal_code:
                          type: string
                          example: '35287'
                        city:
                          type: string
                          example: Little-Ernser
                        clinic_name:
                          type: string
                          example: Dietrichfort
                        clinic_location:
                          type: string
                          example: "56354 Wyman Rue Suite 759\nRonnyport, ME 71556"
                        image:
                          type: string
                          example: null
                        mfa_enabled:
                          type: integer
                          example: 0
                        mfa_method:
                          type: string
                          example: null
                        mfa_verified_to:
                          type: string
                          example: null
                        location_id:
                          type: string
                          example: null
                        created_by:
                          type: string
                          example: null
                        active:
                          type: integer
                          example: 1
                        notifications_timezone:
                          type: string
                          example: null
                        notifications_at:
                          type: string
                          example: null
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:41.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:41.000000Z'
                        invitation_status:
                          type: string
                          example: accepted
                        acadle_invitation_status:
                          type: string
                          example: null
                        clinicians:
                          type: array
                          example:
                            -
                              id: 8
                              mrn: NVW8B4XI1768236461
                              name: 'Allene Gorczany'
                              email: 1768236461aliya.schroeder@example.net
                              language: en
                              phone: 1-820-224-0730
                              phone_country: MZ
                              phone_verified_at: null
                              address1: '515 Alan Islands'
                              address2: 'Revabury, CO 52309-0250'
                              postal_code: '99170'
                              city: Lynch-Dickens
                              clinic_name: Hoppemouth
                              clinic_location: "603 Carole Island\nWest Francesco, FL 04204-5898"
                              image: null
                              mfa_enabled: 0
                              mfa_method: null
                              mfa_verified_to: null
                              location_id: null
                              created_by: null
                              active: 1
                              notifications_timezone: null
                              notifications_at: null
                              created_at: '2026-01-12T16:47:41.000000Z'
                              updated_at: '2026-01-12T16:47:41.000000Z'
                              invitation_status: null
                              acadle_invitation_status: null
                              pivot:
                                user_id: 7
                                assigned_user_id: 8
                              roles: []
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 8
                              mrn:
                                type: string
                                example: NVW8B4XI1768236461
                              name:
                                type: string
                                example: 'Allene Gorczany'
                              email:
                                type: string
                                example: 1768236461aliya.schroeder@example.net
                              language:
                                type: string
                                example: en
                              phone:
                                type: string
                                example: 1-820-224-0730
                              phone_country:
                                type: string
                                example: MZ
                              phone_verified_at:
                                type: string
                                example: null
                              address1:
                                type: string
                                example: '515 Alan Islands'
                              address2:
                                type: string
                                example: 'Revabury, CO 52309-0250'
                              postal_code:
                                type: string
                                example: '99170'
                              city:
                                type: string
                                example: Lynch-Dickens
                              clinic_name:
                                type: string
                                example: Hoppemouth
                              clinic_location:
                                type: string
                                example: "603 Carole Island\nWest Francesco, FL 04204-5898"
                              image:
                                type: string
                                example: null
                              mfa_enabled:
                                type: integer
                                example: 0
                              mfa_method:
                                type: string
                                example: null
                              mfa_verified_to:
                                type: string
                                example: null
                              location_id:
                                type: string
                                example: null
                              created_by:
                                type: string
                                example: null
                              active:
                                type: integer
                                example: 1
                              notifications_timezone:
                                type: string
                                example: null
                              notifications_at:
                                type: string
                                example: null
                              created_at:
                                type: string
                                example: '2026-01-12T16:47:41.000000Z'
                              updated_at:
                                type: string
                                example: '2026-01-12T16:47:41.000000Z'
                              invitation_status:
                                type: string
                                example: null
                              acadle_invitation_status:
                                type: string
                                example: null
                              pivot:
                                type: object
                                properties:
                                  user_id:
                                    type: integer
                                    example: 7
                                  assigned_user_id:
                                    type: integer
                                    example: 8
                              roles:
                                type: array
                                example: []
                        devices:
                          type: array
                          example:
                            -
                              id: 1
                              serial: 9b907de8-ac7f-35f6-808b-0799e86182b7
                              bluetooth_id: 5258daba-0996-35d7-925c-140adf8c693a
                              company_id: null
                              model_id: null
                              amputee_id: 7
                              clinician_id: null
                              firmware_version_id: null
                              pcb_version_id: null
                              reverse_magnets: 0
                              is_electrode: 0
                              active: 1
                              last_activity_at: '0000-00-00 00:00:00'
                              created_at: '2026-01-12T16:47:41.000000Z'
                              updated_at: '2026-01-12T16:47:41.000000Z'
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 1
                              serial:
                                type: string
                                example: 9b907de8-ac7f-35f6-808b-0799e86182b7
                              bluetooth_id:
                                type: string
                                example: 5258daba-0996-35d7-925c-140adf8c693a
                              company_id:
                                type: string
                                example: null
                              model_id:
                                type: string
                                example: null
                              amputee_id:
                                type: integer
                                example: 7
                              clinician_id:
                                type: string
                                example: null
                              firmware_version_id:
                                type: string
                                example: null
                              pcb_version_id:
                                type: string
                                example: null
                              reverse_magnets:
                                type: integer
                                example: 0
                              is_electrode:
                                type: integer
                                example: 0
                              active:
                                type: integer
                                example: 1
                              last_activity_at:
                                type: string
                                example: '0000-00-00 00:00:00'
                              created_at:
                                type: string
                                example: '2026-01-12T16:47:41.000000Z'
                              updated_at:
                                type: string
                                example: '2026-01-12T16:47:41.000000Z'
                        roles:
                          type: array
                          example:
                            -
                              id: 2
                              name: ClinicAdmin
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 2
                              name:
                                type: string
                                example: ClinicAdmin
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view user list'
                  code: 'USERS:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view user list'
                  code:
                    type: string
                    example: 'USERS:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - Users
  /api/me:
    get:
      summary: 'Get current user data'
      operationId: getCurrentUserData
      description: ''
      parameters:
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>clinicians</code>, <code>patients</code>, <code>devices</code>, <code>devicesAsClinician</code>, <code>roles</code>, <code>permissions</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>clinicians</code>, <code>patients</code>, <code>devices</code>, <code>devicesAsClinician</code>, <code>roles</code>, <code>permissions</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 11
                  mrn: L0UXO0WE1768236462
                  name: 'Lemuel Rowe'
                  email: 1768236462klein.javon@example.net
                  language: en
                  phone: '+1 (223) 292-1164'
                  phone_country: CF
                  phone_verified_at: null
                  address1: '6980 Hettinger Fields'
                  address2: 'Wilmafort, OK 13419'
                  postal_code: 41160-1926
                  city: Nicolas-Hartmann
                  clinic_name: Corneliusport
                  clinic_location: "3782 Lesley Turnpike Apt. 746\nBartolettiland, NH 96456"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:47:42.000000Z'
                  updated_at: '2026-01-12T16:47:42.000000Z'
                  invitation_status: null
                  acadle_invitation_status: accepted
                  roles:
                    -
                      id: 6
                      name: AcadleUser
                properties:
                  id:
                    type: integer
                    example: 11
                  mrn:
                    type: string
                    example: L0UXO0WE1768236462
                  name:
                    type: string
                    example: 'Lemuel Rowe'
                  email:
                    type: string
                    example: 1768236462klein.javon@example.net
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: '+1 (223) 292-1164'
                  phone_country:
                    type: string
                    example: CF
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '6980 Hettinger Fields'
                  address2:
                    type: string
                    example: 'Wilmafort, OK 13419'
                  postal_code:
                    type: string
                    example: 41160-1926
                  city:
                    type: string
                    example: Nicolas-Hartmann
                  clinic_name:
                    type: string
                    example: Corneliusport
                  clinic_location:
                    type: string
                    example: "3782 Lesley Turnpike Apt. 746\nBartolettiland, NH 96456"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:42.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:42.000000Z'
                  invitation_status:
                    type: string
                    example: null
                  acadle_invitation_status:
                    type: string
                    example: accepted
                  roles:
                    type: array
                    example:
                      -
                        id: 6
                        name: AcadleUser
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 6
                        name:
                          type: string
                          example: AcadleUser
      tags:
        - Users
  '/api/user/{id}':
    get:
      summary: 'Get other user data'
      operationId: getOtherUserData
      description: ''
      parameters:
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>clinicians</code>, <code>patients</code>, <code>devices</code>, <code>devicesAsClinician</code>, <code>roles</code>, <code>permissions</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>clinicians</code>, <code>patients</code>, <code>devices</code>, <code>devicesAsClinician</code>, <code>roles</code>, <code>permissions</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 12
                  mrn: ZQW8QTF41768236462
                  name: 'Prof. Shemar Pacocha MD'
                  email: 1768236462qzemlak@example.org
                  language: en
                  phone: +1.305.961.6297
                  phone_country: LB
                  phone_verified_at: null
                  address1: '12630 Norene Circles Suite 054'
                  address2: 'North Brendonville, HI 27235'
                  postal_code: 46148-2691
                  city: 'Hessel, King and Hermiston'
                  clinic_name: 'New Johannaborough'
                  clinic_location: "223 Koch Flats\nMcGlynnville, PA 58283"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:47:42.000000Z'
                  updated_at: '2026-01-12T16:47:42.000000Z'
                  invitation_status: accepted
                  acadle_invitation_status: null
                  roles:
                    -
                      id: 3
                      name: Clinician
                properties:
                  id:
                    type: integer
                    example: 12
                  mrn:
                    type: string
                    example: ZQW8QTF41768236462
                  name:
                    type: string
                    example: 'Prof. Shemar Pacocha MD'
                  email:
                    type: string
                    example: 1768236462qzemlak@example.org
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: +1.305.961.6297
                  phone_country:
                    type: string
                    example: LB
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '12630 Norene Circles Suite 054'
                  address2:
                    type: string
                    example: 'North Brendonville, HI 27235'
                  postal_code:
                    type: string
                    example: 46148-2691
                  city:
                    type: string
                    example: 'Hessel, King and Hermiston'
                  clinic_name:
                    type: string
                    example: 'New Johannaborough'
                  clinic_location:
                    type: string
                    example: "223 Koch Flats\nMcGlynnville, PA 58283"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:42.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:42.000000Z'
                  invitation_status:
                    type: string
                    example: accepted
                  acadle_invitation_status:
                    type: string
                    example: null
                  roles:
                    type: array
                    example:
                      -
                        id: 3
                        name: Clinician
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 3
                        name:
                          type: string
                          example: Clinician
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view user data'
                  code: 'USERS:GET:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view user data'
                  code:
                    type: string
                    example: 'USERS:GET:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USERS:GET:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USERS:GET:USER_NOT_FOUND'
      tags:
        - Users
    put:
      summary: 'Update user account'
      operationId: updateUserAccount
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 14
                  mrn: WNVS7KAO1768236462
                  name: 'Magdalena Runolfsson'
                  email: 1768236462norwood.turner@example.net
                  language: en
                  phone: +1-478-496-3202
                  phone_country: MX
                  phone_verified_at: null
                  address1: '76441 Koepp Trace'
                  address2: 'Autumnbury, MT 51436'
                  postal_code: 47981-9649
                  city: 'Schneider Inc'
                  clinic_name: 'North Mayraview'
                  clinic_location: "619 Ayana Turnpike\nTurcotteborough, ID 76067-5083"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:47:42.000000Z'
                  updated_at: '2026-01-12T16:47:42.000000Z'
                  invitation_status: accepted
                  acadle_invitation_status: null
                  roles:
                    -
                      id: 2
                      name: ClinicAdmin
                properties:
                  id:
                    type: integer
                    example: 14
                  mrn:
                    type: string
                    example: WNVS7KAO1768236462
                  name:
                    type: string
                    example: 'Magdalena Runolfsson'
                  email:
                    type: string
                    example: 1768236462norwood.turner@example.net
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: +1-478-496-3202
                  phone_country:
                    type: string
                    example: MX
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '76441 Koepp Trace'
                  address2:
                    type: string
                    example: 'Autumnbury, MT 51436'
                  postal_code:
                    type: string
                    example: 47981-9649
                  city:
                    type: string
                    example: 'Schneider Inc'
                  clinic_name:
                    type: string
                    example: 'North Mayraview'
                  clinic_location:
                    type: string
                    example: "619 Ayana Turnpike\nTurcotteborough, ID 76067-5083"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:42.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:42.000000Z'
                  invitation_status:
                    type: string
                    example: accepted
                  acadle_invitation_status:
                    type: string
                    example: null
                  roles:
                    type: array
                    example:
                      -
                        id: 2
                        name: ClinicAdmin
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 2
                        name:
                          type: string
                          example: ClinicAdmin
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to update user data'
                      code: 'USERS:UPDATE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to update user data'
                      code:
                        type: string
                        example: 'USERS:UPDATE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Insufficient permission to assign role'
                    type: object
                    example:
                      message: 'Insufficient permission to assign this role as ClinicAdmin'
                      code: 'USERS:UPDATE:INSUFFICIENT_PERMISSION_ASSIGN_ROLE'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to assign this role as ClinicAdmin'
                      code:
                        type: string
                        example: 'USERS:UPDATE:INSUFFICIENT_PERMISSION_ASSIGN_ROLE'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USERS:UPDATE:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USERS:UPDATE:USER_NOT_FOUND'
      tags:
        - Users
      requestBody:
        required: false
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                mrn:
                  type: string
                  description: 'Medical Record Number.'
                  example: MRN12345678
                name:
                  type: string
                  description: 'User full name.'
                  example: 'Tom Smith'
                email:
                  type: string
                  description: 'User email. MUST_BE_EMAIL.'
                  example: test@example.com
                language:
                  type: string
                  description: 'User language.'
                  example: en
                address1:
                  type: string
                  description: 'Address line 1. MAXIMUM:STRING_LENGTH:100.'
                  example: '5929 Kelly Way Apt. 990'
                address2:
                  type: string
                  description: 'Address line 2. MAXIMUM:STRING_LENGTH:100.'
                  example: 'North Kristian, IA 30735'
                postal_code:
                  type: string
                  description: 'Postal code. MAXIMUM:STRING_LENGTH:100.'
                  example: 34294-7919
                city:
                  type: string
                  description: 'City. MAXIMUM:STRING_LENGTH:100.'
                  example: 'West Hulda'
                clinic_name:
                  type: string
                  description: 'Clinic name. MAXIMUM:STRING_LENGTH:100.'
                  example: Aether
                clinic_location:
                  type: string
                  description: 'Clinic location. MAXIMUM:STRING_LENGTH:100.'
                  example: '5929 Kelly Way Apt. 990'
                image:
                  type: string
                  format: binary
                  description: 'Attached user image. MUST_BE_IMAGE MAXIMUM:FILE_KB:5120.'
                image_delete:
                  type: boolean
                  description: 'Send this parameter instead of <code>image</code> to remove previously added image.'
                  example: true
                mfa_enabled:
                  type: boolean
                  description: '<strong>Super Admin only:</strong> MFA enabled.'
                  example: true
                mfa_method:
                  type: string
                  description: '<strong>Super Admin only:</strong> MFA method.'
                  example: email
                  enum:
                    - email
                    - sms
                active:
                  type: boolean
                  description: 'User active status (0 - inactive, 1 - active).'
                  example: true
                clinicians:
                  type: array
                  description: 'Clinician ID. The <code>id</code> of an existing record in the App\Models\User table.'
                  example:
                    - 2
                  items:
                    type: string
                notifications_timezone:
                  type: string
                  description: 'User notifications timezone.'
                  example: Europe/Warsaw
                notifications_at:
                  type: string
                  description: 'Time when notifications and reminders should be sent. Format: HH:MM. Set null to notify at default time. Must be a valid date in the format <code>H:i</code>.'
                  example: '8:00'
                role:
                  type: string
                  description: 'Role name.'
                  example: Amputee
                  enum:
                    - Amputee
                    - ClinicianSupport
                    - Clinician
                    - ClinicAdmin
                    - SuperAdmin
                    - AcadleUser
                permissions:
                  type: object
                  description: "List of permissions given to this user.\n\tFor now, it is used for <code>ClinicianSupport</code> role to give access to specific actions\n\t(for example <code>user.update</code> means that user can update users).\n\tYou can assign both predefined permissions (already checked by some endpoints) and custom permissions (check them on your own).\n\tYou can also use wildcards like user.* to give access to all actions for given scope."
                  example: null
                  properties: {  }
    delete:
      summary: 'Delete user account'
      operationId: deleteUserAccount
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User deleted'
                  code: 'USERS:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'User deleted'
                  code:
                    type: string
                    example: 'USERS:DELETE:DELETED'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to delete user'
                      code: 'USERS:DELETE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to delete user'
                      code:
                        type: string
                        example: 'USERS:DELETE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'User has existing patients or chat rooms'
                    type: object
                    example:
                      message: 'Cannot delete: user has existing patients or chat rooms (patients: 1, chat rooms: 0)'
                      code: 'USERS:DELETE:HAS_PATIENTS'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete: user has existing patients or chat rooms (patients: 1, chat rooms: 0)'
                      code:
                        type: string
                        example: 'USERS:DELETE:HAS_PATIENTS'
                  -
                    description: 'User has existing devices'
                    type: object
                    example:
                      message: 'Cannot delete: user has existing devices (as patient: 1, as clinician: 0)'
                      code: 'USERS:DELETE:HAS_DEVICES'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete: user has existing devices (as patient: 1, as clinician: 0)'
                      code:
                        type: string
                        example: 'USERS:DELETE:HAS_DEVICES'
                  -
                    description: 'User has open P2P sessions'
                    type: object
                    example:
                      message: 'Cannot delete: user has open P2P sessions (as patient: 0, as clinician: 1)'
                      code: 'USERS:DELETE:HAS_P2P_SESSIONS'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete: user has open P2P sessions (as patient: 0, as clinician: 1)'
                      code:
                        type: string
                        example: 'USERS:DELETE:HAS_P2P_SESSIONS'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USERS:DELETE:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USERS:DELETE:USER_NOT_FOUND'
        500:
          description: 'Server error'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Server error: user not deleted'
                  code: 'USERS:DELETE:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Server error: user not deleted'
                  code:
                    type: string
                    example: 'USERS:DELETE:SERVER_ERROR'
      tags:
        - Users
    parameters:
      -
        in: path
        name: id
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/user:
    post:
      summary: 'Create new user account'
      operationId: createNewUserAccount
      description: "Predefined permissions:\n\t\t<ul>\n\t\t\t<li><code>user.view</code> - access to view users' data (GET /user/{id} endpoint)</li>\n\t\t\t<li><code>user.update</code> - access to update users' data (PUT /user/{id} and POST /user/{id}/phone endpoints)</li>\n\t\t\t<li><code>user.passwordChange</code> - access to change users' passwords (POST /user/{id}/password endpoint)</li>\n\t\t\t<li><code>user.devices</code> - access to list of users' devices (GET /user/{id}/devices endpoint)</li>\n\t\t\t<li><code>user.tickets.view</code> - access to listing and viewing tickets</li>\n\t\t\t<li><code>user.tickets.update</code> - access to updating tickets (marking messages as read)</li>\n\t\t\t<li><code>user.tickets.send</code> - access to sending messages in tickets</li>\n\t\t\t<li><code>user.tickets.close</code> - access to closing tickets</li>\n\t\t\t<li><code>user.goals</code> - access to view or manage users' goals</li>\n\t\t</ul>"
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 13
                  mrn: K8IRNNOX1768236462
                  name: 'Brenda Gusikowski'
                  email: 1768236462rebeka.jacobson@example.net
                  language: en
                  phone: +1-501-826-4732
                  phone_country: NA
                  phone_verified_at: null
                  address1: '235 Predovic Inlet Apt. 323'
                  address2: 'South Eduardo, WV 22507'
                  postal_code: 49671-7558
                  city: 'Cole PLC'
                  clinic_name: 'North Karineville'
                  clinic_location: "3827 Enrico Squares Suite 171\nBradtkefort, AR 87343"
                  image: null
                  mfa_enabled: 0
                  mfa_method: null
                  mfa_verified_to: null
                  location_id: null
                  created_by: null
                  active: 1
                  notifications_timezone: null
                  notifications_at: null
                  created_at: '2026-01-12T16:47:42.000000Z'
                  updated_at: '2026-01-12T16:47:42.000000Z'
                  invitation_status: null
                  acadle_invitation_status: null
                  roles:
                    -
                      id: 5
                      name: Amputee
                properties:
                  id:
                    type: integer
                    example: 13
                  mrn:
                    type: string
                    example: K8IRNNOX1768236462
                  name:
                    type: string
                    example: 'Brenda Gusikowski'
                  email:
                    type: string
                    example: 1768236462rebeka.jacobson@example.net
                  language:
                    type: string
                    example: en
                  phone:
                    type: string
                    example: +1-501-826-4732
                  phone_country:
                    type: string
                    example: NA
                  phone_verified_at:
                    type: string
                    example: null
                  address1:
                    type: string
                    example: '235 Predovic Inlet Apt. 323'
                  address2:
                    type: string
                    example: 'South Eduardo, WV 22507'
                  postal_code:
                    type: string
                    example: 49671-7558
                  city:
                    type: string
                    example: 'Cole PLC'
                  clinic_name:
                    type: string
                    example: 'North Karineville'
                  clinic_location:
                    type: string
                    example: "3827 Enrico Squares Suite 171\nBradtkefort, AR 87343"
                  image:
                    type: string
                    example: null
                  mfa_enabled:
                    type: integer
                    example: 0
                  mfa_method:
                    type: string
                    example: null
                  mfa_verified_to:
                    type: string
                    example: null
                  location_id:
                    type: string
                    example: null
                  created_by:
                    type: string
                    example: null
                  active:
                    type: integer
                    example: 1
                  notifications_timezone:
                    type: string
                    example: null
                  notifications_at:
                    type: string
                    example: null
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:42.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:42.000000Z'
                  invitation_status:
                    type: string
                    example: null
                  acadle_invitation_status:
                    type: string
                    example: null
                  roles:
                    type: array
                    example:
                      -
                        id: 5
                        name: Amputee
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 5
                        name:
                          type: string
                          example: Amputee
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to create user with given role'
                      code: 'USERS:CREATE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to create user with given role'
                      code:
                        type: string
                        example: 'USERS:CREATE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'E-mail in use (in another region)'
                    type: object
                    example:
                      message: 'E-mail address already in use (in another region)'
                      code: 'USERS:CREATE:EMAIL_IN_USE'
                    properties:
                      message:
                        type: string
                        example: 'E-mail address already in use (in another region)'
                      code:
                        type: string
                        example: 'USERS:CREATE:EMAIL_IN_USE'
      tags:
        - Users
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                mrn:
                  type: string
                  description: 'Medical Record Number.'
                  example: MRN12345678
                name:
                  type: string
                  description: 'User full name.'
                  example: 'Tom Smith'
                email:
                  type: string
                  description: 'User email. MUST_BE_EMAIL.'
                  example: test@example.com
                language:
                  type: string
                  description: 'User language.'
                  example: en
                address1:
                  type: string
                  description: 'Address line 1. MAXIMUM:STRING_LENGTH:100.'
                  example: '61935 Mills Spurs'
                address2:
                  type: string
                  description: 'Address line 2. MAXIMUM:STRING_LENGTH:100.'
                  example: 'Danielhaven, MI 27536'
                postal_code:
                  type: string
                  description: 'Postal code. MAXIMUM:STRING_LENGTH:100.'
                  example: 51939-0167
                city:
                  type: string
                  description: 'City. MAXIMUM:STRING_LENGTH:100.'
                  example: 'West Trudie'
                clinic_name:
                  type: string
                  description: 'Clinic name. MAXIMUM:STRING_LENGTH:100.'
                  example: Aether
                clinic_location:
                  type: string
                  description: 'Clinic location. MAXIMUM:STRING_LENGTH:100.'
                  example: '61935 Mills Spurs'
                image:
                  type: string
                  format: binary
                  description: 'Attached user image. MUST_BE_IMAGE MAXIMUM:FILE_KB:5120.'
                mfa_enabled:
                  type: boolean
                  description: '<strong>Super Admin only:</strong> MFA enabled.'
                  example: true
                mfa_method:
                  type: string
                  description: '<strong>Super Admin only:</strong> MFA method.'
                  example: email
                  enum:
                    - email
                    - sms
                clinicians:
                  type: array
                  description: 'Clinician ID. The <code>id</code> of an existing record in the App\Models\User table.'
                  example:
                    - 2
                  items:
                    type: string
                notifications_timezone:
                  type: string
                  description: 'User notifications timezone.'
                  example: Europe/Warsaw
                notifications_at:
                  type: string
                  description: 'Time when notifications and reminders should be sent. Format: HH:MM. Set null to notify at default time. Must be a valid date in the format <code>H:i</code>.'
                  example: '8:00'
                role:
                  type: string
                  description: 'Role name.'
                  example: Amputee
                  enum:
                    - Amputee
                    - ClinicianSupport
                    - Clinician
                    - ClinicAdmin
                    - SuperAdmin
                    - AcadleUser
                permissions:
                  type: object
                  description: "List of permissions given to this user.\n\tFor now, it is used for <code>ClinicianSupport</code> role to give access to specific actions\n\t(for example <code>user.update</code> means that user can update users).\n\tYou can assign both predefined permissions (already checked by some endpoints) and custom permissions (check them on your own).\n\tYou can also use wildcards like user.* to give access to all actions for given scope."
                  example: null
                  properties: {  }
              required:
                - email
                - role
  '/api/user/{id}/phone':
    post:
      summary: 'Update user phone number'
      operationId: updateUserPhoneNumber
      description: "Phone number has to be verified after update.\n\t\tCall <code>/api/mfa/phone/verify</code> with user-filled code after performing this operation.\n\t\tIf value is \"0\" phone number will be removed without any verification."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Phone number removed'
                    type: object
                    example:
                      message: 'Phone number removed'
                      code: 'USERS:SET_PHONE:REMOVED'
                    properties:
                      message:
                        type: string
                        example: 'Phone number removed'
                      code:
                        type: string
                        example: 'USERS:SET_PHONE:REMOVED'
                  -
                    description: 'Phone number updated'
                    type: object
                    example:
                      message: 'Verification code sent. Call /api/mfa/phone/verify to verify phone number.'
                      code: 'USERS:SET_PHONE:UPDATED'
                    properties:
                      message:
                        type: string
                        example: 'Verification code sent. Call /api/mfa/phone/verify to verify phone number.'
                      code:
                        type: string
                        example: 'USERS:SET_PHONE:UPDATED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update user data'
                  code: 'USERS:SET_PHONE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update user data'
                  code:
                    type: string
                    example: 'USERS:SET_PHONE:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USERS:SET_PHONE:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USERS:SET_PHONE:USER_NOT_FOUND'
        500:
          description: 'Code send failed'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Verification code sending failed'
                  code: 'USERS:SET_PHONE:SEND_FAILED'
                properties:
                  message:
                    type: string
                    example: 'Verification code sending failed'
                  code:
                    type: string
                    example: 'USERS:SET_PHONE:SEND_FAILED'
      tags:
        - Users
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                phone:
                  type: string
                  description: 'User phone number. Pass "0" to remove current one.'
                  example: '+1 (208) 892-0242'
                phone_country:
                  type: string
                  description: "Phone number's country (2 characters). SIZE:STRING_LENGTH:2."
                  example: US
    parameters:
      -
        in: path
        name: id
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/user/{id}/password':
    post:
      summary: 'Change other user password'
      operationId: changeOtherUserPassword
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User password changed'
                  code: 'USERS:PASSWORD_CHANGE:CHANGED'
                properties:
                  message:
                    type: string
                    example: 'User password changed'
                  code:
                    type: string
                    example: 'USERS:PASSWORD_CHANGE:CHANGED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to change user password'
                  code: 'USERS:PASSWORD_CHANGE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to change user password'
                  code:
                    type: string
                    example: 'USERS:PASSWORD_CHANGE:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USERS:PASSWORD_CHANGE:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USERS:PASSWORD_CHANGE:USER_NOT_FOUND'
      tags:
        - Users
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                password:
                  type: string
                  description: ''
                  example: ut
              required:
                - password
    parameters:
      -
        in: path
        name: id
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/user/{id}/devices':
    get:
      summary: 'Get user devices list'
      operationId: getUserDevicesList
      description: ''
      parameters:
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>model</code>, <code>firmwareVersion</code>, <code>pcbVersion</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>model</code>, <code>firmwareVersion</code>, <code>pcbVersion</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 3
                      serial: 177faf2f-e575-3fad-b453-ff0f9744dcba
                      bluetooth_id: f147c749-2c9a-31c2-b9bf-a3a96739553e
                      company_id: null
                      model_id: 1
                      amputee_id: null
                      clinician_id: null
                      firmware_version_id: null
                      pcb_version_id: null
                      reverse_magnets: 0
                      is_electrode: 0
                      active: 1
                      last_activity_at: '0000-00-00 00:00:00'
                      created_at: '2026-01-12T16:47:42.000000Z'
                      updated_at: '2026-01-12T16:47:42.000000Z'
                      model:
                        id: 1
                        name: 'Zeus hand v1'
                        type: leg
                        orientation: left
                        active: 1
                        created_at: '2026-01-12T16:47:42.000000Z'
                        updated_at: '2026-01-12T16:47:42.000000Z'
                    -
                      id: 4
                      serial: f878e339-9e04-31d1-a8f2-a5b683b6f067
                      bluetooth_id: 6fbf8a6d-0fa5-34fb-8b57-54bff198696b
                      company_id: null
                      model_id: 2
                      amputee_id: null
                      clinician_id: null
                      firmware_version_id: null
                      pcb_version_id: null
                      reverse_magnets: 0
                      is_electrode: 0
                      active: 1
                      last_activity_at: '0000-00-00 00:00:00'
                      created_at: '2026-01-12T16:47:42.000000Z'
                      updated_at: '2026-01-12T16:47:42.000000Z'
                      model:
                        id: 2
                        name: 'Zeus hand v1'
                        type: leg
                        orientation: right
                        active: 1
                        created_at: '2026-01-12T16:47:42.000000Z'
                        updated_at: '2026-01-12T16:47:42.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 3
                        serial: 177faf2f-e575-3fad-b453-ff0f9744dcba
                        bluetooth_id: f147c749-2c9a-31c2-b9bf-a3a96739553e
                        company_id: null
                        model_id: 1
                        amputee_id: null
                        clinician_id: null
                        firmware_version_id: null
                        pcb_version_id: null
                        reverse_magnets: 0
                        is_electrode: 0
                        active: 1
                        last_activity_at: '0000-00-00 00:00:00'
                        created_at: '2026-01-12T16:47:42.000000Z'
                        updated_at: '2026-01-12T16:47:42.000000Z'
                        model:
                          id: 1
                          name: 'Zeus hand v1'
                          type: leg
                          orientation: left
                          active: 1
                          created_at: '2026-01-12T16:47:42.000000Z'
                          updated_at: '2026-01-12T16:47:42.000000Z'
                      -
                        id: 4
                        serial: f878e339-9e04-31d1-a8f2-a5b683b6f067
                        bluetooth_id: 6fbf8a6d-0fa5-34fb-8b57-54bff198696b
                        company_id: null
                        model_id: 2
                        amputee_id: null
                        clinician_id: null
                        firmware_version_id: null
                        pcb_version_id: null
                        reverse_magnets: 0
                        is_electrode: 0
                        active: 1
                        last_activity_at: '0000-00-00 00:00:00'
                        created_at: '2026-01-12T16:47:42.000000Z'
                        updated_at: '2026-01-12T16:47:42.000000Z'
                        model:
                          id: 2
                          name: 'Zeus hand v1'
                          type: leg
                          orientation: right
                          active: 1
                          created_at: '2026-01-12T16:47:42.000000Z'
                          updated_at: '2026-01-12T16:47:42.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 3
                        serial:
                          type: string
                          example: 177faf2f-e575-3fad-b453-ff0f9744dcba
                        bluetooth_id:
                          type: string
                          example: f147c749-2c9a-31c2-b9bf-a3a96739553e
                        company_id:
                          type: string
                          example: null
                        model_id:
                          type: integer
                          example: 1
                        amputee_id:
                          type: string
                          example: null
                        clinician_id:
                          type: string
                          example: null
                        firmware_version_id:
                          type: string
                          example: null
                        pcb_version_id:
                          type: string
                          example: null
                        reverse_magnets:
                          type: integer
                          example: 0
                        is_electrode:
                          type: integer
                          example: 0
                        active:
                          type: integer
                          example: 1
                        last_activity_at:
                          type: string
                          example: '0000-00-00 00:00:00'
                        created_at:
                          type: string
                          example: '2026-01-12T16:47:42.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:47:42.000000Z'
                        model:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 1
                            name:
                              type: string
                              example: 'Zeus hand v1'
                            type:
                              type: string
                              example: leg
                            orientation:
                              type: string
                              example: left
                            active:
                              type: integer
                              example: 1
                            created_at:
                              type: string
                              example: '2026-01-12T16:47:42.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:47:42.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to view user devices'
                  code: 'USERS:DEVICES:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to view user devices'
                  code:
                    type: string
                    example: 'USERS:DEVICES:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USERS:DEVICES:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USERS:DEVICES:USER_NOT_FOUND'
      tags:
        - Users
    parameters:
      -
        in: path
        name: id
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/user/attach:
    post:
      summary: 'Attach patient to clinician'
      operationId: attachPatientToClinician
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Patient attached'
                  code: 'USERS:ATTACH:ATTACHED'
                properties:
                  message:
                    type: string
                    example: 'Patient attached'
                  code:
                    type: string
                    example: 'USERS:ATTACH:ATTACHED'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to attach patients'
                      code: 'USERS:ATTACH:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to attach patients'
                      code:
                        type: string
                        example: 'USERS:ATTACH:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Patient is already assigned to another clinician'
                    type: object
                    example:
                      message: 'Patient is already assigned to another clinician'
                      code: 'USERS:ATTACH:ALREADY_ASSIGNED'
                    properties:
                      message:
                        type: string
                        example: 'Patient is already assigned to another clinician'
                      code:
                        type: string
                        example: 'USERS:ATTACH:ALREADY_ASSIGNED'
                  -
                    description: 'User reached the temporary limit of attached devices'
                    type: object
                    example:
                      message: 'Reached the limit of assigned devices'
                      code: 'USERS:ATTACH:LIMIT_REACHED'
                    properties:
                      message:
                        type: string
                        example: 'Reached the limit of assigned devices'
                      code:
                        type: string
                        example: 'USERS:ATTACH:LIMIT_REACHED'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USERS:ATTACH:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USERS:ATTACH:USER_NOT_FOUND'
      tags:
        - Users
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'User e-mail address. MUST_BE_EMAIL The <code>email</code> of an existing record in the App\Models\User table.'
                  example: name@domain.com
              required:
                - email
  '/api/user/{id}/detach':
    post:
      summary: 'Detach patient from clinician'
      operationId: detachPatientFromClinician
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Patient detached'
                  code: 'USERS:DETACH:DETACHED'
                properties:
                  message:
                    type: string
                    example: 'Patient detached'
                  code:
                    type: string
                    example: 'USERS:DETACH:DETACHED'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to detach patient'
                      code: 'USERS:DETACH:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to detach patient'
                      code:
                        type: string
                        example: 'USERS:DETACH:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Cannot detach last clinician'
                    type: object
                    example:
                      message: "Cannot detach patient's last clinician"
                      code: 'USERS:DETACH:CANNOT_DETACH_LAST_CLINICIAN'
                    properties:
                      message:
                        type: string
                        example: "Cannot detach patient's last clinician"
                      code:
                        type: string
                        example: 'USERS:DETACH:CANNOT_DETACH_LAST_CLINICIAN'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USERS:DETACH:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USERS:DETACH:USER_NOT_FOUND'
      tags:
        - Users
    parameters:
      -
        in: path
        name: id
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/user/{id}/mfa-codes':
    get:
      summary: 'Admin access to MFA codes'
      operationId: adminAccessToMFACodes
      description: '<strong>Requires <code>admin.mfa_access</code> permission.</strong>'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 1
                    user_id:
                      type: integer
                      example: 1
                    code:
                      type: string
                      example: '123456'
                    channel:
                      type: string
                      example: email
                    expires:
                      type: string
                      example: '2025-05-09 12:00:00'
                example:
                  -
                    id: 1
                    user_id: 1
                    code: '123456'
                    channel: email
                    expires: '2025-05-09 12:00:00'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to access MFA codes'
                  code: 'USERS:ADMIN_MFA_ACCESS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to access MFA codes'
                  code:
                    type: string
                    example: 'USERS:ADMIN_MFA_ACCESS:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USERS:ADMIN_MFA_ACCESS:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USERS:ADMIN_MFA_ACCESS:USER_NOT_FOUND'
      tags:
        - Users
    parameters:
      -
        in: path
        name: id
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/consents:
    get:
      summary: 'Get user mobile consents'
      operationId: getUserMobileConsents
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 1
                    user_id:
                      type: integer
                      example: 1
                    name:
                      type: string
                      example: facere
                    value:
                      type: string
                      example: laborum
                    created_at:
                      type: string
                      example: '2018-04-07T21:42:43.000000Z'
                    updated_at:
                      type: string
                      example: '1977-12-16T09:02:53.000000Z'
                example:
                  -
                    id: 1
                    user_id: 1
                    name: facere
                    value: laborum
                    created_at: '2018-04-07T21:42:43.000000Z'
                    updated_at: '1977-12-16T09:02:53.000000Z'
                  -
                    id: 2
                    user_id: 1
                    name: delectus
                    value: nam
                    created_at: '1990-09-14T02:01:17.000000Z'
                    updated_at: '1974-04-11T10:13:08.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to use mobile consents'
                  code: 'USERS:GET_MOBILE_CONSENTS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to use mobile consents'
                  code:
                    type: string
                    example: 'USERS:GET_MOBILE_CONSENTS:INSUFFICIENT_PERMISSION'
      tags:
        - Users
    post:
      summary: 'Set user mobile consent'
      operationId: setUserMobileConsent
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 3
                    user_id:
                      type: integer
                      example: 1
                    name:
                      type: string
                      example: voluptatem
                    value:
                      type: string
                      example: ut
                    created_at:
                      type: string
                      example: '1988-11-11T12:40:22.000000Z'
                    updated_at:
                      type: string
                      example: '2006-09-15T16:19:34.000000Z'
                example:
                  -
                    id: 3
                    user_id: 1
                    name: voluptatem
                    value: ut
                    created_at: '1988-11-11T12:40:22.000000Z'
                    updated_at: '2006-09-15T16:19:34.000000Z'
                  -
                    id: 4
                    user_id: 1
                    name: impedit
                    value: id
                    created_at: '2016-06-30T00:45:18.000000Z'
                    updated_at: '1971-01-04T11:30:41.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to use mobile consents'
                  code: 'USERS:SET_MOBILE_CONSENTS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to use mobile consents'
                  code:
                    type: string
                    example: 'USERS:SET_MOBILE_CONSENTS:INSUFFICIENT_PERMISSION'
      tags:
        - Users
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Consent name.'
                  example: 'Push notifications'
                value:
                  type: string
                  description: 'Consent value.'
                  example: 1
              required:
                - name
                - value
  '/api/notifications/{id}':
    delete:
      summary: 'Clear user notifications'
      operationId: clearUserNotifications
      description: "Clearing notifications allow to receive another notification on same day.\n\t\tThis endpoint deletes notifications of type:\n\t\t<ul>\n\t\t\t<li>daily activity reminders</li>\n\t\t\t<li>goals daily summary</li>\n\t\t</ul>\n\t\tThis endpoint is intended for testing use only."
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  messages: '1 notifications deleted'
                  code: 'USERS:CLEAR_NOTIFICATIONS:CLEARED'
                properties:
                  messages:
                    type: string
                    example: '1 notifications deleted'
                  code:
                    type: string
                    example: 'USERS:CLEAR_NOTIFICATIONS:CLEARED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update user data'
                  code: 'USERS:CLEAR_NOTIFICATIONS:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update user data'
                  code:
                    type: string
                    example: 'USERS:CLEAR_NOTIFICATIONS:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'USERS:CLEAR_NOTIFICATIONS:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'USERS:CLEAR_NOTIFICATIONS:USER_NOT_FOUND'
      tags:
        - Users
    parameters:
      -
        in: path
        name: id
        description: 'User ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/versions/software:
    get:
      summary: 'Get software versions'
      operationId: getSoftwareVersions
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 1
                    name:
                      type: string
                      example: 3.92.12
                    created_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                example:
                  -
                    id: 1
                    name: 3.92.12
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
                  -
                    id: 2
                    name: 9.18.44
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list versions'
                  code: 'SOFTWARE_VERSION:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list versions'
                  code:
                    type: string
                    example: 'SOFTWARE_VERSION:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - Versions
    post:
      summary: 'Create software version'
      operationId: createSoftwareVersion
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  name: 9.66.8
                  created_at: '2026-01-12T16:48:03.000000Z'
                  updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  name:
                    type: string
                    example: 9.66.8
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to create versions'
                  code: 'SOFTWARE_VERSION:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to create versions'
                  code:
                    type: string
                    example: 'SOFTWARE_VERSION:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - Versions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of version.'
                  example: '1.0'
              required:
                - name
  '/api/versions/software/{id}':
    delete:
      summary: 'Delete software version'
      operationId: deleteSoftwareVersion
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Version deleted'
                  code: 'SOFTWARE_VERSION:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Version deleted'
                  code:
                    type: string
                    example: 'SOFTWARE_VERSION:DELETE:DELETED'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to delete versions'
                      code: 'SOFTWARE_VERSION:DELETE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to delete versions'
                      code:
                        type: string
                        example: 'SOFTWARE_VERSION:DELETE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Version in use (compatibility)'
                    type: object
                    example:
                      message: 'Cannot delete: version is used in compatibility entries (1)'
                      code: 'SOFTWARE_VERSION:DELETE:VERSION_IN_USE_COMPATIBILITY'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete: version is used in compatibility entries (1)'
                      code:
                        type: string
                        example: 'SOFTWARE_VERSION:DELETE:VERSION_IN_USE_COMPATIBILITY'
        404:
          description: 'Version not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Version not found'
                  code: 'SOFTWARE_VERSION:DELETE:VERSION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Version not found'
                  code:
                    type: string
                    example: 'SOFTWARE_VERSION:DELETE:VERSION_NOT_FOUND'
      tags:
        - Versions
    parameters:
      -
        in: path
        name: id
        description: 'Software Version ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/versions/firmware:
    get:
      summary: 'Get firmware versions'
      operationId: getFirmwareVersions
      description: ''
      parameters:
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>models</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>models</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 2
                    name:
                      type: string
                      example: 1.90.63
                    file_firmware:
                      type: string
                      example: /tmp/faker4Y7Qtl
                    file_firmware_v2:
                      type: string
                      example: /tmp/fakerrUsHYJ
                    file_firmware_v3:
                      type: string
                      example: /tmp/faker65kLnE
                    file_firmware_v4:
                      type: string
                      example: /tmp/fakersy9d46
                    file_firmware_v5:
                      type: string
                      example: /tmp/faker2Q8mhm
                    file_firmware_new_pcb:
                      type: string
                      example: /tmp/fakerT2KyDZ
                    file_bootloader:
                      type: string
                      example: /tmp/fakercmEa69
                    file_bootloader_v2:
                      type: string
                      example: /tmp/fakerL0l0gS
                    file_bootloader_v3:
                      type: string
                      example: /tmp/faker1QJSnu
                    file_bootloader_v4:
                      type: string
                      example: /tmp/fakerrtrwik
                    changelog:
                      type: string
                      example: 'Repellat voluptatem aliquid voluptates voluptas officiis asperiores totam. Non provident veniam ipsum maxime alias culpa perferendis. Natus ut facere voluptatem vero.'
                    created_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                example:
                  -
                    id: 2
                    name: 1.90.63
                    file_firmware: /tmp/faker4Y7Qtl
                    file_firmware_v2: /tmp/fakerrUsHYJ
                    file_firmware_v3: /tmp/faker65kLnE
                    file_firmware_v4: /tmp/fakersy9d46
                    file_firmware_v5: /tmp/faker2Q8mhm
                    file_firmware_new_pcb: /tmp/fakerT2KyDZ
                    file_bootloader: /tmp/fakercmEa69
                    file_bootloader_v2: /tmp/fakerL0l0gS
                    file_bootloader_v3: /tmp/faker1QJSnu
                    file_bootloader_v4: /tmp/fakerrtrwik
                    changelog: 'Repellat voluptatem aliquid voluptates voluptas officiis asperiores totam. Non provident veniam ipsum maxime alias culpa perferendis. Natus ut facere voluptatem vero.'
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
                  -
                    id: 3
                    name: 9.77.5
                    file_firmware: /tmp/fakergww1MR
                    file_firmware_v2: /tmp/fakerm77hbz
                    file_firmware_v3: /tmp/fakerXW0H4e
                    file_firmware_v4: /tmp/fakerVng02Q
                    file_firmware_v5: /tmp/fakerAmQRL7
                    file_firmware_new_pcb: /tmp/fakerMBYo7l
                    file_bootloader: /tmp/fakerEi8zNW
                    file_bootloader_v2: /tmp/fakerLmoeSo
                    file_bootloader_v3: /tmp/fakerdZrKMl
                    file_bootloader_v4: /tmp/fakerAf0NRT
                    changelog: 'Assumenda est ducimus repudiandae quae possimus doloremque pariatur inventore. Quo ea dolor voluptatem rerum.'
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list versions'
                  code: 'FIRMWARE_VERSION:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list versions'
                  code:
                    type: string
                    example: 'FIRMWARE_VERSION:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - Versions
    post:
      summary: 'Create firmware version'
      operationId: createFirmwareVersion
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  name: 4.91.77
                  file_firmware: /tmp/fakerU2l5yI
                  file_firmware_v2: /tmp/fakerhExnH2
                  file_firmware_v3: /tmp/fakerQKDFMu
                  file_firmware_v4: /tmp/fakerjP8lRf
                  file_firmware_v5: /tmp/fakeru0KdAV
                  file_firmware_new_pcb: /tmp/fakerKQHDay
                  file_bootloader: /tmp/fakerj1eV24
                  file_bootloader_v2: /tmp/fakerNySNun
                  file_bootloader_v3: /tmp/fakeru86KY0
                  file_bootloader_v4: /tmp/fakerVGLPIn
                  changelog: 'Deserunt ut consequatur vel. Et accusamus modi mollitia neque sint quod. Non nisi eius incidunt voluptatibus sequi commodi facilis. Officiis dicta ut accusantium quis in.'
                  created_at: '2026-01-12T16:48:03.000000Z'
                  updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  name:
                    type: string
                    example: 4.91.77
                  file_firmware:
                    type: string
                    example: /tmp/fakerU2l5yI
                  file_firmware_v2:
                    type: string
                    example: /tmp/fakerhExnH2
                  file_firmware_v3:
                    type: string
                    example: /tmp/fakerQKDFMu
                  file_firmware_v4:
                    type: string
                    example: /tmp/fakerjP8lRf
                  file_firmware_v5:
                    type: string
                    example: /tmp/fakeru0KdAV
                  file_firmware_new_pcb:
                    type: string
                    example: /tmp/fakerKQHDay
                  file_bootloader:
                    type: string
                    example: /tmp/fakerj1eV24
                  file_bootloader_v2:
                    type: string
                    example: /tmp/fakerNySNun
                  file_bootloader_v3:
                    type: string
                    example: /tmp/fakeru86KY0
                  file_bootloader_v4:
                    type: string
                    example: /tmp/fakerVGLPIn
                  changelog:
                    type: string
                    example: 'Deserunt ut consequatur vel. Et accusamus modi mollitia neque sint quod. Non nisi eius incidunt voluptatibus sequi commodi facilis. Officiis dicta ut accusantium quis in.'
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to create versions'
                  code: 'FIRMWARE_VERSION:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to create versions'
                  code:
                    type: string
                    example: 'FIRMWARE_VERSION:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - Versions
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of version.'
                  example: '1.0'
                models:
                  type: array
                  description: 'Device Model ID. The <code>id</code> of an existing record in the App\Models\DeviceModel table.'
                  example:
                    - 1
                  items:
                    type: integer
                file_firmware:
                  type: string
                  format: binary
                  description: 'Attached firmware file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_firmware_v2:
                  type: string
                  format: binary
                  description: 'Attached firmware file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_firmware_v3:
                  type: string
                  format: binary
                  description: 'Attached firmware file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_firmware_v4:
                  type: string
                  format: binary
                  description: 'Attached firmware file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_firmware_v5:
                  type: string
                  format: binary
                  description: 'Attached firmware file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_firmware_new_pcb:
                  type: string
                  format: binary
                  description: 'Attached firmware for new PCB file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_bootloader:
                  type: string
                  format: binary
                  description: 'Attached bootloader file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_bootloader_v2:
                  type: string
                  format: binary
                  description: 'Attached bootloader file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_bootloader_v3:
                  type: string
                  format: binary
                  description: 'Attached bootloader file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_bootloader_v4:
                  type: string
                  format: binary
                  description: 'Attached bootloader file. Must be a file. MAXIMUM:FILE_KB:102400.'
                changelog:
                  type: array
                  description: 'List of changelog translations.'
                  example: null
                  items:
                    type: object
                    properties:
                      language:
                        type: string
                        description: 'Changelog language (2 characters code).'
                        example: en
                      changelog:
                        type: string
                        description: 'Changelog for the version.'
                        example: 'Fixed bug with the connection'
              required:
                - name
  '/api/versions/firmware/{id}':
    put:
      summary: 'Update firmware version'
      operationId: updateFirmwareVersion
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 5
                  name: 6.47.14
                  file_firmware: /tmp/faker2BAr1A
                  file_firmware_v2: /tmp/fakerm5eXsl
                  file_firmware_v3: /tmp/fakerKJkOEv
                  file_firmware_v4: /tmp/fakerRKWdNU
                  file_firmware_v5: /tmp/fakerX4eJlX
                  file_firmware_new_pcb: /tmp/fakerky2JeA
                  file_bootloader: /tmp/fakerCnxtdn
                  file_bootloader_v2: /tmp/fakerNpc4sl
                  file_bootloader_v3: /tmp/fakeraQCg0p
                  file_bootloader_v4: /tmp/faker9uQHod
                  changelog: 'Quis voluptatibus maxime est saepe. Deserunt commodi aut quo ducimus numquam illo dicta. Perspiciatis quo quos itaque debitis eius aut nemo.'
                  created_at: '2026-01-12T16:48:03.000000Z'
                  updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  id:
                    type: integer
                    example: 5
                  name:
                    type: string
                    example: 6.47.14
                  file_firmware:
                    type: string
                    example: /tmp/faker2BAr1A
                  file_firmware_v2:
                    type: string
                    example: /tmp/fakerm5eXsl
                  file_firmware_v3:
                    type: string
                    example: /tmp/fakerKJkOEv
                  file_firmware_v4:
                    type: string
                    example: /tmp/fakerRKWdNU
                  file_firmware_v5:
                    type: string
                    example: /tmp/fakerX4eJlX
                  file_firmware_new_pcb:
                    type: string
                    example: /tmp/fakerky2JeA
                  file_bootloader:
                    type: string
                    example: /tmp/fakerCnxtdn
                  file_bootloader_v2:
                    type: string
                    example: /tmp/fakerNpc4sl
                  file_bootloader_v3:
                    type: string
                    example: /tmp/fakeraQCg0p
                  file_bootloader_v4:
                    type: string
                    example: /tmp/faker9uQHod
                  changelog:
                    type: string
                    example: 'Quis voluptatibus maxime est saepe. Deserunt commodi aut quo ducimus numquam illo dicta. Perspiciatis quo quos itaque debitis eius aut nemo.'
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update versions'
                  code: 'FIRMWARE_VERSION:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update versions'
                  code:
                    type: string
                    example: 'FIRMWARE_VERSION:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Version not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Version not found'
                  code: 'FIRMWARE_VERSION:UPDATE:VERSION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Version not found'
                  code:
                    type: string
                    example: 'FIRMWARE_VERSION:UPDATE:VERSION_NOT_FOUND'
      tags:
        - Versions
      requestBody:
        required: false
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of version.'
                  example: '1.0'
                models:
                  type: array
                  description: 'Device Model ID. The <code>id</code> of an existing record in the App\Models\DeviceModel table.'
                  example:
                    - 1
                  items:
                    type: integer
                file_firmware:
                  type: string
                  format: binary
                  description: 'Attached firmware file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_firmware_v2:
                  type: string
                  format: binary
                  description: 'Attached firmware file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_firmware_v3:
                  type: string
                  format: binary
                  description: 'Attached firmware file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_firmware_v4:
                  type: string
                  format: binary
                  description: 'Attached firmware file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_firmware_v5:
                  type: string
                  format: binary
                  description: 'Attached firmware file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_firmware_new_pcb:
                  type: string
                  format: binary
                  description: 'Attached firmware for new PCB file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_bootloader:
                  type: string
                  format: binary
                  description: 'Attached bootloader file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_bootloader_v2:
                  type: string
                  format: binary
                  description: 'Attached bootloader file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_bootloader_v3:
                  type: string
                  format: binary
                  description: 'Attached bootloader file. Must be a file. MAXIMUM:FILE_KB:102400.'
                file_bootloader_v4:
                  type: string
                  format: binary
                  description: 'Attached bootloader file. Must be a file. MAXIMUM:FILE_KB:102400.'
                changelog:
                  type: array
                  description: 'List of changelog translations.'
                  example: null
                  items:
                    type: object
                    properties:
                      language:
                        type: string
                        description: 'Changelog language (2 characters code).'
                        example: en
                      changelog:
                        type: string
                        description: 'Changelog for the version. Pass "NULL" string to remove the entry for given language.'
                        example: 'Fixed bug with the connection'
                file_firmware_delete:
                  type: string
                  description: 'Send this parameter with value <code>1</code> to remove existing file for <code>file_firmware</code>.'
                  example: 1
                file_firmware_v2_delete:
                  type: string
                  description: 'Send this parameter with value <code>1</code> to remove existing file for <code>file_firmware_v2</code>.'
                  example: 1
                file_firmware_v3_delete:
                  type: string
                  description: 'Send this parameter with value <code>1</code> to remove existing file for <code>file_firmware_v3</code>.'
                  example: 1
                file_firmware_v4_delete:
                  type: string
                  description: 'Send this parameter with value <code>1</code> to remove existing file for <code>file_firmware_v4</code>.'
                  example: 1
                file_firmware_v5_delete:
                  type: string
                  description: 'Send this parameter with value <code>1</code> to remove existing file for <code>file_firmware_v5</code>.'
                  example: 1
                file_firmware_new_pcb_delete:
                  type: string
                  description: 'Send this parameter with value <code>1</code> to remove existing file for <code>file_firmware_new_pcb</code>.'
                  example: 1
                file_bootloader_delete:
                  type: string
                  description: 'Send this parameter with value <code>1</code> to remove existing file for <code>file_bootloader</code>.'
                  example: 1
                file_bootloader_v2_delete:
                  type: string
                  description: 'Send this parameter with value <code>1</code> to remove existing file for <code>file_bootloader_v2</code>.'
                  example: 1
                file_bootloader_v3_delete:
                  type: string
                  description: 'Send this parameter with value <code>1</code> to remove existing file for <code>file_bootloader_v3</code>.'
                  example: 1
                file_bootloader_v4_delete:
                  type: string
                  description: 'Send this parameter with value <code>1</code> to remove existing file for <code>file_bootloader_v4</code>.'
                  example: 1
    delete:
      summary: 'Delete firmware version'
      operationId: deleteFirmwareVersion
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Version deleted'
                  code: 'FIRMWARE_VERSION:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Version deleted'
                  code:
                    type: string
                    example: 'FIRMWARE_VERSION:DELETE:DELETED'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to delete versions'
                      code: 'FIRMWARE_VERSION:DELETE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to delete versions'
                      code:
                        type: string
                        example: 'FIRMWARE_VERSION:DELETE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Version in use (compatibility)'
                    type: object
                    example:
                      message: 'Cannot delete: version is used in compatibility entries (1)'
                      code: 'FIRMWARE_VERSION:DELETE:VERSION_IN_USE_COMPATIBILITY'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete: version is used in compatibility entries (1)'
                      code:
                        type: string
                        example: 'FIRMWARE_VERSION:DELETE:VERSION_IN_USE_COMPATIBILITY'
                  -
                    description: 'Version in use (device)'
                    type: object
                    example:
                      message: 'Cannot delete: version is assigned to devices (1)'
                      code: 'FIRMWARE_VERSION:DELETE:VERSION_IN_USE_DEVICE'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete: version is assigned to devices (1)'
                      code:
                        type: string
                        example: 'FIRMWARE_VERSION:DELETE:VERSION_IN_USE_DEVICE'
        404:
          description: 'Version not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Version not found'
                  code: 'FIRMWARE_VERSION:DELETE:VERSION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Version not found'
                  code:
                    type: string
                    example: 'FIRMWARE_VERSION:DELETE:VERSION_NOT_FOUND'
      tags:
        - Versions
    parameters:
      -
        in: path
        name: id
        description: 'Firmware Version ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/versions/pcb:
    get:
      summary: 'Get PCB versions'
      operationId: getPCBVersions
      description: ''
      parameters:
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>models</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>models</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 2
                    name:
                      type: string
                      example: 7.60.86
                    hardware_id:
                      type: string
                      example: ''
                    created_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:48:03.000000Z'
                example:
                  -
                    id: 2
                    name: 7.60.86
                    hardware_id: ''
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
                  -
                    id: 3
                    name: 5.10.60
                    hardware_id: ''
                    created_at: '2026-01-12T16:48:03.000000Z'
                    updated_at: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list versions'
                  code: 'PCB_VERSION:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list versions'
                  code:
                    type: string
                    example: 'PCB_VERSION:LIST:INSUFFICIENT_PERMISSION'
      tags:
        - Versions
    post:
      summary: 'Create PCB version'
      operationId: createPCBVersion
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  name: 6.86.46
                  hardware_id: ''
                  created_at: '2026-01-12T16:48:03.000000Z'
                  updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  name:
                    type: string
                    example: 6.86.46
                  hardware_id:
                    type: string
                    example: ''
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to create versions'
                  code: 'PCB_VERSION:CREATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to create versions'
                  code:
                    type: string
                    example: 'PCB_VERSION:CREATE:INSUFFICIENT_PERMISSION'
      tags:
        - Versions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of version.'
                  example: '1.0'
                models:
                  type: array
                  description: 'Device Model ID. The <code>id</code> of an existing record in the App\Models\DeviceModel table.'
                  example:
                    - 1
                  items:
                    type: integer
                hardware_id:
                  type: string
                  description: 'Hardware ID name.'
                  example: '1'
              required:
                - name
                - hardware_id
  '/api/versions/pcb/{id}':
    put:
      summary: 'Update PCB version'
      operationId: updatePCBVersion
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 5
                  name: 8.92.91
                  hardware_id: ''
                  created_at: '2026-01-12T16:48:03.000000Z'
                  updated_at: '2026-01-12T16:48:03.000000Z'
                properties:
                  id:
                    type: integer
                    example: 5
                  name:
                    type: string
                    example: 8.92.91
                  hardware_id:
                    type: string
                    example: ''
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:03.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update versions'
                  code: 'PCB_VERSION:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update versions'
                  code:
                    type: string
                    example: 'PCB_VERSION:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Version not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Version not found'
                  code: 'PCB_VERSION:UPDATE:VERSION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Version not found'
                  code:
                    type: string
                    example: 'PCB_VERSION:UPDATE:VERSION_NOT_FOUND'
      tags:
        - Versions
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Name of version.'
                  example: '1.0'
                models:
                  type: array
                  description: 'Device Model ID. The <code>id</code> of an existing record in the App\Models\DeviceModel table.'
                  example:
                    - 1
                  items:
                    type: integer
                hardware_id:
                  type: string
                  description: 'Hardware ID name.'
                  example: '1'
    delete:
      summary: 'Delete PCB version'
      operationId: deletePCBVersion
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Version deleted'
                  code: 'PCB_VERSION:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Version deleted'
                  code:
                    type: string
                    example: 'PCB_VERSION:DELETE:DELETED'
        403:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Insufficient permission'
                    type: object
                    example:
                      message: 'Insufficient permission to delete versions'
                      code: 'PCB_VERSION:DELETE:INSUFFICIENT_PERMISSION'
                    properties:
                      message:
                        type: string
                        example: 'Insufficient permission to delete versions'
                      code:
                        type: string
                        example: 'PCB_VERSION:DELETE:INSUFFICIENT_PERMISSION'
                  -
                    description: 'Version in use (compatibility)'
                    type: object
                    example:
                      message: 'Cannot delete: version is used in compatibility entries (1)'
                      code: 'PCB_VERSION:DELETE:VERSION_IN_USE_COMPATIBILITY'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete: version is used in compatibility entries (1)'
                      code:
                        type: string
                        example: 'PCB_VERSION:DELETE:VERSION_IN_USE_COMPATIBILITY'
                  -
                    description: 'Version in use (device)'
                    type: object
                    example:
                      message: 'Cannot delete: version is assigned to devices (1)'
                      code: 'PCB_VERSION:DELETE:VERSION_IN_USE_DEVICE'
                    properties:
                      message:
                        type: string
                        example: 'Cannot delete: version is assigned to devices (1)'
                      code:
                        type: string
                        example: 'PCB_VERSION:DELETE:VERSION_IN_USE_DEVICE'
        404:
          description: 'Version not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Version not found'
                  code: 'PCB_VERSION:DELETE:VERSION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Version not found'
                  code:
                    type: string
                    example: 'PCB_VERSION:DELETE:VERSION_NOT_FOUND'
      tags:
        - Versions
    parameters:
      -
        in: path
        name: id
        description: 'PCB Version ID.'
        example: 1
        required: true
        schema:
          type: integer
  /api/versions/compatibility:
    get:
      summary: 'List compatibilities'
      operationId: listCompatibilities
      description: "Most typical scenarios to use compatibility matrix:\n\t\t<ul>\n\t\t\t<li>full matrix (no filters) - for admin panel displaying,</li>\n\t\t\t<li>filtered by all of the versions (software, firmware, PCB and device model) - for checking specific scenario compatibility and supported features.</li>\n\t\t</ul>"
      parameters:
        -
          in: query
          name: model
          description: 'Filter compatibility matrix by device model ID.'
          example: 1
          required: false
          schema:
            type: integer
            description: 'Filter compatibility matrix by device model ID.'
            example: 1
        -
          in: query
          name: software
          description: 'Filter compatibility matrix by software version name (not ID!).'
          example: '1.2'
          required: false
          schema:
            type: string
            description: 'Filter compatibility matrix by software version name (not ID!).'
            example: '1.2'
        -
          in: query
          name: firmware
          description: 'Filter compatibility matrix by firmware version name (not ID!).'
          example: '1.5'
          required: false
          schema:
            type: string
            description: 'Filter compatibility matrix by firmware version name (not ID!).'
            example: '1.5'
        -
          in: query
          name: pcb
          description: 'Filter compatibility matrix by PCB version name (not ID!).'
          example: '1.0'
          required: false
          schema:
            type: string
            description: 'Filter compatibility matrix by PCB version name (not ID!).'
            example: '1.0'
        -
          in: query
          name: summary
          description: 'Add to response the device model, software, firmware and PCB entries used to filter the list.'
          example: false
          required: false
          schema:
            type: boolean
            description: 'Add to response the device model, software, firmware and PCB entries used to filter the list.'
            example: false
        -
          in: query
          name: perpage
          description: 'Elements per page (Default: 20).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Elements per page (Default: 20).'
            example: null
        -
          in: query
          name: page
          description: 'Page number (Default: 1).'
          example: null
          required: false
          schema:
            type: integer
            description: 'Page number (Default: 1).'
            example: null
        -
          in: query
          name: extend
          description: 'Comma-separated list of relation extensions (available: <code>features</code>, <code>features.feature</code>, <code>deviceModel</code>, <code>softwareVersion</code>, <code>firmwareVersion</code>, <code>pcbVersion</code>).'
          example: null
          required: false
          schema:
            type: string
            description: 'Comma-separated list of relation extensions (available: <code>features</code>, <code>features.feature</code>, <code>deviceModel</code>, <code>softwareVersion</code>, <code>firmwareVersion</code>, <code>pcbVersion</code>).'
            example: null
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  paginator:
                    total: 2
                    count: 2
                    perpage: 20
                    current_page: 1
                    last_page: 1
                  items:
                    -
                      id: 1
                      device_model_id: 10
                      software_version_id: 4
                      firmware_version_id: 14
                      pcb_version_id: 6
                      is_fully_compatible: 1
                      created_at: '2026-01-12T16:48:04.000000Z'
                      updated_at: '2026-01-12T16:48:04.000000Z'
                      features:
                        -
                          id: 1
                          compatibility_id: 1
                          feature_id: 5
                          is_compatible: 1
                          reason: 'Laboriosam facere aliquid voluptatem blanditiis suscipit numquam asperiores. Architecto ullam minus eveniet vel ab sunt sed. Quibusdam occaecati laudantium commodi enim non voluptas qui.'
                          created_at: '2026-01-12T16:48:04.000000Z'
                          updated_at: '2026-01-12T16:48:04.000000Z'
                          feature:
                            id: 5
                            name: navy
                            slug: nisi-asperiores-tempore-aut-qui-officiis
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                        -
                          id: 2
                          compatibility_id: 1
                          feature_id: 7
                          is_compatible: 1
                          reason: 'Vitae et voluptatem sit corporis blanditiis aspernatur excepturi. Qui velit labore dicta id. Fugiat eius et in temporibus.'
                          created_at: '2026-01-12T16:48:04.000000Z'
                          updated_at: '2026-01-12T16:48:04.000000Z'
                          feature:
                            id: 7
                            name: navy
                            slug: dolorum-magnam-et-ut-quibusdam
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                        -
                          id: 3
                          compatibility_id: 1
                          feature_id: 9
                          is_compatible: 1
                          reason: 'Vel ratione veniam occaecati iusto beatae. Voluptates sit fugit veniam voluptatem reprehenderit tempora ratione. Qui ipsam aut iste a et laborum ex quod.'
                          created_at: '2026-01-12T16:48:04.000000Z'
                          updated_at: '2026-01-12T16:48:04.000000Z'
                          feature:
                            id: 9
                            name: black
                            slug: rem-ut-tempore-sequi-ea-ut-ex-harum
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                    -
                      id: 5
                      device_model_id: 14
                      software_version_id: 8
                      firmware_version_id: 18
                      pcb_version_id: 10
                      is_fully_compatible: 1
                      created_at: '2026-01-12T16:48:04.000000Z'
                      updated_at: '2026-01-12T16:48:04.000000Z'
                      features:
                        -
                          id: 4
                          compatibility_id: 5
                          feature_id: 10
                          is_compatible: 1
                          reason: 'Unde eius sed quaerat sit vel et. Illum voluptatem aut laborum autem eligendi non facere. Nemo quae in quis voluptatem voluptas sit. Qui libero consequatur esse itaque.'
                          created_at: '2026-01-12T16:48:04.000000Z'
                          updated_at: '2026-01-12T16:48:04.000000Z'
                          feature:
                            id: 10
                            name: green
                            slug: alias-aliquam-occaecati-quis-voluptatem-tenetur
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                        -
                          id: 5
                          compatibility_id: 5
                          feature_id: 12
                          is_compatible: 0
                          reason: 'Qui illum qui id corrupti veritatis. Deserunt nihil iste repellat quibusdam. Ducimus quod iste rerum et quidem non saepe.'
                          created_at: '2026-01-12T16:48:04.000000Z'
                          updated_at: '2026-01-12T16:48:04.000000Z'
                          feature:
                            id: 12
                            name: fuchsia
                            slug: perspiciatis-sunt-porro-exercitationem-accusamus-suscipit-dignissimos-reprehenderit
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                        -
                          id: 6
                          compatibility_id: 5
                          feature_id: 14
                          is_compatible: 1
                          reason: 'Aut porro adipisci itaque perferendis hic nostrum repellat qui. Ad ipsum fugit natus id. Non officia soluta eius.'
                          created_at: '2026-01-12T16:48:04.000000Z'
                          updated_at: '2026-01-12T16:48:04.000000Z'
                          feature:
                            id: 14
                            name: navy
                            slug: nisi-consequatur-et-neque-a-in-commodi-maiores
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                properties:
                  paginator:
                    type: object
                    properties:
                      total:
                        type: integer
                        example: 2
                      count:
                        type: integer
                        example: 2
                      perpage:
                        type: integer
                        example: 20
                      current_page:
                        type: integer
                        example: 1
                      last_page:
                        type: integer
                        example: 1
                  items:
                    type: array
                    example:
                      -
                        id: 1
                        device_model_id: 10
                        software_version_id: 4
                        firmware_version_id: 14
                        pcb_version_id: 6
                        is_fully_compatible: 1
                        created_at: '2026-01-12T16:48:04.000000Z'
                        updated_at: '2026-01-12T16:48:04.000000Z'
                        features:
                          -
                            id: 1
                            compatibility_id: 1
                            feature_id: 5
                            is_compatible: 1
                            reason: 'Laboriosam facere aliquid voluptatem blanditiis suscipit numquam asperiores. Architecto ullam minus eveniet vel ab sunt sed. Quibusdam occaecati laudantium commodi enim non voluptas qui.'
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                            feature:
                              id: 5
                              name: navy
                              slug: nisi-asperiores-tempore-aut-qui-officiis
                              created_at: '2026-01-12T16:48:04.000000Z'
                              updated_at: '2026-01-12T16:48:04.000000Z'
                          -
                            id: 2
                            compatibility_id: 1
                            feature_id: 7
                            is_compatible: 1
                            reason: 'Vitae et voluptatem sit corporis blanditiis aspernatur excepturi. Qui velit labore dicta id. Fugiat eius et in temporibus.'
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                            feature:
                              id: 7
                              name: navy
                              slug: dolorum-magnam-et-ut-quibusdam
                              created_at: '2026-01-12T16:48:04.000000Z'
                              updated_at: '2026-01-12T16:48:04.000000Z'
                          -
                            id: 3
                            compatibility_id: 1
                            feature_id: 9
                            is_compatible: 1
                            reason: 'Vel ratione veniam occaecati iusto beatae. Voluptates sit fugit veniam voluptatem reprehenderit tempora ratione. Qui ipsam aut iste a et laborum ex quod.'
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                            feature:
                              id: 9
                              name: black
                              slug: rem-ut-tempore-sequi-ea-ut-ex-harum
                              created_at: '2026-01-12T16:48:04.000000Z'
                              updated_at: '2026-01-12T16:48:04.000000Z'
                      -
                        id: 5
                        device_model_id: 14
                        software_version_id: 8
                        firmware_version_id: 18
                        pcb_version_id: 10
                        is_fully_compatible: 1
                        created_at: '2026-01-12T16:48:04.000000Z'
                        updated_at: '2026-01-12T16:48:04.000000Z'
                        features:
                          -
                            id: 4
                            compatibility_id: 5
                            feature_id: 10
                            is_compatible: 1
                            reason: 'Unde eius sed quaerat sit vel et. Illum voluptatem aut laborum autem eligendi non facere. Nemo quae in quis voluptatem voluptas sit. Qui libero consequatur esse itaque.'
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                            feature:
                              id: 10
                              name: green
                              slug: alias-aliquam-occaecati-quis-voluptatem-tenetur
                              created_at: '2026-01-12T16:48:04.000000Z'
                              updated_at: '2026-01-12T16:48:04.000000Z'
                          -
                            id: 5
                            compatibility_id: 5
                            feature_id: 12
                            is_compatible: 0
                            reason: 'Qui illum qui id corrupti veritatis. Deserunt nihil iste repellat quibusdam. Ducimus quod iste rerum et quidem non saepe.'
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                            feature:
                              id: 12
                              name: fuchsia
                              slug: perspiciatis-sunt-porro-exercitationem-accusamus-suscipit-dignissimos-reprehenderit
                              created_at: '2026-01-12T16:48:04.000000Z'
                              updated_at: '2026-01-12T16:48:04.000000Z'
                          -
                            id: 6
                            compatibility_id: 5
                            feature_id: 14
                            is_compatible: 1
                            reason: 'Aut porro adipisci itaque perferendis hic nostrum repellat qui. Ad ipsum fugit natus id. Non officia soluta eius.'
                            created_at: '2026-01-12T16:48:04.000000Z'
                            updated_at: '2026-01-12T16:48:04.000000Z'
                            feature:
                              id: 14
                              name: navy
                              slug: nisi-consequatur-et-neque-a-in-commodi-maiores
                              created_at: '2026-01-12T16:48:04.000000Z'
                              updated_at: '2026-01-12T16:48:04.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 1
                        device_model_id:
                          type: integer
                          example: 10
                        software_version_id:
                          type: integer
                          example: 4
                        firmware_version_id:
                          type: integer
                          example: 14
                        pcb_version_id:
                          type: integer
                          example: 6
                        is_fully_compatible:
                          type: integer
                          example: 1
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:04.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:04.000000Z'
                        features:
                          type: array
                          example:
                            -
                              id: 1
                              compatibility_id: 1
                              feature_id: 5
                              is_compatible: 1
                              reason: 'Laboriosam facere aliquid voluptatem blanditiis suscipit numquam asperiores. Architecto ullam minus eveniet vel ab sunt sed. Quibusdam occaecati laudantium commodi enim non voluptas qui.'
                              created_at: '2026-01-12T16:48:04.000000Z'
                              updated_at: '2026-01-12T16:48:04.000000Z'
                              feature:
                                id: 5
                                name: navy
                                slug: nisi-asperiores-tempore-aut-qui-officiis
                                created_at: '2026-01-12T16:48:04.000000Z'
                                updated_at: '2026-01-12T16:48:04.000000Z'
                            -
                              id: 2
                              compatibility_id: 1
                              feature_id: 7
                              is_compatible: 1
                              reason: 'Vitae et voluptatem sit corporis blanditiis aspernatur excepturi. Qui velit labore dicta id. Fugiat eius et in temporibus.'
                              created_at: '2026-01-12T16:48:04.000000Z'
                              updated_at: '2026-01-12T16:48:04.000000Z'
                              feature:
                                id: 7
                                name: navy
                                slug: dolorum-magnam-et-ut-quibusdam
                                created_at: '2026-01-12T16:48:04.000000Z'
                                updated_at: '2026-01-12T16:48:04.000000Z'
                            -
                              id: 3
                              compatibility_id: 1
                              feature_id: 9
                              is_compatible: 1
                              reason: 'Vel ratione veniam occaecati iusto beatae. Voluptates sit fugit veniam voluptatem reprehenderit tempora ratione. Qui ipsam aut iste a et laborum ex quod.'
                              created_at: '2026-01-12T16:48:04.000000Z'
                              updated_at: '2026-01-12T16:48:04.000000Z'
                              feature:
                                id: 9
                                name: black
                                slug: rem-ut-tempore-sequi-ea-ut-ex-harum
                                created_at: '2026-01-12T16:48:04.000000Z'
                                updated_at: '2026-01-12T16:48:04.000000Z'
                          items:
                            type: object
                            properties:
                              id:
                                type: integer
                                example: 1
                              compatibility_id:
                                type: integer
                                example: 1
                              feature_id:
                                type: integer
                                example: 5
                              is_compatible:
                                type: integer
                                example: 1
                              reason:
                                type: string
                                example: 'Laboriosam facere aliquid voluptatem blanditiis suscipit numquam asperiores. Architecto ullam minus eveniet vel ab sunt sed. Quibusdam occaecati laudantium commodi enim non voluptas qui.'
                              created_at:
                                type: string
                                example: '2026-01-12T16:48:04.000000Z'
                              updated_at:
                                type: string
                                example: '2026-01-12T16:48:04.000000Z'
                              feature:
                                type: object
                                properties:
                                  id:
                                    type: integer
                                    example: 5
                                  name:
                                    type: string
                                    example: navy
                                  slug:
                                    type: string
                                    example: nisi-asperiores-tempore-aut-qui-officiis
                                  created_at:
                                    type: string
                                    example: '2026-01-12T16:48:04.000000Z'
                                  updated_at:
                                    type: string
                                    example: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to list versions compatibilities'
                  code: 'COMPATIBILITY:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to list versions compatibilities'
                  code:
                    type: string
                    example: 'COMPATIBILITY:LIST:INSUFFICIENT_PERMISSION'
        404:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: 'Device model not found'
                    type: object
                    example:
                      message: 'Device model not found'
                      code: 'COMPATIBILITY:LIST:DEVICE_MODEL_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Device model not found'
                      code:
                        type: string
                        example: 'COMPATIBILITY:LIST:DEVICE_MODEL_NOT_FOUND'
                  -
                    description: 'Software version not found'
                    type: object
                    example:
                      message: 'Software version not found'
                      code: 'COMPATIBILITY:LIST:SOFTWARE_VERSION_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Software version not found'
                      code:
                        type: string
                        example: 'COMPATIBILITY:LIST:SOFTWARE_VERSION_NOT_FOUND'
                  -
                    description: 'Firmware version not found'
                    type: object
                    example:
                      message: 'Firmware version not found'
                      code: 'COMPATIBILITY:LIST:FIRMWARE_VERSION_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'Firmware version not found'
                      code:
                        type: string
                        example: 'COMPATIBILITY:LIST:FIRMWARE_VERSION_NOT_FOUND'
                  -
                    description: 'PCB version not found'
                    type: object
                    example:
                      message: 'PCB version not found'
                      code: 'COMPATIBILITY:LIST:PCB_VERSION_NOT_FOUND'
                    properties:
                      message:
                        type: string
                        example: 'PCB version not found'
                      code:
                        type: string
                        example: 'COMPATIBILITY:LIST:PCB_VERSION_NOT_FOUND'
      tags:
        - Versions
    post:
      summary: 'Add compatibility'
      operationId: addCompatibility
      description: 'Adds or updates compatibility matrix with assigned features. You can specify many versions for each list.'
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  added: 1
                  updated: 0
                  not_changed: 0
                properties:
                  added:
                    type: integer
                    example: 1
                  updated:
                    type: integer
                    example: 0
                  not_changed:
                    type: integer
                    example: 0
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to add versions compatibility'
                  code: 'COMPATIBILITY:ADD:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to add versions compatibility'
                  code:
                    type: string
                    example: 'COMPATIBILITY:ADD:INSUFFICIENT_PERMISSION'
      tags:
        - Versions
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                device_models:
                  type: array
                  description: 'Array of Device Model IDs. The <code>id</code> of an existing record in the App\Models\DeviceModel table.'
                  example:
                    - 1
                  items:
                    type: integer
                    nullable: true
                software_versions:
                  type: array
                  description: 'Array of Software Version IDs. The <code>id</code> of an existing record in the App\Models\SoftwareVersion table.'
                  example:
                    - 1
                  items:
                    type: integer
                    nullable: true
                firmware_versions:
                  type: array
                  description: 'Array of Firmware Version IDs. The <code>id</code> of an existing record in the App\Models\FirmwareVersion table.'
                  example:
                    - 1
                  items:
                    type: integer
                    nullable: true
                pcb_versions:
                  type: array
                  description: 'Array of PCB Version IDs. The <code>id</code> of an existing record in the App\Models\PCBVersion table.'
                  example:
                    - 1
                  items:
                    type: integer
                    nullable: true
                is_fully_compatible:
                  type: boolean
                  description: 'Is this set of versions fully compatible?.'
                  example: true
                features:
                  type: array
                  description: 'Array of features to be assigned to this set of versions.'
                  example: null
                  items:
                    type: object
                    properties:
                      feature_id:
                        type: string
                        description: 'Product feature ID. The <code>id</code> of an existing record in the App\Models\ProductFeature table.'
                        example: 1
                        nullable: true
                      compatible:
                        type: boolean
                        description: 'Is this feature compatible?.'
                        example: true
                      reason:
                        type: string
                        description: 'Reason of incompatibility.'
                        example: 'Firmware does not support...'
  '/api/versions/compatibility/{id}':
    put:
      summary: 'Update compatibility'
      operationId: updateCompatibility
      description: ''
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 9
                  device_model_id: 18
                  software_version_id: 12
                  firmware_version_id: 22
                  pcb_version_id: 14
                  is_fully_compatible: 0
                  created_at: '2026-01-12T16:48:04.000000Z'
                  updated_at: '2026-01-12T16:48:04.000000Z'
                  features:
                    -
                      id: 7
                      compatibility_id: 9
                      feature_id: 15
                      is_compatible: 0
                      reason: 'Odio magni explicabo sequi ipsum. Iste sed quidem et vel accusamus. Quia aliquid officia repudiandae minima pariatur eveniet. Repudiandae magni est id itaque tenetur blanditiis.'
                      created_at: '2026-01-12T16:48:04.000000Z'
                      updated_at: '2026-01-12T16:48:04.000000Z'
                      feature:
                        id: 15
                        name: fuchsia
                        slug: mollitia-quam-dolor-sint-eum-excepturi-autem-eum
                        created_at: '2026-01-12T16:48:04.000000Z'
                        updated_at: '2026-01-12T16:48:04.000000Z'
                properties:
                  id:
                    type: integer
                    example: 9
                  device_model_id:
                    type: integer
                    example: 18
                  software_version_id:
                    type: integer
                    example: 12
                  firmware_version_id:
                    type: integer
                    example: 22
                  pcb_version_id:
                    type: integer
                    example: 14
                  is_fully_compatible:
                    type: integer
                    example: 0
                  created_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:48:04.000000Z'
                  features:
                    type: array
                    example:
                      -
                        id: 7
                        compatibility_id: 9
                        feature_id: 15
                        is_compatible: 0
                        reason: 'Odio magni explicabo sequi ipsum. Iste sed quidem et vel accusamus. Quia aliquid officia repudiandae minima pariatur eveniet. Repudiandae magni est id itaque tenetur blanditiis.'
                        created_at: '2026-01-12T16:48:04.000000Z'
                        updated_at: '2026-01-12T16:48:04.000000Z'
                        feature:
                          id: 15
                          name: fuchsia
                          slug: mollitia-quam-dolor-sint-eum-excepturi-autem-eum
                          created_at: '2026-01-12T16:48:04.000000Z'
                          updated_at: '2026-01-12T16:48:04.000000Z'
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          example: 7
                        compatibility_id:
                          type: integer
                          example: 9
                        feature_id:
                          type: integer
                          example: 15
                        is_compatible:
                          type: integer
                          example: 0
                        reason:
                          type: string
                          example: 'Odio magni explicabo sequi ipsum. Iste sed quidem et vel accusamus. Quia aliquid officia repudiandae minima pariatur eveniet. Repudiandae magni est id itaque tenetur blanditiis.'
                        created_at:
                          type: string
                          example: '2026-01-12T16:48:04.000000Z'
                        updated_at:
                          type: string
                          example: '2026-01-12T16:48:04.000000Z'
                        feature:
                          type: object
                          properties:
                            id:
                              type: integer
                              example: 15
                            name:
                              type: string
                              example: fuchsia
                            slug:
                              type: string
                              example: mollitia-quam-dolor-sint-eum-excepturi-autem-eum
                            created_at:
                              type: string
                              example: '2026-01-12T16:48:04.000000Z'
                            updated_at:
                              type: string
                              example: '2026-01-12T16:48:04.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to update versions compatibility'
                  code: 'COMPATIBILITY:UPDATE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to update versions compatibility'
                  code:
                    type: string
                    example: 'COMPATIBILITY:UPDATE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Versions Compatibility not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Versions compatibility not found'
                  code: 'COMPATIBILITY:UPDATE:COMPATIBILITY_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Versions compatibility not found'
                  code:
                    type: string
                    example: 'COMPATIBILITY:UPDATE:COMPATIBILITY_NOT_FOUND'
      tags:
        - Versions
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                device_model_id:
                  type: integer
                  description: 'Device Model ID. The <code>id</code> of an existing record in the App\Models\DeviceModel table.'
                  example: 9
                  nullable: true
                software_version_id:
                  type: integer
                  description: 'Software Version ID. The <code>id</code> of an existing record in the App\Models\SoftwareVersion table.'
                  example: 9
                  nullable: true
                firmware_version_id:
                  type: integer
                  description: 'Firmware Version ID. The <code>id</code> of an existing record in the App\Models\FirmwareVersion table.'
                  example: 19
                  nullable: true
                pcb_version_id:
                  type: integer
                  description: 'PCB Version ID. The <code>id</code> of an existing record in the App\Models\PCBVersion table.'
                  example: 6
                  nullable: true
                is_fully_compatible:
                  type: boolean
                  description: 'Is this set of versions fully compatible?.'
                  example: true
                features:
                  type: array
                  description: 'Array of features to be assigned to this set of versions.'
                  example: null
                  items:
                    type: object
                    properties:
                      id:
                        type: string
                        description: "Versions compatibility feature ID. Use with <code>delete</code> parameter to delete specific entry.\n\tDo not confuse with <code>feature_id</code>, this field refers to ID of relation between versions compatibility and product feature. The <code>id</code> of an existing record in the App\\Models\\VersionsCompatibilityFeature table."
                        example: 1
                        nullable: true
                      feature_id:
                        type: string
                        description: '<a href="#list-product-features">Product feature</a> ID. The <code>id</code> of an existing record in the App\Models\ProductFeature table.'
                        example: 1
                        nullable: true
                      compatible:
                        type: boolean
                        description: 'Is this feature compatible?.'
                        example: true
                      reason:
                        type: string
                        description: 'Reason of incompatibility.'
                        example: 'Firmware does not support...'
                      delete:
                        type: boolean
                        description: 'Pass 1 to detach feature from this set of versions, skip otherwise.'
                        example: true
    delete:
      summary: 'Delete compatibility'
      operationId: deleteCompatibility
      description: ''
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Versions compatibility deleted'
                  code: 'COMPATIBILITY:DELETE:DELETED'
                properties:
                  message:
                    type: string
                    example: 'Versions compatibility deleted'
                  code:
                    type: string
                    example: 'COMPATIBILITY:DELETE:DELETED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to delete versions compatibility'
                  code: 'COMPATIBILITY:DELETE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to delete versions compatibility'
                  code:
                    type: string
                    example: 'COMPATIBILITY:DELETE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Versions compatibility not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Versions compatibility not found'
                  code: 'COMPATIBILITY:DELETE:COMPATIBILITY_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Versions compatibility not found'
                  code:
                    type: string
                    example: 'COMPATIBILITY:DELETE:COMPATIBILITY_NOT_FOUND'
      tags:
        - Versions
    parameters:
      -
        in: path
        name: id
        description: 'Versions Compatibility ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/sessions/video/{guestId}':
    get:
      summary: 'List video sessions'
      operationId: listVideoSessions
      description: "Returns list of open video sessions.\n\t\tFor most cases there should be exactly one entry (open/active session) or exactly zero entries (empty array, no open sessions)."
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      example: 1
                    moderator_id:
                      type: integer
                      example: 122
                    guest_id:
                      type: integer
                      example: 123
                    jwt_moderator:
                      type: string
                      example: 61de7ba6838bde2a7d9a58e0c45434f7174ee4df8dce4493378d5688255cc22d
                    jwt_guest:
                      type: string
                      example: 4fc82b7956e90b122a110cd725f8b27bc4c8c51f4e3f4caa029bfef01ddd6e82
                    room_name:
                      type: string
                      example: room_af2f3eed47c7bdc5d2490f1388f680b0
                    expires:
                      type: integer
                      example: 1768237372
                    status:
                      type: string
                      example: open
                    created_at:
                      type: string
                      example: '2026-01-12T16:47:53.000000Z'
                    updated_at:
                      type: string
                      example: '2026-01-12T16:47:53.000000Z'
                example:
                  -
                    id: 1
                    moderator_id: 122
                    guest_id: 123
                    jwt_moderator: 61de7ba6838bde2a7d9a58e0c45434f7174ee4df8dce4493378d5688255cc22d
                    jwt_guest: 4fc82b7956e90b122a110cd725f8b27bc4c8c51f4e3f4caa029bfef01ddd6e82
                    room_name: room_af2f3eed47c7bdc5d2490f1388f680b0
                    expires: 1768237372
                    status: open
                    created_at: '2026-01-12T16:47:53.000000Z'
                    updated_at: '2026-01-12T16:47:53.000000Z'
                  -
                    id: 2
                    moderator_id: 126
                    guest_id: 127
                    jwt_moderator: 4d8e7438a0573b2895ab0f49fe82596b564e8ba985bc8be657ac764bbd0d7895
                    jwt_guest: 2901529c22b10096407c167f4107565aee24228b79071ad5063825c860f6c93f
                    room_name: room_5a9e64b279abdd289630c1d087e301c3
                    expires: 1768237373
                    status: open
                    created_at: '2026-01-12T16:47:53.000000Z'
                    updated_at: '2026-01-12T16:47:53.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to access video session'
                  code: 'VIDEO_SESSIONS:LIST:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to access video session'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:LIST:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'VIDEO_SESSIONS:LIST:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:LIST:USER_NOT_FOUND'
      tags:
        - 'Video sessions'
    post:
      summary: 'Initialize video session'
      operationId: initializeVideoSession
      description: "Creates JWT (JSON Web Token) and room name for Jitsi session.\n\t\tLogged-in user is a moderator of the session.\n\t\tJWT lifetime is 15 minutes."
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 3
                  moderator_id: 130
                  guest_id: 131
                  jwt_moderator: 72ddd2cc4594aa1134b8eaa9da845a31e70ad31ef81b0968f6d58b310c9a9926
                  jwt_guest: 16149626b0365e04a9a52d02e17ca8aeb63680b9f5ee2ba334b0b1a38a833cfe
                  room_name: room_5a9e64b279abdd289630c1d087e301c3
                  expires: 1768237373
                  status: open
                  created_at: '2026-01-12T16:47:53.000000Z'
                  updated_at: '2026-01-12T16:47:53.000000Z'
                properties:
                  id:
                    type: integer
                    example: 3
                  moderator_id:
                    type: integer
                    example: 130
                  guest_id:
                    type: integer
                    example: 131
                  jwt_moderator:
                    type: string
                    example: 72ddd2cc4594aa1134b8eaa9da845a31e70ad31ef81b0968f6d58b310c9a9926
                  jwt_guest:
                    type: string
                    example: 16149626b0365e04a9a52d02e17ca8aeb63680b9f5ee2ba334b0b1a38a833cfe
                  room_name:
                    type: string
                    example: room_5a9e64b279abdd289630c1d087e301c3
                  expires:
                    type: integer
                    example: 1768237373
                  status:
                    type: string
                    example: open
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:53.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:53.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to initialize video session'
                  code: 'VIDEO_SESSIONS:INIT:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to initialize video session'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:INIT:INSUFFICIENT_PERMISSION'
        404:
          description: 'User not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'User not found'
                  code: 'VIDEO_SESSIONS:INIT:USER_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'User not found'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:INIT:USER_NOT_FOUND'
        500:
          description: 'Server error'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Server error'
                  code: 'VIDEO_SESSIONS:INIT:SERVER_ERROR'
                properties:
                  message:
                    type: string
                    example: 'Server error'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:INIT:SERVER_ERROR'
      tags:
        - 'Video sessions'
    parameters:
      -
        in: path
        name: guestId
        description: 'User ID (guest of the meeting).'
        example: 1
        required: true
        schema:
          type: integer
  '/api/sessions/video/{sessionId}/refresh':
    post:
      summary: 'Refresh video session'
      operationId: refreshVideoSession
      description: 'Refreshes video session JWT tokens to extend session lifetime.'
      parameters: []
      responses:
        202:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  id: 4
                  moderator_id: 134
                  guest_id: 135
                  jwt_moderator: f056b8cae37dc3ed60ee52da9a2951f8a6c531fe3222a3ad6835dbdd905c7d2a
                  jwt_guest: f056b8cae37dc3ed60ee52da9a2951f8a6c531fe3222a3ad6835dbdd905c7d2a
                  room_name: room_5a9e64b279abdd289630c1d087e301c3
                  expires: 1768237373
                  status: open
                  created_at: '2026-01-12T16:47:53.000000Z'
                  updated_at: '2026-01-12T16:47:53.000000Z'
                properties:
                  id:
                    type: integer
                    example: 4
                  moderator_id:
                    type: integer
                    example: 134
                  guest_id:
                    type: integer
                    example: 135
                  jwt_moderator:
                    type: string
                    example: f056b8cae37dc3ed60ee52da9a2951f8a6c531fe3222a3ad6835dbdd905c7d2a
                  jwt_guest:
                    type: string
                    example: f056b8cae37dc3ed60ee52da9a2951f8a6c531fe3222a3ad6835dbdd905c7d2a
                  room_name:
                    type: string
                    example: room_5a9e64b279abdd289630c1d087e301c3
                  expires:
                    type: integer
                    example: 1768237373
                  status:
                    type: string
                    example: open
                  created_at:
                    type: string
                    example: '2026-01-12T16:47:53.000000Z'
                  updated_at:
                    type: string
                    example: '2026-01-12T16:47:53.000000Z'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to refresh video session'
                  code: 'VIDEO_SESSIONS:REFRESH:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to refresh video session'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:REFRESH:INSUFFICIENT_PERMISSION'
        404:
          description: 'Session not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Video session not found'
                  code: 'VIDEO_SESSIONS:REFRESH:SESSION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Video session not found'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:REFRESH:SESSION_NOT_FOUND'
      tags:
        - 'Video sessions'
    parameters:
      -
        in: path
        name: sessionId
        description: 'Video Session ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/sessions/video/{sessionId}':
    delete:
      summary: 'Close video session'
      operationId: closeVideoSession
      description: 'Marks video session (database entry) as closed. Does not close session on Jitsi side.'
      parameters: []
      responses:
        202:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Video session closed'
                  code: 'VIDEO_SESSIONS:CLOSE:CLOSED'
                properties:
                  message:
                    type: string
                    example: 'Video session closed'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:CLOSE:CLOSED'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to close video session'
                  code: 'VIDEO_SESSIONS:CLOSE:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to close video session'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:CLOSE:INSUFFICIENT_PERMISSION'
        404:
          description: 'Session not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Video session not found'
                  code: 'VIDEO_SESSIONS:CLOSE:SESSION_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Video session not found'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:CLOSE:SESSION_NOT_FOUND'
      tags:
        - 'Video sessions'
    parameters:
      -
        in: path
        name: sessionId
        description: 'Video Session ID.'
        example: 1
        required: true
        schema:
          type: integer
  '/api/sessions/video/invite-support/{deviceId}':
    post:
      summary: 'Invite technical support'
      operationId: inviteTechnicalSupport
      description: 'Sends notification to Slack channel. Link to meeting is valid for 10 minutes.'
      parameters: []
      responses:
        200:
          description: OK
          content:
            application/json:
              schema:
                type: object
                example:
                  response: success
                  code: 'VIDEO_SESSIONS:INVITE_TECH_SUPPORT:SUCCESS'
                properties:
                  response:
                    type: string
                    example: success
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:INVITE_TECH_SUPPORT:SUCCESS'
        403:
          description: 'Insufficient permission'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Insufficient permission to invite tech support'
                  code: 'VIDEO_SESSIONS:INVITE_TECH_SUPPORT:INSUFFICIENT_PERMISSION'
                properties:
                  message:
                    type: string
                    example: 'Insufficient permission to invite tech support'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:INVITE_TECH_SUPPORT:INSUFFICIENT_PERMISSION'
        404:
          description: 'Device not found'
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Device not found'
                  code: 'VIDEO_SESSIONS:INVITE_TECH_SUPPORT:DEVICE_NOT_FOUND'
                properties:
                  message:
                    type: string
                    example: 'Device not found'
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:INVITE_TECH_SUPPORT:DEVICE_NOT_FOUND'
        500:
          description: 'Request failed'
          content:
            application/json:
              schema:
                type: object
                example:
                  response: invalid_payload
                  code: 'VIDEO_SESSIONS:INVITE_TECH_SUPPORT:FAILED'
                properties:
                  response:
                    type: string
                    example: invalid_payload
                  code:
                    type: string
                    example: 'VIDEO_SESSIONS:INVITE_TECH_SUPPORT:FAILED'
      tags:
        - 'Video sessions'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                room:
                  type: string
                  description: 'Name of Jitsi room to connect.'
                  example: room_1081c785cf1464e4d6ebc3976561d490
                description:
                  type: string
                  description: 'Description of problem provided by clinician.'
                  example: 'Grip switching is not working, please join.'
              required:
                - room
    parameters:
      -
        in: path
        name: deviceId
        description: 'Device ID (current device of the session).'
        example: 1
        required: true
        schema:
          type: integer
