openapi: 3.0.3
info:
  title: "Public APIs"
  version: "v2"
servers:
  - url: https://api.boldsmartlock.com
    description: Production
  - url: https://staging.boldsmartlock.com
    description: Staging
components:
  securitySchemes:
    OAuth2Prod:
      type: oauth2
      description: Production OAuth2 (authorization code)
      flows:
        authorizationCode:
          authorizationUrl: https://auth.boldsmartlock.com/authorize
          tokenUrl: https://api.boldsmartlock.com/v2/oauth/token
          scopes:
            read: Read users, locks, groups, etc
            events: Retrieve events (activation, lock, unlock)
            activate: Activate (lock / unlock) devices
            manage: Modify users, locks, groups, access, etc
            settings: Modify device settings
            impersonate: Perform actions on behalf of a particular user
    OAuth2Staging:
      type: oauth2
      description: Staging OAuth2 (authorization code)
      flows:
        authorizationCode:
          authorizationUrl: https://auth-staging.boldsmartlock.com/authorize
          tokenUrl: https://staging.boldsmartlock.com/v2/oauth/token
          scopes:
            read: Read users, locks, groups, etc
            events: Retrieve events (activation, lock, unlock)
            activate: Activate (lock / unlock) devices
            manage: Modify users, locks, groups, access, etc
            settings: Modify device settings
            impersonate: Perform actions on behalf of a particular user
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: UUID
  schemas:
    Account:
      type: object
      properties:
        id:
          type: integer
        firstName:
          type: string
        lastName:
          type: string
      required:
        - "id"
    AccountPermissions:
      type: object
      properties:
        rangeBoostMode:
          type: boolean
        unlimitedUsers:
          type: boolean
        remoteAccess:
          type: boolean
        backupPins:
          type: boolean
        shareAccess:
          type: boolean
        eventLog:
          type: boolean
        turnToActivate:
          type: boolean
        tailgaterProtection:
          type: boolean
        matter:
          type: boolean
        turnToBoost:
          type: boolean
        lockedStatus:
          type: boolean
        buttonAutoDisable:
          type: boolean
        powerSaveMode:
          type: boolean
        nightLock:
          type: boolean
        leaveAlert:
          type: boolean
        tamperDetection:
          type: boolean
        webKeys:
          type: boolean
        dynamicPins:
          type: boolean
        extendedEventLog:
          type: boolean
        keepActiveMode:
          type: boolean
        showRealUser:
          type: boolean
        portal:
          type: boolean
        deviceGroups:
          type: boolean
        userGroups:
          type: boolean
        temporaryShares:
          type: boolean
        managedClickers:
          type: boolean
        importUsers:
          type: boolean
        exportEvents:
          type: boolean
        userInviteEmail:
          type: boolean
        userInviteSms:
          type: boolean
        userInviteWhatsapp:
          type: boolean
        integration:
          type: boolean
        customClient:
          type: boolean
        eventWebhooks:
          type: boolean
        autoEmailMatch:
          type: boolean
        requireEmailMatch:
          type: boolean
        emailMatchCredentialFilter:
          type: boolean
        nfcActivationTag:
          type: boolean
        walkInMode:
          type: boolean
        createOrganizations:
          type: boolean
      required:
        - "rangeBoostMode"
        - "unlimitedUsers"
        - "remoteAccess"
        - "backupPins"
        - "shareAccess"
        - "eventLog"
        - "turnToActivate"
        - "tailgaterProtection"
        - "matter"
        - "turnToBoost"
        - "lockedStatus"
        - "buttonAutoDisable"
        - "powerSaveMode"
        - "nightLock"
        - "leaveAlert"
        - "tamperDetection"
        - "webKeys"
        - "dynamicPins"
        - "extendedEventLog"
        - "keepActiveMode"
        - "showRealUser"
        - "portal"
        - "deviceGroups"
        - "userGroups"
        - "temporaryShares"
        - "managedClickers"
        - "importUsers"
        - "exportEvents"
        - "userInviteEmail"
        - "userInviteSms"
        - "userInviteWhatsapp"
        - "integration"
        - "customClient"
        - "eventWebhooks"
        - "autoEmailMatch"
        - "requireEmailMatch"
        - "emailMatchCredentialFilter"
        - "nfcActivationTag"
        - "walkInMode"
        - "createOrganizations"
    AddUserGroupUser:
      type: object
      properties:
        userId:
          type: integer
        groupAdmin:
          type: boolean
      required:
        - "userId"
        - "groupAdmin"
    AutoRemove:
      type: string
      enum:
      - "WEEK"
      - "MONTH"
      - "YEAR"
    Creator:
      type: object
      properties:
        id:
          type: integer
        firstName:
          type: string
        lastName:
          type: string
      required:
        - "id"
    Device:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        organizationId:
          type: integer
        organizationName:
          type: string
        deviceModel:
          $ref: '#/components/schemas/Model'
        firmwareConfiguration:
          $ref: '#/components/schemas/FirmwareConfiguration'
        actualFirmwareVersion:
          type: integer
        requiredFirmwareVersion:
          type: integer
        timeZone:
          type: string
        batchKey:
          type: string
          format: uuid
        batteryLevel:
          type: string
        batteryLevelReminder:
          type: string
          format: date-time
        batteryLastMeasurement:
          type: string
          format: date-time
        remarks:
          type: string
        location:
          type: string
        dateCreated:
          type: string
          format: date-time
        dateModified:
          type: string
          format: date-time
        dateAssigned:
          type: string
          format: date-time
        gatewayId:
          type: integer
        gatewayRssi:
          type: integer
        gatewayRssiLevel:
          $ref: '#/components/schemas/RssiLevel'
        gatewayLastSeen:
          type: string
          format: date-time
        gatewayLastSeenMessage:
          type: string
          format: date-time
        messageQueueCount:
          type: integer
        sequenceNumberDeviceEvents:
          type: integer
        decommissioned:
          type: boolean
        restricted:
          type: boolean
        restrictedReminder:
          type: string
          format: date-time
        minCommandStart:
          type: string
          format: date-time
        dateLastExternalSync:
          type: string
          format: date-time
        isActiveUntil:
          type: string
          format: date-time
        carouselImageUrl:
          type: string
        dateLastKeyExchange:
          type: string
          format: date-time
        dateLastKnownActivation:
          type: string
          format: date-time
        lastTimeSyncDate:
          type: string
          format: date-time
        lastTimeSyncDrift:
          type: integer
        locked:
          $ref: '#/components/schemas/DeviceLockStatus'
        lastLocked:
          type: string
          format: date-time
        matter:
          $ref: '#/components/schemas/MatterDetails'
        relatedDeviceGroups:
          type: array
          items:
            $ref: '#/components/schemas/RelatedDeviceGroup'
        reachableGateways:
          type: array
          items:
            $ref: '#/components/schemas/DeviceGatewayInfo'
        reachableDevices:
          type: array
          items:
            $ref: '#/components/schemas/DeviceGatewayInfo'
      required:
        - "id"
        - "deviceModel"
        - "firmwareConfiguration"
        - "actualFirmwareVersion"
        - "requiredFirmwareVersion"
        - "timeZone"
        - "messageQueueCount"
        - "decommissioned"
        - "restricted"
        - "locked"
        - "matter"
        - "relatedDeviceGroups"
        - "reachableGateways"
        - "reachableDevices"
    DeviceCommandConfirmation:
      type: object
      properties:
        deviceId:
          type: integer
        errorCode:
          type: string
        errorMessage:
          type: string
        activationTime:
          type: integer
      required:
        - "deviceId"
    DeviceGatewayFlags:
      type: object
      properties:
        timeSyncNeeded:
          type: boolean
        installationMode:
          type: boolean
        eventsAvailable:
          type: boolean
      required:
        - "timeSyncNeeded"
        - "installationMode"
        - "eventsAvailable"
    DeviceGatewayInfo:
      type: object
      properties:
        id:
          type: integer
        deviceId:
          type: integer
        gatewayId:
          type: integer
        rssi:
          type: integer
        rssiLevel:
          $ref: '#/components/schemas/RssiLevel'
        lastSeen:
          type: string
          format: date-time
        flags:
          $ref: '#/components/schemas/DeviceGatewayFlags'
        dateCreated:
          type: string
          format: date-time
        dateModified:
          type: string
          format: date-time
        deviceName:
          type: string
        deviceOrganizationId:
          type: integer
        deviceModel:
          $ref: '#/components/schemas/ModelLegacy'
      required:
        - "id"
        - "deviceId"
        - "gatewayId"
        - "rssi"
        - "rssiLevel"
        - "lastSeen"
        - "flags"
        - "deviceOrganizationId"
        - "deviceModel"
    DeviceGroup:
      type: object
      properties:
        id:
          type: integer
        organizationId:
          type: integer
        name:
          type: string
        remarks:
          type: string
        location:
          type: string
        dateCreated:
          type: string
          format: date-time
        dateModified:
          type: string
          format: date-time
        deviceList:
          type: array
          items:
            $ref: '#/components/schemas/Device'
      required:
        - "id"
        - "organizationId"
        - "deviceList"
    DeviceLegacy:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        organizationId:
          type: integer
        organizationName:
          type: string
        deviceModel:
          $ref: '#/components/schemas/ModelLegacy'
        actualFirmwareVersion:
          type: integer
        requiredFirmwareVersion:
          type: integer
        timeZone:
          type: string
        batchKey:
          type: string
          format: uuid
        batteryLevel:
          type: string
        batteryLevelReminder:
          type: string
          format: date-time
        batteryLastMeasurement:
          type: string
          format: date-time
        remarks:
          type: string
        location:
          type: string
        dateCreated:
          type: string
          format: date-time
        dateModified:
          type: string
          format: date-time
        dateAssigned:
          type: string
          format: date-time
        gatewayId:
          type: integer
        gatewayRssi:
          type: integer
        gatewayRssiLevel:
          $ref: '#/components/schemas/RssiLevel'
        gatewayLastSeen:
          type: string
          format: date-time
        gatewayLastSeenMessage:
          type: string
          format: date-time
        messageQueueCount:
          type: integer
        sequenceNumberDeviceEvents:
          type: integer
        decommissioned:
          type: boolean
        restricted:
          type: boolean
        restrictedReminder:
          type: string
          format: date-time
        minCommandStart:
          type: string
          format: date-time
        dateLastExternalSync:
          type: string
          format: date-time
        isActiveUntil:
          type: string
          format: date-time
        carouselImageUrl:
          type: string
        dateLastKeyExchange:
          type: string
          format: date-time
        dateLastKnownActivation:
          type: string
          format: date-time
        lastTimeSyncDate:
          type: string
          format: date-time
        lastTimeSyncDrift:
          type: integer
        relatedDeviceGroups:
          type: array
          items:
            $ref: '#/components/schemas/RelatedDeviceGroup'
        reachableGateways:
          type: array
          items:
            $ref: '#/components/schemas/DeviceGatewayInfo'
        reachableDevices:
          type: array
          items:
            $ref: '#/components/schemas/DeviceGatewayInfo'
      required:
        - "id"
        - "deviceModel"
        - "actualFirmwareVersion"
        - "requiredFirmwareVersion"
        - "timeZone"
        - "messageQueueCount"
        - "decommissioned"
        - "restricted"
        - "relatedDeviceGroups"
        - "reachableGateways"
        - "reachableDevices"
    DeviceLockStatus:
      type: string
      enum:
      - "LOCKED"
      - "UNLOCKED"
      - "UNKNOWN"
    DeviceSettingUnlockDirection:
      type: string
      enum:
      - "AUTO"
      - "CLOCKWISE"
      - "COUNTER_CLOCKWISE"
    EffectiveDevice:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        owner:
          $ref: '#/components/schemas/EffectiveOwner'
        model:
          $ref: '#/components/schemas/EffectiveModel'
        settings:
          $ref: '#/components/schemas/EffectiveSetting'
        features:
          $ref: '#/components/schemas/EffectiveFeature'
        gateway:
          $ref: '#/components/schemas/EffectiveGateway'
        entryTags:
          type: array
          items:
            type: string
        actualFirmwareVersion:
          type: integer
        requiredFirmwareVersion:
          type: integer
        dateCreated:
          type: string
          format: date-time
        dateModified:
          type: string
          format: date-time
        timeZone:
          type: string
        batteryLevel:
          type: string
        batteryLastMeasurement:
          type: string
          format: date-time
        isActiveUntil:
          type: string
          format: date-time
        carouselImageUrl:
          type: string
        remarks:
          type: string
        location:
          type: string
        locked:
          $ref: '#/components/schemas/DeviceLockStatus'
        lastLocked:
          type: string
          format: date-time
        matter:
          $ref: '#/components/schemas/EffectiveMatterDetails'
      required:
        - "id"
        - "owner"
        - "model"
        - "settings"
        - "features"
        - "entryTags"
        - "timeZone"
        - "locked"
        - "matter"
    EffectiveFeature:
      type: object
      properties:
        activatable:
          type: boolean
        rangeBoostMode:
          type: boolean
        remoteAccess:
          type: boolean
        backupPins:
          type: boolean
        shareAccess:
          type: boolean
        eventLog:
          type: boolean
        turnToActivate:
          type: boolean
        tailgaterProtection:
          type: boolean
        matter:
          type: boolean
        turnToBoost:
          type: boolean
        lockedStatus:
          type: boolean
        buttonAutoDisable:
          type: boolean
        powerSaveMode:
          type: boolean
        nightLock:
          type: boolean
        leaveAlert:
          type: boolean
        tamperDetection:
          type: boolean
        webKeys:
          type: boolean
        dynamicPins:
          type: boolean
        extendedEventLog:
          type: boolean
        keepActiveMode:
          type: boolean
        showRealUser:
          type: boolean
        walkInMode:
          type: boolean
        controller:
          type: boolean
      required:
        - "activatable"
        - "rangeBoostMode"
        - "remoteAccess"
        - "backupPins"
        - "shareAccess"
        - "eventLog"
        - "turnToActivate"
        - "tailgaterProtection"
        - "matter"
        - "turnToBoost"
        - "lockedStatus"
        - "buttonAutoDisable"
        - "powerSaveMode"
        - "nightLock"
        - "leaveAlert"
        - "tamperDetection"
        - "webKeys"
        - "dynamicPins"
        - "extendedEventLog"
        - "keepActiveMode"
        - "showRealUser"
        - "walkInMode"
        - "controller"
    EffectiveGateway:
      type: object
      properties:
        id:
          type: integer
        rssi:
          type: integer
        rssiLevel:
          $ref: '#/components/schemas/RssiLevel'
        lastSeen:
          type: string
          format: date-time
        name:
          type: string
      required:
        - "id"
        - "rssi"
        - "rssiLevel"
        - "lastSeen"
    EffectiveMatterDetails:
      type: object
      properties:
        manuallyProvisioned:
          type: boolean
        factoryProvisioned:
          type: boolean
      required:
        - "manuallyProvisioned"
        - "factoryProvisioned"
    EffectiveModel:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        type:
          $ref: '#/components/schemas/Type'
        description:
          type: string
      required:
        - "id"
        - "name"
        - "type"
    EffectiveOwner:
      type: object
      properties:
        organizationId:
          type: integer
        accountId:
          type: integer
        name:
          type: string
        firstName:
          type: string
        lastName:
          type: string
      required:
        - "organizationId"
    EffectiveSetting:
      type: object
      properties:
        activationTime:
          type: integer
        soundVolume:
          type: integer
        pressButtonActivation:
          type: boolean
        controllerFunctionality:
          type: boolean
        backupPinsConfigured:
          type: boolean
        acknowledged:
          type: boolean
        dateCreated:
          type: string
          format: date-time
        dateModified:
          type: string
          format: date-time
        backupPin1Name:
          type: string
        backupPin2Name:
          type: string
        backupPin3Name:
          type: string
        dateLastExternalSync:
          type: string
          format: date-time
        relayNormallyOpen:
          type: boolean
        vibrationTamperDetection:
          type: boolean
        vibrationTamperSensitivity:
          type: integer
        rotationsTamperDetection:
          type: boolean
        buttonActivationTime:
          type: integer
        pressButtonDeactivation:
          type: boolean
        rangeBoost:
          type: integer
        powerSaveMode:
          type: boolean
        turnToBoost:
          type: boolean
        lockedStatus:
          type: boolean
        turnToActivate:
          type: boolean
        tailgaterProtection:
          type: boolean
        buttonAutoDisable:
          type: boolean
        suppressDeviceEvents:
          type: boolean
        unlockDirection:
          $ref: '#/components/schemas/DeviceSettingUnlockDirection'
        boldProtocol:
          type: boolean
        matterProtocol:
          type: boolean
        faultyPinTamperDetection:
          type: integer
        walkInMode:
          type: integer
      required:
        - "activationTime"
        - "soundVolume"
        - "pressButtonActivation"
        - "controllerFunctionality"
        - "backupPinsConfigured"
        - "acknowledged"
        - "relayNormallyOpen"
        - "vibrationTamperDetection"
        - "vibrationTamperSensitivity"
        - "rotationsTamperDetection"
        - "pressButtonDeactivation"
        - "rangeBoost"
        - "powerSaveMode"
        - "turnToBoost"
        - "lockedStatus"
        - "turnToActivate"
        - "tailgaterProtection"
        - "buttonAutoDisable"
        - "suppressDeviceEvents"
        - "unlockDirection"
        - "boldProtocol"
        - "matterProtocol"
        - "faultyPinTamperDetection"
        - "walkInMode"
    ExternalId:
      type: object
      properties:
        value:
          type: string
      required:
        - "value"
    Features:
      type: object
      properties:
        rangeBoostMode:
          type: boolean
        remoteAccess:
          type: boolean
        backupPins:
          type: boolean
        shareAccess:
          type: boolean
        eventLog:
          type: boolean
        turnToActivate:
          type: boolean
        tailgaterProtection:
          type: boolean
        matter:
          type: boolean
        turnToBoost:
          type: boolean
        lockedStatus:
          type: boolean
        buttonAutoDisable:
          type: boolean
        powerSaveMode:
          type: boolean
        nightLock:
          type: boolean
        leaveAlert:
          type: boolean
        tamperDetection:
          type: boolean
        webKeys:
          type: boolean
        dynamicPins:
          type: boolean
        extendedEventLog:
          type: boolean
        keepActiveMode:
          type: boolean
        showRealUser:
          type: boolean
        walkInMode:
          type: boolean
        controller:
          type: boolean
      required:
        - "rangeBoostMode"
        - "remoteAccess"
        - "backupPins"
        - "shareAccess"
        - "eventLog"
        - "turnToActivate"
        - "tailgaterProtection"
        - "matter"
        - "turnToBoost"
        - "lockedStatus"
        - "buttonAutoDisable"
        - "powerSaveMode"
        - "nightLock"
        - "leaveAlert"
        - "tamperDetection"
        - "webKeys"
        - "dynamicPins"
        - "extendedEventLog"
        - "keepActiveMode"
        - "showRealUser"
        - "walkInMode"
        - "controller"
    FirmwareConfiguration:
      type: object
      properties:
        id:
          type: integer
        description:
          type: string
      required:
        - "id"
    IdWrap:
      type: object
      properties:
        id:
          type: integer
      required:
        - "id"
    Invitation:
      type: object
      properties:
        token:
          type: string
          format: uuid
        url:
          type: string
        expiration:
          type: string
          format: date-time
        isExpired:
          type: boolean
      required:
        - "token"
        - "url"
        - "expiration"
        - "isExpired"
    Invite:
      type: object
      properties:
        shareId:
          type: integer
        token:
          type: string
          format: uuid
      required:
        - "shareId"
    MatterDetails:
      type: object
      properties:
        provisioningQrCode:
          type: string
        manuallyProvisioned:
          type: boolean
        factoryProvisioned:
          type: boolean
      required:
        - "manuallyProvisioned"
        - "factoryProvisioned"
    Model:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        type:
          $ref: '#/components/schemas/Type'
        features:
          $ref: '#/components/schemas/Features'
        description:
          type: string
      required:
        - "id"
        - "name"
        - "type"
        - "features"
    ModelLegacy:
      type: object
      properties:
        id:
          type: integer
        deviceType:
          $ref: '#/components/schemas/Type'
        model:
          type: string
        name:
          type: string
      required:
        - "id"
        - "deviceType"
    Organization:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        personal:
          type: boolean
        restricted:
          type: boolean
        subscriptionId:
          type: string
        creatorAccountId:
          type: integer
        dateCreated:
          type: string
          format: date-time
        dateModified:
          type: string
          format: date-time
        permissions:
          $ref: '#/components/schemas/AccountPermissions'
      required:
        - "id"
        - "name"
        - "personal"
        - "restricted"
        - "permissions"
    Period:
      type: object
      properties:
        startTime:
          type: string
          format: time
        endTime:
          type: string
          format: time
    Permissions:
      type: object
      properties:
        administrate:
          type: boolean
        remoteActivate:
          type: boolean
        assignKeyfob:
          type: boolean
      required:
        - "administrate"
        - "remoteActivate"
        - "assignKeyfob"
    PersonalSettings:
      type: object
      properties:
        notifications:
          type: boolean
      required:
        - "notifications"
    Receiver:
      type: object
      properties:
        user:
          $ref: '#/components/schemas/ShareUser'
        userGroup:
          $ref: '#/components/schemas/ShareUserGroup'
    Recurrence:
      type: string
      enum:
      - "Daily"
      - "Weekly"
      - "BiWeekly"
    RelatedDeviceGroup:
      type: object
      properties:
        id:
          type: integer
        organizationId:
          type: integer
        name:
          type: string
        remarks:
          type: string
        location:
          type: string
        dateCreated:
          type: string
          format: date-time
        dateModified:
          type: string
          format: date-time
      required:
        - "id"
        - "organizationId"
    RssiLevel:
      type: string
      enum:
      - "Excellent"
      - "High"
      - "Medium"
      - "Low"
      - "Critical"
    ScheduleEntry:
      type: object
      properties:
        dayOfWeek:
          type: string
        period:
          $ref: '#/components/schemas/Period'
        recurrence:
          $ref: '#/components/schemas/Recurrence'
      required:
        - "recurrence"
    Share:
      type: object
      properties:
        id:
          type: integer
        organization:
          $ref: '#/components/schemas/SourceOrganization'
        creatorAccount:
          $ref: '#/components/schemas/Creator'
        startDate:
          type: string
          format: date
        startTime:
          type: string
          format: time
        endDate:
          type: string
          format: date
        endTime:
          type: string
          format: time
        schedule:
          type: array
          items:
            $ref: '#/components/schemas/ScheduleEntry'
        permissions:
          $ref: '#/components/schemas/Permissions'
        source:
          $ref: '#/components/schemas/Source'
        receiver:
          $ref: '#/components/schemas/Receiver'
        personalSettings:
          $ref: '#/components/schemas/PersonalSettings'
        autoRemoveAfter:
          $ref: '#/components/schemas/AutoRemove'
        autoRemoveDate:
          type: string
          format: date-time
        dateCreated:
          type: string
          format: date-time
        dateModified:
          type: string
          format: date-time
        dateValidated:
          type: string
          format: date-time
        dateRestricted:
          type: string
          format: date-time
        webKey:
          type: string
        externalId:
          type: string
      required:
        - "id"
        - "organization"
        - "permissions"
        - "source"
        - "receiver"
        - "personalSettings"
    ShareAccount:
      type: object
      properties:
        id:
          type: integer
        firstName:
          type: string
        lastName:
          type: string
        emailAddress:
          type: string
        phoneNumber:
          type: string
      required:
        - "id"
    ShareDevice:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        location:
          type: string
        remarks:
          type: string
        carouselImageUrl:
          type: string
      required:
        - "id"
    ShareDeviceGroup:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        remarks:
          type: string
        location:
          type: string
      required:
        - "id"
    ShareReceiver:
      type: object
      properties:
        userId:
          type: integer
        userGroupId:
          type: integer
    ShareSource:
      type: object
      properties:
        deviceId:
          type: integer
        deviceGroupId:
          type: integer
    ShareUser:
      type: object
      properties:
        id:
          type: integer
        firstName:
          type: string
        lastName:
          type: string
        emailAddress:
          type: string
        emailAddressVerify:
          type: boolean
        emailAddressVerified:
          type: boolean
        phoneNumber:
          type: string
        phoneNumberVerify:
          type: boolean
        phoneNumberVerified:
          type: boolean
        registered:
          type: boolean
        account:
          $ref: '#/components/schemas/ShareAccount'
        invitation:
          $ref: '#/components/schemas/UserInvitation'
      required:
        - "id"
        - "emailAddressVerify"
        - "emailAddressVerified"
        - "phoneNumberVerify"
        - "phoneNumberVerified"
        - "registered"
    ShareUserGroup:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
      required:
        - "id"
    Source:
      type: object
      properties:
        device:
          $ref: '#/components/schemas/ShareDevice'
        deviceGroup:
          $ref: '#/components/schemas/ShareDeviceGroup'
    SourceOrganization:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        personal:
          type: boolean
      required:
        - "id"
        - "personal"
    Type:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
      required:
        - "id"
    UpdateDeviceGroup:
      type: object
      properties:
        name:
          type: string
        remarks:
          type: string
        location:
          type: string
    User:
      type: object
      properties:
        id:
          type: integer
        account:
          $ref: '#/components/schemas/Account'
        organization:
          $ref: '#/components/schemas/UserOrganization'
        firstName:
          type: string
        lastName:
          type: string
        emailAddress:
          type: string
        emailAddressVerify:
          type: boolean
        emailAddressVerified:
          type: boolean
        phoneNumber:
          type: string
        phoneNumberVerify:
          type: boolean
        phoneNumberVerified:
          type: boolean
        superUser:
          type: boolean
        description:
          type: string
        remarks:
          type: string
        invitation:
          $ref: '#/components/schemas/Invitation'
        dateModified:
          type: string
          format: date-time
        dateCreated:
          type: string
          format: date-time
        externalId:
          type: string
        autoRemoveAfter:
          $ref: '#/components/schemas/AutoRemove'
        autoRemoveDate:
          type: string
          format: date-time
        userGroups:
          type: array
          items:
            $ref: '#/components/schemas/UserGroup2'
      required:
        - "id"
        - "organization"
        - "emailAddressVerify"
        - "emailAddressVerified"
        - "phoneNumberVerify"
        - "phoneNumberVerified"
        - "superUser"
        - "userGroups"
    UserGroup:
      type: object
      properties:
        id:
          type: integer
        organizationId:
          type: integer
        name:
          type: string
        description:
          type: string
        remarks:
          type: string
        dateCreated:
          type: string
          format: date-time
        dateModified:
          type: string
          format: date-time
        externalId:
          $ref: '#/components/schemas/ExternalId'
        users:
          type: array
          items:
            $ref: '#/components/schemas/UserGroupModelUser'
      required:
        - "id"
        - "organizationId"
        - "name"
        - "users"
    UserGroup2:
      type: object
      properties:
        id:
          type: integer
        organizationId:
          type: integer
        name:
          type: string
        description:
          type: string
        groupAdmin:
          type: boolean
      required:
        - "id"
        - "organizationId"
        - "name"
        - "groupAdmin"
    UserGroupModelUser:
      type: object
      properties:
        id:
          type: integer
        account:
          $ref: '#/components/schemas/Account'
        firstName:
          type: string
        lastName:
          type: string
        emailAddress:
          type: string
        emailAddressVerify:
          type: boolean
        emailAddressVerified:
          type: boolean
        phoneNumber:
          type: string
        phoneNumberVerify:
          type: boolean
        phoneNumberVerified:
          type: boolean
        superUser:
          type: boolean
        groupAdmin:
          type: boolean
        description:
          type: string
        remarks:
          type: string
        dateModified:
          type: string
          format: date-time
        dateCreated:
          type: string
          format: date-time
        externalId:
          type: string
        autoRemoveAfter:
          $ref: '#/components/schemas/AutoRemove'
        autoRemoveDate:
          type: string
          format: date-time
      required:
        - "id"
        - "emailAddressVerify"
        - "emailAddressVerified"
        - "phoneNumberVerify"
        - "phoneNumberVerified"
        - "superUser"
        - "groupAdmin"
    UserInvitation:
      type: object
      properties:
        token:
          type: string
          format: uuid
        url:
          type: string
        expiration:
          type: string
          format: date-time
        isExpired:
          type: boolean
      required:
        - "token"
        - "url"
        - "expiration"
        - "isExpired"
    UserOrganization:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        personal:
          type: boolean
        personalAccount:
          $ref: '#/components/schemas/Account'
      required:
        - "id"
        - "personal"
    WebhookTopic:
      type: string
      enum:
      - "DeviceActivationEvents"
      - "DeviceDeactivationEvents"
      - "DeviceStatusEvents"
      - "DeviceTamperEvents"
security:
  - BearerAuth: []
  - OAuth2Prod: []
  - OAuth2Staging: []
tags:
  - name: "Account API"
  - name: "Device API"
  - name: "Device Group API"
  - name: "Device Remote API"
  - name: "OAuth API"
  - name: "Organization API"
  - name: "Shares API"
  - name: "User API"
  - name: "User Group API"
  - name: "Webhooks API"
paths:
  "/v1/account":
    get:
      operationId: getAccount
      tags:
        - "Account API"
      summary: "Get current account"
      description: "Get the account that belongs to the current session"
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  firstName:
                    type: string
                  lastName:
                    type: string
                  email:
                    type: string
                  emailSuppression:
                    type: boolean
                  phone:
                    type: string
                  phoneCountryCode:
                    type: string
                  emailIsVerified:
                    type: boolean
                  language:
                    type: string
                  isSystemAccount:
                    type: boolean
                  isSupportAccount:
                    type: boolean
                  isDistributorAccount:
                    type: string
                    format: date-time
                  isSystemIntegration:
                    type: boolean
                  dateCreated:
                    type: string
                    format: date-time
                  dateModified:
                    type: string
                    format: date-time
                  datePreliminary:
                    type: string
                    format: date-time
                  dateLastAuthentication:
                    type: string
                    format: date-time
                  dateLastActivation:
                    type: string
                    format: date-time
                  personalOrganization:
                    type: object
                    properties:
                      id:
                        type: integer
                      name:
                        type: string
                      personal:
                        type: boolean
                      restricted:
                        type: boolean
                      subscriptionId:
                        type: string
                      creatorAccountId:
                        type: integer
                      dateCreated:
                        type: string
                        format: date-time
                      dateModified:
                        type: string
                        format: date-time
                      permissions:
                        $ref: '#/components/schemas/AccountPermissions'
                    required:
                      - "id"
                      - "name"
                      - "personal"
                      - "restricted"
                      - "permissions"
                  users:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                        organization:
                          type: object
                          properties:
                            id:
                              type: integer
                            name:
                              type: string
                            personal:
                              type: boolean
                            restricted:
                              type: boolean
                            subscriptionId:
                              type: string
                            creatorAccountId:
                              type: integer
                            dateCreated:
                              type: string
                              format: date-time
                            dateModified:
                              type: string
                              format: date-time
                            permissions:
                              $ref: '#/components/schemas/AccountPermissions'
                          required:
                            - "id"
                            - "name"
                            - "personal"
                            - "restricted"
                            - "permissions"
                        isSuperUser:
                          type: boolean
                        permissions:
                          type: array
                          items:
                            type: string
                      required:
                        - "id"
                        - "organization"
                        - "isSuperUser"
                        - "permissions"
                  agreements:
                    type: array
                    items:
                      type: object
                      properties:
                        agreementType:
                          type: string
                          enum:
                          - "TERMS_OF_SERVICE"
                          - "END_USER_LICENSE_AGREEMENT"
                          - "DATA_PROCESSING_AGREEMENT"
                        version:
                          type: integer
                        url:
                          type: string
                        startDate:
                          type: string
                          format: date-time
                        accepted:
                          type: boolean
                      required:
                        - "agreementType"
                        - "version"
                        - "url"
                        - "startDate"
                        - "accepted"
                  appDebugLog:
                    type: boolean
                  passwordStrength:
                    type: integer
                  securityClient:
                    type: object
                    properties:
                      clientInstanceId:
                        type: integer
                      accountId:
                        type: integer
                      organizationId:
                        type: integer
                      clientId:
                        type: integer
                      clientPermissions:
                        type: object
                        properties:
                          read:
                            type: boolean
                          events:
                            type: boolean
                          activate:
                            type: boolean
                          settings:
                            type: boolean
                          manage:
                            type: boolean
                          impersonate:
                            type: boolean
                          authorize:
                            type: boolean
                        required:
                          - "read"
                          - "events"
                          - "activate"
                          - "settings"
                          - "manage"
                          - "impersonate"
                          - "authorize"
                      clientRequirements:
                        type: object
                        properties:
                          permissionIntegration:
                            type: boolean
                        required:
                          - "permissionIntegration"
                      isImpersonated:
                        type: boolean
                    required:
                      - "clientId"
                      - "clientPermissions"
                      - "clientRequirements"
                      - "isImpersonated"
                  credentials:
                    type: array
                    items:
                      type: object
                      properties:
                        credentialType:
                          type: string
                          enum:
                          - "Google"
                          - "Apple"
                          - "Azure"
                          - "Password"
                        emailAddress:
                          type: string
                        dateCreated:
                          type: string
                          format: date-time
                        dateModified:
                          type: string
                          format: date-time
                      required:
                        - "credentialType"
                required:
                  - "id"
                  - "emailIsVerified"
                  - "isSystemAccount"
                  - "isSupportAccount"
                  - "isSystemIntegration"
                  - "users"
                  - "agreements"
                  - "appDebugLog"
                  - "credentials"
              example: |
                {"id":1,"firstName":"Jane","email":"sesam@example.com","emailSuppression":false,"phone":"+40711111298","emailIsVerified":false,"isSystemAccount":false,"isSupportAccount":false,"isSystemIntegration":false,"dateCreated":"2026-03-10T09:34:57.555376Z","users":[],"agreements":[{"agreementType":"TERMS_OF_SERVICE","version":2,"url":"/en/boldsmartlock_2021_eula.pdf","startDate":"2026-02-10T09:34:57.925095Z","accepted":false}],"appDebugLog":false,"passwordStrength":0,"securityClient":{"clientInstanceId":1,"accountId":1,"clientId":2,"clientPermissions":{"read":false,"events":false,"activate":false,"settings":false,"manage":false,"impersonate":false,"authorize":false},"clientRequirements":{"permissionIntegration":false},"isImpersonated":false},"credentials":[{"credentialType":"Password","emailAddress":"sesam@example.com","dateCreated":"2026-03-10T09:34:57.890653Z"}]}
  "/v1/account/id":
    get:
      operationId: getAccountId
      tags:
        - "Account API"
      summary: "Get current account id"
      description: "Get the account id that belongs to the current session"
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IdWrap'
              example: |
                {"id":1}
  "/v1/device-groups":
    get:
      operationId: getDeviceGroups
      tags:
        - "Device Group API"
      summary: "Get all device groups"
      description: "Get all device groups"
      parameters:
        - name: "includeDevices"
          in: query
          required: false
          schema:
            type: boolean
        - name: "organizationId"
          in: query
          required: false
          schema:
            type: integer
        - name: "search"
          in: query
          required: false
          schema:
            type: string
        - name: "sortBy"
          in: query
          required: false
          schema:
            type: string
        - name: "sortDirection"
          in: query
          required: false
          schema:
            type: string
            enum:
            - "Asc"
            - "Desc"
        - name: "offset"
          in: query
          required: false
          schema:
            type: integer
        - name: "size"
          in: query
          required: false
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DeviceGroup'
              example: |
                [{"id":1,"organizationId":29,"name":"Office 1","dateCreated":"2026-03-10T09:32:32.431339Z","deviceList":[]},{"id":2,"organizationId":29,"name":"Office 2","dateCreated":"2026-03-10T09:32:32.432527Z","deviceList":[]},{"id":3,"organizationId":29,"name":"Office 3","dateCreated":"2026-03-10T09:32:32.43303Z","deviceList":[]}]
    post:
      operationId: postDeviceGroups
      tags:
        - "Device Group API"
      summary: "Create a device group"
      description: "Create a device group"
      parameters:
        - name: "organizationId"
          in: query
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                $ref: '#/components/schemas/UpdateDeviceGroup'
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: integer
  "/v1/device-groups/{id}":
    get:
      operationId: getDeviceGroup
      tags:
        - "Device Group API"
      summary: "Get a specific device group"
      description: "Get a specific device group"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
        - name: "includeDevices"
          in: query
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeviceGroup'
              example: |
                {"id":10,"organizationId":35,"name":"Office 1","dateCreated":"2026-03-10T09:32:34.623889Z","deviceList":[]}
    put:
      operationId: putDeviceGroup
      tags:
        - "Device Group API"
      summary: "Update a device group"
      description: "Update a device group"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                $ref: '#/components/schemas/UpdateDeviceGroup'
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: integer
    delete:
      operationId: deleteDeviceGroup
      tags:
        - "Device Group API"
      summary: "Delete a device group"
      description: "Delete a device group"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
  "/v1/device-groups/{id}/devices":
    get:
      operationId: getDeviceGroupDevices
      tags:
        - "Device Group API"
      summary: "Get all devices from a group"
      description: "Get all devices from a group description description"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
        - name: "offset"
          in: query
          required: false
          schema:
            type: integer
        - name: "size"
          in: query
          required: false
          schema:
            type: integer
        - name: "name"
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Device'
              example: |
                [{"id":17,"name":"Front Desk","organizationId":45,"deviceModel":{"id":1,"name":"SX33","type":{"id":1,"name":"Lock","description":"Lock"},"features":{"rangeBoostMode":false,"remoteAccess":false,"backupPins":false,"shareAccess":false,"eventLog":false,"turnToActivate":false,"tailgaterProtection":false,"matter":false,"turnToBoost":false,"lockedStatus":false,"buttonAutoDisable":false,"powerSaveMode":false,"nightLock":false,"leaveAlert":false,"tamperDetection":false,"webKeys":false,"dynamicPins":false,"extendedEventLog":false,"keepActiveMode":false,"showRealUser":false,"walkInMode":false,"controller":false},"description":"Smart Cylinder SX"},"firmwareConfiguration":{"id":1,"description":"pcba-sx-rena-1.0"},"actualFirmwareVersion":0,"requiredFirmwareVersion":0,"timeZone":"UTC","dateCreated":"2026-03-10T09:32:38.287169Z","messageQueueCount":0,"decommissioned":false,"restricted":false,"locked":"UNKNOWN","matter":{"manuallyProvisioned":false,"factoryProvisioned":false},"relatedDeviceGroups":[],"reachableGateways":[],"reachableDevices":[]}]
    post:
      operationId: postDeviceGroupDevices
      tags:
        - "Device Group API"
      summary: "Add multiple devices to a device group"
      description: "Add multiple devices to a group"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: array
                items:
                  type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
    delete:
      operationId: deleteDeviceGroupDevices
      tags:
        - "Device Group API"
      summary: "Remove multiple devices from a device group"
      description: "Remove multiple devices from a group"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
  "/v1/device-groups/{id}/devices/{deviceId}":
    post:
      operationId: postDeviceGroupDevice
      tags:
        - "Device Group API"
      summary: "Add a device to a device group"
      description: "Add a device to a group description"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
        - name: "deviceId"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
    delete:
      operationId: deleteDeviceGroupDevice
      tags:
        - "Device Group API"
      summary: "Remove a device from a group"
      description: "Remove a device from a group"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
        - name: "deviceId"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
  "/v1/devices":
    get:
      operationId: getDevices
      tags:
        - "Device API"
      summary: "Find devices"
      description: "Find devices"
      parameters:
        - name: "offset"
          in: query
          required: false
          schema:
            type: integer
        - name: "size"
          in: query
          required: false
          schema:
            type: integer
        - name: "deviceId"
          in: query
          required: false
          schema:
            type: integer
        - name: "organizationId"
          in: query
          required: false
          schema:
            type: integer
        - name: "organizationName"
          in: query
          required: false
          schema:
            type: string
        - name: "deviceGroupId"
          in: query
          required: false
          schema:
            type: integer
        - name: "search"
          in: query
          required: false
          schema:
            type: string
        - name: "name"
          in: query
          required: false
          schema:
            type: string
        - name: "location"
          in: query
          required: false
          schema:
            type: string
        - name: "remarks"
          in: query
          required: false
          schema:
            type: string
        - name: "deviceType"
          in: query
          required: false
          schema:
            type: string
        - name: "includeGroups"
          in: query
          required: false
          schema:
            type: boolean
        - name: "includeReachableGateways"
          in: query
          required: false
          schema:
            type: boolean
        - name: "includeReachableDevices"
          in: query
          required: false
          schema:
            type: boolean
        - name: "includeDecommissioned"
          in: query
          required: false
          schema:
            type: boolean
        - name: "includeUninstalled"
          in: query
          required: false
          schema:
            type: boolean
        - name: "sortBy"
          in: query
          required: false
          schema:
            type: string
        - name: "sortDirection"
          in: query
          required: false
          schema:
            type: string
            enum:
            - "Asc"
            - "Desc"
        - name: "filter"
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/DeviceLegacy'
              example: |
                [{"id":49,"name":"Lock1","organizationId":25,"organizationName":"","deviceModel":{"id":1,"deviceType":{"id":1,"name":"Lock","description":"Lock"},"model":"Smart Cylinder SX","name":"Smart Cylinder SX"},"actualFirmwareVersion":0,"requiredFirmwareVersion":95,"timeZone":"UTC","dateCreated":"2026-03-10T09:42:20.051466Z","dateModified":"2026-03-10T09:42:20.052936Z","messageQueueCount":0,"decommissioned":false,"restricted":false,"relatedDeviceGroups":[],"reachableGateways":[],"reachableDevices":[]},{"id":50,"name":"Lock2","organizationId":25,"organizationName":"","deviceModel":{"id":1,"deviceType":{"id":1,"name":"Lock","description":"Lock"},"model":"Smart Cylinder SX","name":"Smart Cylinder SX"},"actualFirmwareVersion":0,"requiredFirmwareVersion":0,"timeZone":"UTC","dateCreated":"2026-03-10T09:42:20.052284Z","messageQueueCount":0,"decommissioned":false,"restricted":false,"relatedDeviceGroups":[],"reachableGateways":[],"reachableDevices":[]}]
  "/v1/devices/{device-id}":
    get:
      operationId: getDevice
      tags:
        - "Device API"
      summary: "Get specific device"
      description: "Get specific device"
      parameters:
        - name: "device-id"
          in: path
          required: true
          schema:
            type: integer
        - name: "includeReachableGateways"
          in: query
          required: false
          schema:
            type: boolean
        - name: "includeReachableDevices"
          in: query
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeviceLegacy'
              example: |
                {"id":57,"name":"Lock1","organizationId":29,"organizationName":"","deviceModel":{"id":1,"deviceType":{"id":1,"name":"Lock","description":"Lock"},"model":"Smart Cylinder SX","name":"Smart Cylinder SX"},"actualFirmwareVersion":0,"requiredFirmwareVersion":95,"timeZone":"UTC","dateCreated":"2026-03-10T09:42:21.974754Z","dateModified":"2026-03-10T09:42:21.976097Z","messageQueueCount":0,"decommissioned":false,"restricted":false,"relatedDeviceGroups":[],"reachableGateways":[],"reachableDevices":[]}
  "/v1/devices/{device-id}/details":
    put:
      operationId: putDeviceDetails
      tags:
        - "Device API"
      summary: "Set a device location and remarks"
      description: "Sets the location and remarks of a device."
      parameters:
        - name: "device-id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  location:
                    type: string
                  remarks:
                    type: string
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
  "/v1/devices/{device-id}/name":
    put:
      operationId: putDeviceName
      tags:
        - "Device API"
      summary: "Set a device name"
      description: "Sets the name of a device. Organization-SuperUsers and Device-administrators can set updateForEverybody to 'true'. Everybody else should call the method with 'false', and leaving it empty will assume 'true' for backwards compatibility"
      parameters:
        - name: "device-id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  name:
                    type: string
                  updateForEverybody:
                    type: boolean
                required:
                  - "updateForEverybody"
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
  "/v1/devices/{device-id}/remote-activation":
    post:
      operationId: postDeviceRemoteActivation
      tags:
        - "Device Remote API"
      summary: "Remote activate a device"
      description: |
        This method allows you to remotely activate a device, using a gateway. 
        The status of the server-call and the lock-activation are displayed differently. If the server 
        returns a 200, that means that the server-call has succeeded. The result of the lock-activation is 
        logged in the body of the return object.
      parameters:
        - name: "device-id"
          in: path
          required: true
          schema:
            type: integer
        - name: "nearby"
          in: query
          required: false
          schema:
            type: boolean
        - name: "uuid"
          in: query
          required: false
          schema:
            type: string
            format: uuid
        - name: "language"
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeviceCommandConfirmation'
              example: |
                {"deviceId":20,"errorCode":"OK","errorMessage":"OK"}
  "/v1/devices/{device-id}/remote-deactivation":
    post:
      operationId: postDeviceRemoteDeactivation
      tags:
        - "Device Remote API"
      summary: "Remote deactivate a device"
      description: "This method allows you to remotely deactivate a device, using a gateway. This is the logical opposite of /remote-activation"
      parameters:
        - name: "device-id"
          in: path
          required: true
          schema:
            type: integer
        - name: "nearby"
          in: query
          required: false
          schema:
            type: boolean
        - name: "uuid"
          in: query
          required: false
          schema:
            type: string
            format: uuid
        - name: "language"
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: "All ok"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeviceCommandConfirmation'
  "/v1/organization":
    get:
      operationId: getOrganization
      tags:
        - "Organization API"
      summary: "Get current organization"
      description: "Get the organization that belongs to the current session"
      responses:
        "200":
          description: "All ok, returned found account"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Organization'
  "/v1/organizations/{id}":
    get:
      operationId: getOrganization
      tags:
        - "Organization API"
      summary: "Get organization"
      description: "Get a specific organization"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Organization'
              example: |
                {"id":73,"name":"Organization","personal":true,"restricted":false,"dateCreated":"2026-03-10T09:32:57.363979Z","permissions":{"rangeBoostMode":false,"unlimitedUsers":false,"remoteAccess":false,"backupPins":false,"shareAccess":false,"eventLog":false,"turnToActivate":false,"tailgaterProtection":false,"matter":false,"turnToBoost":false,"lockedStatus":false,"buttonAutoDisable":false,"powerSaveMode":false,"nightLock":false,"leaveAlert":false,"tamperDetection":false,"webKeys":false,"dynamicPins":false,"extendedEventLog":false,"keepActiveMode":false,"showRealUser":false,"portal":false,"deviceGroups":false,"userGroups":false,"temporaryShares":false,"managedClickers":false,"importUsers":false,"exportEvents":false,"userInviteEmail":false,"userInviteSms":false,"userInviteWhatsapp":false,"integration":false,"customClient":false,"eventWebhooks":false,"autoEmailMatch":false,"requireEmailMatch":false,"emailMatchCredentialFilter":false,"nfcActivationTag":false,"walkInMode":false,"createOrganizations":false}}
    put:
      operationId: putOrganization
      tags:
        - "Organization API"
      summary: "Update organization details"
      description: "Change the details of an organization. <br/> Only fields that are defined in the PUT method will be updated, all other fields will be be untouched. Setting a handshake can only by done by administrators, while setting a subscription can also by done by support"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  name:
                    type: string
                  subscriptionId:
                    type: string
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: integer
              example: |
                {"id":90}
  "/v1/user-groups":
    get:
      operationId: getUserGroups
      tags:
        - "User Group API"
      summary: "Get users groups"
      description: "Get users groups description"
      parameters:
        - name: "includeUsers"
          in: query
          required: false
          schema:
            type: boolean
        - name: "search"
          in: query
          required: false
          schema:
            type: string
        - name: "organizationId"
          in: query
          required: false
          schema:
            type: integer
        - name: "sortBy"
          in: query
          required: false
          schema:
            type: string
        - name: "sortDirection"
          in: query
          required: false
          schema:
            type: string
            enum:
            - "Asc"
            - "Desc"
        - name: "offset"
          in: query
          required: false
          schema:
            type: integer
        - name: "size"
          in: query
          required: false
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/UserGroup'
              example: |
                [{"id":1,"organizationId":1,"name":"Group1","description":"","dateCreated":"2026-03-10T09:32:05.598979Z","users":[]},{"id":2,"organizationId":1,"name":"Group2","description":"","dateCreated":"2026-03-10T09:32:05.600065Z","users":[]},{"id":3,"organizationId":1,"name":"Group3","description":"","dateCreated":"2026-03-10T09:32:05.600786Z","users":[]}]
    post:
      operationId: postUserGroups
      tags:
        - "User Group API"
      summary: "Create a user group"
      description: "Create a user group description"
      parameters:
        - name: "organizationId"
          in: query
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  name:
                    type: string
                  description:
                    type: string
                  remarks:
                    type: string
                  externalId:
                    $ref: '#/components/schemas/ExternalId'
                required:
                  - "name"
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: integer
  "/v1/user-groups/{id}":
    get:
      operationId: getUserGroup
      tags:
        - "User Group API"
      summary: "Get a specific user group"
      description: "Get a specific user group description"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
        - name: "includeUsers"
          in: query
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserGroup'
              example: |
                {"id":16,"organizationId":6,"name":"Group1","description":"","dateCreated":"2026-03-10T09:32:09.185034Z","users":[]}
    put:
      operationId: putUserGroup
      tags:
        - "User Group API"
      summary: "Update a user group"
      description: "Update a user group description"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  name:
                    type: string
                  description:
                    type: string
                  remarks:
                    type: string
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: integer
    delete:
      operationId: deleteUserGroup
      tags:
        - "User Group API"
      summary: "Delete"
      description: "Delete a user group"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
  "/v1/user-groups/{id}/users":
    post:
      operationId: postUserGroupUsers
      tags:
        - "User Group API"
      summary: "Add multiple users to a group"
      description: "Add multiple users to a group with group admin flag"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AddUserGroupUser'
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
    put:
      operationId: putUserGroupUsers
      tags:
        - "User Group API"
      summary: "Update users in a group"
      description: "Update the groupAdmin flag for multiple users in a group"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/AddUserGroupUser'
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
    delete:
      operationId: deleteUserGroupUsers
      tags:
        - "User Group API"
      summary: "Remove multiple users from a group"
      description: "Remove multiple users from a group"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
  "/v1/user-groups/{id}/users/{userId}":
    post:
      operationId: postUserGroupUser
      tags:
        - "User Group API"
      summary: "Add a user to a group"
      description: "Add a user to a group description"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
        - name: "userId"
          in: path
          required: true
          schema:
            type: integer
        - name: "groupAdmin"
          in: query
          required: false
          schema:
            type: boolean
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
    delete:
      operationId: deleteUserGroupUser
      tags:
        - "User Group API"
      summary: "Remove a user from a group"
      description: "Remove a user from a group"
      parameters:
        - name: "id"
          in: path
          required: true
          schema:
            type: integer
        - name: "userId"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
  "/v1/web-keys/{uuid}":
    get:
      operationId: getWebKey
      tags:
        - "Shares API"
      summary: "Get a web key"
      description: "Get a web key"
      parameters:
        - name: "uuid"
          in: path
          required: true
          schema:
            type: string
        - name: "language"
          in: query
          required: false
          schema:
            type: string
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              example: |
                {"organizationName":"WebKeyOrg","devices":[{"name":"Lock","carouselImageUrl":"https://resources.boldsmartlock.com/carousel-device-images/door_1.jpg","remarks":"Remarks","location":"Bold Office","batteryLevel":"Critical","batteryLastMeasurement":"2025-03-19T13:52:00Z","powerSaveMode":false,"isConnected":false,"activateUrl":"https://staging.boldsmartlock.com/v1/devices/2/remote-activation?uuid=bd097b9b-6d94-4f2c-b87f-06ac82bf3ada"}],"startDate":"2026-03-10","startTime":"09:35:57","endDate":"2026-03-15","endTime":"09:35:57","error":"NoAccessYet"}
  "/v2/devices":
    get:
      operationId: getDevicesV2
      tags:
        - "Device API"
      summary: "Find devices (v2)"
      description: "Find devices in EffectiveDevice format"
      parameters:
        - name: "offset"
          in: query
          required: false
          schema:
            type: integer
        - name: "size"
          in: query
          required: false
          schema:
            type: integer
        - name: "deviceId"
          in: query
          required: false
          schema:
            type: integer
        - name: "organizationId"
          in: query
          required: false
          schema:
            type: integer
        - name: "organizationName"
          in: query
          required: false
          schema:
            type: string
        - name: "deviceGroupId"
          in: query
          required: false
          schema:
            type: integer
        - name: "search"
          in: query
          required: false
          schema:
            type: string
        - name: "name"
          in: query
          required: false
          schema:
            type: string
        - name: "location"
          in: query
          required: false
          schema:
            type: string
        - name: "remarks"
          in: query
          required: false
          schema:
            type: string
        - name: "deviceType"
          in: query
          required: false
          schema:
            type: string
        - name: "includeGroups"
          in: query
          required: false
          schema:
            type: boolean
        - name: "includeReachableGateways"
          in: query
          required: false
          schema:
            type: boolean
        - name: "includeReachableDevices"
          in: query
          required: false
          schema:
            type: boolean
        - name: "includeDecommissioned"
          in: query
          required: false
          schema:
            type: boolean
        - name: "includeUninstalled"
          in: query
          required: false
          schema:
            type: boolean
        - name: "sortBy"
          in: query
          required: false
          schema:
            type: string
        - name: "sortDirection"
          in: query
          required: false
          schema:
            type: string
            enum:
            - "Asc"
            - "Desc"
        - name: "filter"
          in: query
          required: false
          schema:
            type: array
            items:
              type: string
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/EffectiveDevice'
              example: |
                [{"id":188,"name":"Lock1","owner":{"organizationId":93,"accountId":127,"name":""},"model":{"id":1,"name":"SX33","type":{"id":1,"name":"Lock","description":"Lock"},"description":"Smart Cylinder SX"},"settings":{"activationTime":5,"soundVolume":10,"pressButtonActivation":true,"controllerFunctionality":false,"backupPinsConfigured":false,"acknowledged":true,"relayNormallyOpen":true,"vibrationTamperDetection":false,"vibrationTamperSensitivity":50,"rotationsTamperDetection":false,"buttonActivationTime":0,"pressButtonDeactivation":false,"rangeBoost":0,"powerSaveMode":false,"turnToBoost":false,"lockedStatus":false,"turnToActivate":false,"tailgaterProtection":false,"buttonAutoDisable":false,"suppressDeviceEvents":false,"unlockDirection":"AUTO","boldProtocol":true,"matterProtocol":false,"faultyPinTamperDetection":0,"walkInMode":0},"features":{"activatable":true,"rangeBoostMode":false,"remoteAccess":false,"backupPins":false,"shareAccess":false,"eventLog":false,"turnToActivate":false,"tailgaterProtection":false,"matter":false,"turnToBoost":false,"lockedStatus":false,"buttonAutoDisable":false,"powerSaveMode":false,"nightLock":false,"leaveAlert":false,"tamperDetection":false,"webKeys":false,"dynamicPins":false,"extendedEventLog":false,"keepActiveMode":false,"showRealUser":false,"walkInMode":false,"controller":false},"entryTags":[],"actualFirmwareVersion":0,"requiredFirmwareVersion":95,"dateCreated":"2026-03-10T09:42:51.995358Z","dateModified":"2026-03-10T09:42:51.996623Z","timeZone":"UTC","locked":"UNKNOWN","matter":{"manuallyProvisioned":false,"factoryProvisioned":false}},{"id":189,"name":"Lock2","owner":{"organizationId":93,"accountId":127,"name":""},"model":{"id":1,"name":"SX33","type":{"id":1,"name":"Lock","description":"Lock"},"description":"Smart Cylinder SX"},"settings":{"activationTime":5,"soundVolume":10,"pressButtonActivation":true,"controllerFunctionality":false,"backupPinsConfigured":false,"acknowledged":true,"relayNormallyOpen":true,"vibrationTamperDetection":false,"vibrationTamperSensitivity":50,"rotationsTamperDetection":false,"buttonActivationTime":0,"pressButtonDeactivation":false,"rangeBoost":0,"powerSaveMode":false,"turnToBoost":false,"lockedStatus":false,"turnToActivate":false,"tailgaterProtection":false,"buttonAutoDisable":false,"suppressDeviceEvents":false,"unlockDirection":"AUTO","boldProtocol":true,"matterProtocol":false,"faultyPinTamperDetection":0,"walkInMode":0},"features":{"activatable":true,"rangeBoostMode":false,"remoteAccess":false,"backupPins":false,"shareAccess":false,"eventLog":false,"turnToActivate":false,"tailgaterProtection":false,"matter":false,"turnToBoost":false,"lockedStatus":false,"buttonAutoDisable":false,"powerSaveMode":false,"nightLock":false,"leaveAlert":false,"tamperDetection":false,"webKeys":false,"dynamicPins":false,"extendedEventLog":false,"keepActiveMode":false,"showRealUser":false,"walkInMode":false,"controller":false},"entryTags":[],"actualFirmwareVersion":0,"requiredFirmwareVersion":0,"dateCreated":"2026-03-10T09:42:51.99606Z","timeZone":"UTC","locked":"UNKNOWN","matter":{"manuallyProvisioned":false,"factoryProvisioned":false}}]
  "/v2/devices/{device-id}":
    get:
      operationId: getDeviceV2
      tags:
        - "Device API"
      summary: "Get specific device (v2)"
      description: "Get specific device in EffectiveDevice format"
      parameters:
        - name: "device-id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EffectiveDevice'
              example: |
                {"id":200,"name":"Lock1","owner":{"organizationId":99,"accountId":136,"name":""},"model":{"id":1,"name":"SX33","type":{"id":1,"name":"Lock","description":"Lock"},"description":"Smart Cylinder SX"},"settings":{"activationTime":5,"soundVolume":10,"pressButtonActivation":true,"controllerFunctionality":false,"backupPinsConfigured":false,"acknowledged":true,"relayNormallyOpen":true,"vibrationTamperDetection":false,"vibrationTamperSensitivity":50,"rotationsTamperDetection":false,"buttonActivationTime":0,"pressButtonDeactivation":false,"rangeBoost":0,"powerSaveMode":false,"turnToBoost":false,"lockedStatus":false,"turnToActivate":false,"tailgaterProtection":false,"buttonAutoDisable":false,"suppressDeviceEvents":false,"unlockDirection":"AUTO","boldProtocol":true,"matterProtocol":false,"faultyPinTamperDetection":0,"walkInMode":0},"features":{"activatable":true,"rangeBoostMode":false,"remoteAccess":false,"backupPins":false,"shareAccess":false,"eventLog":false,"turnToActivate":false,"tailgaterProtection":false,"matter":false,"turnToBoost":false,"lockedStatus":false,"buttonAutoDisable":false,"powerSaveMode":false,"nightLock":false,"leaveAlert":false,"tamperDetection":false,"webKeys":false,"dynamicPins":false,"extendedEventLog":false,"keepActiveMode":false,"showRealUser":false,"walkInMode":false,"controller":false},"entryTags":[],"actualFirmwareVersion":0,"requiredFirmwareVersion":95,"dateCreated":"2026-03-10T09:42:54.928415Z","dateModified":"2026-03-10T09:42:54.929543Z","timeZone":"UTC","locked":"UNKNOWN","matter":{"manuallyProvisioned":false,"factoryProvisioned":false}}
  "/v2/oauth/revoke":
    post:
      operationId: postOauthRevokeV2
      tags:
        - "OAuth API"
      summary: "OAuth token revocation"
      description: "Logs out a user by revoking an OAuth token as per <a href='https://datatracker.ietf.org/doc/html/rfc7009#section-2'>ietf rfc7009</a>."
      requestBody:
        required: false
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                grant_type:
                  type: string
                client_id:
                  type: string
                client_secret:
                  type: string
                username:
                  type: string
                password:
                  type: string
                scope:
                  type: string
                mfa_token:
                  type: string
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              example: |
                {"code":"2530c40b-0e57-4858-a92c-bbeb4f814a6c","expiration":"2026-03-10T09:42:49.242594122Z","accountId":53,"accountCreated":false}
  "/v2/oauth/revoke-all":
    post:
      operationId: postOauthRevokeAllV2
      tags:
        - "OAuth API"
      summary: "Revoke OAuth Authentication"
      description: "Logs out a user by revoking all their tokens"
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              example: |
                {}
  "/v2/oauth/token":
    post:
      operationId: postOauthTokenV2
      tags:
        - "OAuth API"
      summary: "OAuth Authentication"
      description: "OAuth2 authentication as per <a href='https://oauth.net/2/'>OAuth 2.0</a>. Keep in mind, grant_type 'password' is deprecated and we'll remove it completely in th near future."
      requestBody:
        required: false
        content:
          application/x-www-form-urlencoded:
            schema:
              type: object
              properties:
                grant_type:
                  type: string
                client_id:
                  type: string
                client_secret:
                  type: string
                username:
                  type: string
                password:
                  type: string
                scope:
                  type: string
                mfa_token:
                  type: string
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              example: |
                {"access_token":"9e01439a-20d9-40b9-ae0c-fadec8b8504a","refresh_token":"f2e59b9e-e195-4d32-8bec-bccf0c6ca153","token_type":"Bearer","expires_in":86400,"account_id":49}
  "/v2/shares":
    get:
      operationId: getSharesV2
      tags:
        - "Shares API"
      summary: "Get"
      description: "Get all shares of an organization"
      parameters:
        - name: "deviceGroupIds"
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
        - name: "deviceIds"
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
        - name: "shareWithOrganizationIds"
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
        - name: "userGroupIds"
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
        - name: "userIds"
          in: query
          required: false
          schema:
            type: array
            items:
              type: integer
        - name: "includeIndirect"
          in: query
          required: false
          schema:
            type: boolean
        - name: "organizationId"
          in: query
          required: false
          schema:
            type: integer
        - name: "date"
          in: query
          required: false
          schema:
            type: string
            format: date
        - name: "search"
          in: query
          required: false
          schema:
            type: string
        - name: "sortBy"
          in: query
          required: false
          schema:
            type: string
        - name: "sortDirection"
          in: query
          required: false
          schema:
            type: string
            enum:
            - "Asc"
            - "Desc"
        - name: "webKey"
          in: query
          required: false
          schema:
            type: boolean
        - name: "offset"
          in: query
          required: false
          schema:
            type: integer
        - name: "size"
          in: query
          required: false
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Share'
              example: |
                [{"id":1,"organization":{"id":1,"name":"MyOrg","personal":true},"creatorAccount":{"id":1},"schedule":[{"dayOfWeek":"Monday","recurrence":"Weekly"}],"permissions":{"administrate":true,"remoteActivate":true,"assignKeyfob":true},"source":{"device":{"id":1,"name":"Lock"}},"receiver":{"user":{"id":2,"emailAddressVerify":false,"emailAddressVerified":false,"phoneNumber":"+40711111299","phoneNumberVerify":false,"phoneNumberVerified":false,"registered":true,"account":{"id":2,"emailAddress":"recipient@example.com","phoneNumber":"+40711111299"}}},"personalSettings":{"notifications":false},"dateCreated":"2026-03-10T09:33:26.615424Z"}]
    post:
      operationId: postSharesV2
      tags:
        - "Shares API"
      summary: "Create a share"
      description: "Create a share"
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  organizationId:
                    type: integer
                  startDate:
                    type: string
                    format: date
                  startTime:
                    type: string
                    format: time
                  endDate:
                    type: string
                    format: date
                  endTime:
                    type: string
                    format: time
                  schedule:
                    type: array
                    items:
                      $ref: '#/components/schemas/ScheduleEntry'
                  permissions:
                    $ref: '#/components/schemas/Permissions'
                  source:
                    $ref: '#/components/schemas/ShareSource'
                  receiver:
                    $ref: '#/components/schemas/ShareReceiver'
                  personalSettings:
                    $ref: '#/components/schemas/PersonalSettings'
                required:
                  - "organizationId"
                  - "permissions"
                  - "source"
                  - "receiver"
                  - "personalSettings"
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Invite'
              example: |
                {"shareId":3}
  "/v2/shares/{share-id}":
    get:
      operationId: getShareV2
      tags:
        - "Shares API"
      summary: "Get Share"
      description: "Get the share with a specific id."
      parameters:
        - name: "share-id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Share'
              example: |
                {"id":1,"organization":{"id":1,"name":"MyOrg","personal":true},"creatorAccount":{"id":1},"schedule":[{"dayOfWeek":"Monday","recurrence":"Weekly"}],"permissions":{"administrate":true,"remoteActivate":true,"assignKeyfob":true},"source":{"device":{"id":1,"name":"Lock"}},"receiver":{"user":{"id":2,"emailAddressVerify":false,"emailAddressVerified":false,"phoneNumber":"+40711111299","phoneNumberVerify":false,"phoneNumberVerified":false,"registered":true,"account":{"id":2,"emailAddress":"recipient@example.com","phoneNumber":"+40711111299"}}},"personalSettings":{"notifications":false},"dateCreated":"2026-03-10T09:33:34.236112Z"}
    put:
      operationId: putShareV2
      tags:
        - "Shares API"
      summary: "Update a share"
      description: "Update a share"
      parameters:
        - name: "share-id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  startDate:
                    type: string
                    format: date
                  startTime:
                    type: string
                    format: time
                  endDate:
                    type: string
                    format: date
                  endTime:
                    type: string
                    format: time
                  schedule:
                    type: array
                    items:
                      $ref: '#/components/schemas/ScheduleEntry'
                  permissions:
                    $ref: '#/components/schemas/Permissions'
                  source:
                    $ref: '#/components/schemas/ShareSource'
                  receiver:
                    $ref: '#/components/schemas/ShareReceiver'
                  personalSettings:
                    $ref: '#/components/schemas/PersonalSettings'
                  autoRemoveAfter:
                    $ref: '#/components/schemas/AutoRemove'
                required:
                  - "permissions"
                  - "personalSettings"
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Invite'
              example: |
                {"shareId":1}
    delete:
      operationId: deleteShareV2
      tags:
        - "Shares API"
      summary: "Delete a share"
      description: "Delete a share"
      parameters:
        - name: "share-id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
  "/v2/shares/{share-id}/name":
    put:
      operationId: putShareNameV2
      tags:
        - "Shares API"
      summary: "Update a share name"
      description: "Update a share name."
      parameters:
        - name: "share-id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  user:
                    type: object
                    properties:
                      firstName:
                        type: string
                      lastName:
                        type: string
                    required:
                      - "firstName"
                      - "lastName"
                  userGroup:
                    type: object
                    properties:
                      name:
                        type: string
                    required:
                      - "name"
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              example: |
                {}
  "/v2/shares/{share-id}/web-key":
    post:
      operationId: postShareWebKeyV2
      tags:
        - "Shares API"
      summary: "Create a web key"
      description: "Create a web key"
      parameters:
        - name: "share-id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
  "/v2/users":
    get:
      operationId: getUsersV2
      tags:
        - "User API"
      summary: "Get users"
      description: "Get a list of users based on specified parameters."
      parameters:
        - name: "search"
          in: query
          required: false
          schema:
            type: string
        - name: "organizationId"
          in: query
          required: false
          schema:
            type: integer
        - name: "userGroupId"
          in: query
          required: false
          schema:
            type: integer
        - name: "accountId"
          in: query
          required: false
          schema:
            type: integer
        - name: "externalId"
          in: query
          required: false
          schema:
            type: string
        - name: "client"
          in: query
          required: false
          schema:
            type: string
        - name: "superUser"
          in: query
          required: false
          schema:
            type: boolean
        - name: "invitationPending"
          in: query
          required: false
          schema:
            type: boolean
        - name: "invitationExpired"
          in: query
          required: false
          schema:
            type: boolean
        - name: "includeGroups"
          in: query
          required: false
          schema:
            type: boolean
        - name: "sortBy"
          in: query
          required: false
          schema:
            type: string
        - name: "sortDirection"
          in: query
          required: false
          schema:
            type: string
            enum:
            - "Asc"
            - "Desc"
        - name: "offset"
          in: query
          required: false
          schema:
            type: integer
        - name: "size"
          in: query
          required: false
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'
              example: |
                [{"id":1,"account":{"id":1,"firstName":"Anna"},"organization":{"id":1,"name":"Personal Account 1","personal":true,"personalAccount":{"id":1,"firstName":"Anna"}},"firstName":"Annabel","emailAddressVerify":false,"emailAddressVerified":false,"phoneNumberVerify":false,"phoneNumberVerified":false,"superUser":true,"dateCreated":"2026-03-10T09:37:56.927928Z","userGroups":[]},{"id":2,"organization":{"id":1,"name":"Personal Account 1","personal":true,"personalAccount":{"id":1,"firstName":"Anna"}},"firstName":"Astrid","emailAddressVerify":false,"emailAddressVerified":false,"phoneNumberVerify":false,"phoneNumberVerified":false,"superUser":false,"dateCreated":"2026-03-10T09:37:56.931202Z","userGroups":[]},{"id":3,"organization":{"id":1,"name":"Personal Account 1","personal":true,"personalAccount":{"id":1,"firstName":"Anna"}},"firstName":"Beatrice","emailAddressVerify":false,"emailAddressVerified":false,"phoneNumberVerify":false,"phoneNumberVerified":false,"superUser":false,"dateCreated":"2026-03-10T09:37:56.932417Z","userGroups":[]}]
    post:
      operationId: postUsersV2
      tags:
        - "User API"
      summary: "Create user"
      description: "Create a user for an organization"
      parameters:
        - name: "groupAdmin"
          in: query
          required: false
          schema:
            type: boolean
        - name: "userGroupId"
          in: query
          required: false
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  organizationId:
                    type: integer
                  firstName:
                    type: string
                  lastName:
                    type: string
                  phoneNumber:
                    type: string
                  phoneNumberVerify:
                    type: boolean
                  emailAddress:
                    type: string
                  emailAddressVerify:
                    type: boolean
                  description:
                    type: string
                  remarks:
                    type: string
                  superUser:
                    type: boolean
                  externalId:
                    type: string
                  invitation:
                    type: object
                    properties:
                      language:
                        type: string
                      expiration:
                        type: string
                        format: date-time
                      sendEmail:
                        type: boolean
                      sendSms:
                        type: boolean
                  autoRemoveAfter:
                    $ref: '#/components/schemas/AutoRemove'
                  autoEmailMatch:
                    type: boolean
                  requireEmailMatch:
                    type: boolean
                  authOrganizationId:
                    type: string
                  emailMatchCredentialFilter:
                    type: boolean
                required:
                  - "organizationId"
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
                properties:
                  userId:
                    type: integer
                  invitation:
                    type: object
                    properties:
                      url:
                        type: string
                      expiration:
                        type: string
                        format: date-time
                    required:
                      - "url"
                      - "expiration"
                  token:
                    type: string
                    format: uuid
                required:
                  - "userId"
              example: |
                {"userId":8,"invitation":{"url":"https://invite-staging.boldsmartlock.com/4e3ce3ac-a8d4-4c0a-8f2b-46da2fae8398","expiration":"2026-03-17T09:38:37.991821898Z"},"token":"4e3ce3ac-a8d4-4c0a-8f2b-46da2fae8398"}
    put:
      operationId: putUsersV2
      tags:
        - "User API"
      summary: "Import users"
      description: "Import users with CSV"
      parameters:
        - name: "organizationId"
          in: query
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              example: |
                [{"message":"Invalid email address charlie-example.com"}]
  "/v2/users/{user-Id}":
    put:
      operationId: putUserV2
      tags:
        - "User API"
      summary: "Update user"
      description: "Update a specific user based on Id"
      parameters:
        - name: "user-Id"
          in: path
          required: true
          schema:
            type: integer
        - name: "groupAdmin"
          in: query
          required: false
          schema:
            type: boolean
        - name: "userGroupId"
          in: query
          required: false
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  firstName:
                    type: string
                  lastName:
                    type: string
                  phoneNumber:
                    type: string
                  phoneNumberVerify:
                    type: boolean
                  emailAddress:
                    type: string
                  emailAddressVerify:
                    type: boolean
                  superUser:
                    type: boolean
                  clientId:
                    type: integer
                  externalId:
                    type: string
                  description:
                    type: string
                  remarks:
                    type: string
                  autoRemoveAfter:
                    $ref: '#/components/schemas/AutoRemove'
                  autoEmailMatch:
                    type: boolean
                  requireEmailMatch:
                    type: boolean
                  authOrganizationId:
                    type: string
                  emailMatchCredentialFilter:
                    type: boolean
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: integer
  "/v2/users/{user-Id}/invitation":
    put:
      operationId: putUserInvitationV2
      tags:
        - "User API"
      summary: "Update user invitation"
      description: "Update a specific user invitation based on Id"
      parameters:
        - name: "user-Id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  language:
                    type: string
                  expiration:
                    type: string
                    format: date-time
                  emailAddress:
                    type: string
                  sendEmail:
                    type: boolean
                  phoneNumber:
                    type: string
                  sendSms:
                    type: boolean
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IdWrap'
              example: |
                {"id":5}
  "/v2/users/{user-id}":
    get:
      operationId: getUserV2
      tags:
        - "User API"
      summary: "Get user"
      description: "Get a specific user based on ID"
      parameters:
        - name: "user-id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
              example: |
                {"id":4,"account":{"id":1,"firstName":"Anna"},"organization":{"id":2,"name":"Business Account","personal":false},"firstName":"Annabel HR","emailAddressVerify":false,"emailAddressVerified":false,"phoneNumberVerify":false,"phoneNumberVerified":false,"superUser":true,"dateCreated":"2026-03-10T09:38:13.474997Z","userGroups":[]}
    delete:
      operationId: deleteUserV2
      tags:
        - "User API"
      summary: "Delete user"
      description: "Delete a specific user based on ID"
      parameters:
        - name: "user-id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
  "/v2/users/{user-id}/impersonate":
    post:
      operationId: postUserImpersonateV2
      tags:
        - "User API"
      summary: "Impersonate user"
      description: "Allow businesses to create an OAuth Grant on behalf of one of their users"
      parameters:
        - name: "user-id"
          in: path
          required: true
          schema:
            type: integer
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  client:
                    type: string
                  scope:
                    type: string
                required:
                  - "client"
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    format: uuid
                  expiration:
                    type: string
                    format: date-time
  "/v2/webhooks":
    get:
      operationId: getWebhooksV2
      tags:
        - "Webhooks API"
      summary: "Find all webhooks"
      description: "Find all webhooks for this organization. Sensitive information will not be returned."
      parameters:
        - name: "organizationId"
          in: query
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                    deviceIds:
                      type: array
                      items:
                        type: integer
                    deviceGroupIds:
                      type: array
                      items:
                        type: integer
                    webhookUrl:
                      type: string
                    topics:
                      type: array
                      items:
                        $ref: '#/components/schemas/WebhookTopic'
                  required:
                    - "id"
                    - "deviceIds"
                    - "deviceGroupIds"
                    - "webhookUrl"
                    - "topics"
              example: |
                [{"id":4,"deviceIds":[96],"deviceGroupIds":[],"webhookUrl":"https://webhook.example.com/api","topics":["DeviceActivationEvents","DeviceDeactivationEvents","DeviceStatusEvents","DeviceTamperEvents"]}]
    post:
      operationId: postWebhooksV2
      tags:
        - "Webhooks API"
      summary: "Create a webhook"
      description: "Create a webhook for our platform to interact with<br/>Due to the security-sensetive nature of our products, we recommend an HMAC to validate the integrity of our messages. Optionally, you can provide us with a simple secret."
      requestBody:
        required: true
        content:
          application/json:
              schema:
                type: object
                properties:
                  organizationId:
                    type: integer
                  deviceIds:
                    type: array
                    items:
                      type: integer
                  deviceGroupIds:
                    type: array
                    items:
                      type: integer
                  secretHttp:
                    type: string
                  webhookUrl:
                    type: string
                  topics:
                    type: array
                    items:
                      $ref: '#/components/schemas/WebhookTopic'
                required:
                  - "organizationId"
                  - "webhookUrl"
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                  secretHmac:
                    type: string
                required:
                  - "id"
                  - "secretHmac"
              example: |
                {"id":2,"secretHmac":"bSxyOp4vaSNpvyUMfrA98WsOqRSlzBBB"}
  "/v2/webhooks/{webhook-id}":
    delete:
      operationId: deleteWebhookV2
      tags:
        - "Webhooks API"
      summary: "Delete a webhook"
      description: "Delete a webhook"
      parameters:
        - name: "webhook-id"
          in: path
          required: true
          schema:
            type: integer
      responses:
        "200":
          description: "OK"
          content:
            application/json:
              schema:
                type: object
              example: |
                {}
