{"openapi":"3.0.0","paths":{"/files/upload":{"post":{"operationId":"StorageController_uploadFiles","summary":"Upload attachments","description":"Upload attachments and get an attachment token to be used in messaging and posts","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UploadFilesDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadFilesRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Files"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/files/{fileKey}":{"get":{"operationId":"StorageController_getFileFromKey","summary":"Find a file","parameters":[{"name":"fileKey","required":true,"in":"path","description":"The file key","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFileFromKeyRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Files"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/reports":{"post":{"operationId":"ReportCreationController_createReport","summary":"Create a report","description":"Create a report","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReportDto"}}}},"responses":{"201":{"description":""}},"tags":["Reports"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/locks/shared-locks":{"get":{"operationId":"LegacySharedLockController_DEPRECATED_findAll","summary":"Find all user shared locks","description":"Use GET /shared-locks instead","deprecated":true,"parameters":[{"name":"status","required":false,"in":"query","description":"The shared lock status","schema":{"default":"active","enum":["active","archived"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SharedLockForPublic"}}}}},"401":{"description":"Not authorized"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]},"post":{"operationId":"SharedLockController_DEPRECATED_create","summary":"Create a shared lock","description":"Use POST /shared-locks","deprecated":true,"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUpdateSharedLockDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSharedLockRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]}},"/locks/shared-locks/{sharedLockId}":{"get":{"operationId":"LegacySharedLockController_DEPRECATED_findOne","summary":"Find a shared lock by id","description":"Use GET /shared-locks/:sharedLockId instead","deprecated":true,"parameters":[{"name":"sharedLockId","required":true,"in":"path","description":"The shared lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedLockForPublic"}}}},"401":{"description":"Not authorized"},"404":{"description":"Shared lock not found"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]},"put":{"operationId":"SharedLockController_DEPRECATED_update","summary":"Update a shared lock","description":"Use PUT /shared-locks/:sharedLockId","deprecated":true,"parameters":[{"name":"sharedLockId","required":true,"in":"path","description":"The shared lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUpdateSharedLockDto"}}}},"responses":{"200":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Shared lock not found"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]}},"/locks":{"get":{"operationId":"LockController_findAll","summary":"Get user locks","description":"Returns a list of all user locks\n\nBy default, only active locks are returned.","parameters":[{"name":"status","required":false,"in":"query","description":"The lock status","schema":{"default":"active","enum":["active","archived","all"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LockForWearer"}}}}},"401":{"description":"Not authorized"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]},"post":{"operationId":"LockCreationController_create","summary":"Create a lock","description":"Creates a personal lock. To create a lock, you must first create\na combination by using the combination endpoints, and then provide its identifier.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLockDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LockCreatedRepDto"}}}},"400":{"description":"You must be a Plus member to add more extensions"},"401":{"description":"Not authorized"}},"tags":["Lock Creation"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}":{"get":{"operationId":"LockController_findOne","summary":"Get a lock by id","description":"Returns a lock by id","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LockForPublic"}}}},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/archive":{"post":{"operationId":"LockController_archive","summary":"Archive a lock","description":"Archives a lock as a wearer. A wearer can archive its own lock:\n<ul>\n<li>If the lock is running (status `locked`), the lock will become deserted (status `deserted`),\nwith no possibility of going back.</li>\n<li>If the lock is unlocked, the lock will simply be archived.</li>\n</ul>","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"204":{"description":""},"401":{"description":"Not authorized"},"403":{"description":"Cannot archive the lock as a non-wearer"},"404":{"description":"Lock not found"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/archive/keyholder":{"post":{"operationId":"LockController_archiveKeyholder","summary":"Archive a lock as a keyholder","description":"Archives a lock as a keyholder. Keyholders can use this endpoint to archive unlocked locks.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"204":{"description":""},"401":{"description":"Not authorized"},"403":{"description":"Cannot archive the lock as a non-keyholder"},"404":{"description":"Lock not found"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/update-time":{"post":{"operationId":"LockController_updateTime","summary":"Update lock duration","description":"Adds or removes duration to a lock. Keyholders can add or remove time, while wearers can only add time.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTimeDto"}}}},"responses":{"204":{"description":""},"400":{"description":"Cannot change an non-locked lock"},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/freeze":{"post":{"operationId":"LockController_setFreeze","summary":"Freeze a lock","description":"Freezes a lock. Keyholders can use this endpoint to freeze wearer's locks.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetFreezeDto"}}}},"responses":{"204":{"description":""},"400":{"description":"Cannot change an non-locked lock"},"401":{"description":"Not authorized"},"403":{"description":"The lock cannot be edited (wearer)"},"404":{"description":"Lock not found"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/unlock":{"post":{"operationId":"LockController_unlock","summary":"Unlock a lock","description":"Unlocks a lock. For wearers, the lock must respect certain constraints so that it can be unlocked.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"204":{"description":""},"400":{"description":"Some extensions prevent the unlocking of the lock"},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/convert-to-self-lock":{"post":{"operationId":"LockController_convertToSelfLock","summary":"Convert a lock to a self lock","description":"Converts a lock to a self lock. Only the wearer can convert a lock to a self lock.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"204":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"},"422":{"description":"Only wearers can convert to self lock, Keyholder is available, cannot convert to self lock"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/resign":{"post":{"operationId":"LockController_resignAsKeyholder","summary":"Resign as keyholder","description":"Resign as keyholder. Only the keyholder can resign from a lock.\nThe lock will be converted to a self-lock and the wearer can find a new keyholder.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"204":{"description":""},"400":{"description":"Cannot resign from a non-locked lock"},"401":{"description":"Not authorized"},"403":{"description":"Only keyholders can resign from a lock"},"404":{"description":"Lock not found"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/settings":{"post":{"operationId":"LockController_setSettings","summary":"Update lock settings","description":"Update locks settings. Only the keyholder can update lock settings.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetLockSettingsDto"}}}},"responses":{"204":{"description":""},"400":{"description":"Cannot change an non-locked lock"},"401":{"description":"Not authorized"},"403":{"description":"The lock cannot be edited (wearer)"},"404":{"description":"Lock not found"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/max-limit-date":{"post":{"operationId":"LockController_setMaxLimitDate","summary":"Increase the max limit date","description":"Increase the max limit date. Only the wearer can increase the limit.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncreaseMaxLimitDateDto"}}}},"responses":{"204":{"description":""},"400":{"description":"","content":{"application/json":{"schema":{"anyOf":[{"description":"Cannot change an non-locked lock"},{"description":"Cannot define a limit to a lock that has no time limit"}]}}}},"401":{"description":"Not authorized"},"403":{"description":"The lock cannot be edited (keyholder)"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/min-limit-date":{"post":{"operationId":"LockController_setMinLimitDate","summary":"Set the minimum limit date","description":"Set the minimum limit date. Only the wearer can set or increase the minimum limit date.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetMinLimitDateDto"}}}},"responses":{"204":{"description":""},"400":{"description":"","content":{"application/json":{"schema":{"anyOf":[{"description":"Cannot change an non-locked lock"},{"description":"The date cannot be earlier than the one currently defined"},{"description":"The date cannot be in the past"}]}}}},"401":{"description":"Not authorized"},"403":{"description":"The lock cannot be edited (keyholder)"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/trust-keyholder":{"post":{"operationId":"LockController_trustKeyholder","summary":"Trust the keyholder","description":"Trust the keyholder. Only the wearer can trust the keyholder.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"204":{"description":""},"400":{"description":"","content":{"application/json":{"schema":{"anyOf":[{"description":"Cannot change an non-locked lock"},{"description":"The lock does not have a keyholder"}]}}}},"401":{"description":"Not authorized"},"403":{"description":"The lock cannot be edited (keyholder)"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/combination":{"get":{"operationId":"LockController_combination","summary":"Find a lock combination","description":"Finds a lock combination","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombinationForPublic"}}}},"400":{"description":"Cannot get a combination for a locked lock"},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/recover-combination":{"post":{"operationId":"LockController_recoverCombination","summary":"Recover a deserted lock combination","description":"Recovers a deserted lock combination. Only the wearer can recover the combination,\nand the lock must be deserted for at least 7 days.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"204":{"description":""},"400":{"description":"Cannot recover combination"},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/history":{"post":{"operationId":"LockController_getLockHistory","summary":"Return lock history","description":"Returns a list of action logs","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetLockHistoryDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetHistoryRepDto"}}}},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/is-test-lock":{"put":{"operationId":"LockController_setAsTestLock","summary":"Set an archived lock as a test lock","description":"Set an archived lock as a test lock","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"},"422":{"description":"Only wearers can set locks as test locks"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/user/{userId}":{"get":{"operationId":"LockVisitorController_getUserLocks","summary":"Return the public locks of a user","description":"Returns the public locks of a user","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LockForPublic"}}}}}},"tags":["Locks","Profile"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/locks/search":{"post":{"operationId":"LockSearchController_search","summary":"Get user locks","description":"Search for user locks","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchLocksDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchLocksRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Locks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/combinations/image":{"post":{"operationId":"CombinationController_uploadImage","summary":"Upload a combination image","description":"Uploads an image and stores the combination. Once the image is uploaded,\nit cannot be recovered without being associated with a lock. To retrieve\nthe combination, refer to the endpoint `/locks/{lockId}/combination` to\nget the image URL.\n\nIf the combination is not associated with a lock, it expires after one hour.","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UploadCombinationImageDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCodeRepDto"}}}},"401":{"description":"The user is not a Premium user"}},"tags":["Combinations"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/combinations/code":{"post":{"operationId":"CombinationController_createCode","summary":"Create a code combination","description":"Creates and stores the code combination. Once the code is sent, it cannot\nbe recovered without being associated with a lock. To retrieve the\ncombination, refer to the endpoint `/locks/{lockId}/combination` to get\nthe code.\n\nIf the combination is not associated with a lock, it expires after one hour.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCodeDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCodeRepDto"}}}}},"tags":["Combinations"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/penalty/penalties":{"get":{"operationId":"PenaltyController_getPenalties","summary":"Get all penalties","deprecated":true,"parameters":[],"responses":{"200":{"description":""}},"tags":["Extensions - Penalties"]}},"/blocks":{"get":{"operationId":"BlockController_findBlocks","summary":"Find blocked users","description":"Find blocked users","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindBlocksRepDto"}}}}},"tags":["Blocks"],"security":[{"oauth2":["profile"]}]},"post":{"operationId":"BlockController_blockUser","summary":"Block user","description":"Block user","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockUserDto"}}}},"responses":{"201":{"description":""}},"tags":["Blocks"],"security":[{"oauth2":["profile"]}]}},"/blocks/block-interaction/{targetUserId}":{"get":{"operationId":"BlockController_getBlockInteraction","summary":"Find block interaction with another user","description":"Find block interaction with another user","parameters":[{"name":"targetUserId","required":true,"in":"path","description":"The target user id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockInteraction"}}}}},"tags":["Blocks"],"security":[{"oauth2":["profile"]}]}},"/blocks/unblock":{"post":{"operationId":"BlockController_unblockUser","summary":"Unblock user","description":"Unblock user","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnblockUserDto"}}}},"responses":{"201":{"description":""}},"tags":["Blocks"],"security":[{"oauth2":["profile"]}]}},"/users/profile/by-id/{userId}":{"get":{"operationId":"ProfileController_getUserById","parameters":[{"name":"userId","required":true,"in":"path","description":"The user id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserForPublic"}}}},"401":{"description":"Not authorized"},"404":{"description":"User not found"}},"tags":["Profile"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/users/profile/{username}":{"get":{"operationId":"ProfileController_getUser","summary":"Deprecated. Use /user-profile/:username/overview instead","deprecated":true,"parameters":[{"name":"username","required":true,"in":"path","description":"The username","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserForProfile"}}}},"401":{"description":"Not authorized"},"404":{"description":"User not found"}},"tags":["Profile"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/users/profile/{username}/details":{"get":{"operationId":"ProfileController_getUserProfile","summary":"Deprecated. Use /user-profile/:username/overview instead","deprecated":true,"parameters":[{"name":"username","required":true,"in":"path","description":"The username","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileRepDto"}}}},"401":{"description":"Not authorized"},"404":{"description":"User not found"}},"tags":["Profile"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/extensions":{"get":{"operationId":"ExtensionListController_getExtensions","summary":"Get the list of extensions","description":"Returns the list of all extensions in memory","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExtensionForPublic"}}}}}},"tags":["Extensions"]}},"/extensions/tags":{"get":{"operationId":"ExtensionTagsController_getTags","summary":"Get available extension tag categories","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtensionTagsResponseDto"}}}}},"tags":["Extensions"]}},"/public-locks/{sharedLockId}":{"get":{"operationId":"PublicLockController_findOne","summary":"Find a public shared lock","description":"Finds a public shared lock","parameters":[{"name":"sharedLockId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicLockForPublic"}}}},"404":{"description":"Shared lock not found"}},"tags":["Public Locks"]}},"/public-locks/images/{sharedLockId}":{"get":{"operationId":"PublicLockController_getSharedLockImage","summary":"Generate a shared lock image","description":"Generates an image illustrating the shared lock, to publish it on forums or social networks.","parameters":[{"name":"sharedLockId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Shared lock not found"}},"tags":["Public Locks"],"security":[{"bearer":[]}]}},"/public-locks/search":{"post":{"operationId":"PublicLockController_search","summary":"Search for locks","description":"Search for locks","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchPublicLockDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchPublicLockRepDto"}}}}},"tags":["Public Locks"]}},"/explore/categories":{"get":{"operationId":"PublicLockExploreController_findAll","summary":"Find Explore page locks","description":"Returns the locks of the Explore page","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExploreCategoryForAdmin"}}}}}},"tags":["Public Locks"]}},"/users/search":{"post":{"operationId":"UserSearchController_searchUsers","summary":"Search users","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchUsersDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsersSearchResponseDto"}}}}},"tags":["Users"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/users/search/by-username":{"post":{"operationId":"UserSearchController_searchByUsername","summary":"Search a user by its username","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchUserUsernameDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserForPreview"}}}}}},"tags":["Users"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/shared-locks":{"get":{"operationId":"SharedLockController_findAll","summary":"Find all user shared locks","description":"Returns a list of all user shared locks","parameters":[{"name":"status","required":false,"in":"query","description":"The shared lock status","schema":{"default":"active","enum":["active","archived"],"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SharedLockForPublic"}}}}},"401":{"description":"Not authorized"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]},"post":{"operationId":"SharedLockController_create","summary":"Create a shared lock","description":"Creates a shared lock","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUpdateSharedLockDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSharedLockRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]}},"/shared-locks/{sharedLockId}":{"get":{"operationId":"SharedLockController_findOne","summary":"Find a shared lock by id","description":"Finds a shared lock by id","parameters":[{"name":"sharedLockId","required":true,"in":"path","description":"The shared lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedLockForPublic"}}}},"401":{"description":"Not authorized"},"404":{"description":"Shared lock not found"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]},"put":{"operationId":"SharedLockController_update","summary":"Update a shared lock","description":"Updates a shared lock","parameters":[{"name":"sharedLockId","required":true,"in":"path","description":"The shared lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUpdateSharedLockDto"}}}},"responses":{"200":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Shared lock not found"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]}},"/shared-locks/{sharedLockId}/archive":{"post":{"operationId":"SharedLockController_archive","summary":"Archive a shared lock","description":"Archives a shared lock","parameters":[{"name":"sharedLockId","required":true,"in":"path","description":"The shared lock id","schema":{"type":"string"}}],"responses":{"201":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Shared lock not found"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]}},"/shared-lock-tags":{"get":{"operationId":"SharedLockTagController_findAllTags","summary":"Find all shared lock tags","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SharedLockTagForPublic"}}}}}},"tags":["Shared Locks"]}},"/shared-lock-tags/suggested":{"post":{"operationId":"SharedLockTagController_findSuggestedTags","summary":"Find suggested shared lock tags","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindSuggestedTagDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SharedLockTagForPublic"}}}}}},"tags":["Shared Locks"]}},"/current-user/kink-profile/predefined":{"get":{"operationId":"UserKinkProfileController_getPredefinedItems","summary":"Get predefined kinks and toys","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPredefinedKinkProfileItemsRepDto"}}}}},"tags":["Users"]}},"/current-user/kink-profile":{"get":{"operationId":"UserKinkProfileController_getKinkProfile","summary":"Get current user's kink profile","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetUserKinkProfileRepDto"}}}}},"tags":["Users"]},"put":{"operationId":"UserKinkProfileController_setKinkProfile","summary":"Update current user's kink profile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetUserKinkProfileDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetUserKinkProfileRepDto"}}}}},"tags":["Users"]}},"/user-profile/{username}/overview":{"get":{"operationId":"UserProfilePageController_getOverview","parameters":[{"name":"username","required":true,"in":"path","description":"The username","schema":{"type":"string"}},{"name":"period","required":false,"in":"query","schema":{"$ref":"#/components/schemas/StatsPeriodEnum"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileOverviewRepDto"}}}}},"tags":["User Profile"]}},"/user-profile/{username}/statistics":{"get":{"operationId":"UserProfilePageController_getStatistics","parameters":[{"name":"username","required":true,"in":"path","description":"The username","schema":{"type":"string"}},{"name":"period","required":false,"in":"query","schema":{"$ref":"#/components/schemas/StatsPeriodEnum"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileStatisticsRepDto"}}}}},"tags":["User Profile"]}},"/user-profile/calendar-statistics":{"get":{"operationId":"UserProfilePageController_getCalendarStatistics","parameters":[{"name":"period","required":false,"in":"query","schema":{"$ref":"#/components/schemas/StatsPeriodEnum"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarStatisticsRepDto"}}}}},"tags":["User Profile"]}},"/lock-stats/reset-config":{"get":{"operationId":"LockStatsResetController_getResetConfig","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatisticsResetConfigRepDto"}}}}},"tags":["Lock Stats"]}},"/lock-stats/reset":{"post":{"operationId":"LockStatsResetController_resetStatistics","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResetStatisticsDto"}}}},"responses":{"200":{"description":""}},"tags":["Lock Stats"]}},"/user-pictures/upload-request":{"post":{"operationId":"UserPictureController_createUploadRequest","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUploadRequestDto"}}}},"responses":{"200":{"description":""}},"tags":["User Pictures"],"security":[{"bearer":[]}]}},"/user-pictures":{"get":{"operationId":"UserPictureController_getUserPictures","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetUserPicturesResponseDto"}}}}},"tags":["User Pictures"],"security":[{"bearer":[]}]}},"/user-pictures/saved-liveness":{"get":{"operationId":"UserPictureController_getSavedLiveness","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedLivenessResponseDto"}}}}},"tags":["User Pictures"],"security":[{"bearer":[]}]},"delete":{"operationId":"UserPictureController_deleteSavedLiveness","parameters":[],"responses":{"200":{"description":""}},"tags":["User Pictures"],"security":[{"bearer":[]}]}},"/user-pictures/liveness-action":{"get":{"operationId":"UserPictureController_getLivenessAction","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessActionResponseDto"}}}}},"tags":["User Pictures"],"security":[{"bearer":[]}]}},"/user-pictures/{id}":{"delete":{"operationId":"UserPictureController_deletePicture","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["User Pictures"],"security":[{"bearer":[]}]}},"/calendar/events":{"get":{"operationId":"CalendarController_getEvents","parameters":[{"name":"from","required":true,"in":"query","schema":{"format":"date-time","type":"string"}},{"name":"to","required":true,"in":"query","schema":{"format":"date-time","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetCalendarEventsResponseDto"}}}}},"tags":["Calendar"],"security":[{"bearer":[]}]},"post":{"operationId":"CalendarController_createEvent","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCalendarEventDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarEventResponseDto"}}}}},"tags":["Calendar"],"security":[{"bearer":[]}]}},"/calendar/events/{id}":{"patch":{"operationId":"CalendarController_updateEvent","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCalendarEventDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CalendarEventResponseDto"}}}}},"tags":["Calendar"],"security":[{"bearer":[]}]},"delete":{"operationId":"CalendarController_deleteEvent","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Calendar"],"security":[{"bearer":[]}]}},"/session-offer/lock/{lockId}":{"post":{"operationId":"SessionOfferController_createKeyholdingOffer","summary":"Create a keyholding offer","description":"Allows the wearer to send a keyholding request to another user.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOfferRequestDto"}}}},"responses":{"201":{"description":""},"400":{"description":"You cannot be your own keyholder."},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"}},"tags":["Session Offer"],"security":[{"bearer":[]},{"oauth2":["locks"]}]}},"/session-offer/token/{offerToken}/accept":{"get":{"operationId":"SessionOfferController_acceptKeyholdingRequest","summary":"Accept a keyholding request","description":"Accepts a keyholding request from a wearer. By accepting the request, you will become the keyholder. The `offerToken` parameter can be found in the `LockForPublic` object, if the user has enabled this option when creating the lock.","parameters":[{"name":"offerToken","required":true,"in":"path","description":"The lock offer token","schema":{"type":"string"}}],"responses":{"200":{"description":""},"400":{"description":"You cannot be your own keyholder."},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"}},"tags":["Session Offer"],"security":[{"bearer":[]},{"oauth2":["keyholder"]}]}},"/session-offer/lock/{lockId}/status":{"get":{"operationId":"SessionOfferController_getOfferRequestStatus","summary":"Return a list of keyholding offers","description":"Returns a list of keyholding offers","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SessionOfferRequestForPublic"}}}}},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"}},"tags":["Session Offer"],"security":[{"bearer":[]},{"oauth2":["locks"]}]}},"/session-offer/token/{offerToken}":{"get":{"operationId":"SessionOfferController_getLockKeyholdingRequest","summary":"Retrive public information of a lock","description":"Retrieves public information of the lock for the visitor who received a keyholding request link","parameters":[{"name":"offerToken","required":true,"in":"path","description":"The keyholding request token","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LockForPublic"}}}},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"}},"tags":["Session Offer"],"security":[{"bearer":[]}]}},"/session-offer/{sessionRequestId}":{"post":{"operationId":"SessionOfferController_validateOfferRequest","summary":"Accept or reject a keyholding offer from a wearer","description":"Accepts or reject a keyholding offer sent directly by a wearer","parameters":[{"name":"sessionRequestId","required":true,"in":"path","description":"The keyholding offer id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateOfferRequestDto"}}}},"responses":{"201":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Session offer request not found."}},"tags":["Session Offer"],"security":[{"bearer":[]},{"oauth2":["keyholder"]}]}},"/session-offer/{sessionRequestId}/archive":{"get":{"operationId":"SessionOfferController_archiveKeyholdingOffer","summary":"Archive a keyholding offer","description":"Archives a keyholding offer. If the offer is pending, it cancels the keyholding offer.","parameters":[{"name":"sessionRequestId","required":true,"in":"path","description":"The keyholding offer id","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Session offer request not found."}},"tags":["Session Offer"],"security":[{"bearer":[]},{"oauth2":["locks"]}]}},"/session-offer/requests":{"get":{"operationId":"SessionOfferController_getKeyholderRequests","summary":"Return keyholding offers from wearers","description":"Returns keyholding offers from wearers","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SessionOfferRequestForKeyholder"}}}}},"401":{"description":"Not authorized"}},"tags":["Session Offer"],"security":[{"bearer":[]},{"oauth2":["keyholder"]}]}},"/locks/{lockId}/extensions/{extensionId}":{"get":{"operationId":"LockExtensionController_getLockInfoFromExtension","summary":"Get information from an extension for a given lock","parameters":[{"name":"extensionId","required":true,"in":"path","schema":{"type":"string"}},{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetLockInfoFromExtensionRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Locks"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/locks/{lockId}/extensions/{extensionId}/action":{"post":{"operationId":"LockExtensionController_triggerAction","summary":"Trigger an action for a lock extension","description":"Triggers an action in a lock extension","parameters":[{"name":"extensionId","required":true,"in":"path","description":"The extension party id","schema":{"type":"string"}},{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerExtensionActionDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Not authorized"}},"tags":["Locks"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/community-event/categories":{"get":{"operationId":"CommunityEventController_getCategories","summary":"Get community event categories","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CommunityEventCategory"}}}}},"401":{"description":"Not authorized"}},"tags":["Community Events"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/community-event/details":{"post":{"operationId":"CommunityEventController_getPeriodDetails","summary":"Get community event task details for a given day","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPeriodDetailsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPeriodDetailsRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Community Events"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/locks/{lockId}/extensions":{"post":{"operationId":"LockCreationController_setLockExtensions","summary":"Edit lock extensions","description":"Edit extensions for a given lock.\n\nKeyholders can edit extensions if the lock is trusted by the wearer.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EditLockExtensionsDto"}}}},"responses":{"201":{"description":""},"401":{"description":"Not authorized"}},"tags":["Lock Creation"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/public-locks/{sharedLockId}/create-lock":{"post":{"operationId":"LockCreationController_createLockFromSharedLock","summary":"Create a lock from a shared lock","description":"Creates a lock from a shared lock. To create a lock, you must first\ncreate a combination and then provide its identifier.","parameters":[{"name":"sharedLockId","required":true,"in":"path","description":"Shared lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLockFromSharedLockDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LockCreatedRepDto"}}}},"400":{"description":"You cannot add yourself to your own lock."},"401":{"description":"Not authorized"},"403":{"description":"Invalid password."},"404":{"description":"Shared lock not found."}},"tags":["Lock Creation"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/api/developers/extensions":{"get":{"operationId":"PartnerExtensionController_findAll","summary":"Return a list of extensions","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PartnerExtensionForDashboard"}}}}},"401":{"description":"Not authorized"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]},"post":{"operationId":"PartnerExtensionController_create","summary":"Create an extension","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePartnerExtensionDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerExtensionForDashboard"}}}},"401":{"description":"Not authorized"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/developers/extensions/{extensionId}":{"get":{"operationId":"PartnerExtensionController_findOne","summary":"Find an extension","parameters":[{"name":"extensionId","required":true,"in":"path","description":"The extension id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerExtensionForDashboard"}}}},"401":{"description":"Not authorized"},"404":{"description":"Extension not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]},"put":{"operationId":"PartnerExtensionController_update","summary":"Update an extension","parameters":[{"name":"extensionId","required":true,"in":"path","description":"The extension id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePartnerExtensionDto"}}}},"responses":{"200":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Extension not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]},"delete":{"operationId":"PartnerExtensionController_delete","summary":"Delete an extension","parameters":[{"name":"extensionId","required":true,"in":"path","description":"The extension id","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Extension not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}":{"get":{"operationId":"PartnerActionsController_getExtensionSession","summary":"Retrieve information from an extension lock session","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPartnerSessionRepDto"}}}},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]},"patch":{"operationId":"PartnerActionsController_patchExtensionSession","summary":"Update partial information for an extension lock session","description":"Update partial information for an extension lock session. All fields are optional.\nIf you provide a value for a field, the content of the whole field is replaced.\nFor example, if you provide a `config` object, the whole object is replaced by\nthe payload received. If you only need to update one field in your object, make\nsure to send the whole object back.\nIf you don't provide a field, it will be unchanged.","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchExtensionSessionDto"}}}},"responses":{"200":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/action":{"post":{"operationId":"PartnerActionsController_doAction","summary":"Run an action on the lock","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerDoActionDto"}}}},"responses":{"201":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/logs/search":{"post":{"operationId":"PartnerActionsController_getLogs","summary":"List log entries for an extension lock session","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPartnerLogsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetHistoryRepDto"}}}},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/metadata":{"put":{"operationId":"PartnerActionsController_setMetadata","summary":"Update metadata for an extension lock session","description":"Deprecated, please use PATCH /api/extensions/sessions/{sessionId}","deprecated":true,"parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerSetMetadataDto"}}}},"responses":{"200":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/search":{"post":{"operationId":"PartnerSessionController_getSessions","summary":"Search for extension sessions","description":"Search for extension sessions","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSessionsDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetSessionsRepDto"}}}}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/regular-actions":{"get":{"operationId":"SessionRegularActionController_getRegularActions","summary":"Get submitted regular actions","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetRegularActionsRepDto"}}}},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]},"post":{"operationId":"SessionRegularActionController_submitRegularAction","summary":"Submit a regular action on the lock","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitRegularActionDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetRegularActionsRepDto"}}}},"401":{"description":"Not authorized"},"404":{"description":"Session not found"},"422":{"description":"You cannot submit a regular action because you do not have any action remaining. Please wait for the next regular action date and try again.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitRegularActionErrorDto"}}}}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/logs/custom":{"post":{"operationId":"PartnerLogController_logCustomAction","summary":"Create a custom log entry for an extension lock session","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerCustomLogActionDto"}}}},"responses":{"201":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/data":{"put":{"operationId":"SessionDataController_setData","summary":"Set session custom data","description":"Deprecated, please use PATCH /api/extensions/sessions/{sessionId}","deprecated":true,"parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetSessionDataDto"}}}},"responses":{"200":{"description":""},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/temporary-opening/open":{"post":{"operationId":"PartnerOpenLockActionsController_openLock","summary":"Temporarily open a lock","description":"Temporarily open a lock","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerOpenLockDto"}}}},"responses":{"201":{"description":"The lock has been temporarily opened"},"400":{"description":"You cannot modify an unlocked lock or the lock is already opened"},"401":{"description":"Not authorized"},"404":{"description":"Session not found or temporary opening extension not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/penalties/increment":{"post":{"operationId":"PartnerPenaltyActionsController_incrementPenalty","summary":"Increment a penalty on an extension lock session","description":"Increment a penalty on an extension lock session.","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncrementPenaltyDto"}}}},"responses":{"201":{"description":""},"400":{"description":"You cannot modify an unlocked lock."},"401":{"description":"Not authorized"},"404":{"description":"Session not found"},"422":{"description":"The penalty extension is not configured on this lock."}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/penalties/time-limit/create":{"post":{"operationId":"PartnerPenaltyActionsController_createTimeLimitPeriod","summary":"Create a time limit period for a habit on an extension lock session","description":"Create a time limit period for a habit on an extension lock session.","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTimeLimitPeriodDto"}}}},"responses":{"201":{"description":""},"400":{"description":"You cannot modify an unlocked lock.\nYou cannot create a time limit period for non time-limited action."},"401":{"description":"Not authorized"},"404":{"description":"Session not found"},"422":{"description":"The penalty extension is not configured on this lock."}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/penalties/time-limit/cancel":{"post":{"operationId":"PartnerPenaltyActionsController_cancelTimeLimitPeriod","summary":"Cancel a time limit period for a habit on an extension lock session","description":"Cancel a time limit period for a habit on an extension lock session.","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelTimeLimitPeriodDto"}}}},"responses":{"201":{"description":""},"400":{"description":"You cannot modify an unlocked lock.\nYou cannot cancel a time limit period for non time-limited action."},"401":{"description":"Not authorized"},"404":{"description":"Session not found"},"422":{"description":"The penalty extension is not configured on this lock."}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/tasks/assign":{"post":{"operationId":"PartnerTaskActionsController_assignTask","summary":"Assign a task","description":"Assign a task","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerAssignTaskDto"}}}},"responses":{"201":{"description":""},"400":{"description":"You cannot modify an unlocked lock."},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/tasks/start-timer":{"post":{"operationId":"PartnerTaskActionsController_startTaskTimer","summary":"Start the timer for a timed task","description":"Start the timer for a timed task","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"responses":{"201":{"description":""},"400":{"description":"You cannot modify an unlocked lock."},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/tasks/complete":{"post":{"operationId":"PartnerTaskActionsController_completeTask","summary":"Complete a task","description":"Complete a task","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerCompleteTaskDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerCompleteTaskResponseDto"}}}},"400":{"description":"You cannot modify an unlocked lock."},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/pillory/status":{"get":{"operationId":"PartnerPilloryActionsController_getStatus","summary":"Get the current pillory status for a session","description":"Get the current pillory status for a session","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerPilloryStatusResponseDto"}}}},"401":{"description":"Not authorized"},"404":{"description":"Session not found"},"422":{"description":"The pillory extension is not configured on this lock."}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/api/extensions/sessions/{sessionId}/verification-picture/request":{"post":{"operationId":"PartnerVerificationPictureActionsController_requestVerificationPicture","summary":"Request a verification picture","parameters":[{"name":"sessionId","required":true,"in":"path","description":"The session id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerVerificationPictureRequestDto"}}}},"responses":{"201":{"description":"The verification picture has been requested"},"400":{"description":"A verification picture request is already pending or lock does not have a keyholder"},"401":{"description":"Not authorized"},"404":{"description":"Session not found or verification picture extension not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/extensions/{slug}/testers/join":{"post":{"operationId":"ExtensionTesterController_joinAsExtensionTester","summary":"Join as a tester for an extension","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Extensions"],"security":[{"bearer":[]}]}},"/extensions/tasks/{lockId}/start-task-timer":{"post":{"operationId":"TasksController_startTaskTimer","summary":"Start the timer for a timed task","description":"Starts the timer for a timed task","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Extensions - Tasks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/tasks/{lockId}/complete-task":{"post":{"operationId":"TasksController_completeTask","summary":"Complete a task","description":"Completes a task","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteTaskDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignedTaskItem"}}}}},"tags":["Extensions - Tasks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/tasks/{lockId}/history":{"get":{"operationId":"TasksController_getTaskHistory","summary":"Get the history of tasks","description":"Get the history of tasks","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaskHistoryEntry"}}}}}},"tags":["Extensions - Tasks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/tasks/{lockId}/vote":{"post":{"operationId":"TasksController_vote","summary":"Vote on a task post","description":"Vote on a task post","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskVoteDto"}}}},"responses":{"201":{"description":""}},"tags":["Extensions - Tasks"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/pillory/{lockId}/vote":{"post":{"operationId":"PilloryController_vote","summary":"Vote on a pillory post","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PilloryVoteDto"}}}},"responses":{"201":{"description":""}},"tags":["Extensions - Pillory"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/temporary-opening/{lockId}":{"get":{"operationId":"TemporaryOpeningController_getStatus","summary":"Get temporary opening status","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemporaryOpeningStatusDto"}}}}},"tags":["Extensions - Temporary Opening"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/temporary-opening/{lockId}/action-log/{actionLogId}/combination":{"get":{"operationId":"TemporaryOpeningController_getCombinationFromHistoryEntry","summary":"Find a combination from an action log","description":"Finds a lock combination from a previous temporary opening","parameters":[{"name":"actionLogId","required":true,"in":"path","description":"The action log id","schema":{"type":"string"}},{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombinationForPublic"}}}}},"tags":["Extensions - Temporary Opening"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/temporary-opening/{lockId}/open":{"post":{"operationId":"TemporaryOpeningController_openLock","summary":"Temporarily open the lock","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Extensions - Temporary Opening"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/temporary-opening/{lockId}/combination":{"get":{"operationId":"TemporaryOpeningController_getCombination","summary":"Get the lock combination when temporarily opened","description":"Returns the lock combination when temporarily opened","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CombinationForPublic"}}}}},"tags":["Extensions - Temporary Opening"],"security":[{"oauth2":["locks"]},{"bearer":[]}]},"post":{"operationId":"TemporaryOpeningController_setCombination","summary":"Set the new combination","description":"Use POST :lockId/resume instead","deprecated":true,"parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemporaryOpeningSetCombinationDto"}}}},"responses":{"201":{"description":""}},"tags":["Extensions - Temporary Opening"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/temporary-opening/{lockId}/resume":{"post":{"operationId":"TemporaryOpeningController_resumeLock","summary":"Resume the lock session after temporary opening","description":"Resume the lock session after temporary opening (primary endpoint)","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemporaryOpeningSetCombinationDto"}}}},"responses":{"201":{"description":""}},"tags":["Extensions - Temporary Opening"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/temporary-opening/{lockId}/request-verification-picture":{"post":{"operationId":"TemporaryOpeningController_requestVerificationPicture","summary":"Request verification picture before temporary opening","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Extensions - Temporary Opening"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/seal":{"get":{"operationId":"LockSealController_getSeal","summary":"Get lock seal","description":"Get the seal for a lock","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LockSealResponseDto"}}}},"401":{"description":"Not authorized"},"404":{"description":"Lock not found"}},"tags":["Lock Seals"],"security":[{"oauth2":["locks"]},{"bearer":[]}]},"post":{"operationId":"LockSealController_createOrUpdateSeal","summary":"Create or update lock seal","description":"Create or update a seal for a lock. Only the wearer can set a seal.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateLockSealDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LockSealResponseDto"}}}},"401":{"description":"Not authorized"},"403":{"description":"Only the wearer can set a seal"},"404":{"description":"Lock not found"}},"tags":["Lock Seals"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/verification-picture/{lockId}/request":{"post":{"operationId":"VerificationPictureRequestController_requestVerificationPicture","summary":"Request a verification picture","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"201":{"description":"The verification picture has been requested"},"400":{"description":"A verification picture request is already pending"},"403":{"description":"Wearers must have actions remaining"},"404":{"description":"Verification picture extension not found"}},"tags":["Extensions - Verification Picture"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/api/extensions/configurations/{token}":{"get":{"operationId":"PartnerConfigurationController_getConfiguration","summary":"Retrieve the extension configuration from a configuration token.\n      \n      The configuration token is passed in hash parameters of your configuration page.","parameters":[{"name":"token","required":true,"in":"path","description":"The configuration token","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerConfigurationForPublic"}}}},"401":{"description":"Not authorized"},"404":{"description":"Configuration not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]},"put":{"operationId":"PartnerConfigurationController_updateConfiguration","summary":"Update the extension configuration from a configuration token.\n      \n      The configuration token is passed in hash parameters of your configuration page.","parameters":[{"name":"token","required":true,"in":"path","description":"The configuration token","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePartnerConfigurationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerConfigurationForPublic"}}}},"401":{"description":"Not authorized"},"404":{"description":"Configuration not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/settings":{"get":{"operationId":"SettingsController_getAppSettings","summary":"Get app settings","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSettingsDto"}}}}},"tags":["Settings"]}},"/api/extensions/auth/sessions/{token}":{"get":{"operationId":"PartnerMainAuthorizationController_getSessionAuth","summary":"Get a session authorization","parameters":[{"name":"token","required":true,"in":"path","description":"The token passed in parameters of the main page","schema":{"type":"string"}},{"name":"X-Chaster-Client-Id","in":"header","description":"The application client id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PartnerGetSessionAuthRepDto"}}}},"401":{"description":"Not authorized"},"404":{"description":"Session not found"}},"tags":["Partner Extensions"],"security":[{"oauth2":["developer"]},{"bearer":[]}]}},"/auth/profile/update":{"get":{"operationId":"AuthMeController_getUpdatedProfile","summary":"Update profile from the authentication server","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurrentUserForProfileSettings"}}}}},"tags":["Profile"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/auth/profile":{"get":{"operationId":"AuthMeController_me","summary":"Get logged user information","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurrentUser"}}}}},"tags":["Profile"],"security":[{"oauth2":[]},{"bearer":[]}]},"post":{"operationId":"UserProfileController_setProfile","summary":"Set the user profile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetProfileDto"}}}},"responses":{"201":{"description":""}},"tags":["Profile"]}},"/conversations/by-user/{userId}":{"get":{"operationId":"MessagingController_getConversationByUserId","summary":"Find conversation by user id","description":"Finds a conversation by user id","parameters":[{"name":"userId","required":true,"in":"path","description":"The user id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationForPublic"}}}},"401":{"description":"Not authorized"}},"tags":["Messaging"],"security":[{"oauth2":["messaging"]},{"bearer":[]}]}},"/conversations":{"post":{"operationId":"MessagingController_createConversation","summary":"Create a conversation","description":"Creates a conversation","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConversationDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationForPublic"}}}},"401":{"description":"Not authorized"}},"tags":["Messaging"],"security":[{"oauth2":["messaging"]},{"bearer":[]}]},"get":{"operationId":"ConversationController_getConversations","summary":"Find a list of conversations","description":"Finds a list of conversations","parameters":[{"name":"limit","required":false,"in":"query","description":"The query limit","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"status","required":false,"in":"query","description":"The conversation status","schema":{"default":"approved","enum":["pending","approved","ignored"],"type":"string"}},{"name":"offset","required":false,"in":"query","description":"The query offset, date of last message\n\nUse the field lastMessageAt for pagination","schema":{"format":"date-time","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetConversationsRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Messaging"],"security":[{"oauth2":["messaging"]},{"bearer":[]}]}},"/conversations/{conversationId}":{"post":{"operationId":"MessagingController_sendMessage","summary":"Add a new message to a conversation","description":"Updates a conversation","parameters":[{"name":"conversationId","required":true,"in":"path","description":"The conversation id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConversationDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageForPublic"}}}},"401":{"description":"Not authorized"}},"tags":["Messaging"],"security":[{"oauth2":["messaging"]},{"bearer":[]}]},"get":{"operationId":"MessagingController_getConversation","summary":"Find a conversation","description":"Finds a conversation","parameters":[{"name":"conversationId","required":true,"in":"path","description":"The conversation id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationForPublic"}}}},"401":{"description":"Not authorized"}},"tags":["Messaging"],"security":[{"oauth2":["messaging"]},{"bearer":[]}]}},"/conversations/{conversationId}/status":{"put":{"operationId":"MessagingController_setConversationStatus","summary":"Set a conversation status","description":"Updates a conversation status","parameters":[{"name":"conversationId","required":true,"in":"path","description":"The conversation id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetConversationStatusDto"}}}},"responses":{"200":{"description":""},"401":{"description":"Not authorized"}},"tags":["Messaging"],"security":[{"oauth2":["messaging"]},{"bearer":[]}]}},"/conversations/{conversationId}/unread":{"put":{"operationId":"MessagingController_setConversationUnread","summary":"Set a conversation unread status","description":"Updates a conversation unread status","parameters":[{"name":"conversationId","required":true,"in":"path","description":"The conversation id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetConversationUnreadDto"}}}},"responses":{"200":{"description":""},"401":{"description":"Not authorized"}},"tags":["Messaging"],"security":[{"oauth2":["messaging"]},{"bearer":[]}]}},"/conversations/{conversationId}/messages":{"get":{"operationId":"MessagingController_getMessages","summary":"Find messages in a conversation","description":"Finds messages in a conversation","parameters":[{"name":"conversationId","required":true,"in":"path","description":"The conversation id","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"The query limit","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"lastId","required":false,"in":"query","description":"Last message id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMessagesRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Messaging"],"security":[{"oauth2":["messaging"]},{"bearer":[]}]}},"/messaging/ignored-users":{"get":{"operationId":"IgnoredUserController_findIgnoredUsers","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IgnoredUsersRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Messaging"],"security":[{"oauth2":["messaging"]},{"bearer":[]}]}},"/users/badge/count":{"get":{"operationId":"UserBadgeController_getUserBadgeCount","summary":"Get the user badge count","description":"Returns the user badge count","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserBadgeCount"}}}},"401":{"description":"Not authorized"}},"tags":["Profile"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/users/search/by-discord-id/{discordId}":{"get":{"operationId":"UserSearchController_getUserByDiscordId","summary":"Search a user by its Discord id","parameters":[{"name":"discordId","required":true,"in":"path","description":"The user Discord id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserForPublic"}}}},"404":{"description":"User not found"}},"tags":["Users"],"security":[{"oauth2":[]},{"bearer":[]}]}},"/current-user":{"patch":{"operationId":"UserPatchController_patchCurrentUser","summary":"","description":"Patches the current user","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchProfileDto"}}}},"responses":{"200":{"description":""}},"tags":["Users"]}},"/keyholder/locks/search":{"post":{"operationId":"KeyholderController_searchLocks","summary":"Search locked users","description":"Search locked users","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyholderSearchLocksDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyholderSearchLocksRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Keyholder"],"security":[{"oauth2":["keyholder"]},{"bearer":[]}]}},"/keyholder/notes/lock/{lockId}":{"get":{"operationId":"KeyholderNoteController_getNotesForLock","summary":"Get keyholder notes for a lock","parameters":[{"name":"lockId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyholderNotesForLockResponseDto"}}}},"401":{"description":"Not authorized"}},"tags":["Keyholder Notes"],"security":[{"oauth2":["keyholder"]},{"bearer":[]}]},"put":{"operationId":"KeyholderNoteController_upsertLockNote","summary":"Create or update keyholder note for a lock","parameters":[{"name":"lockId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertKeyholderNoteDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyholderNoteResponseDto"}}}},"401":{"description":"Not authorized"}},"tags":["Keyholder Notes"],"security":[{"oauth2":["keyholder"]},{"bearer":[]}]},"delete":{"operationId":"KeyholderNoteController_deleteLockNote","summary":"Delete keyholder note for a lock","parameters":[{"name":"lockId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Not authorized"}},"tags":["Keyholder Notes"],"security":[{"oauth2":["keyholder"]},{"bearer":[]}]}},"/keyholder/notes/user/{userId}":{"put":{"operationId":"KeyholderNoteController_upsertUserNote","summary":"Create or update keyholder note for a user","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertKeyholderNoteDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyholderNoteResponseDto"}}}},"401":{"description":"Not authorized"}},"tags":["Keyholder Notes"],"security":[{"oauth2":["keyholder"]},{"bearer":[]}]},"delete":{"operationId":"KeyholderNoteController_deleteUserNote","summary":"Delete keyholder note for a user","parameters":[{"name":"userId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Not authorized"}},"tags":["Keyholder Notes"],"security":[{"oauth2":["keyholder"]},{"bearer":[]}]}},"/shared-locks/{sharedLockId}/partner-extensions/{partnerExtensionId}/partner-configurations":{"post":{"operationId":"PartnerConfigurationCreationController_createSharedLockPartnerConfiguration","summary":"Create a partner configuration from a shared lock extension configuration","parameters":[{"name":"partnerExtensionId","required":true,"in":"path","description":"The partner extension id","schema":{"type":"string"}},{"name":"sharedLockId","required":true,"in":"path","description":"The shared lock id","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSharedLockPartnerConfigurationRepDto"}}}}},"tags":["Partner Configurations"],"security":[{"bearer":[]}]}},"/locks/{lockId}/partner-extensions/{partnerExtensionId}/partner-configurations":{"post":{"operationId":"PartnerConfigurationCreationController_createLockPartnerConfiguration","summary":"Create a partner configuration from a lock extension configuration","parameters":[{"name":"partnerExtensionId","required":true,"in":"path","description":"The partner extension id","schema":{"type":"string"}},{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSharedLockPartnerConfigurationRepDto"}}}}},"tags":["Partner Configurations"],"security":[{"bearer":[]}]}},"/partner-extensions/{partnerExtensionId}/partner-configurations":{"post":{"operationId":"PartnerConfigurationCreationController_createPartnerConfiguration","summary":"Create a partner configuration with the default configuration","parameters":[{"name":"partnerExtensionId","required":true,"in":"path","description":"The partner extension id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePartnerConfigurationDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePartnerConfigurationRepDto"}}}}},"tags":["Partner Configurations"],"security":[{"bearer":[]}]}},"/extensions/verification-picture/{lockId}/submit":{"post":{"operationId":"VerificationPictureController_submitPicture","summary":"Submit a verification picture","description":"Uploads a new verification picture\n\nA user can upload a picture only if there is an existing request.","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Extensions - Verification Picture"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/verification-pictures":{"get":{"operationId":"VerificationPictureController_getVerificationPictures","summary":"Get the history of verification pictures","parameters":[{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VerificationPictureHistoryEntry"}}}}}},"tags":["Extensions - Verification Picture"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/shared-locks/{sharedLockId}/favorite":{"get":{"operationId":"SharedLockFavoriteController_isFavorite","summary":"Check if the shared lock is in user favorites","parameters":[{"name":"sharedLockId","required":true,"in":"path","description":"The shared lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IsFavoriteSharedLockRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]},"put":{"operationId":"SharedLockFavoriteController_setFavorite","summary":"Set a shared lock as favorite","parameters":[{"name":"sharedLockId","required":true,"in":"path","description":"The shared lock id","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Not authorized"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]},"delete":{"operationId":"SharedLockFavoriteController_removeFavorite","summary":"Remove a favorite shared lock","parameters":[{"name":"sharedLockId","required":true,"in":"path","description":"The shared lock id","schema":{"type":"string"}}],"responses":{"200":{"description":""},"401":{"description":"Not authorized"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]}},"/favorites/shared-locks":{"post":{"operationId":"SharedLockFavoritesController_getFavoriteSharedLocks","summary":"Get user favorite shared locks","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFavoriteSharedLocksDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetFavoriteSharedLocksRepDto"}}}},"401":{"description":"Not authorized"}},"tags":["Shared Locks"],"security":[{"oauth2":["shared_locks"]},{"bearer":[]}]}},"/locks/{lockId}/extensions/{extensionId}/penalty-session":{"get":{"operationId":"PenaltySessionController_find","parameters":[{"name":"extensionId","required":true,"in":"path","description":"The extension id","schema":{"type":"string"}},{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PenaltySessionForPublic"}}}}},"tags":["Extensions - Penalties"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/locks/{lockId}/extensions/{extensionId}/penalty-session/penalty-periods/search":{"post":{"operationId":"PenaltySessionController_searchPenaltyPeriods","parameters":[{"name":"extensionId","required":true,"in":"path","description":"The extension id","schema":{"type":"string"}},{"name":"lockId","required":true,"in":"path","description":"The lock id","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindPenaltyPeriodsDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindPenaltyPeriodsRepDto"}}}}},"tags":["Extensions - Penalties"],"security":[{"oauth2":["locks"]},{"bearer":[]}]}},"/extensions/penalty/punishable-actions":{"get":{"operationId":"PunishableActionController_getPunishableActions","summary":"Get all punishable actions","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PunishableActionForPublic"}}}}}},"tags":["Extensions - Penalties"]}},"/users/profile-completeness":{"get":{"operationId":"ProfileCompletenessController_getProfileCompleteness","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileCompletenessRepDto"}}}}},"tags":["Profile"],"security":[{"bearer":[]}]}}},"info":{"title":"Chaster","description":"Chaster Public API\n\nAPI documentation: [https://docs.chaster.app/api/basics/introduction](https://docs.chaster.app/api/basics/introduction)\n","version":"0.35.0","contact":{}},"tags":[],"servers":[{"url":"https://api.chaster.app"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"},"oauth2":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"https://sso.chaster.app/auth/realms/app/protocol/openid-connect/auth","tokenUrl":"https://sso.chaster.app/auth/realms/app/protocol/openid-connect/token","refreshUrl":"https://sso.chaster.app/auth/realms/app/protocol/openid-connect","scopes":{"profile":"Profile","email":"Email","locks":"Locks","shared_locks":"SharedLocks","keyholder":"Keyholder","messaging":"Messaging","developer":"Developer"}}}},"clientId":{"type":"apiKey","in":"header","name":"X-Chaster-Client-Id","description":"Your application id"},"clientSecret":{"type":"apiKey","in":"header","name":"X-Chaster-Client-Secret","description":"Your application secret key"}},"schemas":{"UploadFilesDto":{"type":"object","properties":{"files":{"type":"array","description":"The files to upload","items":{"type":"string","format":"binary"}},"type":{"type":"string","description":"The target storage","enum":["messaging","community_event_challenge","peer_verification","user_picture","user_picture_liveness"]}},"required":["files","type"]},"UploadFilesRepDto":{"type":"object","properties":{"token":{"type":"string","description":"The attachment token\n\nIt can be used in messaging, post and other endpoints that support\nattachments"}},"required":["token"]},"GetFileFromKeyRepDto":{"type":"object","properties":{"url":{"type":"string","description":"The file url"}},"required":["url"]},"CreateMessageReportItemDto":{"type":"object","properties":{"type":{"description":"The report type\nEquals to `message`","enum":["message"],"type":"string"},"messageId":{"type":"string","description":"The message id"}},"required":["type","messageId"]},"CreatePostReportItemDto":{"type":"object","properties":{"type":{"type":"string","description":"The report type\nEquals to `post`","enum":["post"]},"postId":{"type":"string","description":"The post id"}},"required":["type","postId"]},"CreateSharedLockReportItemDto":{"type":"object","properties":{"type":{"type":"string","description":"The report type\nEquals to `post`","enum":["shared_lock"]},"sharedLockId":{"type":"string","description":"The shared lock id"}},"required":["type","sharedLockId"]},"CreateUserReportItemDto":{"type":"object","properties":{"type":{"type":"string","description":"The report type\nEquals to `user`","enum":["user"]},"userId":{"type":"string","description":"The user id"}},"required":["type","userId"]},"CreatePeerVerificationReportItemDto":{"type":"object","properties":{"type":{"type":"string","description":"The report type\nEquals to `peer_verification`","enum":["peer_verification"]},"peerVerificationId":{"type":"string","description":"The peer verification id"}},"required":["type","peerVerificationId"]},"CreateReportDto":{"type":"object","properties":{"target":{"description":"The content to report","oneOf":[{"$ref":"#/components/schemas/CreateMessageReportItemDto"},{"$ref":"#/components/schemas/CreatePostReportItemDto"},{"$ref":"#/components/schemas/CreateSharedLockReportItemDto"},{"$ref":"#/components/schemas/CreateUserReportItemDto"},{"$ref":"#/components/schemas/CreatePeerVerificationReportItemDto"}]},"reason":{"type":"string","description":"The reason of the report","enum":["harassment","suicide_self_injury","inappropriate_content","hate_speech","unsolicited_content","unauthorized_financial_activity","other"]},"message":{"type":"string","description":"An optional message"}},"required":["target","reason"]},"LockTypeEnum":{"type":"string","enum":["chastity","bondage"]},"SharedLockDurationModeEnum":{"type":"string","enum":["duration","date"]},"SharedLockReasonForPublicHideEnum":{"type":"string","enum":["user_not_findom","other"]},"SexualOrientationEnum":{"type":"string","enum":["Unspecified","Straight","Gay","Lesbian","Bisexual","Pansexual","Aromantic","Androsexual","Asexual","Demisexual","Gynesexual","Polysexual","Queer","Skoliosexual"]},"PronounsEnum":{"type":"string","enum":["unspecified","he-him","she-her","they-them","it-its","any-pronouns","neo-pronouns"]},"UserRoleEnum":{"type":"string","enum":["keyholder","wearer","switch","unspecified"]},"FeatureSwitchEnum":{"type":"string","enum":["partner_extensions","age_verification","block_registration_with_disposable_email","block_registration_with_vpn","tags_for_shared_locks","push_notifications","block_users","discord_notifications","advanced_penalties","kink_profile","block_login_with_vpn","phone_number_validation","turnstile_validation","self_identity_verification","lock_calendar","other","plus_page_v2","keyholder_notes","route_verification_by_country","bondage_lock_type","dummy_1","dummy_2","dummy_3"]},"UserMetadata":{"type":"object","properties":{"locktober2020Points":{"type":"number"},"locktober2021Points":{"type":"number"},"chastityMonth2022Points":{"type":"number"},"locktober2022Points":{"type":"number"},"locktober2023Points":{"type":"number"},"locktober2024Points":{"type":"number"},"locktober2025Points":{"type":"number"}},"required":["locktober2020Points","locktober2021Points","chastityMonth2022Points","locktober2022Points","locktober2023Points","locktober2024Points","locktober2025Points"]},"UserForPublic":{"type":"object","properties":{"sexualOrientation":{"description":"The sexual orientation","$ref":"#/components/schemas/SexualOrientationEnum"},"pronouns":{"description":"The pronouns","$ref":"#/components/schemas/PronounsEnum"},"role":{"description":"The role","$ref":"#/components/schemas/UserRoleEnum"},"features":{"description":"Enabled features","type":"array","items":{"$ref":"#/components/schemas/FeatureSwitchEnum"}},"_id":{"type":"string","description":"The user id"},"username":{"type":"string","description":"The username"},"isPremium":{"type":"boolean","description":"Whether the user has a Premium subscription"},"description":{"type":"string","description":"The profile description"},"location":{"type":"string","description":"The location"},"gender":{"type":"string","description":"The gender"},"age":{"type":"number","nullable":true,"description":"The age"},"isFindom":{"type":"boolean","description":"Whether the user is a findom"},"avatarUrl":{"type":"string","description":"The avatar URL"},"online":{"type":"boolean","description":"Whether the user is online"},"lastSeen":{"type":"number","nullable":true,"description":"User last seen, in seconds"},"isAdmin":{"type":"boolean","description":"Whether the user is an admin"},"isTeamMember":{"type":"boolean","description":"Whether the user is a team member"},"isModerator":{"type":"boolean","description":"Whether the user is a moderator"},"metadata":{"description":"User metadata","allOf":[{"$ref":"#/components/schemas/UserMetadata"}]},"fullLocation":{"type":"string","description":"User full location"},"isDisabled":{"type":"boolean","description":"Whether the user is disabled"},"isSuspended":{"type":"boolean","description":"Whether the user is suspended by the Chaster team"},"joinedAt":{"type":"string","description":"Joined date (year and month, YYYY-MM)"},"isNewMember":{"type":"boolean","description":"Whether the user is a new member"},"isSuspendedOrDisabled":{"type":"boolean","description":"Whether the user is suspended or disabled"}},"required":["sexualOrientation","pronouns","role","features","_id","username","isPremium","description","location","gender","age","isFindom","avatarUrl","online","lastSeen","isAdmin","isTeamMember","isModerator","metadata","fullLocation","isDisabled","isSuspended","joinedAt","isNewMember","isSuspendedOrDisabled"]},"UnsplashPhoto":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"}},"required":["id","username","name","url"]},"ExtensionModeEnum":{"type":"string","enum":["cumulative","non_cumulative","turn","unlimited"]},"ExtensionConfigForPublic":{"type":"object","properties":{"slug":{"type":"string","description":"The extension slug. "},"config":{"type":"object","description":"The extension configuration. "},"mode":{"$ref":"#/components/schemas/ExtensionModeEnum"},"name":{"type":"string"},"textConfig":{"type":"string"},"regularity":{"type":"number","minimum":0}},"required":["slug","config","mode","name","regularity"]},"LockStatusEnum":{"type":"string","enum":["locked","unlocked","deserted"]},"KeyholderUnavailableEnum":{"type":"string","enum":["suspended","disabled","inactive"]},"SharedLockForPublic":{"type":"object","properties":{"lockType":{"description":"The lock type","$ref":"#/components/schemas/LockTypeEnum"},"durationMode":{"description":"Duration mode","$ref":"#/components/schemas/SharedLockDurationModeEnum"},"reasonForPublicHide":{"nullable":true,"$ref":"#/components/schemas/SharedLockReasonForPublicHideEnum"},"_id":{"type":"string","description":"The shared lock id"},"minDuration":{"type":"number","description":"The minimum duration, in seconds"},"maxDuration":{"type":"number","description":"The maximum duration, in seconds"},"calculatedMaxLimitDuration":{"type":"number","nullable":true,"description":"The calculated max limit duration"},"calculatedMinLimitDuration":{"type":"number","nullable":true,"description":"The calculated min limit duration"},"user":{"description":"The creator","allOf":[{"$ref":"#/components/schemas/UserForPublic"}]},"unsplashPhoto":{"nullable":true,"description":"The Unsplash photo","allOf":[{"$ref":"#/components/schemas/UnsplashPhoto"}]},"extensions":{"description":"Extension configurations","type":"array","items":{"$ref":"#/components/schemas/ExtensionConfigForPublic"}},"createdAt":{"type":"string","description":"Created at"},"updatedAt":{"type":"string","nullable":true,"description":"Updated at"},"deletedAt":{"type":"string","nullable":true,"description":"Deleted at"},"archivedAt":{"type":"string","nullable":true,"description":"Archived at"},"locks":{"description":"List of locks\n\nOnly returned in shared locks endpoints","type":"array","items":{"$ref":"#/components/schemas/LockForPublic"}},"requirePassword":{"type":"boolean","description":"Whether the lock requires a password"},"password":{"type":"string","nullable":true,"description":"Password"},"maxLimitDuration":{"type":"number","nullable":true,"description":"The maximum duration of the lock, in seconds\n\nAfter this duration, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDuration":{"type":"number","nullable":true,"description":"The minimum duration of the lock, in seconds\n\nBefore this duration, the lock cannot be unlocked,\neven if the timer expires."},"minDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date"},"maxDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date"},"maxLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date of the lock\n\nAfter this date, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date of the lock\n\nBefore this date, the lock cannot be unlocked,\neven if the timer expires."},"displayRemainingTime":{"type":"boolean","description":"Whether the remaining time should be displayed to the wearer"},"limitLockTime":{"type":"boolean","description":"Whether the lock is limited in time"},"maxLockedUsers":{"type":"number","nullable":true,"description":"The number of maximum locked users for this shared lock","minimum":1},"isPublic":{"type":"boolean","description":"Whether the lock is public"},"requireContact":{"type":"boolean","description":"Whether the shared lock requires contact from wearer\n\nDisplayed for information purposes only on the lock page"},"name":{"type":"string","description":"The name"},"description":{"type":"string","description":"The description"},"tags":{"description":"The tags","type":"array","items":{"type":"string"}},"hideTimeLogs":{"type":"boolean","description":"Whether the time information should be hidden from the history"},"isFindom":{"type":"boolean","description":"Whether the lock is findom"},"lastSavedAt":{"format":"date-time","type":"string","description":"Last saved at"}},"required":["lockType","durationMode","reasonForPublicHide","_id","minDuration","maxDuration","calculatedMaxLimitDuration","calculatedMinLimitDuration","user","unsplashPhoto","extensions","createdAt","updatedAt","deletedAt","archivedAt","requirePassword","password","maxLimitDuration","minLimitDuration","minDate","maxDate","maxLimitDate","minLimitDate","displayRemainingTime","limitLockTime","maxLockedUsers","isPublic","requireContact","name","description","tags","hideTimeLogs","isFindom","lastSavedAt"]},"ExtensionPartyForPublic":{"type":"object","properties":{"slug":{"type":"string","description":"The extension slug. "},"config":{"type":"object","description":"The extension configuration. "},"_id":{"type":"string"},"displayName":{"type":"string","description":"This is the name of the extension, which will be displayed to other users in the list of extensions, and in the description of locks."},"summary":{"type":"string","description":"This is the description of your extension, it is a paragraph explaining how your extension works, and what its purpose is."},"subtitle":{"type":"string","description":"This is the subtitle of the extension, it is a short sentence explaining the concept of your extension, and will be displayed in the list of extensions."},"icon":{"type":"string","description":"The icon you choose must be one of the regular icons available on FontAwesome 5, which you can find list here. The icon will be displayed in the list of extensions.\n\nContact us if you want to change the icon of your extension."},"mode":{"type":"string","description":"An extension can offer different modes, depending on the way it works and the actions to be performed. An action is a user interaction, for example in Chaster extensions, spinning the wheel of fortune, assigning a task, or checking in. The frequency of the actions can be defined and limited according to the mode chosen by the user among the modes offered by the extension.\n\nMore information: https://docs.chaster.app/api/extensions-api/configuration#available-modes","enum":["cumulative","non_cumulative","turn","unlimited"]},"userData":{"type":"object"},"regularity":{"type":"number","description":"The regularity displayed in the configuration, if the user chooses the cumulative or non-cumulative mode. If you enable only Unlimited mode, you don't need to fill this parameter."},"nbActionsRemaining":{"type":"number","description":"The number of regular actions remaining. If the mode is Unlimited, it returns -1.\n\nUse it to display the number of actions remaining to the user, and know when the user can perform a regular action.\nIf the value is 0, the user cannot perform a regular action."},"nextActionDate":{"type":"string","nullable":true,"description":"The date when the next regular action can be performed.\n\nUse it to compare the current date with the next action date to know when the user can perform a regular action.\nIf the value is null, the user can perform a regular action.\nIf the mode is Unlimited, it always returns null."},"isPartner":{"type":"boolean"},"textConfig":{"type":"string"},"createdAt":{"type":"string","description":"Created at"},"updatedAt":{"type":"string","description":"Updated at"}},"required":["slug","config","_id","displayName","summary","subtitle","icon","mode","userData","regularity","nbActionsRemaining","nextActionDate","isPartner","textConfig","createdAt","updatedAt"]},"ReasonPreventingUnlocking":{"type":"object","properties":{"reason":{"type":"string"},"icon":{"type":"string"}},"required":["reason","icon"]},"VerificationPictureItem":{"type":"object","properties":{"imageKey":{"type":"string"},"submittedAt":{"format":"date-time","type":"string"},"verificationCode":{"type":"string"},"filename":{"type":"string"},"peerVerificationId":{"type":"string"}},"required":["imageKey","submittedAt","verificationCode"]},"LockForPublic":{"type":"object","properties":{"status":{"description":"The status","$ref":"#/components/schemas/LockStatusEnum"},"lockType":{"description":"The lock type","$ref":"#/components/schemas/LockTypeEnum"},"keyholderUnavailable":{"description":"Whether the keyholder is unavailable\nOnly available for the wearer","$ref":"#/components/schemas/KeyholderUnavailableEnum"},"_id":{"type":"string","description":"The lock id"},"endDate":{"format":"date-time","type":"string","nullable":true,"description":"The end date"},"title":{"type":"string","description":"The lock title"},"totalDuration":{"type":"number","description":"The total duration, since the creation of the lock"},"user":{"description":"The user","allOf":[{"$ref":"#/components/schemas/UserForPublic"}]},"keyholder":{"nullable":true,"description":"The keyholder","allOf":[{"$ref":"#/components/schemas/UserForPublic"}]},"sharedLock":{"nullable":true,"description":"The shared lock","allOf":[{"$ref":"#/components/schemas/SharedLockForPublic"}]},"isAllowedToViewTime":{"type":"boolean","description":"Whether the wearer is allowed to view the remaining time"},"canBeUnlocked":{"type":"boolean","description":"Whether the lock can be unlocked\n\nThis field does not account for extension restrictions\n(reasonsPreventingUnlocking) and may return true even when\nextensions are blocking the unlock.","deprecated":true},"isReadyToUnlock":{"type":"boolean","description":"Whether the lock is truly ready to be unlocked by the wearer, accounting for\nboth timer state, minimum lock time and extension restrictions."},"canBeUnlockedByMaxLimitDate":{"type":"boolean","description":"Whether the lock can be unlocked because the max limit date has been reached"},"isFrozen":{"type":"boolean","description":"Whether the lock is frozen"},"role":{"description":"The user role","enum":["keyholder","wearer","visitor"],"type":"string"},"extensions":{"description":"The extensions","type":"array","items":{"$ref":"#/components/schemas/ExtensionPartyForPublic"}},"combination":{"type":"string","description":"The combination"},"reasonsPreventingUnlocking":{"description":"Reasons preventing unlocking","type":"array","items":{"$ref":"#/components/schemas/ReasonPreventingUnlocking"}},"extensionsAllowUnlocking":{"type":"boolean","description":"Whether the extensions allow unlocking"},"lastVerificationPicture":{"nullable":true,"description":"The last verification picture","allOf":[{"$ref":"#/components/schemas/VerificationPictureItem"}]},"createdAt":{"format":"date-time","type":"string","description":"Created at"},"updatedAt":{"format":"date-time","type":"string","description":"Updated at"},"startDate":{"format":"date-time","type":"string","description":"The start date"},"minDate":{"format":"date-time","type":"string","description":"The minimum initial date configured at creation"},"maxDate":{"format":"date-time","type":"string","description":"The maximum initial date configured at creation"},"maxLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date of the lock\n\nAfter this date, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date of the lock\n\nBefore this date, the lock cannot be unlocked,\neven if the timer expires."},"displayRemainingTime":{"type":"boolean","description":"Whether the remaining time is displayed to the wearer"},"limitLockTime":{"type":"boolean","description":"Whether the lock is limited in duration"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"description":"Deleted at"},"unlockedAt":{"format":"date-time","type":"string","nullable":true,"description":"Unlocked at"},"archivedAt":{"format":"date-time","type":"string","nullable":true,"description":"Archived at"},"recoveredAt":{"format":"date-time","type":"string","nullable":true,"description":"Recovered at (when the wearer explicitly recovered a deserted combination)"},"frozenAt":{"format":"date-time","type":"string","nullable":true,"description":"Frozen at"},"keyholderArchivedAt":{"format":"date-time","type":"string","nullable":true,"description":"Keyholder archived at"},"allowSessionOffer":{"type":"boolean","description":"Whether the lock allows session offers"},"isTestLock":{"type":"boolean","description":"Whether the lock is a test lock and counts in the user stats"},"offerToken":{"type":"string","nullable":true,"description":"The offer token"},"hideTimeLogs":{"type":"boolean","description":"True if the time information should be hidden from the history"},"trusted":{"type":"boolean","description":"Whether the keyholder is trusted"}},"required":["status","lockType","_id","endDate","title","totalDuration","user","keyholder","sharedLock","isAllowedToViewTime","canBeUnlocked","isReadyToUnlock","canBeUnlockedByMaxLimitDate","isFrozen","role","extensions","combination","reasonsPreventingUnlocking","extensionsAllowUnlocking","lastVerificationPicture","createdAt","updatedAt","startDate","minDate","maxDate","maxLimitDate","minLimitDate","displayRemainingTime","limitLockTime","deletedAt","unlockedAt","archivedAt","recoveredAt","frozenAt","keyholderArchivedAt","allowSessionOffer","isTestLock","offerToken","hideTimeLogs","trusted"]},"ExtensionHomeActionWithPartyId":{"type":"object","properties":{"extensionPartyId":{"type":"string"},"slug":{"type":"string","description":"An identifier that is returned to the extension when the user navigates to the extension page."},"title":{"type":"string","description":"The title displayed on the list item for the action."},"description":{"type":"string","description":"The description displayed on the list item for the action."},"icon":{"type":"string","description":"The icon associated with the action, which must be one of the valid FontAwesome 5 icons."},"badge":{"type":"string","description":"Displays a small badge on the list item, useful for indicating notifications or counts associated with the action (e.g., the number of tasks to do or remaining actions in the extension)."}},"required":["extensionPartyId","slug","title","description","icon"]},"LockForWearer":{"type":"object","properties":{"status":{"description":"The status","$ref":"#/components/schemas/LockStatusEnum"},"lockType":{"description":"The lock type","$ref":"#/components/schemas/LockTypeEnum"},"keyholderUnavailable":{"description":"Whether the keyholder is unavailable\nOnly available for the wearer","$ref":"#/components/schemas/KeyholderUnavailableEnum"},"_id":{"type":"string","description":"The lock id"},"endDate":{"format":"date-time","type":"string","nullable":true,"description":"The end date"},"title":{"type":"string","description":"The lock title"},"totalDuration":{"type":"number","description":"The total duration, since the creation of the lock"},"user":{"description":"The user","allOf":[{"$ref":"#/components/schemas/UserForPublic"}]},"keyholder":{"nullable":true,"description":"The keyholder","allOf":[{"$ref":"#/components/schemas/UserForPublic"}]},"sharedLock":{"nullable":true,"description":"The shared lock","allOf":[{"$ref":"#/components/schemas/SharedLockForPublic"}]},"isAllowedToViewTime":{"type":"boolean","description":"Whether the wearer is allowed to view the remaining time"},"canBeUnlocked":{"type":"boolean","description":"Whether the lock can be unlocked\n\nThis field does not account for extension restrictions\n(reasonsPreventingUnlocking) and may return true even when\nextensions are blocking the unlock.","deprecated":true},"isReadyToUnlock":{"type":"boolean","description":"Whether the lock is truly ready to be unlocked by the wearer, accounting for\nboth timer state, minimum lock time and extension restrictions."},"canBeUnlockedByMaxLimitDate":{"type":"boolean","description":"Whether the lock can be unlocked because the max limit date has been reached"},"isFrozen":{"type":"boolean","description":"Whether the lock is frozen"},"role":{"description":"The user role","enum":["keyholder","wearer","visitor"],"type":"string"},"extensions":{"description":"The extensions","type":"array","items":{"$ref":"#/components/schemas/ExtensionPartyForPublic"}},"combination":{"type":"string","description":"The combination"},"reasonsPreventingUnlocking":{"description":"Reasons preventing unlocking","type":"array","items":{"$ref":"#/components/schemas/ReasonPreventingUnlocking"}},"extensionsAllowUnlocking":{"type":"boolean","description":"Whether the extensions allow unlocking"},"lastVerificationPicture":{"nullable":true,"description":"The last verification picture","allOf":[{"$ref":"#/components/schemas/VerificationPictureItem"}]},"createdAt":{"format":"date-time","type":"string","description":"Created at"},"updatedAt":{"format":"date-time","type":"string","description":"Updated at"},"startDate":{"format":"date-time","type":"string","description":"The start date"},"minDate":{"format":"date-time","type":"string","description":"The minimum initial date configured at creation"},"maxDate":{"format":"date-time","type":"string","description":"The maximum initial date configured at creation"},"maxLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date of the lock\n\nAfter this date, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date of the lock\n\nBefore this date, the lock cannot be unlocked,\neven if the timer expires."},"displayRemainingTime":{"type":"boolean","description":"Whether the remaining time is displayed to the wearer"},"limitLockTime":{"type":"boolean","description":"Whether the lock is limited in duration"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"description":"Deleted at"},"unlockedAt":{"format":"date-time","type":"string","nullable":true,"description":"Unlocked at"},"archivedAt":{"format":"date-time","type":"string","nullable":true,"description":"Archived at"},"recoveredAt":{"format":"date-time","type":"string","nullable":true,"description":"Recovered at (when the wearer explicitly recovered a deserted combination)"},"frozenAt":{"format":"date-time","type":"string","nullable":true,"description":"Frozen at"},"keyholderArchivedAt":{"format":"date-time","type":"string","nullable":true,"description":"Keyholder archived at"},"allowSessionOffer":{"type":"boolean","description":"Whether the lock allows session offers"},"isTestLock":{"type":"boolean","description":"Whether the lock is a test lock and counts in the user stats"},"offerToken":{"type":"string","nullable":true,"description":"The offer token"},"hideTimeLogs":{"type":"boolean","description":"True if the time information should be hidden from the history"},"trusted":{"type":"boolean","description":"Whether the keyholder is trusted"},"availableHomeActions":{"description":"List of home actions\nOnly available for the wearer","type":"array","items":{"$ref":"#/components/schemas/ExtensionHomeActionWithPartyId"}}},"required":["status","lockType","_id","endDate","title","totalDuration","user","keyholder","sharedLock","isAllowedToViewTime","canBeUnlocked","isReadyToUnlock","canBeUnlockedByMaxLimitDate","isFrozen","role","extensions","combination","reasonsPreventingUnlocking","extensionsAllowUnlocking","lastVerificationPicture","createdAt","updatedAt","startDate","minDate","maxDate","maxLimitDate","minLimitDate","displayRemainingTime","limitLockTime","deletedAt","unlockedAt","archivedAt","recoveredAt","frozenAt","keyholderArchivedAt","allowSessionOffer","isTestLock","offerToken","hideTimeLogs","trusted"]},"UpdateTimeDto":{"type":"object","properties":{}},"SetFreezeDto":{"type":"object","properties":{"isFrozen":{"type":"boolean","description":"Whether the lock is frozen"}},"required":["isFrozen"]},"SetLockSettingsDto":{"type":"object","properties":{"displayRemainingTime":{"type":"boolean","description":"Whether the remaining time is displayed to the wearer"},"hideTimeLogs":{"type":"boolean","description":"Whether the time information should be hidden from the history"},"minLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum limit date (keyholder can set, change, or remove)"}}},"IncreaseMaxLimitDateDto":{"type":"object","properties":{"maxLimitDate":{"format":"date-time","type":"string","description":"The new maximum limit date"},"disableMaxLimitDate":{"type":"boolean","description":"Whether the maximum limit date should be disabled","default":false}},"required":["maxLimitDate","disableMaxLimitDate"]},"SetMinLimitDateDto":{"type":"object","properties":{"minLimitDate":{"format":"date-time","type":"string","description":"The new minimum limit date"}},"required":["minLimitDate"]},"CombinationForPublic":{"type":"object","properties":{"imageUrl":{"type":"string","deprecated":true,"description":"Use imageFullUrl instead"},"_id":{"type":"string","description":"The combination id"},"user":{"type":"string","description":"The user id"},"checkStatus":{"description":"The review status, if the combination requires a manual review\nfrom the moderators","enum":["pending","verified","failed"],"type":"string"},"type":{"description":"The combination type","enum":["image","code"],"type":"string"},"code":{"type":"string","description":"The combination code, if the type is `code`"},"imageFullUrl":{"type":"string","description":"The combination image, if the type is `image`"},"createdAt":{"type":"string","description":"Created at"},"updatedAt":{"type":"string","description":"Updated at"},"enableManualCheck":{"type":"boolean","description":"Whether the combination requires a manual review from the moderators"}},"required":["_id","user","checkStatus","type","createdAt","updatedAt","enableManualCheck"]},"GetLockHistoryDto":{"type":"object","properties":{"extension":{"type":"string","description":"If provided, filter by extension slug"},"limit":{"type":"number","description":"Limit","minimum":0,"maximum":100},"lastId":{"type":"string","description":"Offset lastId"}}},"UserForHistory":{"type":"object","properties":{"_id":{"type":"string"},"username":{"type":"string"}},"required":["_id","username"]},"ActionLogForPublic":{"type":"object","properties":{"_id":{"type":"string","description":"The action log id"},"type":{"type":"string","description":"The action log type\nWhen comparing the type, make sure to also compare the prefix\nRead more on https://docs.chaster.app/api/reference/action-logs"},"payload":{"type":"object","description":"The action log payload"},"lock":{"type":"string","description":"The lock id"},"role":{"type":"string","description":"The role of the user who performed the action","enum":["user","keyholder","extension","admin"]},"extension":{"type":"string","description":"The extension which performed the action"},"title":{"type":"string","description":"The title of the action log\nThe title can contain the string '%USER%', which can be replaced with the user's name"},"description":{"type":"string","description":"The description of the action log\nThe description can contain the string '%USER%', which can be replaced with the user's name"},"color":{"type":"string","nullable":true,"description":"The color of the action log"},"createdAt":{"format":"date-time","type":"string","description":"Created at"},"icon":{"type":"string","nullable":true,"description":"The FontAwesome v5 icon of the action log, with the fa prefix"},"prefix":{"type":"string","description":"The prefix of the action log\nFor common action logs, the prefix is `default`. Action logs created by a partner extension have their own prefix."},"user":{"description":"The user who performed the action","allOf":[{"$ref":"#/components/schemas/UserForHistory"}]}},"required":["_id","type","payload","lock","role","title","description","color","createdAt","icon","prefix"]},"GetHistoryRepDto":{"type":"object","properties":{"results":{"description":"List of action logs","type":"array","items":{"$ref":"#/components/schemas/ActionLogForPublic"}},"hasMore":{"type":"boolean","description":"Has more results"}},"required":["results","hasMore"]},"SearchLocksDto":{"type":"object","properties":{"filterByArchivedLocks":{"type":"boolean"},"limit":{"type":"number"},"cursor":{"type":"string"}}},"SearchLocksRepDto":{"type":"object","properties":{"hasMore":{"type":"boolean"},"results":{"type":"array","items":{"$ref":"#/components/schemas/LockForPublic"}},"count":{"type":"number"},"cursor":{"type":"string"}},"required":["hasMore","results","count"]},"UploadCombinationImageDto":{"type":"object","properties":{"file":{"type":"string","description":"The combination image","format":"binary"},"enableManualCheck":{"type":"boolean","description":"Enables the manual combination image check, for Premium users."}},"required":["file"]},"CreateCodeRepDto":{"type":"object","properties":{"combinationId":{"type":"string"}},"required":["combinationId"]},"CreateCodeDto":{"type":"object","properties":{"code":{"type":"string","description":"The code combination","maxLength":255}},"required":["code"]},"UserForBlock":{"type":"object","properties":{"_id":{"type":"string"},"username":{"type":"string"},"avatarUrl":{"type":"string"}},"required":["_id","username","avatarUrl"]},"FindBlocksRepDto":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/UserForBlock"}}},"required":["results"]},"BlockInteraction":{"type":"object","properties":{"blockedByActionUser":{"type":"boolean"},"blockedByOtherUser":{"type":"boolean"},"canInteract":{"type":"boolean"}},"required":["blockedByActionUser","blockedByOtherUser","canInteract"]},"BlockUserDto":{"type":"object","properties":{"targetUserId":{"type":"string"}},"required":["targetUserId"]},"UnblockUserDto":{"type":"object","properties":{"targetUserId":{"type":"string"}},"required":["targetUserId"]},"UserForProfile":{"type":"object","properties":{"sexualOrientation":{"description":"The sexual orientation","$ref":"#/components/schemas/SexualOrientationEnum"},"pronouns":{"description":"The pronouns","$ref":"#/components/schemas/PronounsEnum"},"role":{"description":"The role","$ref":"#/components/schemas/UserRoleEnum"},"features":{"description":"Enabled features","type":"array","items":{"$ref":"#/components/schemas/FeatureSwitchEnum"}},"discordId":{"type":"string","description":"The Discord ID"},"discordUsername":{"type":"string","description":"The Discord username"},"_id":{"type":"string","description":"The user id"},"username":{"type":"string","description":"The username"},"isPremium":{"type":"boolean","description":"Whether the user has a Premium subscription"},"isFindom":{"type":"boolean","description":"Whether the user is a findom"},"isAdmin":{"type":"boolean","description":"Whether the user is an admin"},"isModerator":{"type":"boolean","description":"Whether the user is a moderator"},"isTeamMember":{"type":"boolean","description":"Whether the user is a team member"},"metadata":{"description":"User metadata","allOf":[{"$ref":"#/components/schemas/UserMetadata"}]},"isDisabled":{"type":"boolean","description":"Whether the user is disabled"},"isSuspended":{"type":"boolean","description":"Whether the user is suspended by the Chaster team"},"joinedAt":{"type":"string","description":"Joined date (year and month, YYYY-MM)"},"isNewMember":{"type":"boolean","description":"Whether the user is a new member"},"age":{"type":"number","nullable":true,"description":"The age"},"avatarUrl":{"type":"string","description":"The avatar URL"},"description":{"type":"string","description":"The profile description"},"fullLocation":{"type":"string","description":"User full location"},"gender":{"type":"string","description":"The gender"},"lastSeen":{"type":"number","nullable":true,"description":"User last seen, in seconds"},"location":{"type":"string","description":"The location"},"online":{"type":"boolean","description":"Whether the user is online"},"isSuspendedOrDisabled":{"type":"boolean","description":"Whether the user is suspended or disabled"}},"required":["sexualOrientation","pronouns","role","features","_id","username","isPremium","isFindom","isAdmin","isModerator","isTeamMember","metadata","isDisabled","isSuspended","joinedAt","isNewMember","age","avatarUrl","description","fullLocation","gender","lastSeen","location","online","isSuspendedOrDisabled"]},"UserStatsForPublic":{"type":"object","properties":{"nbStartedLocks":{"type":"number","description":"Number of locks started by the user as a wearer"},"nbEndedLocks":{"type":"number","description":"Number of locks ended by the user as a wearer"},"totalTimeLocked":{"type":"number","description":"Total time locked"},"maxTimeLocked":{"type":"number","description":"Maximum session duration"},"keyholderNbLocks":{"type":"number","description":"Number of locks keyholded"}},"required":["nbStartedLocks","nbEndedLocks","totalTimeLocked","maxTimeLocked","keyholderNbLocks"]},"GetUserAchievementsResponseDto":{"type":"object","properties":{"slug":{"type":"string"},"granted":{"type":"boolean"},"progress":{"type":"number","nullable":true},"total":{"type":"number","nullable":true},"grantedAt":{"type":"string","nullable":true},"name":{"type":"string"},"description":{"type":"string"},"category":{"type":"string"},"progressEnabled":{"type":"boolean"},"hideIfNotGranted":{"type":"boolean"}},"required":["slug","granted","progress","total","grantedAt","name","description","category","progressEnabled","hideIfNotGranted"]},"PublicLockJoinRules":{"type":"object","properties":{"canBeJoined":{"type":"boolean"},"containsPremiumExtension":{"type":"boolean"},"exceedsExtensionLimit":{"type":"boolean"},"oneOfExtensionsDisabled":{"type":"boolean"}},"required":["canBeJoined","containsPremiumExtension","exceedsExtensionLimit","oneOfExtensionsDisabled"]},"PublicLockForProfilePage":{"type":"object","properties":{"lockType":{"description":"The lock type","$ref":"#/components/schemas/LockTypeEnum"},"durationMode":{"description":"Duration mode","$ref":"#/components/schemas/SharedLockDurationModeEnum"},"reasonForPublicHide":{"nullable":true,"$ref":"#/components/schemas/SharedLockReasonForPublicHideEnum"},"maxLimitDuration":{"type":"number","nullable":true,"description":"The maximum duration of the lock, in seconds\n\nAfter this duration, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDuration":{"type":"number","nullable":true,"description":"The minimum duration of the lock, in seconds\n\nBefore this duration, the lock cannot be unlocked,\neven if the timer expires."},"minDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date"},"maxDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date"},"maxLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date of the lock\n\nAfter this date, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date of the lock\n\nBefore this date, the lock cannot be unlocked,\neven if the timer expires."},"displayRemainingTime":{"type":"boolean","description":"Whether the remaining time should be displayed to the wearer"},"limitLockTime":{"type":"boolean","description":"Whether the lock is limited in time"},"maxLockedUsers":{"type":"number","nullable":true,"description":"The number of maximum locked users for this shared lock","minimum":1},"isPublic":{"type":"boolean","description":"Whether the lock is public"},"requireContact":{"type":"boolean","description":"Whether the shared lock requires contact from wearer\n\nDisplayed for information purposes only on the lock page"},"name":{"type":"string","description":"The name"},"description":{"type":"string","description":"The description"},"tags":{"description":"The tags","type":"array","items":{"type":"string"}},"unsplashPhoto":{"nullable":true,"description":"The Unsplash photo","allOf":[{"$ref":"#/components/schemas/UnsplashPhoto"}]},"hideTimeLogs":{"type":"boolean","description":"Whether the time information should be hidden from the history"},"isFindom":{"type":"boolean","description":"Whether the lock is findom"},"lastSavedAt":{"format":"date-time","type":"string","description":"Last saved at"},"_id":{"type":"string","description":"The shared lock id"},"calculatedMaxLimitDuration":{"type":"number","nullable":true,"description":"The calculated max limit duration"},"calculatedMinLimitDuration":{"type":"number","nullable":true,"description":"The calculated min limit duration"},"createdAt":{"type":"string","description":"Created at"},"updatedAt":{"type":"string","nullable":true,"description":"Updated at"},"deletedAt":{"type":"string","nullable":true,"description":"Deleted at"},"archivedAt":{"type":"string","nullable":true,"description":"Archived at"},"locks":{"description":"List of locks\n\nOnly returned in shared locks endpoints","type":"array","items":{"$ref":"#/components/schemas/LockForPublic"}},"requirePassword":{"type":"boolean","description":"Whether the lock requires a password"},"minDuration":{"type":"number"},"maxDuration":{"type":"number"},"joinRules":{"$ref":"#/components/schemas/PublicLockJoinRules"}},"required":["lockType","durationMode","reasonForPublicHide","maxLimitDuration","minLimitDuration","minDate","maxDate","maxLimitDate","minLimitDate","displayRemainingTime","limitLockTime","maxLockedUsers","isPublic","requireContact","name","description","tags","unsplashPhoto","hideTimeLogs","isFindom","lastSavedAt","_id","calculatedMaxLimitDuration","calculatedMinLimitDuration","createdAt","updatedAt","deletedAt","archivedAt","requirePassword","minDuration","maxDuration","joinRules"]},"ChastikeyStatsForPublic":{"type":"object","properties":{"_id":{"type":"string"},"totalLocksManaged":{"type":"number"},"cumulativeSecondsLocked":{"type":"number"},"averageTimeLockedInSeconds":{"type":"number"},"longestCompletedLockInSeconds":{"type":"number"},"totalNoOfCompletedLocks":{"type":"number"},"username":{"type":"string"},"mainRole":{"type":"string"}},"required":["_id","totalLocksManaged","cumulativeSecondsLocked","averageTimeLockedInSeconds","longestCompletedLockInSeconds","totalNoOfCompletedLocks","username","mainRole"]},"UserFindomProfileForPublic":{"type":"object","properties":{"offering":{"type":"string","description":"What services the user is offering"},"paymentMethods":{"type":"string","description":"An explanation of how they want to be paid"},"disputePolicy":{"type":"string","description":"The dispute policy of the user"}},"required":["offering","paymentMethods","disputePolicy"]},"KinkCategoryEnum":{"type":"string","enum":["chastity","denial","bondage","dominance_submission","roleplay","fetish","sensation_impact","sexual_acts","intimacy"]},"KinkRatingEnum":{"type":"string","enum":["curious","like","love","soft_limit","hard_limit"]},"KinkDirectionEnum":{"type":"string","enum":["giving","receiving","wearing","keyholding","dominant","submissive","myself","others"]},"KinkEntryForPublicDto":{"type":"object","properties":{"category":{"$ref":"#/components/schemas/KinkCategoryEnum"},"rating":{"$ref":"#/components/schemas/KinkRatingEnum"},"direction":{"$ref":"#/components/schemas/KinkDirectionEnum"},"name":{"type":"string"}},"required":["category","rating","name"]},"ToyCategoryEnum":{"type":"string","enum":["restraints","impact","sensory_play","chastity","stimulation","other"]},"ToyEntryForPublicDto":{"type":"object","properties":{"category":{"$ref":"#/components/schemas/ToyCategoryEnum"},"name":{"type":"string"}},"required":["category","name"]},"UserKinkProfileForPublicDto":{"type":"object","properties":{"bio":{"type":"string"},"kinks":{"type":"array","items":{"$ref":"#/components/schemas/KinkEntryForPublicDto"}},"toys":{"type":"array","items":{"$ref":"#/components/schemas/ToyEntryForPublicDto"}}},"required":["bio","kinks","toys"]},"ProfileRepDto":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/UserForProfile"},"stats":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UserStatsForPublic"}]},"achievements":{"type":"array","items":{"$ref":"#/components/schemas/GetUserAchievementsResponseDto"}},"sharedLocks":{"type":"array","items":{"$ref":"#/components/schemas/PublicLockForProfilePage"}},"chastikeyStats":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ChastikeyStatsForPublic"}]},"blockInteraction":{"$ref":"#/components/schemas/BlockInteraction"},"findomProfile":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UserFindomProfileForPublic"}]},"kinkProfile":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UserKinkProfileForPublicDto"}]}},"required":["user","stats","achievements","sharedLocks","chastikeyStats","blockInteraction","findomProfile","kinkProfile"]},"ExtensionOwnerForPublic":{"type":"object","properties":{"username":{"type":"string"}},"required":["username"]},"ExtensionForPublic":{"type":"object","properties":{"availableModes":{"description":"Available modes","type":"array","items":{"$ref":"#/components/schemas/ExtensionModeEnum"}},"defaultConfig":{"type":"object","description":"The extension configuration. "},"partnerExtensionId":{"type":"string","nullable":true},"configIframeUrl":{"type":"string","nullable":true},"isTesting":{"type":"boolean"},"isPartner":{"type":"boolean"},"isDevelopedByCommunity":{"type":"boolean"},"owner":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/ExtensionOwnerForPublic"}]},"canUserSelfOnboard":{"type":"boolean"},"subtitle":{"type":"string","description":"The extension subtitle"},"summary":{"type":"string","description":"The extension summary"},"description":{"type":"string","description":"The extension full description (supports Markdown)"},"displayName":{"type":"string","description":"The name displayed to the end users"},"icon":{"type":"string","description":"The extension icon"},"slug":{"type":"string","description":"The extension slug"},"defaultRegularity":{"type":"number","description":"Default regularity","default":3600},"isEnabled":{"type":"boolean","description":"TWhether the extension is enabled","default":true},"isPremium":{"type":"boolean","description":"Whether the extension is only available to Premium users","default":false},"isFeatured":{"type":"boolean","description":"Whether the extension is displayed by default in the list","default":false},"isCountedInExtensionsLimit":{"type":"boolean","description":"Whether the extension is counted in the extensions limit","default":true},"hasActions":{"type":"boolean","description":"Whether the extension has actions","default":true},"tags":{"description":"Extension tags for categorization","default":[],"type":"array","items":{"type":"string"}}},"required":["availableModes","defaultConfig","partnerExtensionId","configIframeUrl","isTesting","isPartner","isDevelopedByCommunity","owner","canUserSelfOnboard","subtitle","summary","displayName","icon","slug","defaultRegularity","isEnabled","isPremium","isFeatured","isCountedInExtensionsLimit","hasActions","tags"]},"TagDto":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"}},"required":["key","label"]},"ExtensionTagCategoryDto":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"tags":{"type":"array","items":{"$ref":"#/components/schemas/TagDto"}}},"required":["key","label","tags"]},"ExtensionTagsResponseDto":{"type":"object","properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/ExtensionTagCategoryDto"}}},"required":["categories"]},"PublicLockForPublic":{"type":"object","properties":{"lockType":{"description":"The lock type","$ref":"#/components/schemas/LockTypeEnum"},"durationMode":{"description":"Duration mode","$ref":"#/components/schemas/SharedLockDurationModeEnum"},"reasonForPublicHide":{"nullable":true,"$ref":"#/components/schemas/SharedLockReasonForPublicHideEnum"},"minDuration":{"type":"number"},"maxDuration":{"type":"number"},"joinRules":{"$ref":"#/components/schemas/PublicLockJoinRules"},"maxLimitDuration":{"type":"number","nullable":true,"description":"The maximum duration of the lock, in seconds\n\nAfter this duration, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDuration":{"type":"number","nullable":true,"description":"The minimum duration of the lock, in seconds\n\nBefore this duration, the lock cannot be unlocked,\neven if the timer expires."},"minDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date"},"maxDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date"},"maxLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date of the lock\n\nAfter this date, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date of the lock\n\nBefore this date, the lock cannot be unlocked,\neven if the timer expires."},"displayRemainingTime":{"type":"boolean","description":"Whether the remaining time should be displayed to the wearer"},"limitLockTime":{"type":"boolean","description":"Whether the lock is limited in time"},"maxLockedUsers":{"type":"number","nullable":true,"description":"The number of maximum locked users for this shared lock","minimum":1},"isPublic":{"type":"boolean","description":"Whether the lock is public"},"requireContact":{"type":"boolean","description":"Whether the shared lock requires contact from wearer\n\nDisplayed for information purposes only on the lock page"},"name":{"type":"string","description":"The name"},"description":{"type":"string","description":"The description"},"tags":{"description":"The tags","type":"array","items":{"type":"string"}},"unsplashPhoto":{"nullable":true,"description":"The Unsplash photo","allOf":[{"$ref":"#/components/schemas/UnsplashPhoto"}]},"hideTimeLogs":{"type":"boolean","description":"Whether the time information should be hidden from the history"},"isFindom":{"type":"boolean","description":"Whether the lock is findom"},"lastSavedAt":{"format":"date-time","type":"string","description":"Last saved at"},"_id":{"type":"string","description":"The shared lock id"},"calculatedMaxLimitDuration":{"type":"number","nullable":true,"description":"The calculated max limit duration"},"calculatedMinLimitDuration":{"type":"number","nullable":true,"description":"The calculated min limit duration"},"user":{"description":"The creator","allOf":[{"$ref":"#/components/schemas/UserForPublic"}]},"extensions":{"description":"Extension configurations","type":"array","items":{"$ref":"#/components/schemas/ExtensionConfigForPublic"}},"createdAt":{"type":"string","description":"Created at"},"updatedAt":{"type":"string","nullable":true,"description":"Updated at"},"deletedAt":{"type":"string","nullable":true,"description":"Deleted at"},"archivedAt":{"type":"string","nullable":true,"description":"Archived at"},"locks":{"description":"List of locks\n\nOnly returned in shared locks endpoints","type":"array","items":{"$ref":"#/components/schemas/LockForPublic"}},"requirePassword":{"type":"boolean","description":"Whether the lock requires a password"}},"required":["lockType","durationMode","reasonForPublicHide","minDuration","maxDuration","joinRules","maxLimitDuration","minLimitDuration","minDate","maxDate","maxLimitDate","minLimitDate","displayRemainingTime","limitLockTime","maxLockedUsers","isPublic","requireContact","name","description","tags","unsplashPhoto","hideTimeLogs","isFindom","lastSavedAt","_id","calculatedMaxLimitDuration","calculatedMinLimitDuration","user","extensions","createdAt","updatedAt","deletedAt","archivedAt","requirePassword"]},"DurationCriteriaData":{"type":"object","properties":{"minDuration":{"type":"number"},"maxDuration":{"type":"number"}},"required":["minDuration","maxDuration"]},"ExtensionCriteriaData":{"type":"object","properties":{"extensions":{"type":"array","items":{"type":"string","pattern":"SLUG_REGEX"}},"excludedExtensions":{"type":"array","items":{"type":"string","pattern":"SLUG_REGEX"}},"all":{"type":"boolean","default":false}},"required":["extensions","all"]},"IsFindomCriteriaData":{"type":"object","properties":{"isFindom":{"type":"boolean","description":"Whether the lock is findom\nIf true, return only findom locks.\nIf false, return only non-findom locks."}},"required":["isFindom"]},"SearchableGenderEnum":{"type":"string","enum":["Male","Female","Non-binary","Agender","Bigender","Genderfluid","Genderqueer","Pangender","Two-spirit"]},"AgeCriteriaData":{"type":"object","properties":{"minAge":{"type":"number","description":"Min age should be greater than 18.","minimum":18},"maxAge":{"type":"number","description":"Max age should be less than 65.\nIf max age is 65, it means that the user is 65 or older.","maximum":65}},"required":["minAge","maxAge"]},"CountryForSearchUsers":{"type":"object","properties":{"countryShortCode":{"type":"string"}},"required":["countryShortCode"]},"RegionForSearchUsers":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"LocationCriteriaData":{"type":"object","properties":{"country":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/CountryForSearchUsers"}]},"region":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/RegionForSearchUsers"}]}},"required":["country","region"]},"RoleCriteriaData":{"type":"object","properties":{"wearer":{"type":"boolean"},"keyholder":{"type":"boolean"}},"required":["wearer","keyholder"]},"KinksCriteriaData":{"type":"object","properties":{"kinks":{"type":"array","items":{"type":"string","maxLength":100}},"all":{"type":"boolean","default":false}},"required":["kinks","all"]},"ToysCriteriaData":{"type":"object","properties":{"toys":{"type":"array","items":{"type":"string","maxLength":100}},"all":{"type":"boolean","default":false}},"required":["toys","all"]},"SearchUsersCriteria":{"type":"object","properties":{"genders":{"type":"array","items":{"$ref":"#/components/schemas/SearchableGenderEnum"}},"sexualOrientations":{"type":"array","items":{"$ref":"#/components/schemas/SexualOrientationEnum"}},"age":{"$ref":"#/components/schemas/AgeCriteriaData"},"location":{"$ref":"#/components/schemas/LocationCriteriaData"},"role":{"$ref":"#/components/schemas/RoleCriteriaData"},"isFindom":{"type":"boolean"},"isActive":{"type":"boolean"},"kinks":{"$ref":"#/components/schemas/KinksCriteriaData"},"toys":{"$ref":"#/components/schemas/ToysCriteriaData"}}},"SearchPublicLockCriteria":{"type":"object","properties":{"duration":{"$ref":"#/components/schemas/DurationCriteriaData"},"maxLimitDuration":{"$ref":"#/components/schemas/DurationCriteriaData"},"extensions":{"$ref":"#/components/schemas/ExtensionCriteriaData"},"isFindom":{"description":"Whether the lock is findom\nUnset this field to return both findom and non-findom locks.","allOf":[{"$ref":"#/components/schemas/IsFindomCriteriaData"}]},"user":{"description":"Search locks by user criteria\nThis criteria is only available for authenticated users","allOf":[{"$ref":"#/components/schemas/SearchUsersCriteria"}]},"tags":{"description":"Search locks by tags","type":"array","items":{"type":"string"}},"matchAllTags":{"type":"boolean","description":"Whether to match all tags\nIf true, return locks that contain all the tags\nIf false, return locks that contain at least one of the tags"},"search":{"type":"string","description":"Search locks by name or description"}}},"SearchPublicLockDto":{"type":"object","properties":{"criteria":{"default":{},"allOf":[{"$ref":"#/components/schemas/SearchPublicLockCriteria"}]},"limit":{"type":"number","default":15,"minimum":0,"maximum":100},"lastId":{"type":"string","description":"Last id of the last result\nThis field is deprecated, use cursor instead","deprecated":true},"cursor":{"type":"string","description":"Cursor for pagination\nUse the cursor provided in the last result to get the next page of results"},"userId":{"type":"string","description":"User id to search locks"}},"required":["criteria","limit"]},"PublicLockForSearch":{"type":"object","properties":{"lockType":{"description":"The lock type","$ref":"#/components/schemas/LockTypeEnum"},"durationMode":{"description":"Duration mode","$ref":"#/components/schemas/SharedLockDurationModeEnum"},"reasonForPublicHide":{"nullable":true,"$ref":"#/components/schemas/SharedLockReasonForPublicHideEnum"},"maxLimitDuration":{"type":"number","nullable":true,"description":"The maximum duration of the lock, in seconds\n\nAfter this duration, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDuration":{"type":"number","nullable":true,"description":"The minimum duration of the lock, in seconds\n\nBefore this duration, the lock cannot be unlocked,\neven if the timer expires."},"minDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date"},"maxDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date"},"maxLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date of the lock\n\nAfter this date, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date of the lock\n\nBefore this date, the lock cannot be unlocked,\neven if the timer expires."},"displayRemainingTime":{"type":"boolean","description":"Whether the remaining time should be displayed to the wearer"},"limitLockTime":{"type":"boolean","description":"Whether the lock is limited in time"},"maxLockedUsers":{"type":"number","nullable":true,"description":"The number of maximum locked users for this shared lock","minimum":1},"isPublic":{"type":"boolean","description":"Whether the lock is public"},"requireContact":{"type":"boolean","description":"Whether the shared lock requires contact from wearer\n\nDisplayed for information purposes only on the lock page"},"name":{"type":"string","description":"The name"},"description":{"type":"string","description":"The description"},"tags":{"description":"The tags","type":"array","items":{"type":"string"}},"unsplashPhoto":{"nullable":true,"description":"The Unsplash photo","allOf":[{"$ref":"#/components/schemas/UnsplashPhoto"}]},"hideTimeLogs":{"type":"boolean","description":"Whether the time information should be hidden from the history"},"isFindom":{"type":"boolean","description":"Whether the lock is findom"},"lastSavedAt":{"format":"date-time","type":"string","description":"Last saved at"},"_id":{"type":"string","description":"The shared lock id"},"calculatedMaxLimitDuration":{"type":"number","nullable":true,"description":"The calculated max limit duration"},"calculatedMinLimitDuration":{"type":"number","nullable":true,"description":"The calculated min limit duration"},"user":{"description":"The creator","allOf":[{"$ref":"#/components/schemas/UserForPublic"}]},"createdAt":{"type":"string","description":"Created at"},"updatedAt":{"type":"string","nullable":true,"description":"Updated at"},"deletedAt":{"type":"string","nullable":true,"description":"Deleted at"},"archivedAt":{"type":"string","nullable":true,"description":"Archived at"},"locks":{"description":"List of locks\n\nOnly returned in shared locks endpoints","type":"array","items":{"$ref":"#/components/schemas/LockForPublic"}},"requirePassword":{"type":"boolean","description":"Whether the lock requires a password"},"minDuration":{"type":"number"},"maxDuration":{"type":"number"},"joinRules":{"$ref":"#/components/schemas/PublicLockJoinRules"}},"required":["lockType","durationMode","reasonForPublicHide","maxLimitDuration","minLimitDuration","minDate","maxDate","maxLimitDate","minLimitDate","displayRemainingTime","limitLockTime","maxLockedUsers","isPublic","requireContact","name","description","tags","unsplashPhoto","hideTimeLogs","isFindom","lastSavedAt","_id","calculatedMaxLimitDuration","calculatedMinLimitDuration","user","createdAt","updatedAt","deletedAt","archivedAt","requirePassword","minDuration","maxDuration","joinRules"]},"SearchPublicLockRepDto":{"type":"object","properties":{"count":{"type":"number"},"hasMore":{"type":"boolean"},"results":{"type":"array","items":{"$ref":"#/components/schemas/PublicLockForSearch"}},"cursor":{"type":"string","description":"Cursor for pagination\nUse this value to get the next page of results"}},"required":["count","hasMore","results"]},"ExploreCategoryForAdmin":{"type":"object","properties":{"_id":{"type":"string"},"locks":{"type":"array","items":{"$ref":"#/components/schemas/PublicLockForSearch"}},"description":{"type":"string"},"featured":{"type":"boolean"},"nbItems":{"type":"number","nullable":true},"order":{"type":"number"},"title":{"type":"string"},"type":{"type":"string"},"filter":{"type":"string","nullable":true}},"required":["_id","locks","description","featured","nbItems","order","title","type","filter"]},"SearchUsersDto":{"type":"object","properties":{"criteria":{"default":{},"allOf":[{"$ref":"#/components/schemas/SearchUsersCriteria"}]},"limit":{"type":"number","default":15,"minimum":0,"maximum":100},"lastId":{"type":"string"},"lastAccessForUserList":{"format":"date-time","type":"string"}},"required":["criteria","limit"]},"UsersSearchResponseDto":{"type":"object","properties":{"count":{"type":"number"},"hasMore":{"type":"boolean"},"results":{"type":"array","items":{"$ref":"#/components/schemas/UserForProfile"}},"lastAccessForUserList":{"format":"date-time","type":"string"}},"required":["count","hasMore","results","lastAccessForUserList"]},"SearchUserUsernameDto":{"type":"object","properties":{"search":{"type":"string"}},"required":["search"]},"UserForPreview":{"type":"object","properties":{"_id":{"type":"string"},"username":{"type":"string"},"avatarUrl":{"type":"string"},"isPremium":{"type":"boolean"},"isAdmin":{"type":"boolean"},"isModerator":{"type":"boolean"},"isFindom":{"type":"boolean"},"online":{"type":"boolean"},"lastSeen":{"type":"number","nullable":true}},"required":["_id","username","avatarUrl","isPremium","isAdmin","isModerator","isFindom","online","lastSeen"]},"CreateUpdateSharedLockDto":{"type":"object","properties":{"lockType":{"description":"The lock type","default":"chastity","$ref":"#/components/schemas/LockTypeEnum"},"minDuration":{"type":"number","description":"The minimum duration, in seconds","minimum":1},"maxDuration":{"type":"number","description":"The maximum duration, in seconds"},"maxLimitDuration":{"type":"number","nullable":true,"description":"The maximum duration of the lock, in seconds\n\nAfter this duration, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDuration":{"type":"number","nullable":true,"description":"The minimum duration of the lock, in seconds\n\nBefore this duration, the lock cannot be unlocked,\neven if the timer expires."},"minDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date"},"maxDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date"},"maxLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date of the lock\n\nAfter this date, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date of the lock\n\nBefore this date, the lock cannot be unlocked,\neven if the timer expires."},"displayRemainingTime":{"type":"boolean","description":"Whether the remaining time should be displayed to the wearer"},"limitLockTime":{"type":"boolean","description":"Whether the lock is limited in time"},"isPublic":{"type":"boolean","description":"Whether the lock is public"},"maxLockedUsers":{"type":"number","nullable":true,"description":"The number of maximum locked users for this shared lock","minimum":1},"password":{"type":"string","nullable":true,"description":"An optional password"},"requireContact":{"type":"boolean","description":"Whether the shared lock requires contact from wearer\n\nDisplayed for information purposes only on the lock page"},"name":{"type":"string","description":"The name","maxLength":60},"description":{"type":"string","description":"The description"},"photoId":{"type":"string","description":"The Unsplash photo id"},"hideTimeLogs":{"type":"boolean","description":"Whether the time information should be hidden from the history"},"isFindom":{"type":"boolean","description":"Whether the lock is a findom lock","default":false},"tags":{"description":"Tags","type":"array","items":{"type":"string"}}},"required":["lockType","minDuration","maxDuration","maxLimitDuration","minLimitDuration","minDate","maxDate","maxLimitDate","minLimitDate","displayRemainingTime","limitLockTime","isPublic","maxLockedUsers","password","requireContact","name","description","photoId","hideTimeLogs","isFindom"]},"CreateSharedLockRepDto":{"type":"object","properties":{"id":{"type":"string","description":"The created shared lock id"}},"required":["id"]},"SharedLockTagForPublic":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"FindSuggestedTagDto":{"type":"object","properties":{"text":{"type":"string","description":"The text"}},"required":["text"]},"KinkDirectionTypeEnum":{"type":"string","enum":["giving_receiving","wearing_keyholding","dominant_submissive","myself_others"]},"PredefinedKinkRepDto":{"type":"object","properties":{"category":{"$ref":"#/components/schemas/KinkCategoryEnum"},"directionType":{"$ref":"#/components/schemas/KinkDirectionTypeEnum"},"name":{"type":"string"}},"required":["category","name"]},"PredefinedToyRepDto":{"type":"object","properties":{"category":{"$ref":"#/components/schemas/ToyCategoryEnum"},"name":{"type":"string"}},"required":["category","name"]},"GetPredefinedKinkProfileItemsRepDto":{"type":"object","properties":{"kinks":{"type":"array","items":{"$ref":"#/components/schemas/PredefinedKinkRepDto"}},"toys":{"type":"array","items":{"$ref":"#/components/schemas/PredefinedToyRepDto"}}},"required":["kinks","toys"]},"KinkEntryRepDto":{"type":"object","properties":{"category":{"$ref":"#/components/schemas/KinkCategoryEnum"},"rating":{"$ref":"#/components/schemas/KinkRatingEnum"},"direction":{"$ref":"#/components/schemas/KinkDirectionEnum"},"name":{"type":"string"}},"required":["category","rating","name"]},"ToyEntryRepDto":{"type":"object","properties":{"category":{"$ref":"#/components/schemas/ToyCategoryEnum"},"name":{"type":"string"}},"required":["category","name"]},"GetUserKinkProfileRepDto":{"type":"object","properties":{"bio":{"type":"string"},"kinks":{"type":"array","items":{"$ref":"#/components/schemas/KinkEntryRepDto"}},"toys":{"type":"array","items":{"$ref":"#/components/schemas/ToyEntryRepDto"}}},"required":["bio","kinks","toys"]},"KinkEntryDto":{"type":"object","properties":{"category":{"$ref":"#/components/schemas/KinkCategoryEnum"},"rating":{"$ref":"#/components/schemas/KinkRatingEnum"},"direction":{"$ref":"#/components/schemas/KinkDirectionEnum"},"name":{"type":"string","maxLength":100}},"required":["category","rating","name"]},"ToyEntryDto":{"type":"object","properties":{"category":{"$ref":"#/components/schemas/ToyCategoryEnum"},"name":{"type":"string","maxLength":100}},"required":["category","name"]},"SetUserKinkProfileDto":{"type":"object","properties":{"bio":{"type":"string","maxLength":5000},"kinks":{"type":"array","items":{"$ref":"#/components/schemas/KinkEntryDto"}},"toys":{"type":"array","items":{"$ref":"#/components/schemas/ToyEntryDto"}}}},"StatsPeriodEnum":{"type":"string","enum":["last_week","last_month","last_3_months","last_6_months","last_year","all_time"]},"CalendarDayStatusEnum":{"type":"string","enum":["unlocked","locked","locked_self_reported","orgasm"]},"CalendarDayDto":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/CalendarDayStatusEnum"},"date":{"type":"string"}},"required":["status","date"]},"CalendarDto":{"type":"object","properties":{"days":{"type":"array","items":{"$ref":"#/components/schemas/CalendarDayDto"}}},"required":["days"]},"UserForLink":{"type":"object","properties":{"_id":{"type":"string"},"username":{"type":"string"},"avatarUrl":{"type":"string"}},"required":["_id","username","avatarUrl"]},"LockPreviewSharedLock":{"type":"object","properties":{"_id":{"type":"string"}},"required":["_id"]},"LockPreview":{"type":"object","properties":{"status":{"description":"The status","$ref":"#/components/schemas/LockStatusEnum"},"canBeUnlockedByMaxLimitDate":{"type":"boolean","deprecated":true},"canBeUnlocked":{"type":"boolean","deprecated":true},"_id":{"type":"string"},"title":{"type":"string"},"startDate":{"format":"date-time","type":"string"},"endDate":{"format":"date-time","type":"string","nullable":true},"frozenAt":{"format":"date-time","type":"string","nullable":true},"unlockedAt":{"format":"date-time","type":"string","nullable":true},"isFrozen":{"type":"boolean"},"user":{"$ref":"#/components/schemas/UserForLink"},"keyholder":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UserForLink"}]},"sharedLock":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/LockPreviewSharedLock"}]},"lastVerificationPicture":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/VerificationPictureItem"}]},"displayRemainingTime":{"type":"boolean","description":"Whether the remaining time is displayed to the wearer"}},"required":["status","canBeUnlockedByMaxLimitDate","canBeUnlocked","_id","title","startDate","endDate","frozenAt","unlockedAt","isFrozen","user","keyholder","sharedLock","lastVerificationPicture","displayRemainingTime"]},"UserPictureForProfileDto":{"type":"object","properties":{"_id":{"type":"string"},"url":{"type":"string"},"livenessVerified":{"type":"boolean"}},"required":["_id","url","livenessVerified"]},"UserProfileOverviewRepDto":{"type":"object","properties":{"user":{"$ref":"#/components/schemas/UserForProfile"},"kinkProfile":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UserKinkProfileForPublicDto"}]},"achievements":{"type":"array","items":{"$ref":"#/components/schemas/GetUserAchievementsResponseDto"}},"calendar":{"$ref":"#/components/schemas/CalendarDto"},"showPublicStatistics":{"type":"boolean"},"locks":{"type":"array","items":{"$ref":"#/components/schemas/LockPreview"}},"pictures":{"type":"array","items":{"$ref":"#/components/schemas/UserPictureForProfileDto"}},"findomProfile":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UserFindomProfileForPublic"}]},"blockInteraction":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/BlockInteraction"}]},"sharedLocksCount":{"type":"number"},"isIdentityVerified":{"type":"boolean"}},"required":["user","kinkProfile","achievements","calendar","showPublicStatistics","locks","pictures","findomProfile","blockInteraction","sharedLocksCount","isIdentityVerified"]},"WearerStreakDto":{"type":"object","properties":{"currentStreak":{"type":"number"},"longestStreak":{"type":"number"}},"required":["currentStreak","longestStreak"]},"WearerActivityDto":{"type":"object","properties":{"consistency":{"type":"number"},"bestPeriod":{"type":"number"},"purity":{"type":"number","nullable":true},"bestDenial":{"type":"number","nullable":true},"shortestLockDuration":{"type":"number"},"longestLockDuration":{"type":"number"},"averageLockDuration":{"type":"number"},"completedLocks":{"type":"number"},"desertedLocks":{"type":"number"},"orgasmCount":{"type":"number"}},"required":["consistency","bestPeriod","purity","bestDenial","shortestLockDuration","longestLockDuration","averageLockDuration","completedLocks","desertedLocks","orgasmCount"]},"WearerGlobalDto":{"type":"object","properties":{"longestSession":{"type":"number"},"totalTimeLocked":{"type":"number"}},"required":["longestSession","totalTimeLocked"]},"WearerStatisticsDto":{"type":"object","properties":{"streak":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/WearerStreakDto"}]},"activity":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/WearerActivityDto"}]},"global":{"$ref":"#/components/schemas/WearerGlobalDto"}},"required":["streak","activity","global"]},"CurrentlyLockedUserDto":{"type":"object","properties":{"username":{"type":"string"},"avatarUrl":{"type":"string"},"lockedSince":{"type":"string"}},"required":["username","avatarUrl","lockedSince"]},"CurrentlyLockedDto":{"type":"object","properties":{"totalCount":{"type":"number"},"users":{"type":"array","items":{"$ref":"#/components/schemas/CurrentlyLockedUserDto"}}},"required":["totalCount","users"]},"KeyholderActivityDto":{"type":"object","properties":{"activeLocks":{"type":"number"},"locksCompleted":{"type":"number"},"uniqueWearers":{"type":"number"},"newLocks":{"type":"number"},"shortestLockDuration":{"type":"number"},"longestLockDuration":{"type":"number"},"averageLockDuration":{"type":"number"},"completedLocks":{"type":"number"},"totalWearers":{"type":"number"},"sharedLocksCount":{"type":"number"}},"required":["activeLocks","locksCompleted","uniqueWearers","newLocks","shortestLockDuration","longestLockDuration","averageLockDuration","completedLocks","totalWearers","sharedLocksCount"]},"KeyholderGlobalDto":{"type":"object","properties":{"totalLocksManaged":{"type":"number"},"totalTimeKeyholding":{"type":"number"}},"required":["totalLocksManaged","totalTimeKeyholding"]},"KeyholderStatisticsDto":{"type":"object","properties":{"currentlyLocked":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/CurrentlyLockedDto"}]},"activity":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/KeyholderActivityDto"}]},"global":{"$ref":"#/components/schemas/KeyholderGlobalDto"}},"required":["currentlyLocked","activity","global"]},"UserProfileStatisticsRepDto":{"type":"object","properties":{"wearer":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/WearerStatisticsDto"}]},"keyholder":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/KeyholderStatisticsDto"}]}},"required":["wearer","keyholder"]},"CalendarStatisticsRepDto":{"type":"object","properties":{"wearer":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/WearerStatisticsDto"}]}},"required":["wearer"]},"StatisticsResetConfigRepDto":{"type":"object","properties":{"wearerStatisticsResetAt":{"format":"date-time","type":"string","nullable":true},"keyholderStatisticsResetAt":{"format":"date-time","type":"string","nullable":true}},"required":["wearerStatisticsResetAt","keyholderStatisticsResetAt"]},"ResetStatisticsRoleEnum":{"type":"string","enum":["wearer","keyholder","both"]},"ResetStatisticsDto":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/ResetStatisticsRoleEnum"}},"required":["role"]},"LivenessActionEnum":{"type":"string","enum":["head_turn","head_nod","head_tilt","look_up","wink_left_eye","wink_right_eye","open_mouth","tongue_out","puff_cheeks","raise_eyebrows","hand_show","peace_sign","thumbs_up","ok_sign","spread_fingers","fist_clench","touch_nose","touch_ear","cover_one_eye","hand_over_mouth"]},"CreateUploadRequestDto":{"type":"object","properties":{"livenessAction":{"$ref":"#/components/schemas/LivenessActionEnum"},"picturesToken":{"type":"string"},"livenessToken":{"type":"string"},"saveLiveness":{"type":"boolean"}},"required":["picturesToken"]},"UserPictureStatusEnum":{"type":"string","enum":["pending","accepted","rejected"]},"UserPictureRejectionReasonEnum":{"type":"string","enum":["fake","inappropriate","low_quality","other"]},"AppFileForPublic":{"type":"object","properties":{"url":{"type":"string","description":"The file URL"}},"required":["url"]},"UserPictureResponseDto":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/UserPictureStatusEnum"},"rejectionReason":{"nullable":true,"$ref":"#/components/schemas/UserPictureRejectionReasonEnum"},"_id":{"type":"string"},"file":{"$ref":"#/components/schemas/AppFileForPublic"},"livenessVerified":{"type":"boolean"},"createdAt":{"format":"date-time","type":"string"}},"required":["status","rejectionReason","_id","file","livenessVerified","createdAt"]},"GetUserPicturesResponseDto":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/UserPictureResponseDto"}}},"required":["results"]},"SavedLivenessResponseDto":{"type":"object","properties":{"livenessAction":{"nullable":true,"$ref":"#/components/schemas/LivenessActionEnum"},"hasSavedLiveness":{"type":"boolean"}},"required":["livenessAction","hasSavedLiveness"]},"LivenessActionResponseDto":{"type":"object","properties":{"action":{"$ref":"#/components/schemas/LivenessActionEnum"}},"required":["action"]},"CalendarEventTypeEnum":{"type":"string","enum":["lock_period","orgasm"]},"CalendarEventSourceEnum":{"type":"string","enum":["verified","self_reported"]},"CalendarEventKeyholderDto":{"type":"object","properties":{"_id":{"type":"string"},"username":{"type":"string"},"avatarUrl":{"type":"string"}},"required":["_id","username","avatarUrl"]},"OrgasmTypeEnum":{"type":"string","enum":["normal","ruined","forced","prostate_only","non_ejaculatory","supervised","wet_dream"]},"StimulationMethodEnum":{"type":"string","enum":["masturbation","oral","penetration","hands_free","toys"]},"OrgasmDetailsResponseDto":{"type":"object","properties":{"types":{"type":"array","items":{"$ref":"#/components/schemas/OrgasmTypeEnum"}},"stimulationMethods":{"type":"array","items":{"$ref":"#/components/schemas/StimulationMethodEnum"}},"edging":{"type":"boolean"},"edgeCount":{"type":"number","nullable":true},"speedChallenge":{"type":"boolean"},"speedDurationSeconds":{"type":"number","nullable":true}},"required":["types","stimulationMethods","edging","edgeCount","speedChallenge","speedDurationSeconds"]},"CalendarEventResponseDto":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/CalendarEventTypeEnum"},"source":{"$ref":"#/components/schemas/CalendarEventSourceEnum"},"_id":{"type":"string"},"startDate":{"format":"date-time","type":"string"},"endDate":{"format":"date-time","type":"string","nullable":true},"isAllDay":{"type":"boolean"},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"keyholder":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/CalendarEventKeyholderDto"}]},"orgasmDetails":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/OrgasmDetailsResponseDto"}]},"isEditable":{"type":"boolean"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["type","source","_id","startDate","endDate","isAllDay","title","description","keyholder","orgasmDetails","isEditable","createdAt","updatedAt"]},"GetCalendarEventsResponseDto":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/CalendarEventResponseDto"}}},"required":["events"]},"CreateOrgasmDetailsDto":{"type":"object","properties":{"types":{"type":"array","items":{"$ref":"#/components/schemas/OrgasmTypeEnum"}},"stimulationMethods":{"type":"array","items":{"$ref":"#/components/schemas/StimulationMethodEnum"}},"edging":{"type":"boolean"},"edgeCount":{"type":"number","nullable":true,"minimum":1,"maximum":999},"speedChallenge":{"type":"boolean"},"speedDurationSeconds":{"type":"number","nullable":true,"minimum":1,"maximum":86400}}},"CreateCalendarEventDto":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/CalendarEventTypeEnum"},"startDate":{"format":"date-time","type":"string"},"endDate":{"format":"date-time","type":"string","nullable":true},"isAllDay":{"type":"boolean"},"description":{"type":"string","nullable":true,"maxLength":1000},"orgasmDetails":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/CreateOrgasmDetailsDto"}]}},"required":["type","startDate"]},"UpdateCalendarEventDto":{"type":"object","properties":{"startDate":{"format":"date-time","type":"string"},"endDate":{"format":"date-time","type":"string","nullable":true},"isAllDay":{"type":"boolean"},"description":{"type":"string","nullable":true,"maxLength":1000},"orgasmDetails":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/CreateOrgasmDetailsDto"}]}}},"CreateOfferRequestDto":{"type":"object","properties":{"keyholder":{"type":"string"}},"required":["keyholder"]},"SessionOfferRequestForPublic":{"type":"object","properties":{"keyholder":{"$ref":"#/components/schemas/UserForPreview"},"lock":{"type":"string"},"status":{"type":"string","enum":["pending","accepted","rejected"]},"validatedAt":{"format":"date-time","type":"string"},"archivedAt":{"format":"date-time","type":"string"}},"required":["keyholder","lock","status"]},"ValidateOfferRequestDto":{"type":"object","properties":{"accept":{"type":"boolean"}},"required":["accept"]},"SessionOfferRequestForKeyholder":{"type":"object","properties":{"keyholder":{"type":"string"},"lock":{"$ref":"#/components/schemas/LockForPublic"},"_id":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"},"archivedAt":{"format":"date-time","type":"string"},"status":{"type":"string","enum":["pending","accepted","rejected"]},"validatedAt":{"format":"date-time","type":"string"}},"required":["keyholder","lock","_id","createdAt","updatedAt","status"]},"GetLockInfoFromExtensionRepDto":{"type":"object","properties":{"extension":{"type":"object","description":"The extension configuration. "},"lock":{"description":"The lock","allOf":[{"$ref":"#/components/schemas/LockForPublic"}]}},"required":["extension","lock"]},"TriggerExtensionActionDto":{"type":"object","properties":{"action":{"type":"string","description":"The action name\nRefer to the extension documentation to know the available actions"},"payload":{"type":"object","description":"The action payload"}},"required":["action","payload"]},"CommunityEventAction":{"type":"object","properties":{"name":{"type":"string"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"points":{"type":"number"},"maxPerPeriod":{"type":"number"},"group":{"type":"string"}},"required":["name","title","description","points"]},"CommunityEventCategory":{"type":"object","properties":{"name":{"type":"string"},"title":{"type":"string"},"maxPoints":{"type":"number","nullable":true},"actions":{"type":"array","items":{"$ref":"#/components/schemas/CommunityEventAction"}},"hidden":{"type":"boolean"}},"required":["name","title","maxPoints","actions"]},"GetPeriodDetailsDto":{"type":"object","properties":{"date":{"format":"date-time","type":"string"}},"required":["date"]},"GetPeriodDetailsRepDto":{"type":"object","properties":{"categories":{"type":"object","additionalProperties":{"type":"number"}},"actions":{"type":"object","additionalProperties":{"type":"number"}},"start":{"format":"date-time","type":"string"},"end":{"format":"date-time","type":"string"}},"required":["categories","actions","start","end"]},"LockExtensionConfigDto":{"type":"object","properties":{"slug":{"type":"string","description":"The extension slug. "},"config":{"type":"object","description":"The extension configuration. "},"partnerConfigurationToken":{"type":"string"},"mode":{"type":"string","enum":["cumulative","non_cumulative","turn","unlimited"]},"regularity":{"type":"number","minimum":0}},"required":["slug","config","mode","regularity"]},"CreateLockDto":{"type":"object","properties":{"lockType":{"description":"The lock type","default":"chastity","$ref":"#/components/schemas/LockTypeEnum"},"minDuration":{"type":"number","description":"Min duration in seconds","minimum":0},"maxDuration":{"type":"number","description":"Max duration in seconds"},"maxLimitDuration":{"type":"number","nullable":true,"description":"Max limit duration in seconds"},"minLimitDuration":{"type":"number","nullable":true,"description":"Min limit duration in seconds"},"displayRemainingTime":{"type":"boolean","description":"True if the user can view the remaining time"},"limitLockTime":{"type":"boolean","description":"True if the lock is limited in duration"},"combinationId":{"type":"string","description":"The combination id\n\nA combination object can be created by using the combination endpoints."},"extensions":{"type":"array","items":{"$ref":"#/components/schemas/LockExtensionConfigDto"}},"allowSessionOffer":{"type":"boolean","description":"True if the wearer can offer the lock to a keyholder"},"isTestLock":{"type":"boolean","description":"Whether the lock is a test lock and counts in the user stats","default":false},"hideTimeLogs":{"type":"boolean","description":"True if the time information should be hidden from the history"}},"required":["lockType","minDuration","maxDuration","maxLimitDuration","minLimitDuration","displayRemainingTime","limitLockTime","combinationId","extensions","allowSessionOffer","isTestLock","hideTimeLogs"]},"LockCreatedRepDto":{"type":"object","properties":{"lockId":{"type":"string","description":"The created lock id"}},"required":["lockId"]},"EditLockExtensionsDto":{"type":"object","properties":{"extensions":{"type":"array","items":{"$ref":"#/components/schemas/LockExtensionConfigDto"}}},"required":["extensions"]},"CreateLockFromSharedLockDto":{"type":"object","properties":{"isTestLock":{"type":"boolean","description":"Whether the lock is a test lock and counts in the user stats\nOnly available if the shared lock allows test locks","default":false},"password":{"type":"string","description":"The shared lock password, if needed"},"combinationId":{"type":"string","description":"The combination id"}},"required":["combinationId"]},"PartnerExtensionIconEnum":{"type":"string","enum":["abacus","acorn","ad","address-book","address-card","adjust","air-conditioner","air-freshener","alarm-clock","alarm-exclamation","alarm-plus","alarm-snooze","album-collection","album","alicorn","alien-monster","alien","align-center","align-justify","align-left","align-right","align-slash","allergies","ambulance","american-sign-language-interpreting","amp-guitar","analytics","anchor","angel","angle-double-down","angle-double-left","angle-double-right","angle-double-up","angle-down","angle-left","angle-right","angle-up","angry","ankh","apple-alt","apple-crate","archive","archway","arrow-alt-circle-down","arrow-alt-circle-left","arrow-alt-circle-right","arrow-alt-circle-up","arrow-alt-down","arrow-alt-from-bottom","arrow-alt-from-left","arrow-alt-from-right","arrow-alt-from-top","arrow-alt-left","arrow-alt-right","arrow-alt-square-down","arrow-alt-square-left","arrow-alt-square-right","arrow-alt-square-up","arrow-alt-to-bottom","arrow-alt-to-left","arrow-alt-to-right","arrow-alt-to-top","arrow-alt-up","arrow-circle-down","arrow-circle-left","arrow-circle-right","arrow-circle-up","arrow-down","arrow-from-bottom","arrow-from-left","arrow-from-right","arrow-from-top","arrow-left","arrow-right","arrow-square-down","arrow-square-left","arrow-square-right","arrow-square-up","arrow-to-bottom","arrow-to-left","arrow-to-right","arrow-to-top","arrow-up","arrows-alt-h","arrows-alt-v","arrows-alt","arrows-h","arrows-v","arrows","assistive-listening-systems","asterisk","at","atlas","atom-alt","atom","audio-description","award","axe-battle","axe","baby-carriage","baby","backpack","backspace","backward","bacon","bacteria","bacterium","badge-check","badge-dollar","badge-percent","badge-sheriff","badge","badger-honey","bags-shopping","bahai","balance-scale-left","balance-scale-right","balance-scale","ball-pile","ballot-check","ballot","ban","band-aid","banjo","barcode-alt","barcode-read","barcode-scan","barcode","bars","baseball-ball","baseball","basketball-ball","basketball-hoop","bat","bath","battery-bolt","battery-empty","battery-full","battery-half","battery-quarter","battery-slash","battery-three-quarters","bed-alt","bed-bunk","bed-empty","bed","beer","bell-exclamation","bell-on","bell-plus","bell-school-slash","bell-school","bell-slash","bell","bells","betamax","bezier-curve","bible","bicycle","biking-mountain","biking","binoculars","biohazard","birthday-cake","blanket","blender-phone","blender","blind","blinds-open","blinds-raised","blinds","blog","bold","bolt","bomb","bone-break","bone","bong","book-alt","book-dead","book-heart","book-medical","book-open","book-reader","book-spells","book-user","book","bookmark","books-medical","books","boombox","boot","booth-curtain","border-all","border-bottom","border-center-h","border-center-v","border-inner","border-left","border-none","border-outer","border-right","border-style-alt","border-style","border-top","bow-arrow","bowling-ball","bowling-pins","box-alt","box-ballot","box-check","box-fragile","box-full","box-heart","box-open","box-tissue","box-up","box-usd","box","boxes-alt","boxes","boxing-glove","brackets-curly","brackets","braille","brain","bread-loaf","bread-slice","briefcase-medical","briefcase","bring-forward","bring-front","broadcast-tower","broom","browser","brush","bug","building","bullhorn","bullseye-arrow","bullseye-pointer","bullseye","burger-soda","burn","burrito","bus-alt","bus-school","bus","business-time","cabinet-filing","cactus","calculator-alt","calculator","calendar-alt","calendar-check","calendar-day","calendar-edit","calendar-exclamation","calendar-minus","calendar-plus","calendar-star","calendar-times","calendar-week","calendar","camcorder","camera-alt","camera-home","camera-movie","camera-polaroid","camera-retro","camera","campfire","campground","candle-holder","candy-cane","candy-corn","cannabis","capsules","car-alt","car-battery","car-building","car-bump","car-bus","car-crash","car-garage","car-mechanic","car-side","car-tilt","car-wash","car","caravan-alt","caravan","caret-circle-down","caret-circle-left","caret-circle-right","caret-circle-up","caret-down","caret-left","caret-right","caret-square-down","caret-square-left","caret-square-right","caret-square-up","caret-up","carrot","cars","cart-arrow-down","cart-plus","cash-register","cassette-tape","cat-space","cat","cauldron","cctv","certificate","chair-office","chair","chalkboard-teacher","chalkboard","charging-station","chart-area","chart-bar","chart-line-down","chart-line","chart-network","chart-pie-alt","chart-pie","chart-scatter","check-circle","check-double","check-square","check","cheese-swiss","cheese","cheeseburger","chess-bishop-alt","chess-bishop","chess-board","chess-clock-alt","chess-clock","chess-king-alt","chess-king","chess-knight-alt","chess-knight","chess-pawn-alt","chess-pawn","chess-queen-alt","chess-queen","chess-rook-alt","chess-rook","chess","chevron-circle-down","chevron-circle-left","chevron-circle-right","chevron-circle-up","chevron-double-down","chevron-double-left","chevron-double-right","chevron-double-up","chevron-down","chevron-left","chevron-right","chevron-square-down","chevron-square-left","chevron-square-right","chevron-square-up","chevron-up","child","chimney","church","circle-notch","circle","city","clarinet","claw-marks","clinic-medical","clipboard-check","clipboard-list-check","clipboard-list","clipboard-prescription","clipboard-user","clipboard","clock","clone","closed-captioning","cloud-download-alt","cloud-download","cloud-drizzle","cloud-hail-mixed","cloud-hail","cloud-meatball","cloud-moon-rain","cloud-moon","cloud-music","cloud-rain","cloud-rainbow","cloud-showers-heavy","cloud-showers","cloud-sleet","cloud-snow","cloud-sun-rain","cloud-sun","cloud-upload-alt","cloud-upload","cloud","clouds-moon","clouds-sun","clouds","club","cocktail","code-branch","code-commit","code-merge","code","coffee-pot","coffee-togo","coffee","coffin-cross","coffin","cog","cogs","coin","coins","columns","comet","comment-alt-check","comment-alt-dollar","comment-alt-dots","comment-alt-edit","comment-alt-exclamation","comment-alt-lines","comment-alt-medical","comment-alt-minus","comment-alt-music","comment-alt-plus","comment-alt-slash","comment-alt-smile","comment-alt-times","comment-alt","comment-check","comment-dollar","comment-dots","comment-edit","comment-exclamation","comment-lines","comment-medical","comment-minus","comment-music","comment-plus","comment-slash","comment-smile","comment-times","comment","comments-alt-dollar","comments-alt","comments-dollar","comments","compact-disc","compass-slash","compass","compress-alt","compress-arrows-alt","compress-wide","compress","computer-classic","computer-speaker","concierge-bell","construction","container-storage","conveyor-belt-alt","conveyor-belt","cookie-bite","cookie","copy","copyright","corn","couch","cow","cowbell-more","cowbell","credit-card-blank","credit-card-front","credit-card","cricket","croissant","crop-alt","crop","cross","crosshairs","crow","crown","crutch","crutches","cube","cubes","curling","cut","dagger","database","deaf","debug","deer-rudolph","deer","democrat","desktop-alt","desktop","dewpoint","dharmachakra","diagnoses","diamond","dice-d10","dice-d12","dice-d20","dice-d4","dice-d6","dice-d8","dice-five","dice-four","dice-one","dice-six","dice-three","dice-two","dice","digging","digital-tachograph","diploma","directions","disc-drive","disease","divide","dizzy","dna","do-not-enter","dog-leashed","dog","dollar-sign","dolly-empty","dolly-flatbed-alt","dolly-flatbed-empty","dolly-flatbed","dolly","donate","door-closed","door-open","dot-circle","dove","download","drafting-compass","dragon","draw-circle","draw-polygon","draw-square","dreidel","drone-alt","drone","drum-steelpan","drum","drumstick-bite","drumstick","dryer-alt","dryer","duck","dumbbell","dumpster-fire","dumpster","dungeon","ear-muffs","ear","eclipse-alt","eclipse","edit","egg-fried","egg","eject","elephant","ellipsis-h-alt","ellipsis-h","ellipsis-v-alt","ellipsis-v","empty-set","engine-warning","envelope-open-dollar","envelope-open-text","envelope-open","envelope-square","envelope","equals","eraser","ethernet","euro-sign","exchange-alt","exchange","exclamation-circle","exclamation-square","exclamation-triangle","exclamation","expand-alt","expand-arrows-alt","expand-arrows","expand-wide","expand","external-link-alt","external-link-square-alt","external-link-square","external-link","eye-dropper","eye-evil","eye-slash","eye","fan-table","fan","farm","fast-backward","fast-forward","faucet-drip","faucet","fax","feather-alt","feather","female","field-hockey","fighter-jet","file-alt","file-archive","file-audio","file-certificate","file-chart-line","file-chart-pie","file-check","file-code","file-contract","file-csv","file-download","file-edit","file-excel","file-exclamation","file-export","file-image","file-import","file-invoice-dollar","file-invoice","file-medical-alt","file-medical","file-minus","file-music","file-pdf","file-plus","file-powerpoint","file-prescription","file-search","file-signature","file-spreadsheet","file-times","file-upload","file-user","file-video","file-word","file","files-medical","fill-drip","fill","film-alt","film-canister","film","filter","fingerprint","fire-alt","fire-extinguisher","fire-smoke","fire","fireplace","first-aid","fish-cooked","fish","fist-raised","flag-alt","flag-checkered","flag-usa","flag","flame","flashlight","flask-poison","flask-potion","flask","flower-daffodil","flower-tulip","flower","flushed","flute","flux-capacitor","fog","folder-download","folder-minus","folder-open","folder-plus","folder-times","folder-tree","folder-upload","folder","folders","font-awesome-logo-full","font-case","font","football-ball","football-helmet","forklift","forward","fragile","french-fries","frog","frosty-head","frown-open","frown","function","funnel-dollar","futbol","galaxy","game-board-alt","game-board","game-console-handheld","gamepad-alt","gamepad","garage-car","garage-open","garage","gas-pump-slash","gas-pump","gavel","gem","genderless","ghost","gift-card","gift","gifts","gingerbread-man","glass-champagne","glass-cheers","glass-citrus","glass-martini-alt","glass-martini","glass-whiskey-rocks","glass-whiskey","glass","glasses-alt","glasses","globe-africa","globe-americas","globe-asia","globe-europe","globe-snow","globe-stand","globe","golf-ball","golf-club","gopuram","graduation-cap","gramophone","greater-than-equal","greater-than","grimace","grin-alt","grin-beam-sweat","grin-beam","grin-hearts","grin-squint-tears","grin-squint","grin-stars","grin-tears","grin-tongue-squint","grin-tongue-wink","grin-tongue","grin-wink","grin","grip-horizontal","grip-lines-vertical","grip-lines","grip-vertical","guitar-electric","guitar","guitars","h-square","h1","h2","h3","h4","hamburger","hammer-war","hammer","hamsa","hand-heart","hand-holding-box","hand-holding-heart","hand-holding-magic","hand-holding-medical","hand-holding-seedling","hand-holding-usd","hand-holding-water","hand-holding","hand-lizard","hand-middle-finger","hand-paper","hand-peace","hand-point-down","hand-point-left","hand-point-right","hand-point-up","hand-pointer","hand-receiving","hand-rock","hand-scissors","hand-sparkles","hand-spock","hands-heart","hands-helping","hands-usd","hands-wash","hands","handshake-alt-slash","handshake-alt","handshake-slash","handshake","hanukiah","hard-hat","hashtag","hat-chef","hat-cowboy-side","hat-cowboy","hat-santa","hat-winter","hat-witch","hat-wizard","hdd","head-side-brain","head-side-cough-slash","head-side-cough","head-side-headphones","head-side-mask","head-side-medical","head-side-virus","head-side","head-vr","heading","headphones-alt","headphones","headset","heart-broken","heart-circle","heart-rate","heart-square","heart","heartbeat","heat","helicopter","helmet-battle","hexagon","highlighter","hiking","hippo","history","hockey-mask","hockey-puck","hockey-sticks","holly-berry","home-alt","home-heart","home-lg-alt","home-lg","home","hood-cloak","horizontal-rule","horse-head","horse-saddle","horse","hospital-alt","hospital-symbol","hospital-user","hospital","hospitals","hot-tub","hotdog","hotel","hourglass-end","hourglass-half","hourglass-start","hourglass","house-damage","house-day","house-flood","house-leave","house-night","house-return","house-signal","house-user","house","hryvnia","humidity","hurricane","i-cursor","ice-cream","ice-skate","icicles","icons-alt","icons","id-badge","id-card-alt","id-card","igloo","image-polaroid","image","images","inbox-in","inbox-out","inbox","indent","industry-alt","industry","infinity","info-circle","info-square","info","inhaler","integral","intersection","inventory","island-tropical","italic","jack-o-lantern","jedi","joint","journal-whills","joystick","jug","kaaba","kazoo","kerning","key-skeleton","key","keyboard","keynote","khanda","kidneys","kiss-beam","kiss-wink-heart","kiss","kite","kiwi-bird","knife-kitchen","lambda","lamp-desk","lamp-floor","lamp","landmark-alt","landmark","language","laptop-code","laptop-house","laptop-medical","laptop","lasso","laugh-beam","laugh-squint","laugh-wink","laugh","layer-group","layer-minus","layer-plus","leaf-heart","leaf-maple","leaf-oak","leaf","lemon","less-than-equal","less-than","level-down-alt","level-down","level-up-alt","level-up","life-ring","light-ceiling","light-switch-off","light-switch-on","light-switch","lightbulb-dollar","lightbulb-exclamation","lightbulb-on","lightbulb-slash","lightbulb","lights-holiday","line-columns","line-height","link","lips","lira-sign","list-alt","list-music","list-ol","list-ul","list","location-arrow","location-circle","location-slash","location","lock-alt","lock-open-alt","lock-open","lock","long-arrow-alt-down","long-arrow-alt-left","long-arrow-alt-right","long-arrow-alt-up","long-arrow-down","long-arrow-left","long-arrow-right","long-arrow-up","loveseat","low-vision","luchador","luggage-cart","lungs-virus","lungs","mace","magic","magnet","mail-bulk","mailbox","male","mandolin","map-marked-alt","map-marked","map-marker-alt-slash","map-marker-alt","map-marker-check","map-marker-edit","map-marker-exclamation","map-marker-minus","map-marker-plus","map-marker-question","map-marker-slash","map-marker-smile","map-marker-times","map-marker","map-pin","map-signs","map","marker","mars-double","mars-stroke-h","mars-stroke-v","mars-stroke","mars","mask","meat","medal","medkit","megaphone","meh-blank","meh-rolling-eyes","meh","memory","menorah","mercury","meteor","microchip","microphone-alt-slash","microphone-alt","microphone-slash","microphone-stand","microphone","microscope","microwave","mind-share","minus-circle","minus-hexagon","minus-octagon","minus-square","minus","mistletoe","mitten","mobile-alt","mobile-android-alt","mobile-android","mobile","money-bill-alt","money-bill-wave-alt","money-bill-wave","money-bill","money-check-alt","money-check-edit-alt","money-check-edit","money-check","monitor-heart-rate","monkey","monument","moon-cloud","moon-stars","moon","mortar-pestle","mosque","motorcycle","mountain","mountains","mouse-alt","mouse-pointer","mouse","mp3-player","mug-hot","mug-marshmallows","mug-tea","mug","music-alt-slash","music-alt","music-slash","music","narwhal","network-wired","neuter","newspaper","not-equal","notes-medical","object-group","object-ungroup","octagon","oil-can","oil-temp","om","omega","ornament","otter","outdent","outlet","oven","overline","page-break","pager","paint-brush-alt","paint-brush","paint-roller","palette","pallet-alt","pallet","paper-plane","paperclip","parachute-box","paragraph-rtl","paragraph","parking-circle-slash","parking-circle","parking-slash","parking","passport","pastafarianism","paste","pause-circle","pause","paw-alt","paw-claws","paw","peace","pegasus","pen-alt","pen-fancy","pen-nib","pen-square","pen","pencil-alt","pencil-paintbrush","pencil-ruler","pencil","pennant","people-arrows","people-carry","pepper-hot","percent","percentage","person-booth","person-carry","person-dolly-empty","person-dolly","person-sign","phone-alt","phone-laptop","phone-office","phone-plus","phone-rotary","phone-slash","phone-square-alt","phone-square","phone-volume","phone","photo-video","pi","piano-keyboard","piano","pie","pig","piggy-bank","pills","pizza-slice","pizza","place-of-worship","plane-alt","plane-arrival","plane-departure","plane-slash","plane","planet-moon","planet-ringed","play-circle","play","plug","plus-circle","plus-hexagon","plus-octagon","plus-square","plus","podcast","podium-star","podium","police-box","poll-h","poll-people","poll","poo-storm","poo","poop","popcorn","portal-enter","portal-exit","portrait","pound-sign","power-off","pray","praying-hands","prescription-bottle-alt","prescription-bottle","prescription","presentation","print-search","print-slash","print","procedures","project-diagram","projector","pump-medical","pump-soap","pumpkin","puzzle-piece","qrcode","question-circle","question-square","question","quidditch","quote-left","quote-right","quran","rabbit-fast","rabbit","racquet","radar","radiation-alt","radiation","radio-alt","radio","rainbow","raindrops","ram","ramp-loading","random","raygun","receipt","record-vinyl","rectangle-landscape","rectangle-portrait","rectangle-wide","recycle","redo-alt","redo","refrigerator","registered","remove-format","repeat-1-alt","repeat-1","repeat-alt","repeat","reply-all","reply","republican","restroom","retweet-alt","retweet","ribbon","ring","rings-wedding","road","robot","rocket-launch","rocket","route-highway","route-interstate","route","router","rss-square","rss","ruble-sign","ruler-combined","ruler-horizontal","ruler-triangle","ruler-vertical","ruler","running","rupee-sign","rv","sack-dollar","sack","sad-cry","sad-tear","salad","sandwich","satellite-dish","satellite","sausage","save","sax-hot","saxophone","scalpel-path","scalpel","scanner-image","scanner-keyboard","scanner-touchscreen","scanner","scarecrow","scarf","school","screwdriver","scroll-old","scroll","scrubber","scythe","sd-card","search-dollar","search-location","search-minus","search-plus","search","seedling","send-back","send-backward","sensor-alert","sensor-fire","sensor-on","sensor-smoke","sensor","server","shapes","share-all","share-alt-square","share-alt","share-square","share","sheep","shekel-sign","shield-alt","shield-check","shield-cross","shield-virus","shield","ship","shipping-fast","shipping-timed","shish-kebab","shoe-prints","shopping-bag","shopping-basket","shopping-cart","shovel-snow","shovel","shower","shredder","shuttle-van","shuttlecock","sickle","sigma","sign-in-alt","sign-in","sign-language","sign-out-alt","sign-out","sign","signal-1","signal-2","signal-3","signal-4","signal-alt-1","signal-alt-2","signal-alt-3","signal-alt-slash","signal-alt","signal-slash","signal-stream","signal","signature","sim-card","sink","siren-on","siren","sitemap","skating","skeleton","ski-jump","ski-lift","skiing-nordic","skiing","skull-cow","skull-crossbones","skull","slash","sledding","sleigh","sliders-h-square","sliders-h","sliders-v-square","sliders-v","smile-beam","smile-plus","smile-wink","smile","smog","smoke","smoking-ban","smoking","sms","snake","snooze","snow-blowing","snowboarding","snowflake","snowflakes","snowman","snowmobile","snowplow","soap","socks","solar-panel","solar-system","sort-alpha-down-alt","sort-alpha-down","sort-alpha-up-alt","sort-alpha-up","sort-alt","sort-amount-down-alt","sort-amount-down","sort-amount-up-alt","sort-amount-up","sort-circle-down","sort-circle-up","sort-circle","sort-down","sort-numeric-down-alt","sort-numeric-down","sort-numeric-up-alt","sort-numeric-up","sort-shapes-down-alt","sort-shapes-down","sort-shapes-up-alt","sort-shapes-up","sort-size-down-alt","sort-size-down","sort-size-up-alt","sort-size-up","sort-up","sort","soup","spa","space-shuttle","space-station-moon-alt","space-station-moon","spade","sparkles","speaker","speakers","spell-check","spider-black-widow","spider-web","spider","spinner-third","spinner","splotch","spray-can","sprinkler","square-full","square-root-alt","square-root","square","squirrel","staff","stamp","star-and-crescent","star-christmas","star-exclamation","star-half-alt","star-half","star-of-david","star-of-life","star-shooting","star","starfighter-alt","starfighter","stars","starship-freighter","starship","steak","steering-wheel","step-backward","step-forward","stethoscope","sticky-note","stocking","stomach","stop-circle","stop","stopwatch-20","stopwatch","store-alt-slash","store-alt","store-slash","store","stream","street-view","stretcher","strikethrough","stroopwafel","subscript","subway","suitcase-rolling","suitcase","sun-cloud","sun-dust","sun-haze","sun","sunglasses","sunrise","sunset","superscript","surprise","swatchbook","swimmer","swimming-pool","sword-laser-alt","sword-laser","sword","swords-laser","swords","synagogue","sync-alt","sync","syringe","t","table-tennis","table","tablet-alt","tablet-android-alt","tablet-android","tablet-rugged","tablet","tablets","tachometer-alt-average","tachometer-alt-fast","tachometer-alt-fastest","tachometer-alt-slow","tachometer-alt-slowest","tachometer-alt","tachometer-average","tachometer-fast","tachometer-fastest","tachometer-slow","tachometer-slowest","tachometer","taco","tag","tags","tally","tanakh","tape","tasks-alt","tasks","taxi","teeth-open","teeth","telescope","temperature-down","temperature-frigid","temperature-high","temperature-hot","temperature-low","temperature-up","tenge","tennis-ball","terminal","text-height","text-size","text-width","text","th-large","th-list","th","theater-masks","thermometer-empty","thermometer-full","thermometer-half","thermometer-quarter","thermometer-three-quarters","thermometer","theta","thumbs-down","thumbs-up","thumbtack","thunderstorm-moon","thunderstorm-sun","thunderstorm","ticket-alt","ticket","tilde","times-circle","times-hexagon","times-octagon","times-square","times","tint-slash","tint","tire-flat","tire-pressure-warning","tire-rugged","tire","tired","toggle-off","toggle-on","toilet-paper-alt","toilet-paper-slash","toilet-paper","toilet","tombstone-alt","tombstone","toolbox","tools","tooth","toothbrush","torah","torii-gate","tornado","tractor","trademark","traffic-cone","traffic-light-go","traffic-light-slow","traffic-light-stop","traffic-light","trailer","train","tram","transgender-alt","transgender","transporter-1","transporter-2","transporter-3","transporter-empty","transporter","trash-alt","trash-restore-alt","trash-restore","trash-undo-alt","trash-undo","trash","treasure-chest","tree-alt","tree-christmas","tree-decorated","tree-large","tree-palm","tree","trees","triangle-music","triangle","trophy-alt","trophy","truck-container","truck-couch","truck-loading","truck-monster","truck-moving","truck-pickup","truck-plow","truck-ramp","truck","trumpet","tshirt","tty","turkey","turntable","turtle","tv-alt","tv-music","tv-retro","tv","typewriter","ufo-beam","ufo","umbrella-beach","umbrella","underline","undo-alt","undo","unicorn","union","universal-access","university","unlink","unlock-alt","unlock","upload","usb-drive","usd-circle","usd-square","user-alien","user-alt-slash","user-alt","user-astronaut","user-chart","user-check","user-circle","user-clock","user-cog","user-cowboy","user-crown","user-edit","user-friends","user-graduate","user-hard-hat","user-headset","user-injured","user-lock","user-md-chat","user-md","user-minus","user-music","user-ninja","user-nurse","user-plus","user-robot","user-secret","user-shield","user-slash","user-tag","user-tie","user-times","user-unlock","user-visor","user","users-class","users-cog","users-crown","users-medical","users-slash","users","utensil-fork","utensil-knife","utensil-spoon","utensils-alt","utensils","vacuum-robot","vacuum","value-absolute","vector-square","venus-double","venus-mars","venus","vest-patches","vest","vhs","vial","vials","video-plus","video-slash","video","vihara","violin","virus-slash","virus","viruses","voicemail","volcano","volleyball-ball","volume-down","volume-mute","volume-off","volume-slash","volume-up","volume","vote-nay","vote-yea","vr-cardboard","wagon-covered","walker","walkie-talkie","walking","wallet","wand-magic","wand","warehouse-alt","warehouse","washer","watch-calculator","watch-fitness","watch","water-lower","water-rise","water","wave-sine","wave-square","wave-triangle","waveform-path","waveform","webcam-slash","webcam","weight-hanging","weight","whale","wheat","wheelchair","whistle","wifi-1","wifi-2","wifi-slash","wifi","wind-turbine","wind-warning","wind","window-alt","window-close","window-frame-open","window-frame","window-maximize","window-minimize","window-restore","window","windsock","wine-bottle","wine-glass-alt","wine-glass","won-sign","wreath","wrench","x-ray","yen-sign","yin-yang"]},"TesterUserForDashboard":{"type":"object","properties":{"_id":{"type":"string","description":"User ID","example":"507f1f77bcf86cd799439011"},"username":{"type":"string","description":"Username","example":"john_doe"}},"required":["_id","username"]},"ActionType":{"type":"object","properties":{"type":{"type":"string","pattern":"/^[a-z0-9-_]{1,20}$/"},"icon":{"type":"string","nullable":true},"color":{"type":"string","nullable":true},"titleTemplate":{"type":"string","nullable":true},"descriptionTemplate":{"type":"string","nullable":true}},"required":["type","icon","color","titleTemplate","descriptionTemplate"]},"HabitTypeEnum":{"type":"string","enum":["recurring","time_limit"]},"HabitModel":{"type":"object","properties":{"name":{"type":"string","description":"The habit name","pattern":"/^[a-z0-9-_]{1,20}$/"},"type":{"description":"The habit type: Recurring or TimeLimit","$ref":"#/components/schemas/HabitTypeEnum"},"label":{"type":"string","description":"The habit label"},"paramsText":{"type":"string","description":"The text requesting the required number of actions or limited time\n\nExample: Number of dice rolls required"},"punishmentText":{"type":"string","description":"The text indicating the punishments\n\nExample: Penalty for not rolling the dice in time"}},"required":["name","type","label","paramsText","punishmentText"]},"PartnerExtensionForDashboard":{"type":"object","properties":{"slug":{"type":"string","description":"The extension slug. It is unique and cannot be modified.","pattern":"/^[a-z0-9-]{1,30}$/"},"icon":{"description":"The FontAwesome icon, without the `fa-` prefix.\n\nThe icon must be part of the FontAwesome v5 regular icons:\nhttps://fontawesome.com/v5/search?o=r&s=regular","$ref":"#/components/schemas/PartnerExtensionIconEnum"},"availableModes":{"description":"Available modes","type":"array","items":{"$ref":"#/components/schemas/ExtensionModeEnum"}},"enableStartTimeout":{"type":"boolean","description":"If true, the locked user will have to wait the specified time\nbefore making his first action","default":false},"defaultRegularity":{"type":"number","description":"Default regularity","default":3600},"isEnabled":{"type":"boolean","description":"True if the extension is enabled","default":true},"isPremium":{"type":"boolean","description":"True if the extension is only available to Premium users","default":false},"isTesting":{"type":"boolean","description":"True if the extension is a test extension\nA test extension is only available to the creator","default":true},"isDevelopedByCommunity":{"type":"boolean","description":"Whether the extension is created by members of the community","default":true},"isCountedInExtensionsLimit":{"type":"boolean","description":"True if the extension is counted in the extensions limit","default":true},"enableTestersSelfOnboarding":{"type":"boolean","description":"If true, premium users can self-onboard as testers","default":false},"testerUsers":{"description":"List of tester users","type":"array","items":{"$ref":"#/components/schemas/TesterUserForDashboard"}},"_id":{"type":"string"},"displayName":{"type":"string","description":"The name displayed to end users","maxLength":60},"subtitle":{"type":"string","description":"The extension subtitle"},"summary":{"type":"string","description":"The extension summary"},"description":{"type":"string","description":"The extension full description (supports Markdown)"},"applicationId":{"type":"string","description":"The application Keycloak id"},"defaultConfig":{"type":"object","description":"Default configuration\nThis can be an object of any form, and will be returned to you in the queries."},"defaultData":{"type":"object","description":"Default data\nThis can be an object of any form, and will be returned to you in the queries."},"actions":{"description":"List of extension log actions\n\nThis list of actions will be loaded at startup and can be used by all extensions.","default":[],"type":"array","items":{"$ref":"#/components/schemas/ActionType"}},"configDescription":{"type":"string","nullable":true,"description":"Returns an extension configuration description.\nThis string is a Handlebars template with the config in parameters.\nThis text can be displayed to the user."},"habits":{"description":"List of punishable actions","default":[],"type":"array","items":{"$ref":"#/components/schemas/HabitModel"}},"mainIframeUrl":{"type":"string","description":"The iframe extension url"},"configIframeUrl":{"type":"string","description":"The iframe configuration url"},"webhookUrl":{"type":"string","description":"The webhook url"},"webhookUsername":{"type":"string","description":"The webhook username"},"webhookPassword":{"type":"string","description":"The webhook username"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"description":"Deleted at"},"tags":{"description":"Extension tags for categorization","default":[],"type":"array","items":{"type":"string"}}},"required":["slug","availableModes","enableStartTimeout","defaultRegularity","isEnabled","isPremium","isTesting","isDevelopedByCommunity","isCountedInExtensionsLimit","enableTestersSelfOnboarding","testerUsers","_id","displayName","subtitle","summary","description","applicationId","defaultConfig","defaultData","actions","configDescription","habits","mainIframeUrl","configIframeUrl","webhookUrl","webhookUsername","webhookPassword","deletedAt","tags"]},"CreatePartnerExtensionDto":{"type":"object","properties":{"displayName":{"type":"string","description":"The name displayed to end users","maxLength":60}},"required":["displayName"]},"TesterUserDto":{"type":"object","properties":{"_id":{"type":"string"}},"required":["_id"]},"UpdatePartnerExtensionDto":{"type":"object","properties":{"availableModes":{"description":"Available modes","type":"array","items":{"$ref":"#/components/schemas/ExtensionModeEnum"}},"enableStartTimeout":{"type":"boolean","description":"If true, the locked user will have to wait the specified time\nbefore making his first action","default":false},"defaultRegularity":{"type":"number","description":"Default regularity","default":3600},"isEnabled":{"type":"boolean","description":"True if the extension is enabled","default":true},"isTesting":{"type":"boolean","description":"True if the extension is a test extension\nA test extension is only available to the creator","default":true},"enableTestersSelfOnboarding":{"type":"boolean","description":"If true, premium users can self-onboard as testers","default":false},"icon":{"nullable":true,"$ref":"#/components/schemas/PartnerExtensionIconEnum"},"testerUsers":{"type":"array","items":{"$ref":"#/components/schemas/TesterUserDto"}},"displayName":{"type":"string","description":"The name displayed to end users","maxLength":60},"subtitle":{"type":"string","description":"The extension subtitle"},"summary":{"type":"string","description":"The extension summary"},"description":{"type":"string","description":"The extension full description (supports Markdown)"},"mainIframeUrl":{"type":"string","description":"The iframe extension url"},"configIframeUrl":{"type":"string","description":"The iframe configuration url"},"webhookUrl":{"type":"string","description":"The webhook url"},"defaultConfig":{"type":"object","description":"Default configuration\nThis can be an object of any form, and will be returned to you in the queries."},"defaultData":{"type":"object","description":"Default data\nThis can be an object of any form, and will be returned to you in the queries."},"configDescription":{"type":"string","nullable":true,"description":"Returns an extension configuration description.\nThis string is a Handlebars template with the config in parameters.\nThis text can be displayed to the user."},"webhookUsername":{"type":"string","description":"The webhook username"},"webhookPassword":{"type":"string","description":"The webhook username"},"habits":{"description":"List of punishable actions","default":[],"type":"array","items":{"$ref":"#/components/schemas/HabitModel"}},"tags":{"description":"Extension tags for categorization","default":[],"type":"array","items":{"type":"string"}}}},"ExtensionHomeAction":{"type":"object","properties":{"slug":{"type":"string","description":"An identifier that is returned to the extension when the user navigates to the extension page."},"title":{"type":"string","description":"The title displayed on the list item for the action."},"description":{"type":"string","description":"The description displayed on the list item for the action."},"icon":{"type":"string","description":"The icon associated with the action, which must be one of the valid FontAwesome 5 icons."},"badge":{"type":"string","description":"Displays a small badge on the list item, useful for indicating notifications or counts associated with the action (e.g., the number of tasks to do or remaining actions in the extension)."}},"required":["slug","title","description","icon"]},"PartnerMetadata":{"type":"object","properties":{"reasonsPreventingUnlocking":{"description":"List of reasons blocking the unlocking of the lock.\nIn order for the lock to be unlocked (except when the time limit is exceeded),\nall extensions must return an empty list.","type":"array","items":{"type":"string"}},"homeActions":{"description":"A list of actions that will be displayed on the user lock page.\nWhen the user clicks on the action, they will be redirected to the\nextension page, with a parameter corresponding to the slug of the action.","type":"array","items":{"$ref":"#/components/schemas/ExtensionHomeAction"}}},"required":["reasonsPreventingUnlocking","homeActions"]},"ExtensionSessionForPartner":{"type":"object","properties":{"slug":{"type":"string","description":"The extension slug. "},"config":{"type":"object","description":"The extension configuration. "},"_id":{"type":"string"},"displayName":{"type":"string","description":"This is the name of the extension, which will be displayed to other users in the list of extensions, and in the description of locks."},"summary":{"type":"string","description":"This is the description of your extension, it is a paragraph explaining how your extension works, and what its purpose is."},"subtitle":{"type":"string","description":"This is the subtitle of the extension, it is a short sentence explaining the concept of your extension, and will be displayed in the list of extensions."},"icon":{"type":"string","description":"The icon you choose must be one of the regular icons available on FontAwesome 5, which you can find list here. The icon will be displayed in the list of extensions.\n\nContact us if you want to change the icon of your extension."},"mode":{"description":"An extension can offer different modes, depending on the way it works and the actions to be performed. An action is a user interaction, for example in Chaster extensions, spinning the wheel of fortune, assigning a task, or checking in. The frequency of the actions can be defined and limited according to the mode chosen by the user among the modes offered by the extension.\n\nMore information: https://docs.chaster.app/api/extensions-api/configuration#available-modes","enum":["cumulative","non_cumulative","turn","unlimited"],"type":"string"},"userData":{"type":"object"},"regularity":{"type":"number","description":"The regularity displayed in the configuration, if the user chooses the cumulative or non-cumulative mode. If you enable only Unlimited mode, you don't need to fill this parameter."},"nbActionsRemaining":{"type":"number","description":"The number of regular actions remaining. If the mode is Unlimited, it returns -1.\n\nUse it to display the number of actions remaining to the user, and know when the user can perform a regular action.\nIf the value is 0, the user cannot perform a regular action."},"nextActionDate":{"type":"string","nullable":true,"description":"The date when the next regular action can be performed.\n\nUse it to compare the current date with the next action date to know when the user can perform a regular action.\nIf the value is null, the user can perform a regular action.\nIf the mode is Unlimited, it always returns null."},"isPartner":{"type":"boolean"},"textConfig":{"type":"string"},"createdAt":{"type":"string","description":"Created at"},"updatedAt":{"type":"string","description":"Updated at"},"sessionId":{"type":"string"},"data":{"type":"object","description":"Data stored for this session, in a key-value format."},"metadata":{"$ref":"#/components/schemas/PartnerMetadata"},"lock":{"$ref":"#/components/schemas/LockForPublic"}},"required":["slug","config","_id","displayName","summary","subtitle","icon","mode","userData","regularity","nbActionsRemaining","nextActionDate","isPartner","textConfig","createdAt","updatedAt","sessionId","data","metadata","lock"]},"GetPartnerSessionRepDto":{"type":"object","properties":{"session":{"$ref":"#/components/schemas/ExtensionSessionForPartner"}},"required":["session"]},"PatchExtensionSessionDto":{"type":"object","properties":{"config":{"type":"object","description":"The extension configuration. "},"metadata":{"$ref":"#/components/schemas/PartnerMetadata"},"data":{"type":"object","description":"Data stored for this session, in a key-value format."}}},"AddTimeLockActionModel":{"type":"object","properties":{"name":{"type":"string","description":"Add time to a lock","enum":["add_time"]},"params":{"type":"number","description":"The amount of time to add, in seconds","minimum":1,"maximum":31536000000}},"required":["name","params"]},"RemoveTimeLockActionModel":{"type":"object","properties":{"name":{"type":"string","description":"Remove time to a lock","enum":["remove_time"]},"params":{"type":"number","description":"The amount of time to remove, in seconds","minimum":1,"maximum":31536000000}},"required":["name","params"]},"FreezeLockActionModel":{"type":"object","properties":{"name":{"type":"string","description":"Freeze a lock","enum":["freeze"]}},"required":["name"]},"UnfreezeLockActionModel":{"type":"object","properties":{"name":{"type":"string","description":"Unfreeze a lock","enum":["unfreeze"]}},"required":["name"]},"ToggleFreezeLockActionModel":{"type":"object","properties":{"name":{"type":"string","description":"Toggle the freeze status of a lock","enum":["toggle_freeze"]}},"required":["name"]},"PilloryLockActionParamsModel":{"type":"object","properties":{"duration":{"type":"number","description":"The pillory duration, in seconds","minimum":300,"maximum":86400},"reason":{"type":"string","description":"The text that will be displayed on the pillory"}},"required":["duration","reason"]},"PilloryLockActionModel":{"type":"object","properties":{"name":{"type":"string","description":"Put a user in pillory for the given duration.\nNote: this only works if the user has enabled the pillory extension.","enum":["pillory"]},"params":{"$ref":"#/components/schemas/PilloryLockActionParamsModel"}},"required":["name","params"]},"SetDisplayRemainingTimeActionModel":{"type":"object","properties":{"name":{"type":"string","description":"Put a user in pillory for the given duration.\nNote: this only works if the user has enabled the pillory extension.","enum":["set_display_remaining_time"]},"params":{"type":"boolean","description":"Whether the remaining time should be displayed"}},"required":["name","params"]},"PartnerDoActionDto":{"type":"object","properties":{"action":{"oneOf":[{"$ref":"#/components/schemas/AddTimeLockActionModel"},{"$ref":"#/components/schemas/RemoveTimeLockActionModel"},{"$ref":"#/components/schemas/FreezeLockActionModel"},{"$ref":"#/components/schemas/UnfreezeLockActionModel"},{"$ref":"#/components/schemas/ToggleFreezeLockActionModel"},{"$ref":"#/components/schemas/PilloryLockActionModel"},{"$ref":"#/components/schemas/SetDisplayRemainingTimeActionModel"}]}},"required":["action"]},"LockRoleEnum":{"type":"string","enum":["keyholder","wearer","visitor"]},"GetPartnerLogsDto":{"type":"object","properties":{"role":{"description":"The user type who is requesting the action logs. By default, it is a visitor.\n\nIt can be either the wearer or the keyholder, or a visitor without any rights. This is used to display the correct information to the user. For example, if the wearer is requesting logs but the current session timer is hidden, the logs will be displayed with the timer hidden.","default":"visitor","$ref":"#/components/schemas/LockRoleEnum"},"limit":{"type":"number","description":"Limit of action logs to return. Default is 15.","default":15,"minimum":0,"maximum":100},"lastId":{"type":"string","description":"Offset lastId, used for pagination. If provided, all logs after this id will be returned."},"showOnlyExtensionActions":{"type":"boolean","description":"If true, only action logs from your extension will be returned.","default":false}},"required":["role"]},"PartnerSetMetadataDto":{"type":"object","properties":{"metadata":{"$ref":"#/components/schemas/PartnerMetadata"}},"required":["metadata"]},"GetSessionsDtoStatus":{"type":"string","enum":["locked","unlocked","deserted","all"]},"GetSessionsDto":{"type":"object","properties":{"status":{"description":"The status of the locks to return. The default value returns ongoing sessions (status Locked).","default":"locked","$ref":"#/components/schemas/GetSessionsDtoStatus"},"extensionSlug":{"type":"string","description":"The extension slug. This field is required."},"limit":{"type":"number","description":"Limit of extension sessions to return. Default is 15.","default":15,"minimum":0,"maximum":100},"paginationLastId":{"type":"string","description":"Offset lastId, used for pagination. If provided, all extension sessions after this id will be returned."}},"required":["status","extensionSlug","limit"]},"ExtensionSessionForSearch":{"type":"object","properties":{"slug":{"type":"string","description":"The extension slug. "},"config":{"type":"object","description":"The extension configuration. "},"_id":{"type":"string"},"displayName":{"type":"string","description":"This is the name of the extension, which will be displayed to other users in the list of extensions, and in the description of locks."},"summary":{"type":"string","description":"This is the description of your extension, it is a paragraph explaining how your extension works, and what its purpose is."},"subtitle":{"type":"string","description":"This is the subtitle of the extension, it is a short sentence explaining the concept of your extension, and will be displayed in the list of extensions."},"icon":{"type":"string","description":"The icon you choose must be one of the regular icons available on FontAwesome 5, which you can find list here. The icon will be displayed in the list of extensions.\n\nContact us if you want to change the icon of your extension."},"mode":{"description":"An extension can offer different modes, depending on the way it works and the actions to be performed. An action is a user interaction, for example in Chaster extensions, spinning the wheel of fortune, assigning a task, or checking in. The frequency of the actions can be defined and limited according to the mode chosen by the user among the modes offered by the extension.\n\nMore information: https://docs.chaster.app/api/extensions-api/configuration#available-modes","enum":["cumulative","non_cumulative","turn","unlimited"],"type":"string"},"userData":{"type":"object"},"regularity":{"type":"number","description":"The regularity displayed in the configuration, if the user chooses the cumulative or non-cumulative mode. If you enable only Unlimited mode, you don't need to fill this parameter."},"nbActionsRemaining":{"type":"number","description":"The number of regular actions remaining. If the mode is Unlimited, it returns -1.\n\nUse it to display the number of actions remaining to the user, and know when the user can perform a regular action.\nIf the value is 0, the user cannot perform a regular action."},"nextActionDate":{"type":"string","nullable":true,"description":"The date when the next regular action can be performed.\n\nUse it to compare the current date with the next action date to know when the user can perform a regular action.\nIf the value is null, the user can perform a regular action.\nIf the mode is Unlimited, it always returns null."},"isPartner":{"type":"boolean"},"textConfig":{"type":"string"},"createdAt":{"type":"string","description":"Created at"},"updatedAt":{"type":"string","description":"Updated at"},"sessionId":{"type":"string"},"data":{"type":"object","description":"Data stored for this session, in a key-value format."},"metadata":{"$ref":"#/components/schemas/PartnerMetadata"},"lock":{"$ref":"#/components/schemas/LockForPublic"},"paginationId":{"type":"string"}},"required":["slug","config","_id","displayName","summary","subtitle","icon","mode","userData","regularity","nbActionsRemaining","nextActionDate","isPartner","textConfig","createdAt","updatedAt","sessionId","data","metadata","lock","paginationId"]},"GetSessionsRepDto":{"type":"object","properties":{"count":{"type":"number"},"hasMore":{"type":"boolean"},"results":{"type":"array","items":{"$ref":"#/components/schemas/ExtensionSessionForSearch"}}},"required":["count","hasMore","results"]},"RegularActionForPartner":{"type":"object","properties":{"date":{"type":"string","description":"Date when the regular action was submitted"},"payload":{"type":"object","nullable":true,"description":"The payload of the regular action, if provided when the regular action was\nsubmitted"}},"required":["date","payload"]},"GetRegularActionsRepDto":{"type":"object","properties":{"actions":{"description":"The list of previous submitted regular actions.","type":"array","items":{"$ref":"#/components/schemas/RegularActionForPartner"}},"nbActionsRemaining":{"type":"number","description":"The number of regular actions remaining. If the mode is Unlimited, it returns -1.\n\nUse it to display the number of actions remaining to the user, and know when the user can perform a regular action.\nIf the value is 0, the user cannot perform a regular action."},"nextActionDate":{"type":"string","nullable":true,"description":"The date when the next regular action can be performed.\n\nUse it to compare the current date with the next action date to know when the user can perform a regular action.\nIf the value is null, the user can perform a regular action.\nIf the mode is Unlimited, it always returns null."},"regularity":{"type":"number","description":"The regularity displayed in the configuration, if the user chooses the cumulative or non-cumulative mode. If you enable only Unlimited mode, you don't need to fill this parameter."},"mode":{"description":"An extension can offer different modes, depending on the way it works and the actions to be performed. An action is a user interaction, for example in Chaster extensions, spinning the wheel of fortune, assigning a task, or checking in. The frequency of the actions can be defined and limited according to the mode chosen by the user among the modes offered by the extension.\n\nMore information: https://docs.chaster.app/api/extensions-api/configuration#available-modes","enum":["cumulative","non_cumulative","turn","unlimited"],"type":"string"}},"required":["actions","nbActionsRemaining","nextActionDate","regularity","mode"]},"SubmitRegularActionDto":{"type":"object","properties":{"payload":{"type":"object","description":"The payload of the regular action, in a key-value object format. You can\nstore any data you want in this object, and retrieve it later when fetching\nthe list of previous regular actions."}},"required":["payload"]},"SubmitRegularActionErrorDto":{"type":"object","properties":{"message":{"type":"string"},"nbActionsRemaining":{"type":"number","description":"The number of regular actions remaining. If the mode is Unlimited, it returns -1.\n\nUse it to display the number of actions remaining to the user, and know when the user can perform a regular action.\nIf the value is 0, the user cannot perform a regular action."},"nextActionDate":{"type":"string","nullable":true,"description":"The date when the next regular action can be performed.\n\nUse it to compare the current date with the next action date to know when the user can perform a regular action.\nIf the value is null, the user can perform a regular action.\nIf the mode is Unlimited, it always returns null."},"regularity":{"type":"number","description":"The regularity displayed in the configuration, if the user chooses the cumulative or non-cumulative mode. If you enable only Unlimited mode, you don't need to fill this parameter."},"mode":{"type":"string","description":"An extension can offer different modes, depending on the way it works and the actions to be performed. An action is a user interaction, for example in Chaster extensions, spinning the wheel of fortune, assigning a task, or checking in. The frequency of the actions can be defined and limited according to the mode chosen by the user among the modes offered by the extension.\n\nMore information: https://docs.chaster.app/api/extensions-api/configuration#available-modes","enum":["cumulative","non_cumulative","turn","unlimited"]}},"required":["message","nbActionsRemaining","nextActionDate","regularity","mode"]},"ActionLogRoleEnum":{"type":"string","enum":["user","keyholder","extension","admin"]},"PartnerCustomLogActionDto":{"type":"object","properties":{"role":{"description":"The user type who initiated the action.\n\nIt can be either the wearer or the keyholder, or the extension itself.","$ref":"#/components/schemas/ActionLogRoleEnum"},"icon":{"type":"string","nullable":true,"description":"The FontAwesome icon, without the `fa-` prefix.\n\nThe icon must be part of the FontAwesome v5 regular icons:\nhttps://fontawesome.com/v5/search?o=r&s=regular","enum":["abacus","acorn","ad","address-book","address-card","adjust","air-conditioner","air-freshener","alarm-clock","alarm-exclamation","alarm-plus","alarm-snooze","album-collection","album","alicorn","alien-monster","alien","align-center","align-justify","align-left","align-right","align-slash","allergies","ambulance","american-sign-language-interpreting","amp-guitar","analytics","anchor","angel","angle-double-down","angle-double-left","angle-double-right","angle-double-up","angle-down","angle-left","angle-right","angle-up","angry","ankh","apple-alt","apple-crate","archive","archway","arrow-alt-circle-down","arrow-alt-circle-left","arrow-alt-circle-right","arrow-alt-circle-up","arrow-alt-down","arrow-alt-from-bottom","arrow-alt-from-left","arrow-alt-from-right","arrow-alt-from-top","arrow-alt-left","arrow-alt-right","arrow-alt-square-down","arrow-alt-square-left","arrow-alt-square-right","arrow-alt-square-up","arrow-alt-to-bottom","arrow-alt-to-left","arrow-alt-to-right","arrow-alt-to-top","arrow-alt-up","arrow-circle-down","arrow-circle-left","arrow-circle-right","arrow-circle-up","arrow-down","arrow-from-bottom","arrow-from-left","arrow-from-right","arrow-from-top","arrow-left","arrow-right","arrow-square-down","arrow-square-left","arrow-square-right","arrow-square-up","arrow-to-bottom","arrow-to-left","arrow-to-right","arrow-to-top","arrow-up","arrows-alt-h","arrows-alt-v","arrows-alt","arrows-h","arrows-v","arrows","assistive-listening-systems","asterisk","at","atlas","atom-alt","atom","audio-description","award","axe-battle","axe","baby-carriage","baby","backpack","backspace","backward","bacon","bacteria","bacterium","badge-check","badge-dollar","badge-percent","badge-sheriff","badge","badger-honey","bags-shopping","bahai","balance-scale-left","balance-scale-right","balance-scale","ball-pile","ballot-check","ballot","ban","band-aid","banjo","barcode-alt","barcode-read","barcode-scan","barcode","bars","baseball-ball","baseball","basketball-ball","basketball-hoop","bat","bath","battery-bolt","battery-empty","battery-full","battery-half","battery-quarter","battery-slash","battery-three-quarters","bed-alt","bed-bunk","bed-empty","bed","beer","bell-exclamation","bell-on","bell-plus","bell-school-slash","bell-school","bell-slash","bell","bells","betamax","bezier-curve","bible","bicycle","biking-mountain","biking","binoculars","biohazard","birthday-cake","blanket","blender-phone","blender","blind","blinds-open","blinds-raised","blinds","blog","bold","bolt","bomb","bone-break","bone","bong","book-alt","book-dead","book-heart","book-medical","book-open","book-reader","book-spells","book-user","book","bookmark","books-medical","books","boombox","boot","booth-curtain","border-all","border-bottom","border-center-h","border-center-v","border-inner","border-left","border-none","border-outer","border-right","border-style-alt","border-style","border-top","bow-arrow","bowling-ball","bowling-pins","box-alt","box-ballot","box-check","box-fragile","box-full","box-heart","box-open","box-tissue","box-up","box-usd","box","boxes-alt","boxes","boxing-glove","brackets-curly","brackets","braille","brain","bread-loaf","bread-slice","briefcase-medical","briefcase","bring-forward","bring-front","broadcast-tower","broom","browser","brush","bug","building","bullhorn","bullseye-arrow","bullseye-pointer","bullseye","burger-soda","burn","burrito","bus-alt","bus-school","bus","business-time","cabinet-filing","cactus","calculator-alt","calculator","calendar-alt","calendar-check","calendar-day","calendar-edit","calendar-exclamation","calendar-minus","calendar-plus","calendar-star","calendar-times","calendar-week","calendar","camcorder","camera-alt","camera-home","camera-movie","camera-polaroid","camera-retro","camera","campfire","campground","candle-holder","candy-cane","candy-corn","cannabis","capsules","car-alt","car-battery","car-building","car-bump","car-bus","car-crash","car-garage","car-mechanic","car-side","car-tilt","car-wash","car","caravan-alt","caravan","caret-circle-down","caret-circle-left","caret-circle-right","caret-circle-up","caret-down","caret-left","caret-right","caret-square-down","caret-square-left","caret-square-right","caret-square-up","caret-up","carrot","cars","cart-arrow-down","cart-plus","cash-register","cassette-tape","cat-space","cat","cauldron","cctv","certificate","chair-office","chair","chalkboard-teacher","chalkboard","charging-station","chart-area","chart-bar","chart-line-down","chart-line","chart-network","chart-pie-alt","chart-pie","chart-scatter","check-circle","check-double","check-square","check","cheese-swiss","cheese","cheeseburger","chess-bishop-alt","chess-bishop","chess-board","chess-clock-alt","chess-clock","chess-king-alt","chess-king","chess-knight-alt","chess-knight","chess-pawn-alt","chess-pawn","chess-queen-alt","chess-queen","chess-rook-alt","chess-rook","chess","chevron-circle-down","chevron-circle-left","chevron-circle-right","chevron-circle-up","chevron-double-down","chevron-double-left","chevron-double-right","chevron-double-up","chevron-down","chevron-left","chevron-right","chevron-square-down","chevron-square-left","chevron-square-right","chevron-square-up","chevron-up","child","chimney","church","circle-notch","circle","city","clarinet","claw-marks","clinic-medical","clipboard-check","clipboard-list-check","clipboard-list","clipboard-prescription","clipboard-user","clipboard","clock","clone","closed-captioning","cloud-download-alt","cloud-download","cloud-drizzle","cloud-hail-mixed","cloud-hail","cloud-meatball","cloud-moon-rain","cloud-moon","cloud-music","cloud-rain","cloud-rainbow","cloud-showers-heavy","cloud-showers","cloud-sleet","cloud-snow","cloud-sun-rain","cloud-sun","cloud-upload-alt","cloud-upload","cloud","clouds-moon","clouds-sun","clouds","club","cocktail","code-branch","code-commit","code-merge","code","coffee-pot","coffee-togo","coffee","coffin-cross","coffin","cog","cogs","coin","coins","columns","comet","comment-alt-check","comment-alt-dollar","comment-alt-dots","comment-alt-edit","comment-alt-exclamation","comment-alt-lines","comment-alt-medical","comment-alt-minus","comment-alt-music","comment-alt-plus","comment-alt-slash","comment-alt-smile","comment-alt-times","comment-alt","comment-check","comment-dollar","comment-dots","comment-edit","comment-exclamation","comment-lines","comment-medical","comment-minus","comment-music","comment-plus","comment-slash","comment-smile","comment-times","comment","comments-alt-dollar","comments-alt","comments-dollar","comments","compact-disc","compass-slash","compass","compress-alt","compress-arrows-alt","compress-wide","compress","computer-classic","computer-speaker","concierge-bell","construction","container-storage","conveyor-belt-alt","conveyor-belt","cookie-bite","cookie","copy","copyright","corn","couch","cow","cowbell-more","cowbell","credit-card-blank","credit-card-front","credit-card","cricket","croissant","crop-alt","crop","cross","crosshairs","crow","crown","crutch","crutches","cube","cubes","curling","cut","dagger","database","deaf","debug","deer-rudolph","deer","democrat","desktop-alt","desktop","dewpoint","dharmachakra","diagnoses","diamond","dice-d10","dice-d12","dice-d20","dice-d4","dice-d6","dice-d8","dice-five","dice-four","dice-one","dice-six","dice-three","dice-two","dice","digging","digital-tachograph","diploma","directions","disc-drive","disease","divide","dizzy","dna","do-not-enter","dog-leashed","dog","dollar-sign","dolly-empty","dolly-flatbed-alt","dolly-flatbed-empty","dolly-flatbed","dolly","donate","door-closed","door-open","dot-circle","dove","download","drafting-compass","dragon","draw-circle","draw-polygon","draw-square","dreidel","drone-alt","drone","drum-steelpan","drum","drumstick-bite","drumstick","dryer-alt","dryer","duck","dumbbell","dumpster-fire","dumpster","dungeon","ear-muffs","ear","eclipse-alt","eclipse","edit","egg-fried","egg","eject","elephant","ellipsis-h-alt","ellipsis-h","ellipsis-v-alt","ellipsis-v","empty-set","engine-warning","envelope-open-dollar","envelope-open-text","envelope-open","envelope-square","envelope","equals","eraser","ethernet","euro-sign","exchange-alt","exchange","exclamation-circle","exclamation-square","exclamation-triangle","exclamation","expand-alt","expand-arrows-alt","expand-arrows","expand-wide","expand","external-link-alt","external-link-square-alt","external-link-square","external-link","eye-dropper","eye-evil","eye-slash","eye","fan-table","fan","farm","fast-backward","fast-forward","faucet-drip","faucet","fax","feather-alt","feather","female","field-hockey","fighter-jet","file-alt","file-archive","file-audio","file-certificate","file-chart-line","file-chart-pie","file-check","file-code","file-contract","file-csv","file-download","file-edit","file-excel","file-exclamation","file-export","file-image","file-import","file-invoice-dollar","file-invoice","file-medical-alt","file-medical","file-minus","file-music","file-pdf","file-plus","file-powerpoint","file-prescription","file-search","file-signature","file-spreadsheet","file-times","file-upload","file-user","file-video","file-word","file","files-medical","fill-drip","fill","film-alt","film-canister","film","filter","fingerprint","fire-alt","fire-extinguisher","fire-smoke","fire","fireplace","first-aid","fish-cooked","fish","fist-raised","flag-alt","flag-checkered","flag-usa","flag","flame","flashlight","flask-poison","flask-potion","flask","flower-daffodil","flower-tulip","flower","flushed","flute","flux-capacitor","fog","folder-download","folder-minus","folder-open","folder-plus","folder-times","folder-tree","folder-upload","folder","folders","font-awesome-logo-full","font-case","font","football-ball","football-helmet","forklift","forward","fragile","french-fries","frog","frosty-head","frown-open","frown","function","funnel-dollar","futbol","galaxy","game-board-alt","game-board","game-console-handheld","gamepad-alt","gamepad","garage-car","garage-open","garage","gas-pump-slash","gas-pump","gavel","gem","genderless","ghost","gift-card","gift","gifts","gingerbread-man","glass-champagne","glass-cheers","glass-citrus","glass-martini-alt","glass-martini","glass-whiskey-rocks","glass-whiskey","glass","glasses-alt","glasses","globe-africa","globe-americas","globe-asia","globe-europe","globe-snow","globe-stand","globe","golf-ball","golf-club","gopuram","graduation-cap","gramophone","greater-than-equal","greater-than","grimace","grin-alt","grin-beam-sweat","grin-beam","grin-hearts","grin-squint-tears","grin-squint","grin-stars","grin-tears","grin-tongue-squint","grin-tongue-wink","grin-tongue","grin-wink","grin","grip-horizontal","grip-lines-vertical","grip-lines","grip-vertical","guitar-electric","guitar","guitars","h-square","h1","h2","h3","h4","hamburger","hammer-war","hammer","hamsa","hand-heart","hand-holding-box","hand-holding-heart","hand-holding-magic","hand-holding-medical","hand-holding-seedling","hand-holding-usd","hand-holding-water","hand-holding","hand-lizard","hand-middle-finger","hand-paper","hand-peace","hand-point-down","hand-point-left","hand-point-right","hand-point-up","hand-pointer","hand-receiving","hand-rock","hand-scissors","hand-sparkles","hand-spock","hands-heart","hands-helping","hands-usd","hands-wash","hands","handshake-alt-slash","handshake-alt","handshake-slash","handshake","hanukiah","hard-hat","hashtag","hat-chef","hat-cowboy-side","hat-cowboy","hat-santa","hat-winter","hat-witch","hat-wizard","hdd","head-side-brain","head-side-cough-slash","head-side-cough","head-side-headphones","head-side-mask","head-side-medical","head-side-virus","head-side","head-vr","heading","headphones-alt","headphones","headset","heart-broken","heart-circle","heart-rate","heart-square","heart","heartbeat","heat","helicopter","helmet-battle","hexagon","highlighter","hiking","hippo","history","hockey-mask","hockey-puck","hockey-sticks","holly-berry","home-alt","home-heart","home-lg-alt","home-lg","home","hood-cloak","horizontal-rule","horse-head","horse-saddle","horse","hospital-alt","hospital-symbol","hospital-user","hospital","hospitals","hot-tub","hotdog","hotel","hourglass-end","hourglass-half","hourglass-start","hourglass","house-damage","house-day","house-flood","house-leave","house-night","house-return","house-signal","house-user","house","hryvnia","humidity","hurricane","i-cursor","ice-cream","ice-skate","icicles","icons-alt","icons","id-badge","id-card-alt","id-card","igloo","image-polaroid","image","images","inbox-in","inbox-out","inbox","indent","industry-alt","industry","infinity","info-circle","info-square","info","inhaler","integral","intersection","inventory","island-tropical","italic","jack-o-lantern","jedi","joint","journal-whills","joystick","jug","kaaba","kazoo","kerning","key-skeleton","key","keyboard","keynote","khanda","kidneys","kiss-beam","kiss-wink-heart","kiss","kite","kiwi-bird","knife-kitchen","lambda","lamp-desk","lamp-floor","lamp","landmark-alt","landmark","language","laptop-code","laptop-house","laptop-medical","laptop","lasso","laugh-beam","laugh-squint","laugh-wink","laugh","layer-group","layer-minus","layer-plus","leaf-heart","leaf-maple","leaf-oak","leaf","lemon","less-than-equal","less-than","level-down-alt","level-down","level-up-alt","level-up","life-ring","light-ceiling","light-switch-off","light-switch-on","light-switch","lightbulb-dollar","lightbulb-exclamation","lightbulb-on","lightbulb-slash","lightbulb","lights-holiday","line-columns","line-height","link","lips","lira-sign","list-alt","list-music","list-ol","list-ul","list","location-arrow","location-circle","location-slash","location","lock-alt","lock-open-alt","lock-open","lock","long-arrow-alt-down","long-arrow-alt-left","long-arrow-alt-right","long-arrow-alt-up","long-arrow-down","long-arrow-left","long-arrow-right","long-arrow-up","loveseat","low-vision","luchador","luggage-cart","lungs-virus","lungs","mace","magic","magnet","mail-bulk","mailbox","male","mandolin","map-marked-alt","map-marked","map-marker-alt-slash","map-marker-alt","map-marker-check","map-marker-edit","map-marker-exclamation","map-marker-minus","map-marker-plus","map-marker-question","map-marker-slash","map-marker-smile","map-marker-times","map-marker","map-pin","map-signs","map","marker","mars-double","mars-stroke-h","mars-stroke-v","mars-stroke","mars","mask","meat","medal","medkit","megaphone","meh-blank","meh-rolling-eyes","meh","memory","menorah","mercury","meteor","microchip","microphone-alt-slash","microphone-alt","microphone-slash","microphone-stand","microphone","microscope","microwave","mind-share","minus-circle","minus-hexagon","minus-octagon","minus-square","minus","mistletoe","mitten","mobile-alt","mobile-android-alt","mobile-android","mobile","money-bill-alt","money-bill-wave-alt","money-bill-wave","money-bill","money-check-alt","money-check-edit-alt","money-check-edit","money-check","monitor-heart-rate","monkey","monument","moon-cloud","moon-stars","moon","mortar-pestle","mosque","motorcycle","mountain","mountains","mouse-alt","mouse-pointer","mouse","mp3-player","mug-hot","mug-marshmallows","mug-tea","mug","music-alt-slash","music-alt","music-slash","music","narwhal","network-wired","neuter","newspaper","not-equal","notes-medical","object-group","object-ungroup","octagon","oil-can","oil-temp","om","omega","ornament","otter","outdent","outlet","oven","overline","page-break","pager","paint-brush-alt","paint-brush","paint-roller","palette","pallet-alt","pallet","paper-plane","paperclip","parachute-box","paragraph-rtl","paragraph","parking-circle-slash","parking-circle","parking-slash","parking","passport","pastafarianism","paste","pause-circle","pause","paw-alt","paw-claws","paw","peace","pegasus","pen-alt","pen-fancy","pen-nib","pen-square","pen","pencil-alt","pencil-paintbrush","pencil-ruler","pencil","pennant","people-arrows","people-carry","pepper-hot","percent","percentage","person-booth","person-carry","person-dolly-empty","person-dolly","person-sign","phone-alt","phone-laptop","phone-office","phone-plus","phone-rotary","phone-slash","phone-square-alt","phone-square","phone-volume","phone","photo-video","pi","piano-keyboard","piano","pie","pig","piggy-bank","pills","pizza-slice","pizza","place-of-worship","plane-alt","plane-arrival","plane-departure","plane-slash","plane","planet-moon","planet-ringed","play-circle","play","plug","plus-circle","plus-hexagon","plus-octagon","plus-square","plus","podcast","podium-star","podium","police-box","poll-h","poll-people","poll","poo-storm","poo","poop","popcorn","portal-enter","portal-exit","portrait","pound-sign","power-off","pray","praying-hands","prescription-bottle-alt","prescription-bottle","prescription","presentation","print-search","print-slash","print","procedures","project-diagram","projector","pump-medical","pump-soap","pumpkin","puzzle-piece","qrcode","question-circle","question-square","question","quidditch","quote-left","quote-right","quran","rabbit-fast","rabbit","racquet","radar","radiation-alt","radiation","radio-alt","radio","rainbow","raindrops","ram","ramp-loading","random","raygun","receipt","record-vinyl","rectangle-landscape","rectangle-portrait","rectangle-wide","recycle","redo-alt","redo","refrigerator","registered","remove-format","repeat-1-alt","repeat-1","repeat-alt","repeat","reply-all","reply","republican","restroom","retweet-alt","retweet","ribbon","ring","rings-wedding","road","robot","rocket-launch","rocket","route-highway","route-interstate","route","router","rss-square","rss","ruble-sign","ruler-combined","ruler-horizontal","ruler-triangle","ruler-vertical","ruler","running","rupee-sign","rv","sack-dollar","sack","sad-cry","sad-tear","salad","sandwich","satellite-dish","satellite","sausage","save","sax-hot","saxophone","scalpel-path","scalpel","scanner-image","scanner-keyboard","scanner-touchscreen","scanner","scarecrow","scarf","school","screwdriver","scroll-old","scroll","scrubber","scythe","sd-card","search-dollar","search-location","search-minus","search-plus","search","seedling","send-back","send-backward","sensor-alert","sensor-fire","sensor-on","sensor-smoke","sensor","server","shapes","share-all","share-alt-square","share-alt","share-square","share","sheep","shekel-sign","shield-alt","shield-check","shield-cross","shield-virus","shield","ship","shipping-fast","shipping-timed","shish-kebab","shoe-prints","shopping-bag","shopping-basket","shopping-cart","shovel-snow","shovel","shower","shredder","shuttle-van","shuttlecock","sickle","sigma","sign-in-alt","sign-in","sign-language","sign-out-alt","sign-out","sign","signal-1","signal-2","signal-3","signal-4","signal-alt-1","signal-alt-2","signal-alt-3","signal-alt-slash","signal-alt","signal-slash","signal-stream","signal","signature","sim-card","sink","siren-on","siren","sitemap","skating","skeleton","ski-jump","ski-lift","skiing-nordic","skiing","skull-cow","skull-crossbones","skull","slash","sledding","sleigh","sliders-h-square","sliders-h","sliders-v-square","sliders-v","smile-beam","smile-plus","smile-wink","smile","smog","smoke","smoking-ban","smoking","sms","snake","snooze","snow-blowing","snowboarding","snowflake","snowflakes","snowman","snowmobile","snowplow","soap","socks","solar-panel","solar-system","sort-alpha-down-alt","sort-alpha-down","sort-alpha-up-alt","sort-alpha-up","sort-alt","sort-amount-down-alt","sort-amount-down","sort-amount-up-alt","sort-amount-up","sort-circle-down","sort-circle-up","sort-circle","sort-down","sort-numeric-down-alt","sort-numeric-down","sort-numeric-up-alt","sort-numeric-up","sort-shapes-down-alt","sort-shapes-down","sort-shapes-up-alt","sort-shapes-up","sort-size-down-alt","sort-size-down","sort-size-up-alt","sort-size-up","sort-up","sort","soup","spa","space-shuttle","space-station-moon-alt","space-station-moon","spade","sparkles","speaker","speakers","spell-check","spider-black-widow","spider-web","spider","spinner-third","spinner","splotch","spray-can","sprinkler","square-full","square-root-alt","square-root","square","squirrel","staff","stamp","star-and-crescent","star-christmas","star-exclamation","star-half-alt","star-half","star-of-david","star-of-life","star-shooting","star","starfighter-alt","starfighter","stars","starship-freighter","starship","steak","steering-wheel","step-backward","step-forward","stethoscope","sticky-note","stocking","stomach","stop-circle","stop","stopwatch-20","stopwatch","store-alt-slash","store-alt","store-slash","store","stream","street-view","stretcher","strikethrough","stroopwafel","subscript","subway","suitcase-rolling","suitcase","sun-cloud","sun-dust","sun-haze","sun","sunglasses","sunrise","sunset","superscript","surprise","swatchbook","swimmer","swimming-pool","sword-laser-alt","sword-laser","sword","swords-laser","swords","synagogue","sync-alt","sync","syringe","t","table-tennis","table","tablet-alt","tablet-android-alt","tablet-android","tablet-rugged","tablet","tablets","tachometer-alt-average","tachometer-alt-fast","tachometer-alt-fastest","tachometer-alt-slow","tachometer-alt-slowest","tachometer-alt","tachometer-average","tachometer-fast","tachometer-fastest","tachometer-slow","tachometer-slowest","tachometer","taco","tag","tags","tally","tanakh","tape","tasks-alt","tasks","taxi","teeth-open","teeth","telescope","temperature-down","temperature-frigid","temperature-high","temperature-hot","temperature-low","temperature-up","tenge","tennis-ball","terminal","text-height","text-size","text-width","text","th-large","th-list","th","theater-masks","thermometer-empty","thermometer-full","thermometer-half","thermometer-quarter","thermometer-three-quarters","thermometer","theta","thumbs-down","thumbs-up","thumbtack","thunderstorm-moon","thunderstorm-sun","thunderstorm","ticket-alt","ticket","tilde","times-circle","times-hexagon","times-octagon","times-square","times","tint-slash","tint","tire-flat","tire-pressure-warning","tire-rugged","tire","tired","toggle-off","toggle-on","toilet-paper-alt","toilet-paper-slash","toilet-paper","toilet","tombstone-alt","tombstone","toolbox","tools","tooth","toothbrush","torah","torii-gate","tornado","tractor","trademark","traffic-cone","traffic-light-go","traffic-light-slow","traffic-light-stop","traffic-light","trailer","train","tram","transgender-alt","transgender","transporter-1","transporter-2","transporter-3","transporter-empty","transporter","trash-alt","trash-restore-alt","trash-restore","trash-undo-alt","trash-undo","trash","treasure-chest","tree-alt","tree-christmas","tree-decorated","tree-large","tree-palm","tree","trees","triangle-music","triangle","trophy-alt","trophy","truck-container","truck-couch","truck-loading","truck-monster","truck-moving","truck-pickup","truck-plow","truck-ramp","truck","trumpet","tshirt","tty","turkey","turntable","turtle","tv-alt","tv-music","tv-retro","tv","typewriter","ufo-beam","ufo","umbrella-beach","umbrella","underline","undo-alt","undo","unicorn","union","universal-access","university","unlink","unlock-alt","unlock","upload","usb-drive","usd-circle","usd-square","user-alien","user-alt-slash","user-alt","user-astronaut","user-chart","user-check","user-circle","user-clock","user-cog","user-cowboy","user-crown","user-edit","user-friends","user-graduate","user-hard-hat","user-headset","user-injured","user-lock","user-md-chat","user-md","user-minus","user-music","user-ninja","user-nurse","user-plus","user-robot","user-secret","user-shield","user-slash","user-tag","user-tie","user-times","user-unlock","user-visor","user","users-class","users-cog","users-crown","users-medical","users-slash","users","utensil-fork","utensil-knife","utensil-spoon","utensils-alt","utensils","vacuum-robot","vacuum","value-absolute","vector-square","venus-double","venus-mars","venus","vest-patches","vest","vhs","vial","vials","video-plus","video-slash","video","vihara","violin","virus-slash","virus","viruses","voicemail","volcano","volleyball-ball","volume-down","volume-mute","volume-off","volume-slash","volume-up","volume","vote-nay","vote-yea","vr-cardboard","wagon-covered","walker","walkie-talkie","walking","wallet","wand-magic","wand","warehouse-alt","warehouse","washer","watch-calculator","watch-fitness","watch","water-lower","water-rise","water","wave-sine","wave-square","wave-triangle","waveform-path","waveform","webcam-slash","webcam","weight-hanging","weight","whale","wheat","wheelchair","whistle","wifi-1","wifi-2","wifi-slash","wifi","wind-turbine","wind-warning","wind","window-alt","window-close","window-frame-open","window-frame","window-maximize","window-minimize","window-restore","window","windsock","wine-bottle","wine-glass-alt","wine-glass","won-sign","wreath","wrench","x-ray","yen-sign","yin-yang"]},"color":{"type":"string","nullable":true,"description":"The color of the log action.","pattern":"/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/"},"title":{"type":"string","description":"The log action title"},"description":{"type":"string","description":"The log action description"}},"required":["title","description"]},"SetSessionDataDto":{"type":"object","properties":{"data":{"type":"object","description":"Data stored for this session, in a key-value format."}},"required":["data"]},"PartnerOpenLockDto":{"type":"object","properties":{"actor":{"type":"string","description":"The actor performing the action","enum":["wearer","keyholder","extension"]}},"required":["actor"]},"IncrementPenaltyDto":{"type":"object","properties":{"habitName":{"type":"string","description":"The name of the habit to increment the penalty for"},"count":{"type":"number","description":"The number of actions to increment the penalty for.\nThis is only used for recurring habits.","default":1,"minimum":1}},"required":["habitName"]},"CreateTimeLimitPeriodDto":{"type":"object","properties":{"habitName":{"type":"string","description":"The name of the habit to create a time limit period for"}},"required":["habitName"]},"CancelTimeLimitPeriodDto":{"type":"object","properties":{"habitName":{"type":"string","description":"The name of the habit to cancel the time limit period for"}},"required":["habitName"]},"TaskItem":{"type":"object","properties":{"task":{"type":"string","description":"The task","maxLength":200},"points":{"type":"number","description":"Number of points given","minimum":0},"verificationRequired":{"type":"boolean","description":"Whether verification is required"},"duration":{"type":"number","description":"Timed task duration in seconds","minimum":60,"maximum":86400}},"required":["task","points"]},"PartnerAssignTaskDto":{"type":"object","properties":{"task":{"description":"The task to assign","allOf":[{"$ref":"#/components/schemas/TaskItem"}]},"actor":{"type":"string","description":"The actor performing the action","enum":["wearer","keyholder","extension"]}},"required":["task","actor"]},"PartnerCompleteTaskDto":{"type":"object","properties":{"actor":{"type":"string","description":"The actor performing the action","enum":["wearer","keyholder","extension"]},"isCompleted":{"type":"boolean","description":"True if the task is completed"}},"required":["actor","isCompleted"]},"PartnerCompleteTaskResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"The task ID"},"task":{"type":"string","description":"The task name","maxLength":500},"points":{"type":"number","description":"Number of points given","minimum":0},"verificationRequired":{"type":"boolean","description":"Whether verification is required"},"duration":{"type":"number","description":"Timed task duration in seconds","minimum":60,"maximum":86400}},"required":["id","task","points"]},"PartnerPilloryVoteStatusDto":{"type":"object","properties":{"_id":{"type":"string","description":"The pillory vote ID"},"nbVotes":{"type":"number","description":"Number of votes","minimum":0},"totalDurationAdded":{"type":"number","description":"Total duration added in seconds","minimum":0},"voteEndsAt":{"format":"date-time","type":"string","description":"When the vote ends"},"reason":{"type":"string","description":"The reason for the pillory"},"createdAt":{"format":"date-time","type":"string","description":"When the pillory vote was created"}},"required":["_id","nbVotes","totalDurationAdded","voteEndsAt","reason","createdAt"]},"PartnerPilloryStatusResponseDto":{"type":"object","properties":{"votes":{"description":"List of pending pillory votes","type":"array","items":{"$ref":"#/components/schemas/PartnerPilloryVoteStatusDto"}}},"required":["votes"]},"PartnerTaskActorEnum":{"type":"string","enum":["wearer","keyholder","extension"]},"PartnerVerificationPictureRequestDto":{"type":"object","properties":{"actor":{"description":"The actor performing the action","$ref":"#/components/schemas/PartnerTaskActorEnum"}},"required":["actor"]},"CompleteTaskDto":{"type":"object","properties":{"isCompleted":{"type":"boolean","description":"True if the task is completed"},"verificationPictureToken":{"type":"string","description":"Verification picture token if picture verification is required"}},"required":["isCompleted"]},"AssignedTaskItem":{"type":"object","properties":{"task":{"type":"string","description":"The task","maxLength":200},"points":{"type":"number","description":"Number of points given","minimum":0},"verificationRequired":{"type":"boolean","description":"Whether verification is required"},"duration":{"type":"number","description":"Timed task duration in seconds","minimum":60,"maximum":86400},"id":{"type":"string"}},"required":["task","points","id"]},"TaskHistoryStatusEnum":{"type":"string","enum":["verified","pending_verification","abandoned","rejected","completed"]},"ChastityDeviceCheck":{"type":"object","properties":{"name":{"type":"string"},"code":{"type":"string","description":"The verification code on the image"},"sealNumber":{"type":"string","description":"The seal number on the chastity device"}},"required":["name","code"]},"TaskCheck":{"type":"object","properties":{"name":{"type":"string"},"task":{"type":"string","description":"The task string"}},"required":["name","task"]},"PeerVerificationStatusEnum":{"type":"string","enum":["ongoing","verified","rejected"]},"RejectionReasonCount":{"type":"object","properties":{"text":{"type":"string"},"nbVotes":{"type":"number"}},"required":["text","nbVotes"]},"PeerVerificationAssignedUserStatusEnum":{"type":"string","enum":["pending","verified","rejected"]},"PeerVerificationAssignedUserDto":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/PeerVerificationAssignedUserStatusEnum"},"_id":{"type":"string"},"username":{"type":"string"},"avatarUrl":{"type":"string"}},"required":["status","_id","username","avatarUrl"]},"PeerVerificationForLockList":{"type":"object","properties":{"status":{"description":"The verification status","$ref":"#/components/schemas/PeerVerificationStatusEnum"},"checks":{"type":"array","description":"List of checks","items":{"oneOf":[{"$ref":"#/components/schemas/ChastityDeviceCheck"},{"$ref":"#/components/schemas/TaskCheck"}]}},"_id":{"type":"string"},"nbVerifiedVotes":{"type":"number"},"nbRejectedVotes":{"type":"number"},"rejectionReasons":{"type":"array","items":{"$ref":"#/components/schemas/RejectionReasonCount"}},"assignedUsers":{"type":"array","items":{"$ref":"#/components/schemas/PeerVerificationAssignedUserDto"}},"createdAt":{"format":"date-time","type":"string"}},"required":["status","checks","_id","nbVerifiedVotes","nbRejectedVotes","rejectionReasons","assignedUsers","createdAt"]},"TaskHistoryEntry":{"type":"object","properties":{"status":{"$ref":"#/components/schemas/TaskHistoryStatusEnum"},"id":{"type":"string"},"task":{"type":"string"},"points":{"type":"number"},"grantedPoints":{"type":"number"},"peerVerification":{"$ref":"#/components/schemas/PeerVerificationForLockList"},"createdAt":{"type":"string"}},"required":["status","task","points","grantedPoints","createdAt"]},"TaskVoteDto":{"type":"object","properties":{"task":{"$ref":"#/components/schemas/TaskItem"}},"required":["task"]},"PilloryVoteDto":{"type":"object","properties":{"voteId":{"type":"string"}},"required":["voteId"]},"TemporaryOpeningStatusDto":{"type":"object","properties":{"openedAt":{"format":"date-time","type":"string","nullable":true,"description":"Timestamp when the lock was temporarily opened.\nNull if the lock is not currently open.\nSerialized as ISO 8601 string in API responses."},"requiresVerificationPicture":{"type":"boolean","description":"Whether a verification picture is required before the wearer can temporarily open the lock.\nThis is true when:\n- The temporary opening extension has requireVerificationPictureBefore enabled\n- The verification picture extension is enabled\n- No verification picture was submitted in the last 15 minutes"}},"required":["openedAt","requiresVerificationPicture"]},"TemporaryOpeningSetCombinationDto":{"type":"object","properties":{"combinationId":{"type":"string"}},"required":["combinationId"]},"LockSealResponseDto":{"type":"object","properties":{"_id":{"type":"string"},"lock":{"type":"string"},"seal":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["_id","lock","seal","createdAt","updatedAt"]},"CreateLockSealDto":{"type":"object","properties":{"seal":{"type":"string","minLength":1,"maxLength":100,"pattern":"/^[a-zA-Z0-9]+$/"}},"required":["seal"]},"PartnerConfigurationRoleEnum":{"type":"string","enum":["wearer","keyholder"]},"PartnerConfigurationForPublic":{"type":"object","properties":{"config":{"type":"object","description":"The configuration object"},"role":{"description":"The role of the user creating or editing the configuration.\nWhen the wearer creates a configuration for a self-lock, the role is `wearer`.\nWhen the keyholder creates a configuration for a public lock, or edits an existing session,\nthe role is `keyholder`.","$ref":"#/components/schemas/PartnerConfigurationRoleEnum"},"user":{"type":"string","description":"The user who created the configuration"},"sessionId":{"type":"string","nullable":true,"description":"If provided, the user is editing a configuration for an existing extension session. This is the session ID."},"extensionSlug":{"type":"string","description":"The extension slug"},"createdAt":{"format":"date-time","type":"string","description":"Created at"}},"required":["config","role","user","sessionId","extensionSlug","createdAt"]},"UpdatePartnerConfigurationDto":{"type":"object","properties":{"config":{"type":"object","description":"The configuration object"}},"required":["config"]},"CommunityEventTier":{"type":"object","properties":{"name":{"type":"string"},"requiredPoints":{"type":"number"}},"required":["name","requiredPoints"]},"CommunityEventSettings":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Whether the community event is enabled"},"slug":{"type":"string","description":"The community event slug"},"name":{"type":"string","description":"The community event name"},"color":{"type":"string","description":"The community event color"},"lightColor":{"type":"string","description":"The community event light color"},"icon":{"type":"string","description":"The community event icon"},"tiers":{"description":"The community event tiers","type":"array","items":{"$ref":"#/components/schemas/CommunityEventTier"}}},"required":["enabled","slug","name","color","lightColor","icon","tiers"]},"AppSettingsDto":{"type":"object","properties":{"features":{"description":"Global features","type":"array","items":{"$ref":"#/components/schemas/FeatureSwitchEnum"}},"nonPremiumMaxLocks":{"type":"number","description":"The maximum number of locks allowed for a non-premium user"},"nonPremiumMaxExtensions":{"type":"number","description":"The maximum number of extensions allowed for a non-premium user"},"maxAttachments":{"type":"number","description":"Maximum number of attachments per upload"},"turnstileSiteKey":{"type":"string","description":"The turnstile site key"},"time":{"format":"date-time","type":"string","description":"The server time"},"version":{"type":"string","description":"The app version"},"communityEvent":{"nullable":true,"description":"Community event settings","allOf":[{"$ref":"#/components/schemas/CommunityEventSettings"}]},"vapidPublicKey":{"type":"string","description":"Vapid public key"}},"required":["features","nonPremiumMaxLocks","nonPremiumMaxExtensions","maxAttachments","turnstileSiteKey","time","version","communityEvent","vapidPublicKey"]},"PartnerUserRoleEnum":{"type":"string","enum":["wearer","keyholder"]},"PartnerGetSessionAuthRepDto":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/PartnerUserRoleEnum"},"session":{"$ref":"#/components/schemas/ExtensionSessionForPartner"},"lockForUser":{"$ref":"#/components/schemas/LockForPublic"},"userId":{"type":"string"}},"required":["role","session","lockForUser","userId"]},"GenderEnum":{"type":"string","enum":["","agender","androgyne","androgynous","bigender","cis","cis-female","cis-male","cis-man","cis-woman","cisgender","cisgender-female","cisgender-male","cisgender-man","cisgender-woman","ftm","female","female-to-male","gender-fluid","gender-identity","gender-nonconforming","gender-questioning","gender-variant","genderqueer","intersex","mtf","male","male-to-female","neither","neutrois","non-binary","not-specified","other","pangender","trans","trans-female","trans-male","trans-man","trans-person","trans-woman","transfeminine","transgender","transgender-female","transgender-male","transgender-man","transgender-person","transgender-woman","transmasculine","transsexual","transsexual-female","transsexual-male","transsexual-man","transsexual-person","transsexual-woman","two-spirit"]},"UserSettings":{"type":"object","properties":{"showLocksOnProfile":{"type":"boolean"},"showOnlineStatus":{"type":"boolean"},"showDiscordOnProfile":{"type":"boolean"},"emailOnWearerUsesSharedLock":{"type":"boolean"},"messageOnWearerUsesSharedLock":{"type":"boolean"},"discordNotifications":{"type":"boolean"},"discordMessagingNotifications":{"type":"boolean"},"displayNsfw":{"type":"boolean"},"showAge":{"type":"boolean"},"displayFindomContent":{"type":"boolean"},"showPublicStatistics":{"type":"boolean"},"showIdentityBadge":{"type":"boolean"}},"required":["showLocksOnProfile","showOnlineStatus","showDiscordOnProfile","emailOnWearerUsesSharedLock","messageOnWearerUsesSharedLock","discordNotifications","discordMessagingNotifications","displayNsfw","showAge","displayFindomContent","showPublicStatistics","showIdentityBadge"]},"Region":{"type":"object","properties":{"name":{"type":"string"},"shortCode":{"type":"string"}},"required":["name"]},"Country":{"type":"object","properties":{"countryName":{"type":"string"},"countryShortCode":{"type":"string"},"regions":{"type":"array","items":{"$ref":"#/components/schemas/Region"}}},"required":["countryName","countryShortCode"]},"UserSearchFormLocation":{"type":"object","properties":{"countryShortCode":{"type":"string","nullable":true},"regionName":{"type":"string","nullable":true}},"required":["countryShortCode","regionName"]},"UserSearchFormKinks":{"type":"object","properties":{"kinks":{"type":"array","items":{"type":"string"}},"all":{"type":"boolean"}}},"UserSearchFormToys":{"type":"object","properties":{"toys":{"type":"array","items":{"type":"string"}},"all":{"type":"boolean"}}},"UserSearchForm":{"type":"object","properties":{"sexualOrientations":{"type":"array","items":{"$ref":"#/components/schemas/SexualOrientationEnum"}},"age":{"type":"array","items":{"type":"number"}},"location":{"$ref":"#/components/schemas/UserSearchFormLocation"},"wearer":{"type":"boolean"},"keyholder":{"type":"boolean"},"genders":{"type":"array","items":{"type":"string"}},"hasFindom":{"type":"boolean"},"hasNotFindom":{"type":"boolean"},"isActive":{"type":"boolean"},"kinks":{"$ref":"#/components/schemas/UserSearchFormKinks"},"toys":{"$ref":"#/components/schemas/UserSearchFormToys"}}},"PublicLockSearchForm":{"type":"object","properties":{"hasFindom":{"type":"boolean"},"hasNotFindom":{"type":"boolean"},"user":{"$ref":"#/components/schemas/UserSearchForm"},"duration":{"$ref":"#/components/schemas/DurationCriteriaData"},"maxLimitDuration":{"$ref":"#/components/schemas/DurationCriteriaData"},"extensions":{"$ref":"#/components/schemas/ExtensionCriteriaData"},"tags":{"description":"Search locks by tags","type":"array","items":{"type":"string"}},"matchAllTags":{"type":"boolean","description":"Whether to match all tags\nIf true, return locks that contain all the tags\nIf false, return locks that contain at least one of the tags"}}},"UserPrivateMetadataForPublic":{"type":"object","properties":{"userSearchForm":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/UserSearchForm"}]},"publicLockSearchForm":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/PublicLockSearchForm"}]},"profileCompletenessDismissed":{"type":"boolean"}}},"CurrentUserForProfileSettings":{"type":"object","properties":{"gender":{"nullable":true,"description":"The gender","$ref":"#/components/schemas/GenderEnum"},"sexualOrientation":{"description":"The sexual orientation","$ref":"#/components/schemas/SexualOrientationEnum"},"pronouns":{"description":"The pronouns","$ref":"#/components/schemas/PronounsEnum"},"role":{"description":"The role","$ref":"#/components/schemas/UserRoleEnum"},"features":{"description":"Enabled features","type":"array","items":{"$ref":"#/components/schemas/FeatureSwitchEnum"}},"canEditUsername":{"type":"boolean"},"canEditBirthDate":{"type":"boolean"},"email":{"type":"string","nullable":true},"keycloakId":{"type":"string","description":"The user Keycloak id"},"username":{"type":"string","description":"The username"},"subscriptionEnd":{"format":"date-time","type":"string","nullable":true,"description":"End date of subscription"},"customSubscriptionEnd":{"format":"date-time","type":"string","nullable":true,"description":"End date of custom subscription"},"hasPastDueSubscription":{"type":"boolean","description":"Whether the subscription is past due"},"description":{"type":"string","description":"The profile description"},"location":{"type":"string","description":"The location","maxLength":60},"birthDate":{"format":"date-time","type":"string","nullable":true,"description":"The birth date"},"emailVerified":{"type":"boolean","description":"Whether the email is verified"},"isDeveloper":{"type":"boolean","description":"Whether the user is a developer"},"isModerator":{"type":"boolean","description":"Whether the user is a moderator"},"isTeamMember":{"type":"boolean","description":"Whether the user is a team member"},"subscriptionCancelAfterEnd":{"type":"boolean","description":"Whether the subscription is canceled after the end date"},"discordId":{"type":"string","nullable":true,"description":"The Discord id"},"discordUsername":{"type":"string","nullable":true,"description":"The Discord username"},"isAdmin":{"type":"boolean","description":"Whether the user is an admin"},"isFindom":{"type":"boolean","description":"Whether the user is a findom"},"settings":{"description":"The user settings","allOf":[{"$ref":"#/components/schemas/UserSettings"}]},"metadata":{"description":"The user metadata","allOf":[{"$ref":"#/components/schemas/UserMetadata"}]},"country":{"nullable":true,"description":"The country","allOf":[{"$ref":"#/components/schemas/Country"}]},"region":{"nullable":true,"description":"Region","allOf":[{"$ref":"#/components/schemas/Region"}]},"hasAcceptedCommunityRules":{"type":"boolean","description":"Whether the user has accepted the community rules"},"isSuspended":{"type":"boolean","description":"Whether the user is suspended"},"_id":{"type":"string","description":"The user id"},"avatarUrl":{"type":"string","description":"The avatar URL"},"isPremium":{"type":"boolean","description":"True if the user is a premium user"},"needsDiscordMigration":{"type":"boolean"},"privateMetadata":{"$ref":"#/components/schemas/UserPrivateMetadataForPublic"},"timezone":{"type":"string","nullable":true,"description":"The user timezone"},"phoneNumber":{"type":"string","description":"The user phone number"},"phoneNumberVerified":{"type":"boolean","description":"True if the user phone number is verified"},"hasActiveModerationNotification":{"type":"boolean","description":"Whether the user has an active moderation notification"}},"required":["gender","sexualOrientation","pronouns","role","features","canEditUsername","canEditBirthDate","email","keycloakId","username","hasPastDueSubscription","description","location","birthDate","emailVerified","isDeveloper","isModerator","isTeamMember","subscriptionCancelAfterEnd","isAdmin","isFindom","settings","metadata","country","region","hasAcceptedCommunityRules","isSuspended","_id","avatarUrl","isPremium","needsDiscordMigration","privateMetadata","timezone","phoneNumberVerified","hasActiveModerationNotification"]},"CurrentUser":{"type":"object","properties":{"gender":{"nullable":true,"description":"The gender","$ref":"#/components/schemas/GenderEnum"},"sexualOrientation":{"description":"The sexual orientation","$ref":"#/components/schemas/SexualOrientationEnum"},"pronouns":{"description":"The pronouns","$ref":"#/components/schemas/PronounsEnum"},"role":{"description":"The role","$ref":"#/components/schemas/UserRoleEnum"},"features":{"description":"Enabled features","type":"array","items":{"$ref":"#/components/schemas/FeatureSwitchEnum"}},"_id":{"type":"string","description":"The user id"},"avatarUrl":{"type":"string","description":"The avatar URL"},"isPremium":{"type":"boolean","description":"True if the user is a premium user"},"needsDiscordMigration":{"type":"boolean"},"privateMetadata":{"$ref":"#/components/schemas/UserPrivateMetadataForPublic"},"timezone":{"type":"string","nullable":true,"description":"The user timezone"},"phoneNumber":{"type":"string","description":"The user phone number"},"phoneNumberVerified":{"type":"boolean","description":"True if the user phone number is verified"},"hasActiveModerationNotification":{"type":"boolean","description":"Whether the user has an active moderation notification"},"keycloakId":{"type":"string","description":"The user Keycloak id"},"username":{"type":"string","description":"The username"},"email":{"type":"string","description":"The email"},"subscriptionEnd":{"format":"date-time","type":"string","nullable":true,"description":"End date of subscription"},"customSubscriptionEnd":{"format":"date-time","type":"string","nullable":true,"description":"End date of custom subscription"},"hasPastDueSubscription":{"type":"boolean","description":"Whether the subscription is past due"},"description":{"type":"string","description":"The profile description"},"location":{"type":"string","description":"The location","maxLength":60},"birthDate":{"format":"date-time","type":"string","nullable":true,"description":"The birth date"},"emailVerified":{"type":"boolean","description":"Whether the email is verified"},"isDeveloper":{"type":"boolean","description":"Whether the user is a developer"},"isModerator":{"type":"boolean","description":"Whether the user is a moderator"},"isTeamMember":{"type":"boolean","description":"Whether the user is a team member"},"subscriptionCancelAfterEnd":{"type":"boolean","description":"Whether the subscription is canceled after the end date"},"discordId":{"type":"string","nullable":true,"description":"The Discord id"},"discordUsername":{"type":"string","nullable":true,"description":"The Discord username"},"isAdmin":{"type":"boolean","description":"Whether the user is an admin"},"isFindom":{"type":"boolean","description":"Whether the user is a findom"},"settings":{"description":"The user settings","allOf":[{"$ref":"#/components/schemas/UserSettings"}]},"metadata":{"description":"The user metadata","allOf":[{"$ref":"#/components/schemas/UserMetadata"}]},"country":{"nullable":true,"description":"The country","allOf":[{"$ref":"#/components/schemas/Country"}]},"region":{"nullable":true,"description":"Region","allOf":[{"$ref":"#/components/schemas/Region"}]},"hasAcceptedCommunityRules":{"type":"boolean","description":"Whether the user has accepted the community rules"},"isSuspended":{"type":"boolean","description":"Whether the user is suspended"}},"required":["gender","sexualOrientation","pronouns","role","features","_id","avatarUrl","isPremium","needsDiscordMigration","privateMetadata","timezone","phoneNumberVerified","hasActiveModerationNotification","keycloakId","username","email","hasPastDueSubscription","description","location","birthDate","emailVerified","isDeveloper","isModerator","isTeamMember","subscriptionCancelAfterEnd","isAdmin","isFindom","settings","metadata","country","region","hasAcceptedCommunityRules","isSuspended"]},"LastMessageForPublic":{"type":"object","properties":{"_id":{"type":"string"},"message":{"type":"string","description":"The message content"}},"required":["_id","message"]},"ConversationForPublic":{"type":"object","properties":{"_id":{"type":"string","description":"The conversation id"},"users":{"description":"List of users who are part of the conversation","type":"array","items":{"$ref":"#/components/schemas/UserForPublic"}},"lastMessage":{"description":"The last message sent","allOf":[{"$ref":"#/components/schemas/LastMessageForPublic"}]},"unread":{"type":"boolean","description":"Is the conversation unread"},"status":{"description":"Conversation status","enum":["pending","approved","ignored"],"type":"string"},"createdAt":{"format":"date-time","type":"string","description":"Created at"},"lastMessageAt":{"format":"date-time","type":"string","description":"Last message at"},"isMember":{"type":"boolean","description":"Whether the user is part of the conversation"},"isSenderBanned":{"type":"boolean","description":"Whether the sender is banned"},"type":{"description":"The conversation type","enum":["private","group"],"type":"string"}},"required":["_id","users","unread","status","createdAt","lastMessageAt","isMember","isSenderBanned","type"]},"CreateConversationDto":{"type":"object","properties":{"users":{"description":"List of user ids in the conversation, excluding the logged user","type":"array","items":{"type":"string"}},"type":{"type":"string","description":"The conversation type\n\nThe `group` type is currently not supported.","enum":["private","group"]},"attachments":{"type":"string","description":"The file token\n\nCreate a file token by using the `/files/upload` endpoint."},"message":{"type":"string","description":"The message"},"nonce":{"type":"string","description":"Nonce\n\nIf this field is included, it will be returned to the websocket client"},"turnstileToken":{"type":"string","description":"Turnstile token"}},"required":["users","type","message"]},"UpdateConversationDto":{"type":"object","properties":{"attachments":{"type":"string","description":"The file token\n\nCreate a file token by using the `/files/upload` endpoint."},"message":{"type":"string","description":"The message"},"nonce":{"type":"string","description":"Nonce\n\nIf this field is included, it will be returned to the websocket client"},"turnstileToken":{"type":"string","description":"Turnstile token"}},"required":["message"]},"MessageForPublic":{"type":"object","properties":{"_id":{"type":"string","description":"The message id"},"user":{"type":"string","description":"The sender id"},"attachments":{"description":"Message attachments","type":"array","items":{"$ref":"#/components/schemas/AppFileForPublic"}},"conversation":{"type":"string","description":"The conversation id"},"createdAt":{"format":"date-time","type":"string","description":"Created at"},"updatedAt":{"format":"date-time","type":"string","description":"Updated at"},"nonce":{"type":"string","description":"Nonce\n\nIs present only in the return of the websocket during the creation of the\nmessage, for the sender."},"type":{"type":"string","description":"The message type","enum":["message","log"]},"message":{"type":"string","description":"The message content"}},"required":["_id","user","attachments","conversation","createdAt","updatedAt","type","message"]},"SetConversationStatusDto":{"type":"object","properties":{"status":{"type":"string","description":"The new conversation status","enum":["approved","ignored"]}},"required":["status"]},"SetConversationUnreadDto":{"type":"object","properties":{"unread":{"type":"boolean","description":"True if unread"}},"required":["unread"]},"GetMessagesRepDto":{"type":"object","properties":{"results":{"description":"List of messages","type":"array","items":{"$ref":"#/components/schemas/MessageForPublic"}},"count":{"type":"number","description":"The number of results"},"hasMore":{"type":"boolean","description":"Has more"}},"required":["results","count","hasMore"]},"UserForIgnoredConversation":{"type":"object","properties":{"_id":{"type":"string"},"username":{"type":"string"},"avatarUrl":{"type":"string"},"conversationId":{"type":"string","description":"The conversation ID"}},"required":["_id","username","avatarUrl","conversationId"]},"IgnoredUsersRepDto":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/UserForIgnoredConversation"}}},"required":["results"]},"GetConversationsRepDto":{"type":"object","properties":{"results":{"description":"List of conversations","type":"array","items":{"$ref":"#/components/schemas/ConversationForPublic"}},"count":{"type":"number","description":"The number of results"},"hasMore":{"type":"boolean","description":"Has more"}},"required":["results","count","hasMore"]},"UserBadgeCount":{"type":"object","properties":{"pendingMessages":{"type":"number","description":"Number of message requests"},"unreadMessages":{"type":"number","description":"Number of messages"},"keyholdingRequests":{"type":"number","description":"Number of keyholding requests"},"pendingPeerVerifications":{"type":"number","description":"Number of pending peer verifications"},"incompleteProfileRequirements":{"type":"number","description":"Number of incomplete profile requirements"}},"required":["pendingMessages","unreadMessages","keyholdingRequests","pendingPeerVerifications","incompleteProfileRequirements"]},"TimezoneEnum":{"type":"string","enum":["Africa/Abidjan","Africa/Accra","Africa/Addis_Ababa","Africa/Algiers","Africa/Asmera","Africa/Bamako","Africa/Bangui","Africa/Banjul","Africa/Bissau","Africa/Blantyre","Africa/Brazzaville","Africa/Bujumbura","Africa/Cairo","Africa/Casablanca","Africa/Ceuta","Africa/Conakry","Africa/Dakar","Africa/Dar_es_Salaam","Africa/Djibouti","Africa/Douala","Africa/El_Aaiun","Africa/Freetown","Africa/Gaborone","Africa/Harare","Africa/Johannesburg","Africa/Juba","Africa/Kampala","Africa/Khartoum","Africa/Kigali","Africa/Kinshasa","Africa/Lagos","Africa/Libreville","Africa/Lome","Africa/Luanda","Africa/Lubumbashi","Africa/Lusaka","Africa/Malabo","Africa/Maputo","Africa/Maseru","Africa/Mbabane","Africa/Mogadishu","Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena","Africa/Niamey","Africa/Nouakchott","Africa/Ouagadougou","Africa/Porto-Novo","Africa/Sao_Tome","Africa/Tripoli","Africa/Tunis","Africa/Windhoek","America/Adak","America/Anchorage","America/Anguilla","America/Antigua","America/Araguaina","America/Argentina/La_Rioja","America/Argentina/Rio_Gallegos","America/Argentina/Salta","America/Argentina/San_Juan","America/Argentina/San_Luis","America/Argentina/Tucuman","America/Argentina/Ushuaia","America/Aruba","America/Asuncion","America/Bahia","America/Bahia_Banderas","America/Barbados","America/Belem","America/Belize","America/Blanc-Sablon","America/Boa_Vista","America/Bogota","America/Boise","America/Buenos_Aires","America/Cambridge_Bay","America/Campo_Grande","America/Cancun","America/Caracas","America/Catamarca","America/Cayenne","America/Cayman","America/Chicago","America/Chihuahua","America/Ciudad_Juarez","America/Coral_Harbour","America/Cordoba","America/Costa_Rica","America/Creston","America/Cuiaba","America/Curacao","America/Danmarkshavn","America/Dawson","America/Dawson_Creek","America/Denver","America/Detroit","America/Dominica","America/Edmonton","America/Eirunepe","America/El_Salvador","America/Fort_Nelson","America/Fortaleza","America/Glace_Bay","America/Godthab","America/Goose_Bay","America/Grand_Turk","America/Grenada","America/Guadeloupe","America/Guatemala","America/Guayaquil","America/Guyana","America/Halifax","America/Havana","America/Hermosillo","America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg","America/Indiana/Tell_City","America/Indiana/Vevay","America/Indiana/Vincennes","America/Indiana/Winamac","America/Indianapolis","America/Inuvik","America/Iqaluit","America/Jamaica","America/Jujuy","America/Juneau","America/Kentucky/Monticello","America/Kralendijk","America/La_Paz","America/Lima","America/Los_Angeles","America/Louisville","America/Lower_Princes","America/Maceio","America/Managua","America/Manaus","America/Marigot","America/Martinique","America/Matamoros","America/Mazatlan","America/Mendoza","America/Menominee","America/Merida","America/Metlakatla","America/Mexico_City","America/Miquelon","America/Moncton","America/Monterrey","America/Montevideo","America/Montserrat","America/Nassau","America/New_York","America/Nome","America/Noronha","America/North_Dakota/Beulah","America/North_Dakota/Center","America/North_Dakota/New_Salem","America/Ojinaga","America/Panama","America/Paramaribo","America/Phoenix","America/Port-au-Prince","America/Port_of_Spain","America/Porto_Velho","America/Puerto_Rico","America/Punta_Arenas","America/Rankin_Inlet","America/Recife","America/Regina","America/Resolute","America/Rio_Branco","America/Santarem","America/Santiago","America/Santo_Domingo","America/Sao_Paulo","America/Scoresbysund","America/Sitka","America/St_Barthelemy","America/St_Johns","America/St_Kitts","America/St_Lucia","America/St_Thomas","America/St_Vincent","America/Swift_Current","America/Tegucigalpa","America/Thule","America/Tijuana","America/Toronto","America/Tortola","America/Vancouver","America/Whitehorse","America/Winnipeg","America/Yakutat","Antarctica/Casey","Antarctica/Davis","Antarctica/DumontDUrville","Antarctica/Macquarie","Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer","Antarctica/Rothera","Antarctica/Syowa","Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen","Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr","Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Atyrau","Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok","Asia/Barnaul","Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Calcutta","Asia/Chita","Asia/Colombo","Asia/Damascus","Asia/Dhaka","Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Famagusta","Asia/Gaza","Asia/Hebron","Asia/Hong_Kong","Asia/Hovd","Asia/Irkutsk","Asia/Jakarta","Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka","Asia/Karachi","Asia/Katmandu","Asia/Khandyga","Asia/Krasnoyarsk","Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila","Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk","Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak","Asia/Pyongyang","Asia/Qatar","Asia/Qostanay","Asia/Qyzylorda","Asia/Rangoon","Asia/Riyadh","Asia/Saigon","Asia/Sakhalin","Asia/Samarkand","Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk","Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran","Asia/Thimphu","Asia/Tokyo","Asia/Tomsk","Asia/Ulaanbaatar","Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok","Asia/Yakutsk","Asia/Yekaterinburg","Asia/Yerevan","Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary","Atlantic/Cape_Verde","Atlantic/Faeroe","Atlantic/Madeira","Atlantic/Reykjavik","Atlantic/South_Georgia","Atlantic/St_Helena","Atlantic/Stanley","Australia/Adelaide","Australia/Brisbane","Australia/Broken_Hill","Australia/Darwin","Australia/Eucla","Australia/Hobart","Australia/Lindeman","Australia/Lord_Howe","Australia/Melbourne","Australia/Perth","Australia/Sydney","Europe/Amsterdam","Europe/Andorra","Europe/Astrakhan","Europe/Athens","Europe/Belgrade","Europe/Berlin","Europe/Bratislava","Europe/Brussels","Europe/Bucharest","Europe/Budapest","Europe/Busingen","Europe/Chisinau","Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar","Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man","Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad","Europe/Kiev","Europe/Kirov","Europe/Lisbon","Europe/Ljubljana","Europe/London","Europe/Luxembourg","Europe/Madrid","Europe/Malta","Europe/Mariehamn","Europe/Minsk","Europe/Monaco","Europe/Moscow","Europe/Oslo","Europe/Paris","Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome","Europe/Samara","Europe/San_Marino","Europe/Sarajevo","Europe/Saratov","Europe/Simferopol","Europe/Skopje","Europe/Sofia","Europe/Stockholm","Europe/Tallinn","Europe/Tirane","Europe/Ulyanovsk","Europe/Vaduz","Europe/Vatican","Europe/Vienna","Europe/Vilnius","Europe/Volgograd","Europe/Warsaw","Europe/Zagreb","Europe/Zurich","Indian/Antananarivo","Indian/Chagos","Indian/Christmas","Indian/Cocos","Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives","Indian/Mauritius","Indian/Mayotte","Indian/Reunion","UTC","Pacific/Apia","Pacific/Auckland","Pacific/Bougainville","Pacific/Chatham","Pacific/Easter","Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo","Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos","Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam","Pacific/Honolulu","Pacific/Kiritimati","Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro","Pacific/Marquesas","Pacific/Midway","Pacific/Nauru","Pacific/Niue","Pacific/Norfolk","Pacific/Noumea","Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn","Pacific/Ponape","Pacific/Port_Moresby","Pacific/Rarotonga","Pacific/Saipan","Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu","Pacific/Truk","Pacific/Wake","Pacific/Wallis"]},"PatchProfileDto":{"type":"object","properties":{"timezone":{"description":"The user timezone","$ref":"#/components/schemas/TimezoneEnum"},"email":{"type":"string","description":"The user email"},"phoneNumber":{"type":"string","description":"The user's phone number"},"description":{"type":"string","description":"The user's description"}}},"SetProfileDto":{"type":"object","properties":{"gender":{"nullable":true,"description":"The gender","$ref":"#/components/schemas/GenderEnum"},"sexualOrientation":{"description":"The sexual orientation","$ref":"#/components/schemas/SexualOrientationEnum"},"pronouns":{"description":"The pronouns","$ref":"#/components/schemas/PronounsEnum"},"role":{"description":"The role","$ref":"#/components/schemas/UserRoleEnum"},"timezone":{"description":"The user timezone","$ref":"#/components/schemas/TimezoneEnum"},"username":{"type":"string","description":"The username"},"email":{"type":"string","description":"The email"},"location":{"type":"string","description":"The location","maxLength":60},"description":{"type":"string","description":"The profile description"},"birthDate":{"format":"date-time","type":"string","nullable":true,"description":"The birth date"},"isFindom":{"type":"boolean","description":"Whether the user is a findom"},"country":{"nullable":true,"description":"The country","allOf":[{"$ref":"#/components/schemas/Country"}]},"region":{"nullable":true,"description":"Region","allOf":[{"$ref":"#/components/schemas/Region"}]}},"required":["gender","sexualOrientation","pronouns","role","username","email","location","description","birthDate","isFindom","country","region"]},"SharedLocksCriteriaData":{"type":"object","properties":{"sharedLockIds":{"description":"An array of shared locks ids","type":"array","items":{"type":"string"}},"includeKeyholderLocks":{"type":"boolean","description":"Whether the request includes locks created by wearers"}}},"KeyholderSearchLocksCriteria":{"type":"object","properties":{"sharedLocks":{"$ref":"#/components/schemas/SharedLocksCriteriaData"}}},"KeyholderSearchLocksDto":{"type":"object","properties":{"criteria":{"description":"Search criteria","default":{},"allOf":[{"$ref":"#/components/schemas/KeyholderSearchLocksCriteria"}]},"status":{"type":"string","description":"Filter by lock status","enum":["locked","unlocked","deserted","archived"]},"search":{"type":"string","description":"Search by username of shared lock name\nMin. 2 characters"},"page":{"type":"number","description":"Page number (starts with 0)","minimum":0},"limit":{"type":"number","description":"Number of items returned","minimum":1,"maximum":50}}},"LockForKeyholder":{"type":"object","properties":{"status":{"description":"The status","$ref":"#/components/schemas/LockStatusEnum"},"lockType":{"description":"The lock type","$ref":"#/components/schemas/LockTypeEnum"},"keyholderUnavailable":{"description":"Whether the keyholder is unavailable\nOnly available for the wearer","$ref":"#/components/schemas/KeyholderUnavailableEnum"},"startDate":{"format":"date-time","type":"string","description":"The start date"},"minDate":{"format":"date-time","type":"string","description":"The minimum initial date configured at creation"},"maxDate":{"format":"date-time","type":"string","description":"The maximum initial date configured at creation"},"maxLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The maximum date of the lock\n\nAfter this date, the wearer can release themself\nregardless of the timer or extension restrictions."},"minLimitDate":{"format":"date-time","type":"string","nullable":true,"description":"The minimum date of the lock\n\nBefore this date, the lock cannot be unlocked,\neven if the timer expires."},"displayRemainingTime":{"type":"boolean","description":"Whether the remaining time is displayed to the wearer"},"limitLockTime":{"type":"boolean","description":"Whether the lock is limited in duration"},"deletedAt":{"format":"date-time","type":"string","nullable":true,"description":"Deleted at"},"unlockedAt":{"format":"date-time","type":"string","nullable":true,"description":"Unlocked at"},"archivedAt":{"format":"date-time","type":"string","nullable":true,"description":"Archived at"},"recoveredAt":{"format":"date-time","type":"string","nullable":true,"description":"Recovered at (when the wearer explicitly recovered a deserted combination)"},"frozenAt":{"format":"date-time","type":"string","nullable":true,"description":"Frozen at"},"keyholderArchivedAt":{"format":"date-time","type":"string","nullable":true,"description":"Keyholder archived at"},"allowSessionOffer":{"type":"boolean","description":"Whether the lock allows session offers"},"isTestLock":{"type":"boolean","description":"Whether the lock is a test lock and counts in the user stats"},"offerToken":{"type":"string","nullable":true,"description":"The offer token"},"hideTimeLogs":{"type":"boolean","description":"True if the time information should be hidden from the history"},"trusted":{"type":"boolean","description":"Whether the keyholder is trusted"},"_id":{"type":"string","description":"The lock id"},"endDate":{"format":"date-time","type":"string","nullable":true,"description":"The end date"},"title":{"type":"string","description":"The lock title"},"totalDuration":{"type":"number","description":"The total duration, since the creation of the lock"},"user":{"description":"The user","allOf":[{"$ref":"#/components/schemas/UserForPublic"}]},"keyholder":{"nullable":true,"description":"The keyholder","allOf":[{"$ref":"#/components/schemas/UserForPublic"}]},"sharedLock":{"nullable":true,"description":"The shared lock","allOf":[{"$ref":"#/components/schemas/SharedLockForPublic"}]},"isAllowedToViewTime":{"type":"boolean","description":"Whether the wearer is allowed to view the remaining time"},"canBeUnlocked":{"type":"boolean","description":"Whether the lock can be unlocked\n\nThis field does not account for extension restrictions\n(reasonsPreventingUnlocking) and may return true even when\nextensions are blocking the unlock.","deprecated":true},"isReadyToUnlock":{"type":"boolean","description":"Whether the lock is truly ready to be unlocked by the wearer, accounting for\nboth timer state, minimum lock time and extension restrictions."},"canBeUnlockedByMaxLimitDate":{"type":"boolean","description":"Whether the lock can be unlocked because the max limit date has been reached"},"isFrozen":{"type":"boolean","description":"Whether the lock is frozen"},"role":{"type":"string","description":"The user role","enum":["keyholder","wearer","visitor"]},"extensions":{"description":"The extensions","type":"array","items":{"$ref":"#/components/schemas/ExtensionPartyForPublic"}},"combination":{"type":"string","description":"The combination"},"reasonsPreventingUnlocking":{"description":"Reasons preventing unlocking","type":"array","items":{"$ref":"#/components/schemas/ReasonPreventingUnlocking"}},"extensionsAllowUnlocking":{"type":"boolean","description":"Whether the extensions allow unlocking"},"lastVerificationPicture":{"nullable":true,"description":"The last verification picture","allOf":[{"$ref":"#/components/schemas/VerificationPictureItem"}]},"createdAt":{"format":"date-time","type":"string","description":"Created at"},"updatedAt":{"format":"date-time","type":"string","description":"Updated at"}},"required":["status","lockType","startDate","minDate","maxDate","maxLimitDate","minLimitDate","displayRemainingTime","limitLockTime","deletedAt","unlockedAt","archivedAt","recoveredAt","frozenAt","keyholderArchivedAt","allowSessionOffer","isTestLock","offerToken","hideTimeLogs","trusted","_id","endDate","title","totalDuration","user","keyholder","sharedLock","isAllowedToViewTime","canBeUnlocked","isReadyToUnlock","canBeUnlockedByMaxLimitDate","isFrozen","role","extensions","combination","reasonsPreventingUnlocking","extensionsAllowUnlocking","lastVerificationPicture","createdAt","updatedAt"]},"KeyholderSearchLocksRepDto":{"type":"object","properties":{"pages":{"type":"number","description":"Number of pages"},"total":{"type":"number","description":"Number of results"},"locks":{"description":"List of locks","type":"array","items":{"$ref":"#/components/schemas/LockForKeyholder"}}},"required":["pages","total","locks"]},"KeyholderNoteTypeEnum":{"type":"string","enum":["user","lock"]},"KeyholderNoteResponseDto":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/KeyholderNoteTypeEnum"},"_id":{"type":"string"},"targetUserId":{"type":"string"},"targetLockId":{"type":"string","nullable":true},"content":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["type","_id","targetUserId","content","createdAt","updatedAt"]},"KeyholderNotesForLockResponseDto":{"type":"object","properties":{"userNote":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/KeyholderNoteResponseDto"}]},"lockNote":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/KeyholderNoteResponseDto"}]}}},"UpsertKeyholderNoteDto":{"type":"object","properties":{"content":{"type":"string","minLength":1,"maxLength":10000}},"required":["content"]},"CreateSharedLockPartnerConfigurationRepDto":{"type":"object","properties":{"token":{"type":"string","description":"The partner configuration token"}},"required":["token"]},"CreatePartnerConfigurationDto":{"type":"object","properties":{"role":{"$ref":"#/components/schemas/PartnerConfigurationRoleEnum"}},"required":["role"]},"CreatePartnerConfigurationRepDto":{"type":"object","properties":{"token":{"type":"string","description":"The partner configuration token"}},"required":["token"]},"PeerVerificationVoteStatus":{"type":"object","properties":{"status":{"description":"Peer verification status","$ref":"#/components/schemas/PeerVerificationStatusEnum"},"_id":{"type":"string","description":"Peer verification id"},"verifiedVotes":{"type":"number","description":"Number of verified votes"},"rejectedVotes":{"type":"number","description":"Number of rejected votes"}},"required":["status","_id","verifiedVotes","rejectedVotes"]},"VerificationPictureHistoryEntry":{"type":"object","properties":{"votes":{"nullable":true,"description":"Votes if the peer verification is enabled.","deprecated":true,"allOf":[{"$ref":"#/components/schemas/PeerVerificationVoteStatus"}]},"verificationCode":{"type":"string","nullable":true,"description":"The verification code"},"peerVerificationId":{"type":"string","nullable":true,"description":"The peer verification id"},"imageKey":{"type":"string","description":"The peer verification image key"},"submittedAt":{"format":"date-time","type":"string","description":"Submitted at"},"peerVerification":{"description":"Full peer verification data if available","allOf":[{"$ref":"#/components/schemas/PeerVerificationForLockList"}]}},"required":["votes","verificationCode","peerVerificationId","imageKey","submittedAt"]},"IsFavoriteSharedLockRepDto":{"type":"object","properties":{"favorite":{"type":"boolean","description":"Whether the lock is user favorite"}},"required":["favorite"]},"GetFavoriteSharedLocksDto":{"type":"object","properties":{"limit":{"type":"number","default":15,"minimum":0,"maximum":100},"lastId":{"type":"string"}},"required":["limit"]},"GetFavoriteSharedLocksRepDto":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/PublicLockForSearch"}},"lastId":{"type":"string"},"hasMore":{"type":"boolean"},"count":{"type":"number"}},"required":["results","lastId","hasMore","count"]},"HabitForPublicExtension":{"type":"object","properties":{"slug":{"type":"string","description":"The slug of the extension"},"displayName":{"type":"string","description":"The name of the extension"},"icon":{"type":"string","description":"The icon of the extension"}},"required":["slug","displayName","icon"]},"RegularityRuleIntervalTypeEnum":{"type":"string","enum":["hour","day"]},"RegularityRule":{"type":"object","properties":{"intervalType":{"description":"The interval type for the regularity rule","$ref":"#/components/schemas/RegularityRuleIntervalTypeEnum"},"interval":{"type":"number","description":"The interval for the regularity rule, in the unit defined by `intervalType`"}},"required":["intervalType","interval"]},"RecurringPenaltyItemParams":{"type":"object","properties":{"nbActions":{"type":"number","description":"Number of actions required","minimum":1},"frequency":{"type":"number","description":"Frequency in seconds","enum":[3600,7200,10800,14400,18000,21600,25200,28800,32400,36000,39600,43200,46800,50400,54000,57600,61200,64800,68400,72000,75600,79200,82800,86400,172800,259200,345600,432000,518400,604800,691200,777600,864000,950400,1036800,1123200,1209600,1296000,1382400,1468800,1555200,1641600,1728000,1814400,1900800,1987200,2073600,2160000,2246400,2332800,2419200,2505600,2592000]},"regularityRule":{"description":"Regularity rule","allOf":[{"$ref":"#/components/schemas/RegularityRule"}]},"startMode":{"type":"string","description":"Penalty period start mode","enum":["on_lock_start","fixed_start_time"]},"fixedStartTime":{"type":"string","description":"Optional start time for periods in \"HH:mm\" format. If not provided, periods will start at midnight.","pattern":"/^([01]\\d|2[0-3]):([0-5]\\d)$/"}},"required":["nbActions","frequency"]},"TimeLimitPenaltyItemParams":{"type":"object","properties":{"timeLimit":{"type":"number","description":"Time limit in seconds","minimum":60}},"required":["timeLimit"]},"LockAction":{"type":"object","properties":{"params":{"description":"Parameters","oneOf":[{"$ref":"#/components/schemas/AddTimeLockActionModel"},{"$ref":"#/components/schemas/RemoveTimeLockActionModel"},{"$ref":"#/components/schemas/FreezeLockActionModel"},{"$ref":"#/components/schemas/UnfreezeLockActionModel"},{"$ref":"#/components/schemas/ToggleFreezeLockActionModel"},{"$ref":"#/components/schemas/PilloryLockActionModel"},{"$ref":"#/components/schemas/SetDisplayRemainingTimeActionModel"}]},"name":{"type":"string","description":"The action name"}},"required":["params","name"]},"HabitForPublic":{"type":"object","properties":{"habitName":{"type":"string","description":"The name of the habit"},"label":{"type":"string","description":"The label of the habit"},"extension":{"description":"The extension","allOf":[{"$ref":"#/components/schemas/HabitForPublicExtension"}]},"paramsText":{"type":"string","description":"The text requesting the required number of actions or limited time\n\nExample: Number of dice rolls required"},"punishmentText":{"type":"string","description":"The text indicating the punishments\n\nExample: Penalty for not rolling the dice in time"},"recurringParams":{"nullable":true,"description":"The configuration for the recurring action","allOf":[{"$ref":"#/components/schemas/RecurringPenaltyItemParams"}]},"timeLimitParams":{"nullable":true,"description":"The configuration for the time limit action","allOf":[{"$ref":"#/components/schemas/TimeLimitPenaltyItemParams"}]},"punishments":{"description":"The list of punishments applied if the habit is not completed","type":"array","items":{"$ref":"#/components/schemas/LockAction"}}},"required":["habitName","label","paramsText","punishmentText","recurringParams","timeLimitParams","punishments"]},"PenaltyPeriodStatusEnum":{"type":"string","enum":["ongoing","validated","punished","cancelled"]},"PenaltyPeriodForPublic":{"type":"object","properties":{"status":{"description":"The status of the penalty period","$ref":"#/components/schemas/PenaltyPeriodStatusEnum"},"_id":{"type":"string","description":"The penalty period id"},"startsAt":{"format":"date-time","type":"string","description":"The date when the penalty period starts"},"endsAt":{"format":"date-time","type":"string","description":"The date when the penalty period ends.\nAt the end of the period, the punishment will be applied if the habit is not completed"},"habitName":{"type":"string","description":"The name of the habit"},"nbActionsDone":{"type":"number","description":"The number of actions already done"},"nbActionsRequired":{"type":"number","description":"The number of actions required to complete the habit"},"punishments":{"description":"The list of punishments applied for this penalty period if the habit is not completed","type":"array","items":{"$ref":"#/components/schemas/LockAction"}}},"required":["status","_id","startsAt","endsAt","habitName","nbActionsDone","nbActionsRequired","punishments"]},"PenaltySessionForPublic":{"type":"object","properties":{"habits":{"type":"array","items":{"$ref":"#/components/schemas/HabitForPublic"}},"penaltyPeriods":{"type":"array","items":{"$ref":"#/components/schemas/PenaltyPeriodForPublic"}}},"required":["habits","penaltyPeriods"]},"FindPenaltyPeriodsDto":{"type":"object","properties":{"limit":{"type":"number","default":50,"minimum":0,"maximum":100},"habitName":{"type":"string"},"cursor":{"type":"string"}},"required":["habitName"]},"FindPenaltyPeriodsRepDto":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/PenaltyPeriodForPublic"}},"hasMore":{"type":"boolean"},"count":{"type":"number"}},"required":["results","hasMore","count"]},"PunishableActionTypeEnum":{"type":"string","enum":["recurring","time_limit"]},"PunishableActionForPublicExtension":{"type":"object","properties":{"slug":{"type":"string","description":"The slug of the extension"},"displayName":{"type":"string","description":"The name of the extension"},"icon":{"type":"string","description":"The icon of the extension"},"subtitle":{"type":"string","description":"The subtitle of the extension"}},"required":["slug","displayName","icon","subtitle"]},"PunishableActionForPublic":{"type":"object","properties":{"type":{"description":"The habit type","$ref":"#/components/schemas/PunishableActionTypeEnum"},"prefix":{"type":"string","description":"The habit prefix"},"name":{"type":"string","description":"The habit prefix"},"habitName":{"type":"string","description":"The habit name. This is a combination of the prefix and the name"},"label":{"type":"string","description":"The habit label"},"extension":{"description":"The extension","allOf":[{"$ref":"#/components/schemas/PunishableActionForPublicExtension"}]},"paramsText":{"type":"string","description":"The text requesting the required number of actions or limited time\n\nExample: Number of dice rolls required"},"punishmentText":{"type":"string","description":"The text indicating the punishments\n\nExample: Penalty for not rolling the dice in time"}},"required":["type","prefix","name","habitName","label","paramsText","punishmentText"]},"ProfileCompletenessRequirementDto":{"type":"object","properties":{"key":{"type":"string"},"completed":{"type":"boolean"}},"required":["key","completed"]},"ProfileCompletenessRepDto":{"type":"object","properties":{"requirements":{"type":"array","items":{"$ref":"#/components/schemas/ProfileCompletenessRequirementDto"}}},"required":["requirements"]},"KeycloakGlobalConfig":{"type":"object","properties":{"clientId":{"type":"string"},"realm":{"type":"string"},"url":{"type":"string"}},"required":["clientId","realm","url"]},"GlobalConfig":{"type":"object","properties":{"apiUrl":{"type":"string"},"keycloak":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/KeycloakGlobalConfig"}]}},"required":["apiUrl","keycloak"]},"PartnerConfigurationChildEventEnum":{"type":"string","enum":["capabilities","save_loading","save_success","save_failed"]},"PartnerConfigurationChildCapabilitiesFeatures":{"type":"object","properties":{"save":{"type":"boolean"}},"required":["save"]},"PartnerConfigurationChildCapabilitiesEvent":{"type":"object","properties":{"features":{"$ref":"#/components/schemas/PartnerConfigurationChildCapabilitiesFeatures"}},"required":["features"]},"PartnerConfigurationChildEvents":{"type":"object","properties":{"event":{"$ref":"#/components/schemas/PartnerConfigurationChildEventEnum"},"payload":{"oneOf":[{"$ref":"#/components/schemas/PartnerConfigurationChildCapabilitiesEvent"}],"allOf":[{"$ref":"#/components/schemas/PartnerConfigurationChildCapabilitiesEvent"}]}},"required":["event","payload"]},"ExtensionSessionCreatedExtension":{"type":"object","properties":{"slug":{"type":"string"}},"required":["slug"]},"ExtensionSessionCreatedData":{"type":"object","properties":{"session":{"$ref":"#/components/schemas/ExtensionSessionForPartner"},"extension":{"$ref":"#/components/schemas/ExtensionSessionCreatedExtension"}},"required":["session","extension"]},"ExtensionSessionCreated":{"type":"object","properties":{"event":{"type":"string","enum":["extension_session.created"]},"data":{"$ref":"#/components/schemas/ExtensionSessionCreatedData"},"sentAt":{"format":"date-time","type":"string"},"requestId":{"type":"string"}},"required":["event","data","sentAt","requestId"]},"ExtensionSessionUpdatedExtension":{"type":"object","properties":{"slug":{"type":"string"}},"required":["slug"]},"ExtensionSessionUpdatedData":{"type":"object","properties":{"session":{"$ref":"#/components/schemas/ExtensionSessionForPartner"},"extension":{"$ref":"#/components/schemas/ExtensionSessionUpdatedExtension"}},"required":["session","extension"]},"ExtensionSessionUpdated":{"type":"object","properties":{"event":{"type":"string","enum":["extension_session.updated"]},"data":{"$ref":"#/components/schemas/ExtensionSessionUpdatedData"},"sentAt":{"format":"date-time","type":"string"},"requestId":{"type":"string"}},"required":["event","data","sentAt","requestId"]},"ExtensionSessionCreatedDataSession":{"type":"object","properties":{"sessionId":{"type":"string"},"lock":{"$ref":"#/components/schemas/LockForPublic"}},"required":["sessionId","lock"]},"ExtensionSessionDeletedExtension":{"type":"object","properties":{"slug":{"type":"string"}},"required":["slug"]},"ExtensionSessionDeletedData":{"type":"object","properties":{"session":{"$ref":"#/components/schemas/ExtensionSessionCreatedDataSession"},"extension":{"$ref":"#/components/schemas/ExtensionSessionDeletedExtension"}},"required":["session","extension"]},"ExtensionSessionDeleted":{"type":"object","properties":{"event":{"type":"string","enum":["extension_session.deleted"]},"data":{"$ref":"#/components/schemas/ExtensionSessionDeletedData"},"sentAt":{"format":"date-time","type":"string"},"requestId":{"type":"string"}},"required":["event","data","sentAt","requestId"]},"ActionLogCreatedData":{"type":"object","properties":{"sessionId":{"type":"string","description":"The session id"},"actionLog":{"description":"The action log","allOf":[{"$ref":"#/components/schemas/ActionLogForPublic"}]}},"required":["sessionId","actionLog"]},"ActionLogCreated":{"type":"object","properties":{"event":{"type":"string","enum":["action_log.created"]},"data":{"$ref":"#/components/schemas/ActionLogCreatedData"},"sentAt":{"format":"date-time","type":"string"},"requestId":{"type":"string"}},"required":["event","data","sentAt","requestId"]},"WebhookEventForPublic":{"type":"object","properties":{"payload":{"oneOf":[{"$ref":"#/components/schemas/ExtensionSessionCreated"},{"$ref":"#/components/schemas/ExtensionSessionUpdated"},{"$ref":"#/components/schemas/ExtensionSessionDeleted"},{"$ref":"#/components/schemas/ActionLogCreated"}]}},"required":["payload"]}}}}