{"files":{"SKILL.md":"---\nname: dracoon-api\ndescription: \"DRACOON API skill. Use when working with DRACOON for public, downloads, users. Covers 314 endpoints.\"\nversion: 1.0.0\ngenerator: lapsh\n---\n\n# DRACOON API\nAPI version: 5.49.0\n\n## Auth\nOAuth2\n\n## Base URL\n/api\n\n## Setup\n1. Configure auth: OAuth2\n2. GET /v4/user/subscriptions/upload_shares -- list upload share subscriptions\n3. POST /v4/users/{user_id}/userAttributes -- create first userAttribute\n\n## Endpoints\n314 endpoints across 17 groups. See references/api-spec.lap for full details.\n\n### Public\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/public/shares/downloads/{access_key}/{token} | Download file with token |\n| HEAD | /v4/public/shares/downloads/{access_key}/{token} | Download file with token |\n| GET | /v4/public/shares/uploads/{access_key}/{upload_id} | Request status of S3 file upload |\n| PUT | /v4/public/shares/uploads/{access_key}/{upload_id} | Complete file upload |\n| POST | /v4/public/shares/uploads/{access_key}/{upload_id} | Upload file |\n| DELETE | /v4/public/shares/uploads/{access_key}/{upload_id} | Cancel file upload |\n| PUT | /v4/public/shares/uploads/{access_key}/{upload_id}/s3 | Complete S3 file upload |\n| GET | /v4/public/shares/uploads/{access_key} | Request public Upload Share information |\n| POST | /v4/public/shares/uploads/{access_key} | Create new file upload channel |\n| POST | /v4/public/shares/uploads/{access_key}/{upload_id}/s3_urls | Generate presigned URLs for S3 file upload |\n| GET | /v4/public/shares/downloads/{access_key} | Request public Download Share information |\n| POST | /v4/public/shares/downloads/{access_key} | Generate download URL |\n| HEAD | /v4/public/shares/downloads/{access_key} | Check public Download Share password |\n| GET | /v4/public/time | Request system time |\n| GET | /v4/public/system/info | Request system information |\n| GET | /v4/public/system/info/auth/openid | Request OpenID Connect provider authentication information |\n| GET | /v4/public/system/info/auth/ad | Request Active Directory authentication information |\n| GET | /v4/public/software/version | Request software version information |\n| GET | /v4/public/software/third_party_dependencies | Request third-party software dependencies |\n\n### Downloads\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/downloads/{token} | Download file |\n| HEAD | /v4/downloads/{token} | Download file |\n| GET | /v4/downloads/zip/{token} | Download ZIP archive |\n| GET | /v4/downloads/avatar/{user_id}/{uuid} | Download avatar |\n\n### Users\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/users/{user_id} | Request user |\n| PUT | /v4/users/{user_id} | Update user's metadata |\n| DELETE | /v4/users/{user_id} | Remove user |\n| GET | /v4/users/{user_id}/userAttributes | Request custom user attributes |\n| PUT | /v4/users/{user_id}/userAttributes | Add or edit custom user attributes |\n| POST | /v4/users/{user_id}/userAttributes | Set custom user attributes |\n| GET | /v4/users | Request users |\n| POST | /v4/users | Create new user |\n| POST | /v4/users/{user_id}/mfa/emergency_code | Request emergency MFA code |\n| GET | /v4/users/{user_id}/rooms | Request rooms granted to the user or / and rooms that can be granted |\n| GET | /v4/users/{user_id}/roles | Request user's granted roles |\n| GET | /v4/users/{user_id}/last_admin_rooms | Request rooms where the user is last admin |\n| GET | /v4/users/{user_id}/groups | Request groups that user is a member of or / and can become a member |\n| DELETE | /v4/users/{user_id}/userAttributes/{key} | Remove custom user attribute |\n| DELETE | /v4/users/{user_id}/mfa | Reset MFA for user |\n\n### User\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/user/subscriptions/upload_shares | List Upload Share subscriptions |\n| PUT | /v4/user/subscriptions/upload_shares | Subscribe or Unsubscribe a List of Upload Shares for notifications |\n| GET | /v4/user/subscriptions/nodes | List node subscriptions |\n| PUT | /v4/user/subscriptions/nodes | Subscribe or Unsubscribe a List of nodes for notifications |\n| GET | /v4/user/subscriptions/download_shares | List Download Share subscriptions |\n| PUT | /v4/user/subscriptions/download_shares | Subscribe or Unsubscribe a List of Download Shares for notifications |\n| GET | /v4/user/profileAttributes | Request user profile attributes |\n| PUT | /v4/user/profileAttributes | Add or edit user profile attributes |\n| POST | /v4/user/profileAttributes | Set user profile attributes |\n| PUT | /v4/user/notifications/config/{id} | Update notification configuration |\n| GET | /v4/user/account | Request user account information |\n| PUT | /v4/user/account | Update user account |\n| PUT | /v4/user/account/password | Change user's password |\n| GET | /v4/user/account/customer | Request customer information for user |\n| PUT | /v4/user/account/customer | Activate client-side encryption for customer |\n| POST | /v4/user/subscriptions/upload_shares/{share_id} | Subscribe Upload Share for notifications |\n| DELETE | /v4/user/subscriptions/upload_shares/{share_id} | Unsubscribe Upload Share from notifications |\n| POST | /v4/user/subscriptions/nodes/{node_id} | Subscribe node for notifications |\n| DELETE | /v4/user/subscriptions/nodes/{node_id} | Unsubscribe node from notifications |\n| POST | /v4/user/subscriptions/download_shares/{share_id} | Subscribe Download Share for notifications |\n| DELETE | /v4/user/subscriptions/download_shares/{share_id} | Unsubscribe Download Share from notifications |\n| GET | /v4/user/account/mfa/totp | Request information to setup TOTP as second authentication factor |\n| POST | /v4/user/account/mfa/totp | Confirm second factor TOTP setup with a generated OTP |\n| GET | /v4/user/account/keypairs | Request all user key pairs |\n| POST | /v4/user/account/keypairs | Create key pair and preserve copy of old private key |\n| GET | /v4/user/account/keypair | Request user's key pair |\n| POST | /v4/user/account/keypair | Set user's key pair |\n| DELETE | /v4/user/account/keypair | Remove user's key pair |\n| GET | /v4/user/account/avatar | Request avatar |\n| POST | /v4/user/account/avatar | Change avatar |\n| DELETE | /v4/user/account/avatar | Reset avatar |\n| GET | /v4/user/ping | (authenticated) Ping |\n| GET | /v4/user/oauth/authorizations | Request list of OAuth client authorizations |\n| GET | /v4/user/oauth/approvals | Request list of OAuth client approvals |\n| GET | /v4/user/notifications/config | Request list of notification configurations |\n| GET | /v4/user/account/mfa | Request information about the user's mfa status |\n| DELETE | /v4/user/account/mfa | Using emergency-code |\n| GET | /v4/user/account/customer/keypair | Request customer's key pair |\n| DELETE | /v4/user/profileAttributes/{key} | Remove user profile attribute |\n| DELETE | /v4/user/oauth/authorizations/{client_id} | Remove all OAuth authorizations of a client |\n| DELETE | /v4/user/oauth/authorizations/{client_id}/{authorization_id} | Remove a OAuth authorization |\n| DELETE | /v4/user/oauth/approvals/{client_id} | Remove OAuth client approval |\n| DELETE | /v4/user/account/mfa/totp/{id} | Disable a MFA TOTP setup with generated OTP |\n\n### Uploads\n| Method | Path | Description |\n|--------|------|-------------|\n| PUT | /v4/uploads/{token} | Complete file upload |\n| POST | /v4/uploads/{token} | Upload file |\n| DELETE | /v4/uploads/{token} | Cancel file upload |\n\n### System\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/system/config/storage/s3 | Request S3 storage configuration |\n| PUT | /v4/system/config/storage/s3 | Update S3 storage configuration |\n| POST | /v4/system/config/storage/s3 | Create S3 storage configuration |\n| GET | /v4/system/config/settings/syslog | Request syslog settings |\n| PUT | /v4/system/config/settings/syslog | Update syslog settings |\n| GET | /v4/system/config/settings/general | Request general settings |\n| PUT | /v4/system/config/settings/general | Update general settings |\n| GET | /v4/system/config/settings/eventlog | Request eventlog settings |\n| PUT | /v4/system/config/settings/eventlog | Update eventlog settings |\n| GET | /v4/system/config/settings/defaults | Request system defaults |\n| PUT | /v4/system/config/settings/defaults | Update system defaults |\n| GET | /v4/system/config/settings/auth | Request authentication settings |\n| PUT | /v4/system/config/settings/auth | Update authentication settings |\n| GET | /v4/system/config/policies/virus_protection | Request virus protection policies |\n| PUT | /v4/system/config/policies/virus_protection | Change virus protection policies |\n| GET | /v4/system/config/policies/passwords | Request password policies |\n| PUT | /v4/system/config/policies/passwords | Change password policies |\n| GET | /v4/system/config/policies/mfa | Request MFA policies |\n| PUT | /v4/system/config/policies/mfa | Change MFA policies |\n| PUT | /v4/system/config/policies/mfa/{user_type} | Change MFA policies for internal/external users |\n| GET | /v4/system/config/policies/guest_users | Request guest user policies |\n| PUT | /v4/system/config/policies/guest_users | Change guest user policies |\n| GET | /v4/system/config/policies/classifications | Request classification policies |\n| PUT | /v4/system/config/policies/classifications | Change classification policies |\n| GET | /v4/system/config/oauth/clients/{client_id} | Request OAuth client |\n| PUT | /v4/system/config/oauth/clients/{client_id} | Update OAuth client |\n| DELETE | /v4/system/config/oauth/clients/{client_id} | Remove OAuth client |\n| GET | /v4/system/config/auth/openid/idps/{idp_id} | Request OpenID Connect IDP configuration |\n| PUT | /v4/system/config/auth/openid/idps/{idp_id} | Update OpenID Connect IDP configuration |\n| DELETE | /v4/system/config/auth/openid/idps/{idp_id} | Remove OpenID Connect IDP configuration |\n| GET | /v4/system/config/auth/ads/{ad_id} | Request Active Directory configuration |\n| PUT | /v4/system/config/auth/ads/{ad_id} | Update Active Directory configuration |\n| DELETE | /v4/system/config/auth/ads/{ad_id} | Remove Active Directory configuration |\n| GET | /v4/system/config/storage/s3/tags | Request list of configured S3 tags |\n| POST | /v4/system/config/storage/s3/tags | Create S3 tag |\n| POST | /v4/system/config/policies/passwords/enforce_change | Enforce login password change for all users |\n| GET | /v4/system/config/oauth/clients | Request list of OAuth clients |\n| POST | /v4/system/config/oauth/clients | Create OAuth client |\n| GET | /v4/system/config/auth/openid/idps | Request list of OpenID Connect IDP configurations |\n| POST | /v4/system/config/auth/openid/idps | Create OpenID Connect IDP configuration |\n| GET | /v4/system/config/auth/ads | Request list of Active Directory configurations |\n| POST | /v4/system/config/auth/ads | Create Active Directory configuration |\n| POST | /v4/system/config/actions/test/ad | Test Active Directory configuration |\n| GET | /v4/system/config/storage/s3/tags/{id} | Request S3 tag |\n| DELETE | /v4/system/config/storage/s3/tags/{id} | Remove S3 tag |\n| GET | /v4/system/config/settings/infrastructure | Request infrastructure properties |\n| GET | /v4/system/config/policies/passwords/{password_type} | Request password policies for a certain password type |\n\n### Shares\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/shares/uploads | Request list of Upload Shares |\n| PUT | /v4/shares/uploads | Update List of Upload Shares |\n| POST | /v4/shares/uploads | Create new Upload Share |\n| DELETE | /v4/shares/uploads | Remove Upload Shares |\n| GET | /v4/shares/uploads/{share_id} | Request Upload Share |\n| PUT | /v4/shares/uploads/{share_id} | Update Upload Share |\n| DELETE | /v4/shares/uploads/{share_id} | Remove Upload Share |\n| GET | /v4/shares/downloads | Request list of Download Shares |\n| PUT | /v4/shares/downloads | Update a list of Download Shares |\n| POST | /v4/shares/downloads | Create new Download Share |\n| DELETE | /v4/shares/downloads | Remove Download Shares |\n| GET | /v4/shares/downloads/{share_id} | Request Download Share |\n| PUT | /v4/shares/downloads/{share_id} | Update Download Share |\n| DELETE | /v4/shares/downloads/{share_id} | Remove Download Share |\n| POST | /v4/shares/uploads/{share_id}/email | Send an existing Upload Share link via email |\n| POST | /v4/shares/downloads/{share_id}/email | Send an existing Download Share link via email |\n| GET | /v4/shares/uploads/{share_id}/qr | Request Upload Share via QR Code |\n| GET | /v4/shares/downloads/{share_id}/qr | Request Download Share via QR Code |\n\n### Settings\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/settings | Request customer settings |\n| PUT | /v4/settings | Set customer settings |\n| GET | /v4/settings/webhooks/{webhook_id} | Request webhook |\n| PUT | /v4/settings/webhooks/{webhook_id} | Update webhook |\n| DELETE | /v4/settings/webhooks/{webhook_id} | Remove webhook |\n| GET | /v4/settings/notifications/channels | Request list of notification channels |\n| PUT | /v4/settings/notifications/channels | Toggle notification channels |\n| GET | /v4/settings/webhooks | Request list of webhooks |\n| POST | /v4/settings/webhooks | Create webhook |\n| POST | /v4/settings/webhooks/{webhook_id}/reset_lifetime | Reset webhook lifetime |\n| GET | /v4/settings/keypairs | Request all system rescue key pairs |\n| POST | /v4/settings/keypairs | Create system rescue key pair and preserve copy of old private key |\n| GET | /v4/settings/keypair | Request system rescue key pair |\n| POST | /v4/settings/keypair | Activate client-side encryption for customer |\n| DELETE | /v4/settings/keypair | Remove system rescue key pair |\n| GET | /v4/settings/webhooks/event_types | Request list of event types |\n\n### Provisioning\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/provisioning/webhooks/{webhook_id} | Request tenant webhook |\n| PUT | /v4/provisioning/webhooks/{webhook_id} | Update tenant webhook |\n| DELETE | /v4/provisioning/webhooks/{webhook_id} | Remove tenant webhook |\n| GET | /v4/provisioning/customers/{customer_id} | Get customer |\n| PUT | /v4/provisioning/customers/{customer_id} | Update customer |\n| DELETE | /v4/provisioning/customers/{customer_id} | Remove customer |\n| GET | /v4/provisioning/customers/{customer_id}/customerAttributes | Request customer attributes |\n| PUT | /v4/provisioning/customers/{customer_id}/customerAttributes | Add or edit customer attributes |\n| POST | /v4/provisioning/customers/{customer_id}/customerAttributes | Set customer attributes |\n| GET | /v4/provisioning/webhooks | Request list of tenant webhooks |\n| POST | /v4/provisioning/webhooks | Create tenant webhook |\n| POST | /v4/provisioning/webhooks/{webhook_id}/reset_lifetime | Reset tenant webhook lifetime |\n| GET | /v4/provisioning/customers | Request list of customers |\n| POST | /v4/provisioning/customers | Create customer |\n| GET | /v4/provisioning/webhooks/event_types | Request list of event types |\n| GET | /v4/provisioning/customers/{customer_id}/users | Request list of customer users |\n| DELETE | /v4/provisioning/customers/{customer_id}/customerAttributes/{key} | Remove customer attribute |\n\n### Nodes\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/nodes/{node_id}/node_attributes | Request custom node attributes |\n| PUT | /v4/nodes/{node_id}/node_attributes | Add or edit custom node attributes |\n| PUT | /v4/nodes/rooms/{room_id} | Updates room’s metadata |\n| GET | /v4/nodes/rooms/{room_id}/webhooks | Request list of webhooks that are assigned or can be assigned to this room |\n| PUT | /v4/nodes/rooms/{room_id}/webhooks | Assign or unassign webhooks to room |\n| GET | /v4/nodes/rooms/{room_id}/users | Request room granted user(s) or / and user(s) that can be granted |\n| PUT | /v4/nodes/rooms/{room_id}/users | Add or change room granted user(s) |\n| DELETE | /v4/nodes/rooms/{room_id}/users | Revoke granted user(s) from room |\n| GET | /v4/nodes/rooms/{room_id}/policies | Request Room Policies |\n| PUT | /v4/nodes/rooms/{room_id}/policies | Set room policies |\n| PUT | /v4/nodes/rooms/{room_id}/guest_users | Add guest users to a room |\n| GET | /v4/nodes/rooms/{room_id}/groups | Request room granted group(s) or / and group(s) that can be granted |\n| PUT | /v4/nodes/rooms/{room_id}/groups | Add or change room granted group(s) |\n| DELETE | /v4/nodes/rooms/{room_id}/groups | Revoke granted group(s) from room |\n| PUT | /v4/nodes/rooms/{room_id}/encrypt | Encrypt room |\n| PUT | /v4/nodes/rooms/{room_id}/config | Configure room |\n| GET | /v4/nodes/rooms/pending | Request user-room assignments per group |\n| PUT | /v4/nodes/rooms/pending | Handle user-room assignments per group |\n| PUT | /v4/nodes/folders/{folder_id} | Updates folder’s metadata |\n| PUT | /v4/nodes/files | Updates a list of  file’s metadata |\n| PUT | /v4/nodes/files/{file_id} | Updates a file’s metadata |\n| GET | /v4/nodes/files/uploads/{upload_id} | Request status of S3 file upload |\n| PUT | /v4/nodes/files/uploads/{upload_id} | Complete file upload |\n| POST | /v4/nodes/files/uploads/{upload_id} | Upload file |\n| DELETE | /v4/nodes/files/uploads/{upload_id} | Cancel file upload |\n| PUT | /v4/nodes/files/uploads/{upload_id}/s3 | Complete S3 file upload |\n| PUT | /v4/nodes/favorites | Mark or unmark a list of nodes (room, folder or file) as favorite |\n| PUT | /v4/nodes/comments/{comment_id} | Edit node comment |\n| DELETE | /v4/nodes/comments/{comment_id} | Remove node comment |\n| POST | /v4/nodes/{node_id}/move_to | Move node(s) |\n| POST | /v4/nodes/{node_id}/favorite | Mark a node (room, folder or file) as favorite |\n| DELETE | /v4/nodes/{node_id}/favorite | Unmark a node (room, folder or file) as favorite |\n| POST | /v4/nodes/{node_id}/copy_to | Copy node(s) |\n| GET | /v4/nodes/{node_id}/comments | Request list of node comments |\n| POST | /v4/nodes/{node_id}/comments | Create node comment |\n| POST | /v4/nodes/zip | Generate download URL for ZIP download |\n| POST | /v4/nodes/zip/download | Download files / folders as ZIP archive |\n| POST | /v4/nodes/rooms | Create new room |\n| GET | /v4/nodes/rooms/{room_id}/s3_tags | Request list of all assigned S3 tags to the room |\n| POST | /v4/nodes/rooms/{room_id}/s3_tags | Set S3 tags for a room |\n| GET | /v4/nodes/rooms/{room_id}/keypairs | Request all room rescue key pairs |\n| POST | /v4/nodes/rooms/{room_id}/keypairs | Create key pair and preserve copy of old private key |\n| GET | /v4/nodes/rooms/{room_id}/keypair | Request room rescue key |\n| POST | /v4/nodes/rooms/{room_id}/keypair | Set room's rescue key pair |\n| DELETE | /v4/nodes/rooms/{room_id}/keypair | Remove rooms's rescue key pair |\n| POST | /v4/nodes/folders | Create new folder |\n| POST | /v4/nodes/files/{file_id}/downloads | Generate download URL |\n| POST | /v4/nodes/files/uploads | Create new file upload channel |\n| POST | /v4/nodes/files/uploads/{upload_id}/s3_urls | Generate presigned URLs for S3 file upload |\n| POST | /v4/nodes/files/keys | Set file keys for a list of users and files |\n| POST | /v4/nodes/files/generate_verdict_info | Generate Virus Protection Verdict Information |\n| POST | /v4/nodes/deleted_nodes/actions/restore | Restore deleted nodes |\n| GET | /v4/nodes | Request list of nodes |\n| DELETE | /v4/nodes | Remove nodes |\n| GET | /v4/nodes/{node_id} | Request node |\n| DELETE | /v4/nodes/{node_id} | Remove node |\n| GET | /v4/nodes/{node_id}/parents | Request list of parent nodes |\n| GET | /v4/nodes/{node_id}/deleted_nodes | Request list of deleted nodes |\n| DELETE | /v4/nodes/{node_id}/deleted_nodes | Empty recycle bin |\n| GET | /v4/nodes/{node_id}/deleted_nodes/versions | Request deleted versions of nodes |\n| GET | /v4/nodes/search | Search nodes |\n| GET | /v4/nodes/rooms/{room_id}/events | Request events of a room |\n| GET | /v4/nodes/missingFileKeys | Request files without user's file key |\n| GET | /v4/nodes/files/{file_id}/user_file_key | Request user's file key |\n| GET | /v4/nodes/files/{file_id}/data_space_file_key | Request system rescue key |\n| GET | /v4/nodes/files/{file_id}/data_room_file_key | Request room rescue key |\n| GET | /v4/nodes/files/versions/{reference_id} | Request list of file versions |\n| GET | /v4/nodes/deleted_nodes/{deleted_node_id} | Request deleted node |\n| DELETE | /v4/nodes/{node_id}/node_attributes/{key} | Remove custom node attribute |\n| DELETE | /v4/nodes/malicious_files/{malicious_file_id} | Remove malicious File |\n| DELETE | /v4/nodes/deleted_nodes | Remove nodes from recycle bin |\n\n### Groups\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/groups/{group_id} | Request user group |\n| PUT | /v4/groups/{group_id} | Update user group's metadata |\n| DELETE | /v4/groups/{group_id} | Remove user group |\n| GET | /v4/groups | Request list of user groups |\n| POST | /v4/groups | Create new user group |\n| GET | /v4/groups/{group_id}/users | Request group member users or / and users who can become a member |\n| POST | /v4/groups/{group_id}/users | Add group members |\n| DELETE | /v4/groups/{group_id}/users | Remove group members |\n| GET | /v4/groups/{group_id}/rooms | Request rooms granted to the group or / and rooms that can be granted |\n| GET | /v4/groups/{group_id}/roles | Request list of roles assigned to the group |\n| GET | /v4/groups/{group_id}/last_admin_rooms | Request rooms where the group is defined as last admin group |\n\n### Config\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/config/settings | Request system settings |\n| PUT | /v4/config/settings | Update system settings |\n| GET | /v4/config/info/s3_tags | Request list of configured S3 tags |\n| GET | /v4/config/info/product_packages | Request list of product packages |\n| GET | /v4/config/info/product_packages/current | Request list of currently enabled product packages |\n| GET | /v4/config/info/policies/virus_protection | Request virus protection |\n| GET | /v4/config/info/policies/passwords | Request password policies |\n| GET | /v4/config/info/policies/guest_users | Request guest users policies |\n| GET | /v4/config/info/policies/classifications | Request classification policies |\n| GET | /v4/config/info/policies/algorithms | Request algorithms |\n| GET | /v4/config/info/notifications/channels | Request list of notification channels |\n| GET | /v4/config/info/infrastructure | Request infrastructure properties |\n| GET | /v4/config/info/general | Request general settings |\n| GET | /v4/config/info/defaults | Request default values |\n\n### Auth\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/auth/reset_password/{token} | Validate information for password reset |\n| PUT | /v4/auth/reset_password/{token} | Reset password |\n| POST | /v4/auth/reset_password | Request password reset |\n| POST | /v4/auth/recover_username | Recover username |\n\n### Roles\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/roles/{role_id}/users | Request users with specific role |\n| POST | /v4/roles/{role_id}/users | Assign user(s) to the role |\n| DELETE | /v4/roles/{role_id}/users | Revoke granted role from user(s) |\n| GET | /v4/roles/{role_id}/groups | Request groups with specific role |\n| POST | /v4/roles/{role_id}/groups | Assign group(s) to the role |\n| DELETE | /v4/roles/{role_id}/groups | Revoke granted role from group(s) |\n| GET | /v4/roles | Request all roles with assigned rights |\n\n### Datev\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/datev/mst/{config_id}/taxyears | Request all addable Datev MST tax years |\n| POST | /v4/datev/mst/{config_id}/taxyears | Create new Datev MST tax year |\n| POST | /v4/datev/mst/{config_id}/sync | Execute Datev MST sync |\n| POST | /v4/datev/mst/authorization/start | Start Datev MST authorization |\n| POST | /v4/datev/mst/authorization/complete | Complete Datev MST authorization |\n| POST | /v4/datev/duo/{config_id}/sync | Execute Datev DUO sync |\n| POST | /v4/datev/duo/authorization/start | Start Datev DUO authorization |\n| POST | /v4/datev/duo/authorization/complete | Complete Datev DUO authorization |\n| GET | /v4/datev | Request Datev sync configuration for room |\n| GET | /v4/datev/mst | Request list of Datev MST sync configurations |\n| GET | /v4/datev/mst/{config_id} | Request Datev MST sync configuration |\n| DELETE | /v4/datev/mst/{config_id} | Remove Datev MST sync configuration |\n| GET | /v4/datev/mst/{config_id}/files | Request information about Datev MST sync files |\n| GET | /v4/datev/mst/{config_id}/files/{file_id} | Request information about a Datev MST sync file |\n| GET | /v4/datev/duo | Request list of Datev DUO sync configurations |\n| GET | /v4/datev/duo/{config_id} | Request Datev DUO sync configuration |\n| DELETE | /v4/datev/duo/{config_id} | Remove Datev DUO sync configuration |\n| GET | /v4/datev/duo/{config_id}/files | Request information about Datev DUO sync files |\n| GET | /v4/datev/duo/{config_id}/files/{file_id} | Request information about a Datev DUO sync file |\n\n### Resources\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/resources/users/{user_id}/avatar/{uuid} | Request user avatar |\n| GET | /v4/resources/user/notifications/scopes | Request list of subscription scopes |\n\n### Eventlog\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | /v4/eventlog/operations | Request allowed Log Operations |\n| GET | /v4/eventlog/events | Request system events |\n| GET | /v4/eventlog/audits/nodes | Request node assigned users with permissions |\n| GET | /v4/eventlog/audits/node_info | Request nodes |\n\n## Common Questions\nMatch user requests to endpoints in references/api-spec.lap. Key patterns:\n- \"Get download details?\" -> GET /v4/public/shares/downloads/{access_key}/{token}\n- \"Get user details?\" -> GET /v4/users/{user_id}\n- \"Update a user?\" -> PUT /v4/users/{user_id}\n- \"Delete a user?\" -> DELETE /v4/users/{user_id}\n- \"List all userAttributes?\" -> GET /v4/users/{user_id}/userAttributes\n- \"Create a userAttribute?\" -> POST /v4/users/{user_id}/userAttributes\n- \"List all upload_shares?\" -> GET /v4/user/subscriptions/upload_shares\n- \"List all nodes?\" -> GET /v4/user/subscriptions/nodes\n- \"List all download_shares?\" -> GET /v4/user/subscriptions/download_shares\n- \"List all profileAttributes?\" -> GET /v4/user/profileAttributes\n- \"Create a profileAttribute?\" -> POST /v4/user/profileAttributes\n- \"Update a config?\" -> PUT /v4/user/notifications/config/{id}\n- \"List all account?\" -> GET /v4/user/account\n- \"List all customer?\" -> GET /v4/user/account/customer\n- \"Update a upload?\" -> PUT /v4/uploads/{token}\n- \"Delete a upload?\" -> DELETE /v4/uploads/{token}\n- \"List all s3?\" -> GET /v4/system/config/storage/s3\n- \"Create a s3?\" -> POST /v4/system/config/storage/s3\n- \"List all syslog?\" -> GET /v4/system/config/settings/syslog\n- \"List all general?\" -> GET /v4/system/config/settings/general\n- \"List all eventlog?\" -> GET /v4/system/config/settings/eventlog\n- \"List all defaults?\" -> GET /v4/system/config/settings/defaults\n- \"List all auth?\" -> GET /v4/system/config/settings/auth\n- \"List all virus_protection?\" -> GET /v4/system/config/policies/virus_protection\n- \"List all passwords?\" -> GET /v4/system/config/policies/passwords\n- \"List all mfa?\" -> GET /v4/system/config/policies/mfa\n- \"Update a mfa?\" -> PUT /v4/system/config/policies/mfa/{user_type}\n- \"List all guest_users?\" -> GET /v4/system/config/policies/guest_users\n- \"List all classifications?\" -> GET /v4/system/config/policies/classifications\n- \"Get client details?\" -> GET /v4/system/config/oauth/clients/{client_id}\n- \"Update a client?\" -> PUT /v4/system/config/oauth/clients/{client_id}\n- \"Delete a client?\" -> DELETE /v4/system/config/oauth/clients/{client_id}\n- \"Get idp details?\" -> GET /v4/system/config/auth/openid/idps/{idp_id}\n- \"Update a idp?\" -> PUT /v4/system/config/auth/openid/idps/{idp_id}\n- \"Delete a idp?\" -> DELETE /v4/system/config/auth/openid/idps/{idp_id}\n- \"Get ad details?\" -> GET /v4/system/config/auth/ads/{ad_id}\n- \"Update a ad?\" -> PUT /v4/system/config/auth/ads/{ad_id}\n- \"Delete a ad?\" -> DELETE /v4/system/config/auth/ads/{ad_id}\n- \"List all uploads?\" -> GET /v4/shares/uploads\n- \"Create a upload?\" -> POST /v4/shares/uploads\n- \"Get upload details?\" -> GET /v4/shares/uploads/{share_id}\n- \"List all downloads?\" -> GET /v4/shares/downloads\n- \"Create a download?\" -> POST /v4/shares/downloads\n- \"Update a download?\" -> PUT /v4/shares/downloads/{share_id}\n- \"Delete a download?\" -> DELETE /v4/shares/downloads/{share_id}\n- \"List all settings?\" -> GET /v4/settings\n- \"Get webhook details?\" -> GET /v4/settings/webhooks/{webhook_id}\n- \"Update a webhook?\" -> PUT /v4/settings/webhooks/{webhook_id}\n- \"Delete a webhook?\" -> DELETE /v4/settings/webhooks/{webhook_id}\n- \"List all channels?\" -> GET /v4/settings/notifications/channels\n- \"Get customer details?\" -> GET /v4/provisioning/customers/{customer_id}\n- \"Update a customer?\" -> PUT /v4/provisioning/customers/{customer_id}\n- \"Delete a customer?\" -> DELETE /v4/provisioning/customers/{customer_id}\n- \"List all customerAttributes?\" -> GET /v4/provisioning/customers/{customer_id}/customerAttributes\n- \"Create a customerAttribute?\" -> POST /v4/provisioning/customers/{customer_id}/customerAttributes\n- \"List all node_attributes?\" -> GET /v4/nodes/{node_id}/node_attributes\n- \"Update a room?\" -> PUT /v4/nodes/rooms/{room_id}\n- \"List all webhooks?\" -> GET /v4/nodes/rooms/{room_id}/webhooks\n- \"List all users?\" -> GET /v4/nodes/rooms/{room_id}/users\n- \"List all policies?\" -> GET /v4/nodes/rooms/{room_id}/policies\n- \"List all groups?\" -> GET /v4/nodes/rooms/{room_id}/groups\n- \"List all pending?\" -> GET /v4/nodes/rooms/pending\n- \"Update a folder?\" -> PUT /v4/nodes/folders/{folder_id}\n- \"Update a file?\" -> PUT /v4/nodes/files/{file_id}\n- \"Update a comment?\" -> PUT /v4/nodes/comments/{comment_id}\n- \"Delete a comment?\" -> DELETE /v4/nodes/comments/{comment_id}\n- \"Get group details?\" -> GET /v4/groups/{group_id}\n- \"Update a group?\" -> PUT /v4/groups/{group_id}\n- \"Delete a group?\" -> DELETE /v4/groups/{group_id}\n- \"Get reset_password details?\" -> GET /v4/auth/reset_password/{token}\n- \"Update a reset_password?\" -> PUT /v4/auth/reset_password/{token}\n- \"Create a user?\" -> POST /v4/users\n- \"Create a emergency_code?\" -> POST /v4/users/{user_id}/mfa/emergency_code\n- \"Delete a upload_share?\" -> DELETE /v4/user/subscriptions/upload_shares/{share_id}\n- \"Delete a node?\" -> DELETE /v4/user/subscriptions/nodes/{node_id}\n- \"Delete a download_share?\" -> DELETE /v4/user/subscriptions/download_shares/{share_id}\n- \"List all totp?\" -> GET /v4/user/account/mfa/totp\n- \"Create a totp?\" -> POST /v4/user/account/mfa/totp\n- \"List all keypairs?\" -> GET /v4/user/account/keypairs\n- \"Create a keypair?\" -> POST /v4/user/account/keypairs\n- \"List all keypair?\" -> GET /v4/user/account/keypair\n- \"List all avatar?\" -> GET /v4/user/account/avatar\n- \"Create a avatar?\" -> POST /v4/user/account/avatar\n- \"List all tags?\" -> GET /v4/system/config/storage/s3/tags\n- \"Create a tag?\" -> POST /v4/system/config/storage/s3/tags\n- \"Create a enforce_change?\" -> POST /v4/system/config/policies/passwords/enforce_change\n- \"List all clients?\" -> GET /v4/system/config/oauth/clients\n- \"Create a client?\" -> POST /v4/system/config/oauth/clients\n- \"List all idps?\" -> GET /v4/system/config/auth/openid/idps\n- \"Create a idp?\" -> POST /v4/system/config/auth/openid/idps\n- \"List all ads?\" -> GET /v4/system/config/auth/ads\n- \"Create a ad?\" -> POST /v4/system/config/auth/ads\n- \"Create a email?\" -> POST /v4/shares/uploads/{share_id}/email\n- \"Create a webhook?\" -> POST /v4/settings/webhooks\n- \"Create a reset_lifetime?\" -> POST /v4/settings/webhooks/{webhook_id}/reset_lifetime\n- \"Create a group?\" -> POST /v4/roles/{role_id}/groups\n- \"Create a s3_url?\" -> POST /v4/public/shares/uploads/{access_key}/{upload_id}/s3_urls\n- \"List all customers?\" -> GET /v4/provisioning/customers\n- \"Create a customer?\" -> POST /v4/provisioning/customers\n- \"Create a move_to?\" -> POST /v4/nodes/{node_id}/move_to\n- \"Create a favorite?\" -> POST /v4/nodes/{node_id}/favorite\n- \"Create a copy_to?\" -> POST /v4/nodes/{node_id}/copy_to\n- \"List all comments?\" -> GET /v4/nodes/{node_id}/comments\n- \"Create a comment?\" -> POST /v4/nodes/{node_id}/comments\n- \"Create a zip?\" -> POST /v4/nodes/zip\n- \"Create a room?\" -> POST /v4/nodes/rooms\n- \"List all s3_tags?\" -> GET /v4/nodes/rooms/{room_id}/s3_tags\n- \"Create a s3_tag?\" -> POST /v4/nodes/rooms/{room_id}/s3_tags\n- \"Create a folder?\" -> POST /v4/nodes/folders\n- \"Create a key?\" -> POST /v4/nodes/files/keys\n- \"Create a generate_verdict_info?\" -> POST /v4/nodes/files/generate_verdict_info\n- \"Create a restore?\" -> POST /v4/nodes/deleted_nodes/actions/restore\n- \"List all taxyears?\" -> GET /v4/datev/mst/{config_id}/taxyears\n- \"Create a taxyear?\" -> POST /v4/datev/mst/{config_id}/taxyears\n- \"Create a sync?\" -> POST /v4/datev/mst/{config_id}/sync\n- \"Create a start?\" -> POST /v4/datev/mst/authorization/start\n- \"Create a complete?\" -> POST /v4/datev/mst/authorization/complete\n- \"Create a reset_password?\" -> POST /v4/auth/reset_password\n- \"Create a recover_username?\" -> POST /v4/auth/recover_username\n- \"List all rooms?\" -> GET /v4/users/{user_id}/rooms\n- \"List all roles?\" -> GET /v4/users/{user_id}/roles\n- \"List all last_admin_rooms?\" -> GET /v4/users/{user_id}/last_admin_rooms\n- \"List all ping?\" -> GET /v4/user/ping\n- \"List all authorizations?\" -> GET /v4/user/oauth/authorizations\n- \"List all approvals?\" -> GET /v4/user/oauth/approvals\n- \"List all config?\" -> GET /v4/user/notifications/config\n- \"Get tag details?\" -> GET /v4/system/config/storage/s3/tags/{id}\n- \"Delete a tag?\" -> DELETE /v4/system/config/storage/s3/tags/{id}\n- \"List all infrastructure?\" -> GET /v4/system/config/settings/infrastructure\n- \"Get password details?\" -> GET /v4/system/config/policies/passwords/{password_type}\n- \"List all qr?\" -> GET /v4/shares/uploads/{share_id}/qr\n- \"List all event_types?\" -> GET /v4/settings/webhooks/event_types\n- \"Get avatar details?\" -> GET /v4/resources/users/{user_id}/avatar/{uuid}\n- \"List all scopes?\" -> GET /v4/resources/user/notifications/scopes\n- \"List all time?\" -> GET /v4/public/time\n- \"List all info?\" -> GET /v4/public/system/info\n- \"List all openid?\" -> GET /v4/public/system/info/auth/openid\n- \"List all ad?\" -> GET /v4/public/system/info/auth/ad\n- \"List all version?\" -> GET /v4/public/software/version\n- \"List all third_party_dependencies?\" -> GET /v4/public/software/third_party_dependencies\n- \"Get node details?\" -> GET /v4/nodes/{node_id}\n- \"List all parents?\" -> GET /v4/nodes/{node_id}/parents\n- \"List all deleted_nodes?\" -> GET /v4/nodes/{node_id}/deleted_nodes\n- \"List all versions?\" -> GET /v4/nodes/{node_id}/deleted_nodes/versions\n- \"List all search?\" -> GET /v4/nodes/search\n- \"List all events?\" -> GET /v4/nodes/rooms/{room_id}/events\n- \"List all missingFileKeys?\" -> GET /v4/nodes/missingFileKeys\n- \"List all user_file_key?\" -> GET /v4/nodes/files/{file_id}/user_file_key\n- \"List all data_space_file_key?\" -> GET /v4/nodes/files/{file_id}/data_space_file_key\n- \"List all data_room_file_key?\" -> GET /v4/nodes/files/{file_id}/data_room_file_key\n- \"Get version details?\" -> GET /v4/nodes/files/versions/{reference_id}\n- \"Get deleted_node details?\" -> GET /v4/nodes/deleted_nodes/{deleted_node_id}\n- \"List all operations?\" -> GET /v4/eventlog/operations\n- \"List all node_info?\" -> GET /v4/eventlog/audits/node_info\n- \"Get zip details?\" -> GET /v4/downloads/zip/{token}\n- \"List all datev?\" -> GET /v4/datev\n- \"List all mst?\" -> GET /v4/datev/mst\n- \"Get mst details?\" -> GET /v4/datev/mst/{config_id}\n- \"Delete a mst?\" -> DELETE /v4/datev/mst/{config_id}\n- \"List all files?\" -> GET /v4/datev/mst/{config_id}/files\n- \"Get file details?\" -> GET /v4/datev/mst/{config_id}/files/{file_id}\n- \"List all duo?\" -> GET /v4/datev/duo\n- \"Get duo details?\" -> GET /v4/datev/duo/{config_id}\n- \"Delete a duo?\" -> DELETE /v4/datev/duo/{config_id}\n- \"List all product_packages?\" -> GET /v4/config/info/product_packages\n- \"List all current?\" -> GET /v4/config/info/product_packages/current\n- \"List all algorithms?\" -> GET /v4/config/info/policies/algorithms\n- \"Delete a userAttribute?\" -> DELETE /v4/users/{user_id}/userAttributes/{key}\n- \"Delete a profileAttribute?\" -> DELETE /v4/user/profileAttributes/{key}\n- \"Delete a authorization?\" -> DELETE /v4/user/oauth/authorizations/{client_id}\n- \"Delete a approval?\" -> DELETE /v4/user/oauth/approvals/{client_id}\n- \"Delete a totp?\" -> DELETE /v4/user/account/mfa/totp/{id}\n- \"Delete a customerAttribute?\" -> DELETE /v4/provisioning/customers/{customer_id}/customerAttributes/{key}\n- \"Delete a node_attribute?\" -> DELETE /v4/nodes/{node_id}/node_attributes/{key}\n- \"Delete a malicious_file?\" -> DELETE /v4/nodes/malicious_files/{malicious_file_id}\n- \"How to authenticate?\" -> See Auth section above\n\n## Response Tips\n- Check response schemas in references/api-spec.lap for field details\n- Paginated endpoints accept limit/offset or cursor parameters\n- Create/update endpoints return the modified resource on success\n- Error responses include status codes and descriptions in the spec\n\n## References\n- Full spec: See references/api-spec.lap for complete endpoint details, parameter tables, and response schemas\n\n> Generated from the official API spec by [LAP](https://lap.sh)\n","references/api-spec.lap":"@lap v0.3\n# Machine-readable API spec. Each @endpoint block is one API call.\n@api DRACOON API\n@base /api\n@version 5.49.0\n@auth OAuth2\n@endpoints 314\n@hint download_for_search\n@toc public(19), downloads(4), users(15), user(43), uploads(3), system(47), shares(18), settings(16), provisioning(17), nodes(71), groups(11), config(14), auth(4), roles(7), datev(19), resources(2), eventlog(4)\n\n@group public\n@endpoint GET /v4/public/shares/downloads/{access_key}/{token}\n@desc Download file with token\n@required {access_key: str # Access key, token: str # Download token}\n@optional {Range: str # Range   e.g. `bytes=0-999`, generic_mimetype: bool # Always return `application/octet-stream` instead of specific mimetype, inline: bool # Use Content-Disposition: `inline` instead of `attachment`}\n@returns(200) OK\n@returns(206) Partial Content\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable, 416: Range Not Satisfiable}\n\n@endpoint HEAD /v4/public/shares/downloads/{access_key}/{token}\n@desc Download file with token\n@required {access_key: str # Access key, token: str # Download token}\n@optional {Range: str # Range   e.g. `bytes=0-999`, generic_mimetype: bool # Always return `application/octet-stream` instead of specific mimetype, inline: bool # Use Content-Disposition: `inline` instead of `attachment`}\n@returns(200) OK\n@returns(206) Partial Content\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable, 416: Range Not Satisfiable}\n\n@endgroup\n\n@group downloads\n@endpoint GET /v4/downloads/{token}\n@desc Download file\n@required {token: str # Download token}\n@optional {Range: str # Range   e.g. `bytes=0-999`, generic_mimetype: bool # Always return `application/octet-stream` instead of specific mimetype, inline: bool # Use Content-Disposition: `inline` instead of `attachment`}\n@returns(200) OK\n@returns(206) Partial Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 416: Range Not Satisfiable}\n\n@endpoint HEAD /v4/downloads/{token}\n@desc Download file\n@required {token: str # Download token}\n@optional {Range: str # Range   e.g. `bytes=0-999`, generic_mimetype: bool # Always return `application/octet-stream` instead of specific mimetype, inline: bool # Use Content-Disposition: `inline` instead of `attachment`}\n@returns(200) OK\n@returns(206) Partial Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 416: Range Not Satisfiable}\n\n@endgroup\n\n@group users\n@endpoint GET /v4/users/{user_id}\n@desc Request user\n@required {user_id: int(int64) # User ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), effective_roles: bool # Filter users with DIRECT or DIRECT **AND** EFFECTIVE roles.  * `false`: DIRECT roles  * `true`: DIRECT **AND** EFFECTIVE roles  DIRECT means: e.g. user gets role **directly** granted from someone with _grant permission_ right.  EFFECTIVE means: e.g. user gets role through **group membership**.}\n@returns(200) {id: int(int64), userName: str, firstName: str, lastName: str, isLocked: bool, avatarUuid: str, authData: map{method: str, login: str, password: str, mustChangePassword: bool, adConfigId: int(int32), oidConfigId: int(int32)}, email: str, phone: str, expireAt: str(date-time), hasManageableRooms: bool, isEncryptionEnabled: bool, lastLoginSuccessAt: str(date-time), homeRoomId: int(int64), publicKeyContainer: map{version: str, publicKey: str, createdAt: str(date-time), createdBy: int(int64)}, userRoles: map{items: [map]}, isMfaEnabled: bool, isMfaEnforced: bool, userAttributes: map{items: [map]}, title: str, lockStatus: int(int32), login: str, authMethods: [map], gender: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/users/{user_id}\n@desc Update user's metadata\n@required {user_id: int(int64) # User ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), firstName: str # User first name, lastName: str # User last name, userName: str # Username, email: str # Email, isLocked: bool=false # User is locked:  * `false` - unlocked  * `true` - locked    User is locked and can not login anymore., phone: str # Phone number, receiverLanguage: str # IETF language tag, expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information, authData: map{method: str, login: str, adConfigId: int(int32), oidConfigId: int(int32)} # User Authentication Data Update Request, mfaConfig: map{mfaEnforced: bool} # Multi-factor authentication configuration, title: str # Job title, lockStatus: int(int32) # User lock status:  * `0` - locked  * `1` - Web access allowed  * `2` - Web and mobile access allowed    Please use `isLocked` instead., gender: str=n # Gender  Do NOT use `gender`! It will be ignored., authMethods: [map{authId!: str, isEnabled!: bool, options: [map]}] # Authentication methods:  * `sql`  * `active_directory`  * `openid`  use `authData` instead}\n@returns(200) {id: int(int64), userName: str, firstName: str, lastName: str, isLocked: bool, avatarUuid: str, authData: map{method: str, login: str, password: str, mustChangePassword: bool, adConfigId: int(int32), oidConfigId: int(int32)}, email: str, phone: str, expireAt: str(date-time), hasManageableRooms: bool, isEncryptionEnabled: bool, lastLoginSuccessAt: str(date-time), homeRoomId: int(int64), publicKeyContainer: map{version: str, publicKey: str, createdAt: str(date-time), createdBy: int(int64)}, userRoles: map{items: [map]}, isMfaEnabled: bool, isMfaEnforced: bool, userAttributes: map{items: [map]}, title: str, lockStatus: int(int32), login: str, authMethods: [map], gender: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint DELETE /v4/users/{user_id}\n@desc Remove user\n@required {user_id: int(int64) # User ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/users/{user_id}/userAttributes\n@desc Request custom user attributes\n@required {user_id: int(int64) # User ID}\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/users/{user_id}/userAttributes\n@desc Add or edit custom user attributes\n@required {user_id: int(int64) # User ID, items: [map{key!: str, value!: str}] # List of key-value pairs}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/users/{user_id}/userAttributes\n@desc Set custom user attributes\n@required {user_id: int(int64) # User ID, items: [map{key!: str, value!: str}] # List of key-value pairs}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(201) {id: int(int64), userName: str, firstName: str, lastName: str, isLocked: bool, avatarUuid: str, authData: map{method: str, login: str, password: str, mustChangePassword: bool, adConfigId: int(int32), oidConfigId: int(int32)}, email: str, phone: str, expireAt: str(date-time), hasManageableRooms: bool, isEncryptionEnabled: bool, lastLoginSuccessAt: str(date-time), homeRoomId: int(int64), publicKeyContainer: map{version: str, publicKey: str, createdAt: str(date-time), createdBy: int(int64)}, userRoles: map{items: [map]}, isMfaEnabled: bool, isMfaEnforced: bool, userAttributes: map{items: [map]}, title: str, lockStatus: int(int32), login: str, authMethods: [map], gender: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group user\n@endpoint GET /v4/user/subscriptions/upload_shares\n@desc List Upload Share subscriptions\n@optional {filter: str # Filter string, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., offset: int(int32) # Range offset, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/user/subscriptions/upload_shares\n@desc Subscribe or Unsubscribe a List of Upload Shares for notifications\n@required {isSubscribed: bool # Creates or deletes a subscription on each item in an array of objects., objectIds: [int(int64)] # List of ids}\n@returns(201) Created\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/user/subscriptions/nodes\n@desc List node subscriptions\n@optional {filter: str # Filter string, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., offset: int(int32) # Range offset, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/user/subscriptions/nodes\n@desc Subscribe or Unsubscribe a List of nodes for notifications\n@required {isSubscribed: bool # Creates or deletes a subscription on each item in an array of objects., objectIds: [int(int64)] # List of ids}\n@returns(201) Created\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/user/subscriptions/download_shares\n@desc List Download Share subscriptions\n@optional {filter: str # Filter string, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., offset: int(int32) # Range offset, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/user/subscriptions/download_shares\n@desc Subscribe or Unsubscribe a List of Download Shares for notifications\n@required {isSubscribed: bool # Creates or deletes a subscription on each item in an array of objects., objectIds: [int(int64)] # List of ids}\n@returns(201) Created\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/user/profileAttributes\n@desc Request user profile attributes\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/user/profileAttributes\n@desc Add or edit user profile attributes\n@required {items: [map{key!: str, value!: str}] # List of key-value pairs}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/user/profileAttributes\n@desc Set user profile attributes\n@required {items: [map{key!: str, value!: str}] # List of key-value pairs}\n@returns(201) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # Created\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/user/notifications/config/{id}\n@desc Update notification configuration\n@required {id: int(int64) # Unique identifier for a notification configuration, channelIds: [int(int32)] # List of notification channel IDs.  Leave empty to disable notifications.}\n@returns(200) {id: int(int64), scopeId: int(int32), eventTypeName: str, channelIds: [int(int32)]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/user/account\n@desc Request user account information\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), more_info: bool # Get more info for this user  e.g. list of user groups}\n@returns(200) {id: int(int64), userName: str, firstName: str, lastName: str, isLocked: bool, hasManageableRooms: bool, userRoles: map{items: [map]}, language: str, authData: map{method: str, login: str, password: str, mustChangePassword: bool, adConfigId: int(int32), oidConfigId: int(int32)}, mustSetEmail: bool, needsToAcceptEULA: bool, expireAt: str(date-time), isEncryptionEnabled: bool, lastLoginSuccessAt: str(date-time), lastLoginFailAt: str(date-time), email: str, phone: str, homeRoomId: int(int64), createdAt: str(date-time), automaticallySubscribeDatarooms: bool, userGroups: [map], userAttributes: map{items: [map]}, title: str, lastLoginSuccessIp: str, lastLoginFailIp: str, gender: str, needsToChangeUserName: bool, authMethods: [map], login: str, lockStatus: int(int32), needsToChangePassword: bool} # OK\n@errors {401: Unauthorized, 406: Not Acceptable}\n\n@endpoint PUT /v4/user/account\n@desc Update user account\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), userName: str # Username, acceptEULA: bool # Accept EULA  Present, if EULA is system global active.  cf. `GET system/config/settings/general` - `eulaEnabled`  If accepted can not be undone., firstName: str # User first name, lastName: str # User last name, email: str # Email, phone: str # Phone number, language: str # IETF language tag, automaticallySubscribeDatarooms: bool # Automatically subscribe datarooms when getting permissions, title: str # Job title, login: str # User login name, gender: str=n # Gender  Do NOT use `gender`! It will be ignored.}\n@returns(200) {id: int(int64), userName: str, firstName: str, lastName: str, isLocked: bool, hasManageableRooms: bool, userRoles: map{items: [map]}, language: str, authData: map{method: str, login: str, password: str, mustChangePassword: bool, adConfigId: int(int32), oidConfigId: int(int32)}, mustSetEmail: bool, needsToAcceptEULA: bool, expireAt: str(date-time), isEncryptionEnabled: bool, lastLoginSuccessAt: str(date-time), lastLoginFailAt: str(date-time), email: str, phone: str, homeRoomId: int(int64), createdAt: str(date-time), automaticallySubscribeDatarooms: bool, userGroups: [map], userAttributes: map{items: [map]}, title: str, lastLoginSuccessIp: str, lastLoginFailIp: str, gender: str, needsToChangeUserName: bool, authMethods: [map], login: str, lockStatus: int(int32), needsToChangePassword: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint PUT /v4/user/account/password\n@desc Change user's password\n@required {oldPassword: str # Old password, newPassword: str # New password}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable}\n\n@endpoint GET /v4/user/account/customer\n@desc Request customer information for user\n@returns(200) {id: int(int64), name: str, isProviderCustomer: bool, spaceLimit: int(int64), spaceUsed: int(int64), accountsLimit: int(int32), accountsUsed: int(int32), cntInternalUser: int(int32), cntGuestUser: int(int32), customerEncryptionEnabled: bool} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/user/account/customer\n@desc Activate client-side encryption for customer\n@required {enableCustomerEncryption: bool # Set `true` to enable encryption for this customer, dataSpaceRescueKey: map{privateKeyContainer!: map, publicKeyContainer!: map} # Key pair container}\n@returns(200) {id: int(int64), name: str, isProviderCustomer: bool, spaceLimit: int(int64), spaceUsed: int(int64), accountsLimit: int(int32), accountsUsed: int(int32), cntInternalUser: int(int32), cntGuestUser: int(int32), customerEncryptionEnabled: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group uploads\n@endpoint PUT /v4/uploads/{token}\n@desc Complete file upload\n@required {token: str # Upload token}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), resolutionStrategy: str(autorename/overwrite/fail)=autorename # Node conflict resolution strategy:  * `autorename`  * `overwrite`  * `fail`, keepShareLinks: bool=false # Preserve Download Share Links and point them to the new node., fileName: str # New file name to store with, fileKey: map{key!: str, iv!: str, version!: str, tag!: str} # File key information, userFileKeyList: map{items: [map]} # Mandatory for encrypted shares}\n@returns(201) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # Created\n@returns(202) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # Accepted\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 507: Insufficient Storage}\n\n@endpoint POST /v4/uploads/{token}\n@desc Upload file\n@required {token: str # Upload token}\n@optional {Content-Range: str # Content-Range   e.g. `bytes 0-999/3980`}\n@returns(200) {size: int(int64), hash: str} # OK\n@returns(201) {size: int(int64), hash: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 507: Insufficient Storage}\n\n@endpoint DELETE /v4/uploads/{token}\n@desc Cancel file upload\n@required {token: str # Upload token}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 507: Insufficient Storage}\n\n@endgroup\n\n@group system\n@endpoint GET /v4/system/config/storage/s3\n@desc Request S3 storage configuration\n@returns(200) {bucketUrl: str, accessKeyDefined: bool, secretKeyDefined: bool, region: str} # OK\n@errors {401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/storage/s3\n@desc Update S3 storage configuration\n@optional {bucketUrl: str # S3 object storage bucket URL, accessKey: str # Access Key ID, secretKey: str # Secret Access Key, region: str # S3 region}\n@returns(200) {bucketUrl: str, accessKeyDefined: bool, secretKeyDefined: bool, region: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/system/config/storage/s3\n@desc Create S3 storage configuration\n@required {accessKey: str # Access Key ID, secretKey: str # Secret Access Key}\n@optional {bucketUrl: str # S3 object storage bucket URL, region: str # S3 region}\n@returns(201) {bucketUrl: str, accessKeyDefined: bool, secretKeyDefined: bool, region: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/settings/syslog\n@desc Request syslog settings\n@returns(200) {enabled: bool, host: str, port: int(int32), protocol: str, logIpEnabled: bool} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/settings/syslog\n@desc Update syslog settings\n@optional {enabled: bool # Is syslog enabled?, host: str # Syslog server (IP or FQDN), port: int(int32) # Syslog server port, protocol: str(TCP/UDP) # Protocol to connect to syslog server, logIpEnabled: bool # Determines whether user’s IP address is logged.}\n@returns(200) {enabled: bool, host: str, port: int(int32), protocol: str, logIpEnabled: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/settings/general\n@desc Request general settings\n@returns(200) {sharePasswordSmsEnabled: bool, cryptoEnabled: bool, emailNotificationButtonEnabled: bool, eulaEnabled: bool, useS3Storage: bool, s3TagsEnabled: bool, hideLoginInputFields: bool, authTokenRestrictions: map{restrictionEnabled: bool, accessTokenValidity: int(int32), refreshTokenValidity: int(int32)}, mediaServerEnabled: bool, weakPasswordEnabled: bool} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/settings/general\n@desc Update general settings\n@optional {sharePasswordSmsEnabled: bool # Allow sending of share passwords via SMS, cryptoEnabled: bool # Activation status of client-side encryption.  Can only be enabled once; disabling is not possible., emailNotificationButtonEnabled: bool # Enable email notification button, eulaEnabled: bool # Each user has to confirm the EULA at first login., s3TagsEnabled: bool # Defines if S3 tags are enabled, authTokenRestrictions: map{overwriteEnabled!: bool, accessTokenValidity: int(int32), refreshTokenValidity: int(int32)} # Request model for updating auth token settings, hideLoginInputFields: bool # Defines if login fields should be hidden, mediaServerEnabled: bool # Determines if the media server is enabled, weakPasswordEnabled: bool # Allow weak password  * A weak password has to fulfill the following criteria:     * is at least 8 characters long     * contains letters and numbers  * A strong password has to fulfill the following criteria in addition:     * contains at least one special character     * contains upper and lower case characters  Please use `PUT /system/config/policies/passwords` API to change configured password policies.}\n@returns(200) {sharePasswordSmsEnabled: bool, cryptoEnabled: bool, emailNotificationButtonEnabled: bool, eulaEnabled: bool, useS3Storage: bool, s3TagsEnabled: bool, hideLoginInputFields: bool, authTokenRestrictions: map{restrictionEnabled: bool, accessTokenValidity: int(int32), refreshTokenValidity: int(int32)}, mediaServerEnabled: bool, weakPasswordEnabled: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/settings/eventlog\n@desc Request eventlog settings\n@returns(200) {enabled: bool, retentionPeriod: int(int32), logIpEnabled: bool} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/settings/eventlog\n@desc Update eventlog settings\n@optional {enabled: bool # Is eventlog enabled?, retentionPeriod: int(int32) # Retention period (in days) of event log entries.  After that period, all entries are deleted.  Recommended value: 7, logIpEnabled: bool # Determines whether user’s IP address is logged.}\n@returns(200) {enabled: bool, retentionPeriod: int(int32), logIpEnabled: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/settings/defaults\n@desc Request system defaults\n@returns(200) {languageDefault: str, downloadShareDefaultExpirationPeriod: int(int32), uploadShareDefaultExpirationPeriod: int(int32), fileDefaultExpirationPeriod: int(int32), globalRecycleBinRetentionPeriod: int(int32), globalRecycleBinRetentionPeriodLegacy: int(int32), nonmemberViewerDefault: bool, hideLoginInputFields: bool} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/settings/defaults\n@desc Update system defaults\n@optional {languageDefault: str # Define which language should be default., downloadShareDefaultExpirationPeriod: int(int32) # Default expiration period for Download Shares in days., uploadShareDefaultExpirationPeriod: int(int32) # Default expiration period for Upload Shares in days., fileDefaultExpirationPeriod: int(int32) # Default expiration period for all uploaded files in days., globalRecycleBinRetentionPeriod: int(int32) # Global recycle bin retention period in days., nonmemberViewerDefault: bool # Defines if new users get the role Non Member Viewer by default}\n@returns(200) {languageDefault: str, downloadShareDefaultExpirationPeriod: int(int32), uploadShareDefaultExpirationPeriod: int(int32), fileDefaultExpirationPeriod: int(int32), globalRecycleBinRetentionPeriod: int(int32), globalRecycleBinRetentionPeriodLegacy: int(int32), nonmemberViewerDefault: bool, hideLoginInputFields: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/settings/auth\n@desc Request authentication settings\n@returns(200) {authMethods: [map]} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/settings/auth\n@desc Update authentication settings\n@required {authMethods: [map{name!: str, isEnabled!: bool, priority!: int(int32)}] # List of authentication methods}\n@returns(200) {authMethods: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/policies/virus_protection\n@desc Request virus protection policies\n@returns(200) {isVirusProtectionEnabled: bool} # OK\n@errors {401: Unauthorized, 402: Payment Required, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/policies/virus_protection\n@desc Change virus protection policies\n@optional {isVirusProtectionEnabled: bool # Determines whether virus protection is enabled for room. To be set by room admins}\n@returns(200) {isVirusProtectionEnabled: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/policies/passwords\n@desc Request password policies\n@returns(200) {loginPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectDictionaryWords: bool, rejectUserInfo: bool, rejectKeyboardPatterns: bool, numberOfArchivedPasswords: int(int32), passwordExpiration: map{enabled: bool, maxPasswordAge: int(int32)}, userLockout: map{enabled: bool, maxNumberOfLoginFailures: int(int32), lockoutPeriod: int(int32)}, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}, sharesPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectDictionaryWords: bool, rejectUserInfo: bool, rejectKeyboardPatterns: bool, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}, encryptionPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectUserInfo: bool, rejectKeyboardPatterns: bool, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/policies/passwords\n@desc Change password policies\n@optional {loginPasswordPolicies: map{characterRules: map, minLength: int(int32), rejectDictionaryWords: bool, rejectUserInfo: bool, rejectKeyboardPatterns: bool, numberOfArchivedPasswords: int(int32), passwordExpiration: map, userLockout: map} # Request model for updating login password policies, sharesPasswordPolicies: map{characterRules: map, minLength: int(int32), rejectDictionaryWords: bool, rejectUserInfo: bool, rejectKeyboardPatterns: bool} # Request model for updating shares password policies, encryptionPasswordPolicies: map{characterRules: map, minLength: int(int32), rejectUserInfo: bool, rejectKeyboardPatterns: bool} # Request model for updating encryption password policies}\n@returns(200) {loginPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectDictionaryWords: bool, rejectUserInfo: bool, rejectKeyboardPatterns: bool, numberOfArchivedPasswords: int(int32), passwordExpiration: map{enabled: bool, maxPasswordAge: int(int32)}, userLockout: map{enabled: bool, maxNumberOfLoginFailures: int(int32), lockoutPeriod: int(int32)}, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}, sharesPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectDictionaryWords: bool, rejectUserInfo: bool, rejectKeyboardPatterns: bool, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}, encryptionPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectUserInfo: bool, rejectKeyboardPatterns: bool, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/policies/mfa\n@desc Request MFA policies\n@returns(200) {isMfaEnforced: bool, enforcedUserTypes: [str]} # OK\n@errors {401: Unauthorized, 402: Payment Required, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/policies/mfa\n@desc Change MFA policies\n@required {isMfaEnforced: bool # Determines whether multi-factor authentication is enforced}\n@returns(200) {isMfaEnforced: bool, enforcedUserTypes: [str]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/policies/mfa/{user_type}\n@desc Change MFA policies for internal/external users\n@required {user_type: str(guest/internal) # User type, isMfaEnforced: bool # Determines whether multi-factor authentication is enforced}\n@returns(200) {isMfaEnforced: bool, enforcedUserTypes: [str]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/policies/guest_users\n@desc Request guest user policies\n@returns(200) {isInviteUsersEnabled: bool} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/policies/guest_users\n@desc Change guest user policies\n@required {isInviteUsersEnabled: bool # Determines whether the invite of users to rooms is enabled.}\n@returns(200) {isInviteUsersEnabled: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/policies/classifications\n@desc Request classification policies\n@returns(200) {shareClassificationPolicies: map{classificationRequiresSharePassword: int(int32)}} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/policies/classifications\n@desc Change classification policies\n@optional {shareClassificationPolicies: map{classificationRequiresSharePassword: int(int32)} # Shares classification policies}\n@returns(200) {shareClassificationPolicies: map{classificationRequiresSharePassword: int(int32)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/oauth/clients/{client_id}\n@desc Request OAuth client\n@required {client_id: str # OAuth client ID}\n@returns(200) {clientId: str, clientSecret: str, clientName: str, clientType: str, isStandard: bool, isExternal: bool, isEnabled: bool, grantTypes: [str], redirectUris: [str], accessTokenValidity: int(int32), refreshTokenValidity: int(int32), approvalValidity: int(int32)} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/oauth/clients/{client_id}\n@desc Update OAuth client\n@required {client_id: str # OAuth client ID, grantTypes: [str](authorization_code/client_credentials/implicit/password/refresh_token) # Authorized grant types  * `authorization_code`  * `implicit`  * `password`  * `client_credentials`  * `refresh_token`    cf. [RFC 6749](https://tools.ietf.org/html/rfc6749)}\n@optional {clientSecret: str # Secret, which client uses at authentication., clientName: str # Name, which is shown at the client configuration and authorization., clientType: str(confidential/public) # Determines whether client is a confidential or public client., isEnabled: bool # Determines whether client is enabled., redirectUris: [str] # URIs, to which a user is redirected after authorization., accessTokenValidity: int(int32) # Validity of the access token in seconds., refreshTokenValidity: int(int32) # Validity of the refresh token in seconds., approvalValidity: int(int32) # Validity of the approval interval in seconds.}\n@returns(200) {clientId: str, clientSecret: str, clientName: str, clientType: str, isStandard: bool, isExternal: bool, isEnabled: bool, grantTypes: [str], redirectUris: [str], accessTokenValidity: int(int32), refreshTokenValidity: int(int32), approvalValidity: int(int32)} # OK\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/system/config/oauth/clients/{client_id}\n@desc Remove OAuth client\n@required {client_id: str # OAuth client ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/auth/openid/idps/{idp_id}\n@desc Request OpenID Connect IDP configuration\n@required {idp_id: int(int32) # OpenID Connect IDP configuration ID}\n@returns(200) {id: int(int32), name: str, isStandard: bool, isEnabled: bool, issuer: str, authorizationEndPointUrl: str, tokenEndPointUrl: str, userInfoEndPointUrl: str, jwksEndPointUrl: str, clientId: str, clientSecret: str, flow: str, scopes: [str], redirectUris: [str], pkceEnabled: bool, pkceChallengeMethod: str, mappingClaim: str, fallbackMappingClaim: str, userInfoSource: str, userImportEnabled: bool, userImportGroup: int(int64), userUpdateEnabled: bool, userManagementUrl: str, useAuthProxyEnabled: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/auth/openid/idps/{idp_id}\n@desc Update OpenID Connect IDP configuration\n@required {idp_id: int(int32) # OpenID Connect IDP configuration ID}\n@optional {name: str # Name of the IDP, isEnabled: bool # Determines whether client is enabled., issuer: str # Issuer identifier of the IDP  The value is a case sensitive URL., authorizationEndPointUrl: str # URL of the authorization endpoint, tokenEndPointUrl: str # URL of the token endpoint, userInfoEndPointUrl: str # URL of the user info endpoint, jwksEndPointUrl: str # URL of the JWKS endpoint, clientId: str # ID of the OpenID client, clientSecret: str # Secret, which client uses at authentication., flow: str(authorization_code/hybrid) # Flow, which is used at authentication, scopes: [str] # List of requested scopes  Usually `openid` and the names of the requested claims., redirectUris: [str] # URIs, to which a user is redirected after authorization., pkceEnabled: bool=false # Determines whether PKCE is enabled.  cf. [RFC 7636](https://tools.ietf.org/html/rfc7636), pkceChallengeMethod: str # PKCE code challenge method.  cf. [RFC 7636](https://tools.ietf.org/html/rfc7636), mappingClaim: str # Name of the claim which is used for the user mapping., fallbackMappingClaim: str # Name of the claim which is used for the user mapping fallback., resetFallbackMappingClaim: bool # Set `true` to reset `fallbackMappingClaim`., userInfoSource: str(user_info_endpoint/id_token) # Source, which is used to get user information at the import or update of a user., userImportEnabled: bool=false # Determines if a DRACOON account is automatically created for a new user  who successfully logs on with his / her AD / IDP account., userImportGroup: int(int64) # User group that is assigned to users who are created by automatic import.  Reset with `0`, userUpdateEnabled: bool=false # Determines if the DRACOON account is updated with data from AD / IDP.  For OpenID Connect, the scopes `email` and `profile` are needed., userManagementUrl: str # URL of the user management UI.  Use empty string to remove., useAuthProxyEnabled: bool=false # Determines if the IDP use the DRACOON Auth Proxy.  For OpenID Connect, the scopes `email` and `profile` are needed.}\n@returns(200) {id: int(int32), name: str, isStandard: bool, isEnabled: bool, issuer: str, authorizationEndPointUrl: str, tokenEndPointUrl: str, userInfoEndPointUrl: str, jwksEndPointUrl: str, clientId: str, clientSecret: str, flow: str, scopes: [str], redirectUris: [str], pkceEnabled: bool, pkceChallengeMethod: str, mappingClaim: str, fallbackMappingClaim: str, userInfoSource: str, userImportEnabled: bool, userImportGroup: int(int64), userUpdateEnabled: bool, userManagementUrl: str, useAuthProxyEnabled: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint DELETE /v4/system/config/auth/openid/idps/{idp_id}\n@desc Remove OpenID Connect IDP configuration\n@required {idp_id: int(int32) # OpenID Connect IDP configuration ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/auth/ads/{ad_id}\n@desc Request Active Directory configuration\n@required {ad_id: int(int32) # Active Directory ID}\n@returns(200) {id: int(int32), alias: str, serverIp: str, serverPort: int(int32), serverAdminName: str, ldapUsersDomain: str, userFilter: str, userImport: bool, adExportGroup: str, useLdaps: bool, sdsImportGroup: int(int64), sslFingerPrint: str, homeFolderParent: int(int64), createHomeFolder: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/system/config/auth/ads/{ad_id}\n@desc Update Active Directory configuration\n@required {ad_id: int(int32) # Active Directory ID}\n@optional {alias: str # Unique name for an Active Directory configuration, serverIp: str # IPv4 or IPv6 address or host name, serverPort: int(int32) # Port, serverAdminName: str # Distinguished Name (DN) of Active Directory administrative account, serverAdminPassword: str # Password of Active Directory administrative account, ldapUsersDomain: str # Search scope of Active Directory; only users below this node can log on., userFilter: str # Name of Active Directory attribute that is used as login name., userImport: bool # Determines if a DRACOON account is automatically created for a new user  who successfully logs on with his / her AD / IDP account., adExportGroup: str # If `userImport` is set to `true`,  the user must be member of this Active Directory group to receive a newly created DRACOON account., sdsImportGroup: int(int64) # User group that is assigned to users who are created by automatic import.  Reset with `0`, createHomeFolder: bool=false # DEPRECATED, will be ignored  Determines whether a room is created for each user that is created by automatic import (like a home folder).  Room's name will equal the user's login name., homeFolderParent: int(int64) # DEPRECATED, will be ignored  ID of the room in which the individual rooms for users will be created., useLdaps: bool # Determines whether LDAPS should be used instead of plain LDAP., sslFingerPrint: str # SSL finger print of Active Directory server.  Mandatory for LDAPS connections.  Format: `Algorithm/Fingerprint`}\n@returns(200) {id: int(int32), alias: str, serverIp: str, serverPort: int(int32), serverAdminName: str, ldapUsersDomain: str, userFilter: str, userImport: bool, adExportGroup: str, useLdaps: bool, sdsImportGroup: int(int64), sslFingerPrint: str, homeFolderParent: int(int64), createHomeFolder: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint DELETE /v4/system/config/auth/ads/{ad_id}\n@desc Remove Active Directory configuration\n@required {ad_id: int(int32) # Active Directory ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endgroup\n\n@group shares\n@endpoint GET /v4/shares/uploads\n@desc Request list of Upload Shares\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), filter: str # Filter string, sort: str # Sort string, offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`).}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/shares/uploads\n@desc Update List of Upload Shares\n@required {objectIds: [int(int64)] # List of ids}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information, showCreatorName: bool # Show creator first and last name., showCreatorUsername: bool # Show creator email address., showUploadedFiles: bool # Allow display of already uploaded files, maxSlots: int(int32) # Maximal amount of files to upload, resetMaxSlots: bool # Set 'true' to reset 'maxSlots' for Upload Share, maxSize: int(int64) # Maximal total size of uploaded files (in bytes), resetMaxSize: bool # Set 'true' to reset 'maxSize' for Upload Share, filesExpiryPeriod: int(int32) # Number of days after which uploaded files expire, resetFilesExpiryPeriod: bool # Set 'true' to reset 'filesExpiryPeriod' for Upload Share}\n@returns(200) OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 502: Bad Gateway}\n\n@endpoint POST /v4/shares/uploads\n@desc Create new Upload Share\n@required {targetId: int(int64) # Target room or folder ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), name: str # Alias name  (default: name of the shared node), password: str # Password, expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information, filesExpiryPeriod: int(int32) # Number of days after which uploaded files expire, notes: str # User notes, internalNotes: str # Internal notes, showUploadedFiles: bool=false # Allow display of already uploaded files, maxSlots: int(int32) # Maximal amount of files to upload, maxSize: int(int64) # Maximal total size of uploaded files (in bytes), receiverLanguage: str # Language tag for messages to receiver, textMessageRecipients: [str] # List of recipient FQTNs  E.123 / E.164 Format, showCreatorName: bool=false # Show creator first and last name., showCreatorUsername: bool=false # Show creator email address., notifyCreator: bool=false # Notify creator on every upload., creatorLanguage: str # Language tag for messages to creator, sendMail: bool=false # Notify recipients via email  Please use `POST /shares/uploads/{share_id}/email` API instead., mailRecipients: str # CSV string of recipient email addresses, mailSubject: str # Notification email subject, mailBody: str # Notification email content, sendSms: bool=false # Send share password via SMS  Please use `textMessageRecipients` attribute instead., smsRecipients: str # CSV string of recipient MSISDNs}\n@returns(201) {id: int(int64), name: str, targetId: int(int64), isProtected: bool, accessKey: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), targetPath: str, isEncrypted: bool, notes: str, internalNotes: str, filesExpiryPeriod: int(int32), cntFiles: int(int32), cntUploads: int(int32), showUploadedFiles: bool, dataUrl: str, maxSlots: int(int32), maxSize: int(int64), targetType: str, showCreatorName: bool, showCreatorUsername: bool, notifyCreator: bool, recipients: str, smsRecipients: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 502: Bad Gateway}\n\n@endpoint DELETE /v4/shares/uploads\n@desc Remove Upload Shares\n@required {shareIds: [int(int64)] # List of share IDs}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/shares/uploads/{share_id}\n@desc Request Upload Share\n@required {share_id: int(int64) # Share ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), name: str, targetId: int(int64), isProtected: bool, accessKey: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), targetPath: str, isEncrypted: bool, notes: str, internalNotes: str, filesExpiryPeriod: int(int32), cntFiles: int(int32), cntUploads: int(int32), showUploadedFiles: bool, dataUrl: str, maxSlots: int(int32), maxSize: int(int64), targetType: str, showCreatorName: bool, showCreatorUsername: bool, notifyCreator: bool, recipients: str, smsRecipients: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/shares/uploads/{share_id}\n@desc Update Upload Share\n@required {share_id: int(int64) # Share ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), name: str # Alias name, password: str # Password, expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information, filesExpiryPeriod: int(int32) # Number of days after which uploaded files expire, notes: str # User notes, internalNotes: str # Internal notes, showCreatorName: bool # Show creator first and last name., showCreatorUsername: bool # Show creator email address., showUploadedFiles: bool # Allow display of already uploaded files, maxSlots: int(int32) # Maximal amount of files to upload, maxSize: int(int64) # Maximal total size of uploaded files (in bytes), textMessageRecipients: [str] # List of recipient FQTNs  E.123 / E.164 Format, receiverLanguage: str # Language tag for messages to receiver, defaultCountry: str # Country shorthand symbol (cf. ISO 3166-2), resetPassword: bool # Set 'true' to reset 'password' for Upload Share., resetFilesExpiryPeriod: bool # Set 'true' to reset 'filesExpiryPeriod' for Upload Share, resetMaxSlots: bool # Set 'true' to reset 'maxSlots' for Upload Share, resetMaxSize: bool # Set 'true' to reset 'maxSize' for Upload Share, notifyCreator: bool # Notify creator on every upload.}\n@returns(200) {id: int(int64), name: str, targetId: int(int64), isProtected: bool, accessKey: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), targetPath: str, isEncrypted: bool, notes: str, internalNotes: str, filesExpiryPeriod: int(int32), cntFiles: int(int32), cntUploads: int(int32), showUploadedFiles: bool, dataUrl: str, maxSlots: int(int32), maxSize: int(int64), targetType: str, showCreatorName: bool, showCreatorUsername: bool, notifyCreator: bool, recipients: str, smsRecipients: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 502: Bad Gateway}\n\n@endpoint DELETE /v4/shares/uploads/{share_id}\n@desc Remove Upload Share\n@required {share_id: int(int64) # Share ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/shares/downloads\n@desc Request list of Download Shares\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), filter: str # Filter string, sort: str # Sort string, offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`).}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/shares/downloads\n@desc Update a list of Download Shares\n@required {objectIds: [int(int64)] # List of ids}\n@optional {expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information, showCreatorName: bool # Show creator first and last name., showCreatorUsername: bool # Show creator email address., maxDownloads: int(int32) # Max allowed downloads, resetMaxDownloads: bool # Set 'true' to reset 'maxDownloads' for Download Share.}\n@returns(200) No Content\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 502: Bad Gateway}\n\n@endpoint POST /v4/shares/downloads\n@desc Create new Download Share\n@required {nodeId: int(int64) # Source node ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), name: str # Alias name  (default: name of the shared node), password: str # Access password, not allowed for encrypted shares, expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information, notes: str # User notes, internalNotes: str # Internal notes, showCreatorName: bool=false # Show creator first and last name., showCreatorUsername: bool=false # Show creator email address., maxDownloads: int(int32) # Max allowed downloads, keyPair: map{privateKeyContainer!: map, publicKeyContainer!: map} # Key pair container, fileKey: map{key!: str, iv!: str, version!: str, tag!: str} # File key information, receiverLanguage: str # Language tag for messages to receiver, textMessageRecipients: [str] # List of recipient FQTNs  E.123 / E.164 Format, hideDownload: bool=false # Whether or not the download is hidden on a public download share, notifyCreator: bool=false # Notify creator on every download., creatorLanguage: str # Language tag for messages to creator, sendMail: bool=false # Notify recipients via email  Please use `POST /shares/downloads/{share_id}/email` API instead., mailRecipients: str # CSV string of recipient email addresses, mailSubject: str # Notification email subject, mailBody: str # Notification email content, sendSms: bool=false # Send share password via SMS  Please use `textMessageRecipients` attribute instead., smsRecipients: str # CSV string of recipient MSISDNs}\n@returns(201) {id: int(int64), name: str, nodeId: int(int64), accessKey: str, cntDownloads: int(int32), createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, notes: str, internalNotes: str, showCreatorName: bool, showCreatorUsername: bool, isProtected: bool, expireAt: str(date-time), maxDownloads: int(int32), nodePath: str, dataUrl: str, isEncrypted: bool, nodeType: str, hideDownload: bool, classification: int(int32), notifyCreator: bool, recipients: str, smsRecipients: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 502: Bad Gateway}\n\n@endpoint DELETE /v4/shares/downloads\n@desc Remove Download Shares\n@required {shareIds: [int(int64)] # List of share IDs}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/shares/downloads/{share_id}\n@desc Request Download Share\n@required {share_id: int(int64) # Share ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), name: str, nodeId: int(int64), accessKey: str, cntDownloads: int(int32), createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, notes: str, internalNotes: str, showCreatorName: bool, showCreatorUsername: bool, isProtected: bool, expireAt: str(date-time), maxDownloads: int(int32), nodePath: str, dataUrl: str, isEncrypted: bool, nodeType: str, hideDownload: bool, classification: int(int32), notifyCreator: bool, recipients: str, smsRecipients: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/shares/downloads/{share_id}\n@desc Update Download Share\n@required {share_id: int(int64) # Share ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), name: str # Alias name, password: str # Access password, not allowed for encrypted shares, expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information, notes: str # User notes, internalNotes: str # Internal notes, showCreatorName: bool # Show creator first and last name., showCreatorUsername: bool # Show creator email address., maxDownloads: int(int32) # Max allowed downloads, textMessageRecipients: [str] # List of recipient FQTNs  E.123 / E.164 Format, receiverLanguage: str # Language tag for messages to receiver, defaultCountry: str # Country shorthand symbol (cf. ISO 3166-2), resetPassword: bool # Set 'true' to reset 'password' for Download Share., resetMaxDownloads: bool # Set 'true' to reset 'maxDownloads' for Download Share., hideDownload: bool # Whether or not the download is hidden on a public download share, notifyCreator: bool # Notify creator on every download.}\n@returns(200) {id: int(int64), name: str, nodeId: int(int64), accessKey: str, cntDownloads: int(int32), createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, notes: str, internalNotes: str, showCreatorName: bool, showCreatorUsername: bool, isProtected: bool, expireAt: str(date-time), maxDownloads: int(int32), nodePath: str, dataUrl: str, isEncrypted: bool, nodeType: str, hideDownload: bool, classification: int(int32), notifyCreator: bool, recipients: str, smsRecipients: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 502: Bad Gateway}\n\n@endpoint DELETE /v4/shares/downloads/{share_id}\n@desc Remove Download Share\n@required {share_id: int(int64) # Share ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group settings\n@endpoint GET /v4/settings\n@desc Request customer settings\n@returns(200) {homeRoomsActive: bool, homeRoomParentId: int(int64), homeRoomParentName: str, homeRoomQuota: int(int64)} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/settings\n@desc Set customer settings\n@optional {homeRoomParentName: str # Homeroom Parent Name, homeRoomQuota: int(int64) # Homeroom Quota in bytes, homeRoomsActive: bool # Homerooms active}\n@returns(200) {homeRoomsActive: bool, homeRoomParentId: int(int64), homeRoomParentName: str, homeRoomQuota: int(int64)} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint GET /v4/settings/webhooks/{webhook_id}\n@desc Request webhook\n@required {webhook_id: int(int64) # Webhook ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), name: str, url: str, secret: str, isEnabled: bool, expireAt: str(date-time), eventTypeNames: [str], createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, failStatus: int(int32)} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/settings/webhooks/{webhook_id}\n@desc Update webhook\n@required {webhook_id: int(int64) # Webhook ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), name: str # Name, eventTypeNames: [str] # List of names of event types, url: str # URL (must begin with the `HTTPS` scheme), secret: str # Secret; used for event message signatures, isEnabled: bool # Is enabled, triggerExampleEvent: bool # If set to true, an example event is being created}\n@returns(200) {id: int(int64), name: str, url: str, secret: str, isEnabled: bool, expireAt: str(date-time), eventTypeNames: [str], createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, failStatus: int(int32)} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/settings/webhooks/{webhook_id}\n@desc Remove webhook\n@required {webhook_id: int(int64) # Webhook ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/settings/notifications/channels\n@desc Request list of notification channels\n@returns(200) {items: [map]} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/settings/notifications/channels\n@desc Toggle notification channels\n@required {channelId: int(int32) # Channel ID, isEnabled: bool # Determines whether channel is enabled}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group public\n@endpoint GET /v4/public/shares/uploads/{access_key}/{upload_id}\n@desc Request status of S3 file upload\n@required {access_key: str # Access key, upload_id: str # Upload channel ID}\n@returns(200) {status: str, fileName: str, size: int(int64), errorDetails: map{code: int(int32), message: str, debugInfo: str, errorCode: int(int32)}} # OK\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/public/shares/uploads/{access_key}/{upload_id}\n@desc Complete file upload\n@required {access_key: str # Access key, upload_id: str # Upload channel ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), items: [map{userId!: int(int64), fileKey!: map}] # List of user file keys}\n@returns(201) {name: str, size: int(int64), createdAt: str(date-time), hash: str} # Created\n@returns(202) {name: str, size: int(int64), createdAt: str(date-time), hash: str} # Accepted\n@errors {400: Bad Request, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 504: Gateway Timeout, 507: Insufficient Storage}\n\n@endpoint POST /v4/public/shares/uploads/{access_key}/{upload_id}\n@desc Upload file\n@required {access_key: str # Access key, upload_id: str # Upload channel ID}\n@optional {Content-Range: str # Content-Range   e.g. `bytes 0-999/3980`, X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {size: int(int64), hash: str} # OK\n@returns(201) {size: int(int64), hash: str} # Created\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 507: Insufficient Storage}\n\n@endpoint DELETE /v4/public/shares/uploads/{access_key}/{upload_id}\n@desc Cancel file upload\n@required {access_key: str # Access key, upload_id: str # Upload channel ID}\n@returns(204) No Content\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable, 504: Gateway Timeout, 507: Insufficient Storage}\n\n@endpoint PUT /v4/public/shares/uploads/{access_key}/{upload_id}/s3\n@desc Complete S3 file upload\n@required {access_key: str # Access key, upload_id: str # Upload channel ID, parts: [map{partNumber!: int(int32), partEtag!: str}] # List of S3 file upload parts}\n@optional {userFileKeyList: [map{userId!: int(int64), fileKey!: map}] # List of user file keys}\n@returns(202) Accepted\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group provisioning\n@endpoint GET /v4/provisioning/webhooks/{webhook_id}\n@desc Request tenant webhook\n@required {webhook_id: int(int64) # Webhook ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), X-Sds-Service-Token: str # Service Authentication token}\n@returns(200) {id: int(int64), name: str, url: str, secret: str, isEnabled: bool, expireAt: str(date-time), eventTypeNames: [str], createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, failStatus: int(int32)} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable}\n\n@endpoint PUT /v4/provisioning/webhooks/{webhook_id}\n@desc Update tenant webhook\n@required {webhook_id: int(int64) # Webhook ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), X-Sds-Service-Token: str # Service Authentication token, name: str # Name, eventTypeNames: [str] # List of names of event types, url: str # URL (must begin with the `HTTPS` scheme), secret: str # Secret; used for event message signatures, isEnabled: bool # Is enabled, triggerExampleEvent: bool # If set to true, an example event is being created}\n@returns(200) {id: int(int64), name: str, url: str, secret: str, isEnabled: bool, expireAt: str(date-time), eventTypeNames: [str], createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, failStatus: int(int32)} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable}\n\n@endpoint DELETE /v4/provisioning/webhooks/{webhook_id}\n@desc Remove tenant webhook\n@required {webhook_id: int(int64) # Webhook ID}\n@optional {X-Sds-Service-Token: str # Service Authentication token}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable}\n\n@endpoint GET /v4/provisioning/customers/{customer_id}\n@desc Get customer\n@required {customer_id: int(int64) # Customer ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), include_attributes: bool # Include custom customer attributes., X-Sds-Service-Token: str # Service Authentication token}\n@returns(200) {id: int(int64), companyName: str, customerContractType: str, quotaMax: int(int64), quotaUsed: int(int64), userMax: int(int32), userUsed: int(int32), cntInternalUser: int(int32), cntGuestUser: int(int32), createdAt: str(date-time), isLocked: bool, trialDaysLeft: int(int32), updatedAt: str(date-time), lastLoginAt: str(date-time), customerAttributes: map{items: [map]}, providerCustomerId: str, webhooksMax: int(int64), activationCode: str, lockStatus: bool, customerUuid: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable}\n\n@endpoint PUT /v4/provisioning/customers/{customer_id}\n@desc Update customer\n@required {customer_id: int(int64) # Customer ID, customerContractType: str(demo/free/pay) # Customer type}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), X-Sds-Service-Token: str # Service Authentication token, companyName: str # Company name, quotaMax: int(int64) # Maximal disc space which can be allocated by customer in bytes. -1 for unlimited, userMax: int(int32) # Maximal number of users, isLocked: bool=false # Customer is locked:  * `false` - unlocked  * `true` - locked    All users of this customer will be blocked and can not login anymore., providerCustomerId: str # Provider customer ID, webhooksMax: int(int64) # Maximal number of webhooks, lockStatus: bool=false # Customer lock status:  * `false` - unlocked  * `true` - locked    Please use `isLocked` instead.  All users of this customer will be blocked and can not login anymore.}\n@returns(200) {id: int(int64), companyName: str, customerContractType: str, quotaMax: int(int64), userMax: int(int32), customerUuid: str, isLocked: bool, trialDays: int(int32), createdAt: str(date-time), updatedAt: str(date-time), customerAttributes: map{items: [map]}, providerCustomerId: str, webhooksMax: int(int64), activationCode: str, lockStatus: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 404: Not Found, 406: Not Acceptable}\n\n@endpoint DELETE /v4/provisioning/customers/{customer_id}\n@desc Remove customer\n@required {customer_id: int(int64) # Customer ID}\n@optional {X-Sds-Service-Token: str # Service Authentication token}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable}\n\n@endpoint GET /v4/provisioning/customers/{customer_id}/customerAttributes\n@desc Request customer attributes\n@required {customer_id: int(int64) # Customer ID}\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string, X-Sds-Service-Token: str # Service Authentication token}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable}\n\n@endpoint PUT /v4/provisioning/customers/{customer_id}/customerAttributes\n@desc Add or edit customer attributes\n@required {customer_id: int(int64) # Customer ID, items: [map{key!: str, value!: str}] # List of customer attributes}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), X-Sds-Service-Token: str # Service Authentication token}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable}\n\n@endpoint POST /v4/provisioning/customers/{customer_id}/customerAttributes\n@desc Set customer attributes\n@required {customer_id: int(int64) # Customer ID, items: [map{key!: str, value!: str}] # List of customer attributes}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), X-Sds-Service-Token: str # Service Authentication token}\n@returns(201) {id: int(int64), companyName: str, customerContractType: str, quotaMax: int(int64), quotaUsed: int(int64), userMax: int(int32), userUsed: int(int32), cntInternalUser: int(int32), cntGuestUser: int(int32), createdAt: str(date-time), isLocked: bool, trialDaysLeft: int(int32), updatedAt: str(date-time), lastLoginAt: str(date-time), customerAttributes: map{items: [map]}, providerCustomerId: str, webhooksMax: int(int64), activationCode: str, lockStatus: bool, customerUuid: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable}\n\n@endgroup\n\n@group nodes\n@endpoint GET /v4/nodes/{node_id}/node_attributes\n@desc Request custom node attributes\n@required {node_id: int(int64) # Node ID}\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/{node_id}/node_attributes\n@desc Add or edit custom node attributes\n@required {node_id: int(int64) # Node ID, items: [map{key!: str, value!: str}] # List of key-value pairs}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/rooms/{room_id}\n@desc Updates room’s metadata\n@required {room_id: int(int64) # Room ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), name: str # Name, quota: int(int64) # Quota in byte, notes: str # User notes  Use empty string to remove., timestampCreation: str(date-time) # Time the node was created on external file system, timestampModification: str(date-time) # Time the content of a node was last modified on external file system}\n@returns(200) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/rooms/{room_id}/webhooks\n@desc Request list of webhooks that are assigned or can be assigned to this room\n@required {room_id: int(int64) # Room ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/rooms/{room_id}/webhooks\n@desc Assign or unassign webhooks to room\n@required {room_id: int(int64) # Room ID, items: [map{webhookId!: int(int64), isAssigned!: bool}] # Assign a webhook to a room to use it for node actions within the room}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/rooms/{room_id}/users\n@desc Request room granted user(s) or / and user(s) that can be granted\n@required {room_id: int(int64) # Room ID}\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/rooms/{room_id}/users\n@desc Add or change room granted user(s)\n@required {room_id: int(int64) # Room ID, items: [map{id!: int(int64), permissions!: map}] # List of room-user mappings}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/nodes/rooms/{room_id}/users\n@desc Revoke granted user(s) from room\n@required {room_id: int(int64) # Room ID, ids: [int(int64)] # List of user IDs}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/rooms/{room_id}/policies\n@desc Request Room Policies\n@required {room_id: int(int64) # Room ID}\n@returns(200) {defaultExpirationPeriod: int(int32), isVirusProtectionEnabled: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/rooms/{room_id}/policies\n@desc Set room policies\n@required {room_id: int(int64) # Room ID}\n@optional {defaultExpirationPeriod: int(int32) # Default policy room expiration period in seconds.  All files in a room will have their expiration date set to this period after their respective upload.   0 means no default expiration policy is set., virusProtectionEnabled: bool # Determines whether virus protection is enabled for room. To be set by room admins}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/rooms/{room_id}/guest_users\n@desc Add guest users to a room\n@required {room_id: int(int64) # Room ID, roomGuestInvitations: [map{firstName!: str, lastName!: str, email!: str}] # List of room-user mappings}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/rooms/{room_id}/groups\n@desc Request room granted group(s) or / and group(s) that can be granted\n@required {room_id: int(int64) # Room ID}\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/rooms/{room_id}/groups\n@desc Add or change room granted group(s)\n@required {room_id: int(int64) # Room ID, items: [map{id!: int(int64), permissions!: map, newGroupMemberAcceptance: str}] # List of room-group mappings}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/nodes/rooms/{room_id}/groups\n@desc Revoke granted group(s) from room\n@required {room_id: int(int64) # Room ID, ids: [int(int64)] # List of group IDs}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/rooms/{room_id}/encrypt\n@desc Encrypt room\n@required {room_id: int(int64) # Room ID, isEncrypted: bool # Encryption state}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), useDataSpaceRescueKey: bool # Use system emergency password (rescue key) for files in this room, dataRoomRescueKey: map{privateKeyContainer!: map, publicKeyContainer!: map} # Key pair container}\n@returns(200) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/rooms/{room_id}/config\n@desc Configure room\n@required {room_id: int(int64) # Room ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), recycleBinRetentionPeriod: int(int32) # Retention period for deleted nodes in days, inheritPermissions: bool # Inherit permissions from parent room  (default: `false` if `parentId` is `0`; otherwise: `true`), takeOverPermissions: bool # Take over existing permissions, adminIds: [int(int64)] # List of user ids  A room requires at least one admin (user or group), adminGroupIds: [int(int64)] # List of group ids  A room requires at least one admin (user or group), newGroupMemberAcceptance: str(autoallow/pending)=autoallow # Behaviour when new users are added to the group:  * `autoallow`  * `pending`    Only relevant if `adminGroupIds` has items., hasActivitiesLog: bool=true # Is activities log active (for rooms only), classification: int(int32)(1/2/3/4)=2 # Classification ID:  * `1` - public  * `2` - internal  * `3` - confidential  * `4` - strictly confidential    Provided (or default) classification is taken from room  when file gets uploaded without any classification.}\n@returns(200) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/rooms/pending\n@desc Request user-room assignments per group\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/rooms/pending\n@desc Handle user-room assignments per group\n@required {items: [map{userId!: int(int64), groupId!: int(int64), roomId!: int(int64), roomName!: str, state!: str}] # List of pending assignments}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/folders/{folder_id}\n@desc Updates folder’s metadata\n@required {folder_id: int(int64) # Folder ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), name: str # Folder name, notes: str # User notes  Use empty string to remove., classification: int(int32)(1/2/3/4) # Classification ID:  * `1` - public  * `2` - internal  * `3` - confidential  * `4` - strictly confidential    Provided (or default) classification is taken from room  when file gets uploaded without any classification., timestampCreation: str(date-time) # Time the node was created on external file system  (default: current server datetime in UTC format), timestampModification: str(date-time) # Time the content of a node was last modified on external file system  (default: current server datetime in UTC format)}\n@returns(200) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/files\n@desc Updates a list of  file’s metadata\n@required {objectIds: [int(int64)] # List of ids}\n@optional {classification: int(int32) # Classification ID:  * `1` - public  * `2` - internal  * `3` - confidential  * `4` - strictly confidential, expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/files/{file_id}\n@desc Updates a file’s metadata\n@required {file_id: int(int64) # File ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), name: str # File name, expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information, classification: int(int32) # Classification ID:  * `1` - public  * `2` - internal  * `3` - confidential  * `4` - strictly confidential, notes: str # User notes  Use empty string to remove., timestampCreation: str(date-time) # Time the node was created on external file system  (default: current server datetime in UTC format), timestampModification: str(date-time) # Time the content of a node was last modified on external file system  (default: current server datetime in UTC format)}\n@returns(200) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/files/uploads/{upload_id}\n@desc Request status of S3 file upload\n@required {upload_id: str # Upload channel ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {status: str, node: map{id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}}, errorDetails: map{code: int(int32), message: str, debugInfo: str, errorCode: int(int32)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/files/uploads/{upload_id}\n@desc Complete file upload\n@required {upload_id: str # Upload channel ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), resolutionStrategy: str(autorename/overwrite/fail)=autorename # Node conflict resolution strategy:  * `autorename`  * `overwrite`  * `fail`, keepShareLinks: bool=false # Preserve Download Share Links and point them to the new node., fileName: str # New file name to store with, fileKey: map{key!: str, iv!: str, version!: str, tag!: str} # File key information, userFileKeyList: map{items: [map]} # Mandatory for encrypted shares}\n@returns(201) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # Created\n@returns(202) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # Accepted\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed, 507: Insufficient Storage}\n\n@endpoint POST /v4/nodes/files/uploads/{upload_id}\n@desc Upload file\n@required {upload_id: str # Upload channel ID}\n@optional {Content-Range: str # Content-Range   e.g. `bytes 0-999/3980`}\n@returns(201) {size: int(int64), hash: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 507: Insufficient Storage}\n\n@endpoint DELETE /v4/nodes/files/uploads/{upload_id}\n@desc Cancel file upload\n@required {upload_id: str # Upload channel ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 504: Gateway Timeout}\n\n@endpoint PUT /v4/nodes/files/uploads/{upload_id}/s3\n@desc Complete S3 file upload\n@required {upload_id: str # Upload channel ID, parts: [map{partNumber!: int(int32), partEtag!: str}] # List of S3 file upload parts}\n@optional {resolutionStrategy: str(autorename/overwrite/fail)=autorename # Node conflict resolution strategy:  * `autorename`  * `overwrite`  * `fail`, keepShareLinks: bool=false # Preserve Download Share Links and point them to the new node., fileName: str # New file name to store with, fileKey: map{key!: str, iv!: str, version!: str, tag!: str} # File key information, isPrioritisedVirusScan: bool=false # If true prioritises the virus-protection scan higher when in a scanning room and it comes from ms-teams or OAI}\n@returns(202) Accepted\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed, 504: Gateway Timeout}\n\n@endpoint PUT /v4/nodes/favorites\n@desc Mark or unmark a list of nodes (room, folder or file) as favorite\n@required {isFavorite: bool # Sets the favorite attribute to true or false on each file in an array of nodes., objectIds: [int(int64)] # List of ids}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/nodes/comments/{comment_id}\n@desc Edit node comment\n@required {comment_id: int(int64) # Comment ID, text: str # Comment text}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), text: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, isChanged: bool, isDeleted: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/nodes/comments/{comment_id}\n@desc Remove node comment\n@required {comment_id: int(int64) # Comment ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group groups\n@endpoint GET /v4/groups/{group_id}\n@desc Request user group\n@required {group_id: int(int64) # Group ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), name: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, cntUsers: int(int32), updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), groupRoles: map{items: [map]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/groups/{group_id}\n@desc Update user group's metadata\n@required {group_id: int(int64) # Group ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), name: str # Group name, expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information}\n@returns(200) {id: int(int64), name: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, cntUsers: int(int32), updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), groupRoles: map{items: [map]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint DELETE /v4/groups/{group_id}\n@desc Remove user group\n@required {group_id: int(int64) # Group ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group config\n@endpoint GET /v4/config/settings\n@desc Request system settings\n@returns(200) {items: [map]} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint PUT /v4/config/settings\n@desc Update system settings\n@required {items: [map{key!: str, value!: str}] # List of key-value pairs}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group auth\n@endpoint GET /v4/auth/reset_password/{token}\n@desc Validate information for password reset\n@required {token: str # Password reset token}\n@returns(200) {firstName: str, lastName: str, loginPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectDictionaryWords: bool, rejectUserInfo: bool, rejectKeyboardPatterns: bool, numberOfArchivedPasswords: int(int32), passwordExpiration: map{enabled: bool, maxPasswordAge: int(int32)}, userLockout: map{enabled: bool, maxNumberOfLoginFailures: int(int32), lockoutPeriod: int(int32)}, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}, title: str, gender: str, allowSystemGlobalWeakPassword: bool} # OK\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable}\n\n@endpoint PUT /v4/auth/reset_password/{token}\n@desc Reset password\n@required {token: str # Password reset token, password: str # New password}\n@returns(204) No Content\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable}\n\n@endgroup\n\n@group users\n@endpoint GET /v4/users\n@desc Request users\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string, include_attributes: bool # Include custom user attributes., include_roles: bool # Include roles, include_manageable_rooms: bool # Include hasManageableRooms (deprecated)}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/users\n@desc Create new user\n@required {firstName: str # User first name, lastName: str # User last name}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), userName: str # Username, phone: str # Phone number, expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information, receiverLanguage: str # IETF language tag, email: str # Email, notifyUser: bool # Notify user about his new account  * default: `true` for `basic` auth type  * default: `false` for `active_directory`, `openid` auth types, authData: map{method!: str, login: str, password: str, mustChangePassword: bool, adConfigId: int(int32), oidConfigId: int(int32)} # User Authentication Data, isNonmemberViewer: bool # Determines whether user has the role NONMEMBER_VIEWER, mfaConfig: map{mfaEnforced: bool} # Multi-factor authentication configuration, title: str # Job title, password: str # An initial password may be preset  use `authData` instead, login: str # User login name, authMethods: [map{authId!: str, isEnabled!: bool, options: [map]}] # Authentication methods:  * `sql`  * `active_directory`  * `openid`  use `authData` instead, needsToChangePassword: bool # Determines whether user has to change his / her initial password.  use `authDate.mustChangePassword` instead, gender: str=n # Gender  Do NOT use `gender`! It will be ignored.}\n@returns(201) {id: int(int64), userName: str, firstName: str, lastName: str, isLocked: bool, avatarUuid: str, authData: map{method: str, login: str, password: str, mustChangePassword: bool, adConfigId: int(int32), oidConfigId: int(int32)}, email: str, phone: str, expireAt: str(date-time), hasManageableRooms: bool, isEncryptionEnabled: bool, lastLoginSuccessAt: str(date-time), homeRoomId: int(int64), publicKeyContainer: map{version: str, publicKey: str, createdAt: str(date-time), createdBy: int(int64)}, userRoles: map{items: [map]}, isMfaEnabled: bool, isMfaEnforced: bool, userAttributes: map{items: [map]}, title: str, lockStatus: int(int32), login: str, authMethods: [map], gender: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint POST /v4/users/{user_id}/mfa/emergency_code\n@desc Request emergency MFA code\n@required {user_id: int(int64)}\n@returns(200) {code: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group user\n@endpoint POST /v4/user/subscriptions/upload_shares/{share_id}\n@desc Subscribe Upload Share for notifications\n@required {share_id: int(int64) # Share ID}\n@returns(201) {id: int(int64), targetNodeId: int(int64)} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/user/subscriptions/upload_shares/{share_id}\n@desc Unsubscribe Upload Share from notifications\n@required {share_id: int(int64) # Share ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/user/subscriptions/nodes/{node_id}\n@desc Subscribe node for notifications\n@required {node_id: int(int64) # Node ID}\n@returns(201) {id: int(int64), type: str, authParentId: int(int64), name: str, parentPath: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/user/subscriptions/nodes/{node_id}\n@desc Unsubscribe node from notifications\n@required {node_id: int(int64) # Node ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/user/subscriptions/download_shares/{share_id}\n@desc Subscribe Download Share for notifications\n@required {share_id: int(int64) # Share ID}\n@returns(201) {id: int(int64), authParentId: int(int64)} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/user/subscriptions/download_shares/{share_id}\n@desc Unsubscribe Download Share from notifications\n@required {share_id: int(int64) # Share ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/user/account/mfa/totp\n@desc Request information to setup TOTP as second authentication factor\n@returns(201) {id: int(int64), qrCode: str, otpUri: str, secret: str} # Created\n@errors {401: Unauthorized, 402: Payment Required, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint POST /v4/user/account/mfa/totp\n@desc Confirm second factor TOTP setup with a generated OTP\n@required {id: int(int64) # ID, otp: str # Generated valid OTP}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/user/account/keypairs\n@desc Request all user key pairs\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) OK\n@errors {401: Unauthorized, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/user/account/keypairs\n@desc Create key pair and preserve copy of old private key\n@required {privateKeyContainer: map{version!: str, privateKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Private key container, publicKeyContainer: map{version!: str, publicKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Public key container, previousPrivateKey: map{version!: str, privateKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Private key container}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint GET /v4/user/account/keypair\n@desc Request user's key pair\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), version: str # Version (NEW)}\n@returns(200) {privateKeyContainer: map{version: str, privateKey: str, createdAt: str(date-time), createdBy: int(int64)}, publicKeyContainer: map{version: str, publicKey: str, createdAt: str(date-time), createdBy: int(int64)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/user/account/keypair\n@desc Set user's key pair\n@required {privateKeyContainer: map{version!: str, privateKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Private key container, publicKeyContainer: map{version!: str, publicKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Public key container}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint DELETE /v4/user/account/keypair\n@desc Remove user's key pair\n@optional {version: str # Version (NEW)}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/user/account/avatar\n@desc Request avatar\n@returns(200) {avatarUri: str, avatarUuid: str, isCustomAvatar: bool} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/user/account/avatar\n@desc Change avatar\n@returns(201) {avatarUri: str, avatarUuid: str, isCustomAvatar: bool} # Created\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/user/account/avatar\n@desc Reset avatar\n@returns(200) {avatarUri: str, avatarUuid: str, isCustomAvatar: bool} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group system\n@endpoint GET /v4/system/config/storage/s3/tags\n@desc Request list of configured S3 tags\n@returns(200) {items: [map]} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/system/config/storage/s3/tags\n@desc Create S3 tag\n@required {key: str # S3 tag key, value: str # S3 tag value}\n@optional {isMandatory: bool=false # Determines whether S3 is mandatory or not}\n@returns(201) {id: int(int64), key: str, value: str, isMandatory: bool} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint POST /v4/system/config/policies/passwords/enforce_change\n@desc Enforce login password change for all users\n@returns(200) OK\n@returns(204) No Content\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/oauth/clients\n@desc Request list of OAuth clients\n@optional {filter: str # Filter string, sort: str # Sort string}\n@returns(200) OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/system/config/oauth/clients\n@desc Create OAuth client\n@required {clientName: str # Name, which is shown at the client configuration and authorization., grantTypes: [str](authorization_code/client_credentials/implicit/password/refresh_token) # Authorized grant types  * `authorization_code`  * `implicit`  * `password`  * `client_credentials`  * `refresh_token`    cf. [RFC 6749](https://tools.ietf.org/html/rfc6749), redirectUris: [str] # URIs, to which a user is redirected after authorization.}\n@optional {clientId: str # ID of the OAuth client, clientSecret: str # Secret, which client uses at authentication., clientType: str(confidential/public)=confidential # Determines whether client is a confidential or public client., accessTokenValidity: int(int32) # Validity of the access token in seconds., refreshTokenValidity: int(int32) # Validity of the refresh token in seconds., approvalValidity: int(int32) # Validity of the approval interval in seconds.}\n@returns(201) {clientId: str, clientSecret: str, clientName: str, clientType: str, isStandard: bool, isExternal: bool, isEnabled: bool, grantTypes: [str], redirectUris: [str], accessTokenValidity: int(int32), refreshTokenValidity: int(int32), approvalValidity: int(int32)} # Created\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 403: Forbidden, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/auth/openid/idps\n@desc Request list of OpenID Connect IDP configurations\n@optional {filter: str # Filter string, sort: str # Sort string}\n@returns(200) OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/system/config/auth/openid/idps\n@desc Create OpenID Connect IDP configuration\n@required {name: str # Name of the IDP, issuer: str # Issuer identifier of the IDP  The value is a case sensitive URL., authorizationEndPointUrl: str # URL of the authorization endpoint, tokenEndPointUrl: str # URL of the token endpoint, userInfoEndPointUrl: str # URL of the user info endpoint, jwksEndPointUrl: str # URL of the JWKS endpoint, clientId: str # ID of the OpenID client, clientSecret: str # Secret, which client uses at authentication., scopes: [str] # List of requested scopes, redirectUris: [str] # URIs, to which a user is redirected after authorization., mappingClaim: str # Name of the claim which is used for the user mapping.}\n@optional {flow: str(authorization_code/hybrid) # Flow, which is used at authentication, pkceEnabled: bool=false # Determines whether PKCE is enabled.  cf. [RFC 7636](https://tools.ietf.org/html/rfc7636), pkceChallengeMethod: str=plain # PKCE code challenge method.  cf. [RFC 7636](https://tools.ietf.org/html/rfc7636), fallbackMappingClaim: str # Name of the claim which is used for the user mapping fallback., userInfoSource: str(user_info_endpoint/id_token) # Source, which is used to get user information at the import or update of a user., userImportEnabled: bool=false # Determines if a DRACOON account is automatically created for a new user  who successfully logs on with his / her AD / IDP account., userImportGroup: int(int64) # User group that is assigned to users who are created by automatic import.  Reset with `0`, userUpdateEnabled: bool=false # Determines if the DRACOON account is updated with data from AD / IDP.  For OpenID Connect, the scopes `email` and `profile` are needed., userManagementUrl: str # URL of the user management UI.  Use empty string to remove., useAuthProxyEnabled: bool=false # Determines if the IDP use the DRACOON Auth Proxy.  For OpenID Connect, the scopes `email` and `profile` are needed.}\n@returns(201) {id: int(int32), name: str, isStandard: bool, isEnabled: bool, issuer: str, authorizationEndPointUrl: str, tokenEndPointUrl: str, userInfoEndPointUrl: str, jwksEndPointUrl: str, clientId: str, clientSecret: str, flow: str, scopes: [str], redirectUris: [str], pkceEnabled: bool, pkceChallengeMethod: str, mappingClaim: str, fallbackMappingClaim: str, userInfoSource: str, userImportEnabled: bool, userImportGroup: int(int64), userUpdateEnabled: bool, userManagementUrl: str, useAuthProxyEnabled: bool} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/auth/ads\n@desc Request list of Active Directory configurations\n@returns(200) {items: [map]} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/system/config/auth/ads\n@desc Create Active Directory configuration\n@required {alias: str # Unique name for an Active Directory configuration, serverIp: str # IPv4 or IPv6 address or host name, serverPort: int(int32) # Port, serverAdminName: str # Distinguished Name (DN) of Active Directory administrative account, serverAdminPassword: str # Password of Active Directory administrative account, ldapUsersDomain: str # Search scope of Active Directory; only users below this node can log on., userFilter: str # Name of Active Directory attribute that is used as login name.}\n@optional {userImport: bool=false # Determines if a DRACOON account is automatically created for a new user  who successfully logs on with his / her AD / IDP account., useLdaps: bool=false # Determines whether LDAPS should be used instead of plain LDAP., adExportGroup: str # If `userImport` is set to `true`,  the user must be member of this Active Directory group to receive a newly created DRACOON account., sdsImportGroup: int(int64) # User group that is assigned to users who are created by automatic import.  Reset with `0`, createHomeFolder: bool=false # DEPRECATED, will be ignored  Determines whether a room is created for each user that is created by automatic import (like a home folder).  Room's name will equal the user's login name., homeFolderParent: int(int64) # DEPRECATED, will be ignored  ID of the room in which the individual rooms for users will be created., sslFingerPrint: str # SSL finger print of Active Directory server.  Mandatory for LDAPS connections.  Format: `Algorithm/Fingerprint`}\n@returns(201) {id: int(int32), alias: str, serverIp: str, serverPort: int(int32), serverAdminName: str, ldapUsersDomain: str, userFilter: str, userImport: bool, adExportGroup: str, useLdaps: bool, sdsImportGroup: int(int64), sslFingerPrint: str, homeFolderParent: int(int64), createHomeFolder: bool} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint POST /v4/system/config/actions/test/ad\n@desc Test Active Directory configuration\n@required {serverIp: str # IPv4 or IPv6 address or host name, serverPort: int(int32) # Port, serverAdminName: str # Distinguished Name (DN) of Active Directory administrative account, serverAdminPassword: str # Password of Active Directory administrative account, ldapUsersDomain: str # Search scope of Active Directory; only users below this node can log on.}\n@optional {useLdaps: bool=false # Determines whether LDAPS should be used instead of plain LDAP., sslFingerPrint: str # SSL finger print of Active Directory server.  Mandatory for LDAPS connections.  Format: `Algorithm/Fingerprint`}\n@returns(200) {serverIp: str, serverPort: int(int32), serverAdminName: str, ldapUsersDomain: str, useLdaps: bool, sslFingerPrint: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group shares\n@endpoint POST /v4/shares/uploads/{share_id}/email\n@desc Send an existing Upload Share link via email\n@required {share_id: int(int64) # Share ID, recipients: [str] # List of recipient email addresses, body: str # Notification email content}\n@optional {receiverLanguage: str # Language tag for messages to receiver}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/shares/downloads/{share_id}/email\n@desc Send an existing Download Share link via email\n@required {share_id: int(int64) # Share ID, recipients: [str] # List of recipient email addresses, body: str # Notification email content}\n@optional {receiverLanguage: str # Language tag for messages to receiver}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group settings\n@endpoint GET /v4/settings/webhooks\n@desc Request list of webhooks\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/settings/webhooks\n@desc Create webhook\n@required {name: str # Name, eventTypeNames: [str] # List of names of event types, url: str # URL (must begin with the `HTTPS` scheme)}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), secret: str # Secret; used for event message signatures, isEnabled: bool # Is enabled, triggerExampleEvent: bool # If set to true, an example event is being created}\n@returns(201) {id: int(int64), name: str, url: str, secret: str, isEnabled: bool, expireAt: str(date-time), eventTypeNames: [str], createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, failStatus: int(int32)} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/settings/webhooks/{webhook_id}/reset_lifetime\n@desc Reset webhook lifetime\n@required {webhook_id: int(int64) # Webhook ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), name: str, url: str, secret: str, isEnabled: bool, expireAt: str(date-time), eventTypeNames: [str], createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, failStatus: int(int32)} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/settings/keypairs\n@desc Request all system rescue key pairs\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/settings/keypairs\n@desc Create system rescue key pair and preserve copy of old private key\n@required {privateKeyContainer: map{version!: str, privateKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Private key container, publicKeyContainer: map{version!: str, publicKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Public key container, previousPrivateKey: map{version!: str, privateKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Private key container}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/settings/keypair\n@desc Request system rescue key pair\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), version: str # Version (NEW)}\n@returns(200) {privateKeyContainer: map{version: str, privateKey: str, createdAt: str(date-time), createdBy: int(int64)}, publicKeyContainer: map{version: str, publicKey: str, createdAt: str(date-time), createdBy: int(int64)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/settings/keypair\n@desc Activate client-side encryption for customer\n@required {privateKeyContainer: map{version!: str, privateKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Private key container, publicKeyContainer: map{version!: str, publicKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Public key container}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/settings/keypair\n@desc Remove system rescue key pair\n@optional {version: str # Version (NEW)}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group roles\n@endpoint GET /v4/roles/{role_id}/users\n@desc Request users with specific role\n@required {role_id: int(int32) # Role ID}\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/roles/{role_id}/users\n@desc Assign user(s) to the role\n@required {role_id: int(int32) # Role ID, ids: [int(int64)] # List of user IDs}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint DELETE /v4/roles/{role_id}/users\n@desc Revoke granted role from user(s)\n@required {role_id: int(int32) # Role ID, ids: [int(int64)] # List of user IDs}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/roles/{role_id}/groups\n@desc Request groups with specific role\n@required {role_id: int(int32) # Role ID}\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/roles/{role_id}/groups\n@desc Assign group(s) to the role\n@required {role_id: int(int32) # Role ID, ids: [int(int64)] # List of group IDs}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/roles/{role_id}/groups\n@desc Revoke granted role from group(s)\n@required {role_id: int(int32) # Role ID, ids: [int(int64)] # List of group IDs}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group public\n@endpoint GET /v4/public/shares/uploads/{access_key}\n@desc Request public Upload Share information\n@required {access_key: str # Access key}\n@optional {X-Sds-Share-Password: str # Upload share password. Should be base64-encoded.  Plain X-Sds-Share-Passwords are *deprecated* and will be removed in the future, X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {isProtected: bool, createdAt: str(date-time), name: str, isEncrypted: bool, expireAt: str(date-time), notes: str, uploadedFiles: [map], userUserPublicKeyList: map{items: [map]}, showUploadedFiles: bool, remainingSize: int(int64), remainingSlots: int(int32), creatorName: str, creatorUsername: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable}\n\n@endpoint POST /v4/public/shares/uploads/{access_key}\n@desc Create new file upload channel\n@required {access_key: str # Access key, name: str # File name}\n@optional {size: int(int64) # File size in byte, password: str # Password, directS3Upload: bool=false # Upload direct to S3, timestampCreation: str(date-time) # Time the node was created on external file system  (default: current server datetime in UTC format), timestampModification: str(date-time) # Time the content of a node was last modified on external file system  (default: current server datetime in UTC format)}\n@returns(201) {uploadId: str, uploadUrl: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 504: Gateway Timeout, 507: Insufficient Storage}\n\n@endpoint POST /v4/public/shares/uploads/{access_key}/{upload_id}/s3_urls\n@desc Generate presigned URLs for S3 file upload\n@required {access_key: str # Access key, upload_id: str # Upload channel ID, size: int(int64) # `Content-Length` header size for each presigned URL (in bytes)  *MUST* be >= 5 MB except the last part., firstPartNumber: int(int32) # First part number of a range of requested presigned URLs (for S3 it is: `1`), lastPartNumber: int(int32) # Last part number of a range of requested presigned URLs}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(201) {urls: [map]} # Created\n@errors {400: Bad Request, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 504: Gateway Timeout, 507: Insufficient Storage}\n\n@endpoint GET /v4/public/shares/downloads/{access_key}\n@desc Request public Download Share information\n@required {access_key: str # Access key}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {isProtected: bool, fileName: str, size: int(int64), limitReached: bool, creatorName: str, createdAt: str(date-time), hasDownloadLimit: bool, mediaType: str, name: str, creatorUsername: str, expireAt: str(date-time), notes: str, isEncrypted: bool, fileKey: map{key: str, iv: str, version: str, tag: str}, privateKeyContainer: map{version: str, privateKey: str, createdAt: str(date-time), createdBy: int(int64)}, virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}, hideDownload: bool} # OK\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable}\n\n@endpoint POST /v4/public/shares/downloads/{access_key}\n@desc Generate download URL\n@required {access_key: str # Access key}\n@optional {password: str # Password (only for password-protected shares)}\n@returns(201) {downloadUrl: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable}\n\n@endpoint HEAD /v4/public/shares/downloads/{access_key}\n@desc Check public Download Share password\n@required {access_key: str # Access key}\n@optional {password: str # Download share password}\n@returns(200) OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable}\n\n@endgroup\n\n@group provisioning\n@endpoint GET /v4/provisioning/webhooks\n@desc Request list of tenant webhooks\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string, X-Sds-Service-Token: str # Service Authentication token}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable}\n\n@endpoint POST /v4/provisioning/webhooks\n@desc Create tenant webhook\n@required {name: str # Name, eventTypeNames: [str] # List of names of event types, url: str # URL (must begin with the `HTTPS` scheme)}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), X-Sds-Service-Token: str # Service Authentication token, secret: str # Secret; used for event message signatures, isEnabled: bool # Is enabled, triggerExampleEvent: bool # If set to true, an example event is being created}\n@returns(201) {id: int(int64), name: str, url: str, secret: str, isEnabled: bool, expireAt: str(date-time), eventTypeNames: [str], createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, failStatus: int(int32)} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable}\n\n@endpoint POST /v4/provisioning/webhooks/{webhook_id}/reset_lifetime\n@desc Reset tenant webhook lifetime\n@required {webhook_id: int(int64) # Webhook ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), X-Sds-Service-Token: str # Service Authentication token}\n@returns(200) {id: int(int64), name: str, url: str, secret: str, isEnabled: bool, expireAt: str(date-time), eventTypeNames: [str], createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, failStatus: int(int32)} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable}\n\n@endpoint GET /v4/provisioning/customers\n@desc Request list of customers\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string, include_attributes: bool # Include custom customer attributes., X-Sds-Service-Token: str # Service Authentication token}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable}\n\n@endpoint POST /v4/provisioning/customers\n@desc Create customer\n@required {customerContractType: str(demo/free/pay) # Customer type, quotaMax: int(int64) # Maximal disc space which can be allocated by customer in bytes. -1 for unlimited, userMax: int(int32) # Maximal number of users, firstAdminUser: map{firstName!: str, lastName!: str, userName: str, authData: map, receiverLanguage: str, notifyUser: bool, email: str, phone: str, title: str, language: str, authMethods: [map], needsToChangeUserName: bool, password: str, needsToChangePassword: bool, login: str, gender: str} # First administrator user}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), X-Sds-Service-Token: str # Service Authentication token, companyName: str # Company name, trialDays: int(int32) # Number of days left for trial period (relevant only for type `demo`)  (not used), isLocked: bool=false # Customer is locked:  * `false` - unlocked  * `true` - locked    All users of this customer will be blocked and can not login anymore., customerAttributes: map{items!: [map]} # List of customer attributes, providerCustomerId: str # Provider customer ID, webhooksMax: int(int64) # Maximal number of webhooks, lockStatus: bool=false # Customer lock status:  * `false` - unlocked  * `true` - locked    Please use `isLocked` instead.  All users of this customer will be blocked and can not login anymore., activationCode: str # Customer activation code string:  * valid only for types `free` and `demo`  * for `pay` customers it is empty}\n@returns(201) {id: int(int64), companyName: str, customerContractType: str, quotaMax: int(int64), userMax: int(int32), isLocked: bool, trialDays: int(int32), createdAt: str(date-time), firstAdminUser: map{firstName: str, lastName: str, userName: str, authData: map{method: str, login: str, password: str, mustChangePassword: bool, adConfigId: int(int32), oidConfigId: int(int32)}, receiverLanguage: str, notifyUser: bool, email: str, phone: str, title: str, language: str, authMethods: [map], needsToChangeUserName: bool, password: str, needsToChangePassword: bool, login: str, gender: str}, customerAttributes: map{items: [map]}, providerCustomerId: str, webhooksMax: int(int64), customerUuid: str, activationCode: str, lockStatus: bool} # Created\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 404: Not Found, 406: Not Acceptable, 409: Conflict}\n\n@endgroup\n\n@group nodes\n@endpoint POST /v4/nodes/{node_id}/move_to\n@desc Move node(s)\n@required {node_id: int(int64) # Target parent node ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), items: [map{id!: int(int64), name: str, timestampCreation: str(date-time), timestampModification: str(date-time)}] # List of nodes to be moved, resolutionStrategy: str(autorename/overwrite/fail)=autorename # Node conflict resolution strategy:  * `autorename`  * `overwrite`  * `fail`, keepShareLinks: bool=false # Preserve Download Share Links and point them to the new node., nodeIds: [int(int64)] # Node IDs  Please use `items` instead.}\n@returns(200) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # OK\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed, 507: Insufficient Storage}\n\n@endpoint POST /v4/nodes/{node_id}/favorite\n@desc Mark a node (room, folder or file) as favorite\n@required {node_id: int(int64) # Node ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(201) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/nodes/{node_id}/favorite\n@desc Unmark a node (room, folder or file) as favorite\n@required {node_id: int(int64) # Node ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/{node_id}/copy_to\n@desc Copy node(s)\n@required {node_id: int(int64) # Target parent node ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), items: [map{id!: int(int64), name: str, timestampCreation: str(date-time), timestampModification: str(date-time)}] # List of nodes to be copied, resolutionStrategy: str(autorename/overwrite/fail)=autorename # Node conflict resolution strategy:  * `autorename`  * `overwrite`  * `fail`, keepShareLinks: bool=false # Preserve Download Share Links and point them to the new node., nodeIds: [int(int64)] # Node IDs  Please use `items` instead.}\n@returns(201) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # Created\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed, 507: Insufficient Storage}\n\n@endpoint GET /v4/nodes/{node_id}/comments\n@desc Request list of node comments\n@required {node_id: int(int64) # Node ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., hide_deleted: bool # Hide deleted comments (default: false)}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/{node_id}/comments\n@desc Create node comment\n@required {node_id: int(int64) # Node ID, text: str # Comment text}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(201) {id: int(int64), text: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, isChanged: bool, isDeleted: bool} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/zip\n@desc Generate download URL for ZIP download\n@required {nodeIds: [int(int64)] # List of node IDs}\n@returns(200) {downloadUrl: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/zip/download\n@desc Download files / folders as ZIP archive\n@required {nodeIds: [int(int64)] # List of node IDs}\n@returns(200) OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/rooms\n@desc Create new room\n@required {name: str # Name}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), parentId: int(int64) # Parent room ID or `null` (not 0) to create a top level room, recycleBinRetentionPeriod: int(int32) # Retention period for deleted nodes in days, quota: int(int64) # Quota in byte, inheritPermissions: bool # Inherit permissions from parent room  (default: `false` if `parentId` is `0`; otherwise: `true`), adminIds: [int(int64)] # List of user ids  A room requires at least one admin (user or group), adminGroupIds: [int(int64)] # List of group ids  A room requires at least one admin (user or group), newGroupMemberAcceptance: str(autoallow/pending)=autoallow # Behaviour when new users are added to the group:  * `autoallow`  * `pending`    Only relevant if `adminGroupIds` has items., notes: str # User notes  Use empty string to remove., hasActivitiesLog: bool=true # Is activities log active (for rooms only), classification: int(int32)(1/2/3/4)=2 # Classification ID:  * `1` - public  * `2` - internal  * `3` - confidential  * `4` - strictly confidential    Provided (or default) classification is taken from room  when file gets uploaded without any classification., timestampCreation: str(date-time) # Time the node was created on external file system  (default: current server datetime in UTC format), timestampModification: str(date-time) # Time the content of a node was last modified on external file system  (default: current server datetime in UTC format), hasRecycleBin: bool # Is recycle bin active (for rooms only)  Recycle bin is always on (disabling is not possible).}\n@returns(201) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/rooms/{room_id}/s3_tags\n@desc Request list of all assigned S3 tags to the room\n@required {room_id: int(int64) # Room ID}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/rooms/{room_id}/s3_tags\n@desc Set S3 tags for a room\n@required {room_id: int(int64) # Room ID, ids: [int(int64)] # List of S3 tag IDs}\n@returns(201) {items: [map]} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/rooms/{room_id}/keypairs\n@desc Request all room rescue key pairs\n@required {room_id: int(int64) # Room ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) OK\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/rooms/{room_id}/keypairs\n@desc Create key pair and preserve copy of old private key\n@required {room_id: int(int64) # Room ID, privateKeyContainer: map{version!: str, privateKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Private key container, publicKeyContainer: map{version!: str, publicKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Public key container, previousPrivateKey: map{version!: str, privateKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Private key container}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/rooms/{room_id}/keypair\n@desc Request room rescue key\n@required {room_id: int(int64) # Room ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), version: str # Version (NEW)}\n@returns(200) {privateKeyContainer: map{version: str, privateKey: str, createdAt: str(date-time), createdBy: int(int64)}, publicKeyContainer: map{version: str, publicKey: str, createdAt: str(date-time), createdBy: int(int64)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/rooms/{room_id}/keypair\n@desc Set room's rescue key pair\n@required {room_id: int(int64) # Room ID, privateKeyContainer: map{version!: str, privateKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Private key container, publicKeyContainer: map{version!: str, publicKey!: str, createdAt: str(date-time), createdBy: int(int64)} # Public key container}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint DELETE /v4/nodes/rooms/{room_id}/keypair\n@desc Remove rooms's rescue key pair\n@required {room_id: int(int64) # Room ID}\n@optional {version: str # Version (NEW)}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/folders\n@desc Create new folder\n@required {parentId: int(int64) # Parent node ID (room or folder), name: str # Name}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), notes: str # User notes  Use empty string to remove., classification: int(int32)(1/2/3/4) # Classification ID:  * `1` - public  * `2` - internal  * `3` - confidential  * `4` - strictly confidential    Provided (or default) classification is taken from room  when file gets uploaded without any classification., timestampCreation: str(date-time) # Time the node was created on external file system  (default: current server datetime in UTC format), timestampModification: str(date-time) # Time the content of a node was last modified on external file system  (default: current server datetime in UTC format)}\n@returns(201) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/files/{file_id}/downloads\n@desc Generate download URL\n@required {file_id: int(int64) # File ID}\n@returns(200) {downloadUrl: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/files/uploads\n@desc Create new file upload channel\n@required {parentId: int(int64) # Parent node ID (room or folder), name: str # File name}\n@optional {classification: int(int32)(1/2/3/4) # Classification ID:  * `1` - public  * `2` - internal  * `3` - confidential  * `4` - strictly confidential    (default: classification from parent room), size: int(int64) # File size in byte, expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information, notes: str # User notes  Use empty string to remove., directS3Upload: bool=false # Upload direct to S3, timestampCreation: str(date-time) # Time the node was created on external file system  (default: current server datetime in UTC format), timestampModification: str(date-time) # Time the content of a node was last modified on external file system  (default: current server datetime in UTC format)}\n@returns(201) {uploadUrl: str, uploadId: str, token: str} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 504: Gateway Timeout, 507: Insufficient Storage}\n\n@endpoint POST /v4/nodes/files/uploads/{upload_id}/s3_urls\n@desc Generate presigned URLs for S3 file upload\n@required {upload_id: str # Upload channel ID, size: int(int64) # `Content-Length` header size for each presigned URL (in bytes)  *MUST* be >= 5 MB except the last part., firstPartNumber: int(int32) # First part number of a range of requested presigned URLs (for S3 it is: `1`), lastPartNumber: int(int32) # Last part number of a range of requested presigned URLs}\n@returns(201) {urls: [map]} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 504: Gateway Timeout, 507: Insufficient Storage}\n\n@endpoint POST /v4/nodes/files/keys\n@desc Set file keys for a list of users and files\n@required {items: [map{fileId!: int(int64), userId!: int(int64), fileKey!: map}] # List of user file keys}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/files/generate_verdict_info\n@desc Generate Virus Protection Verdict Information\n@required {nodeIds: [int(int64)] # List of node IDs}\n@returns(200) OK\n@errors {400: Bad Request, 401: Unauthorized, 402: Payment Required, 403: Forbidden, 404: Not Found, 412: Precondition Failed}\n\n@endpoint POST /v4/nodes/deleted_nodes/actions/restore\n@desc Restore deleted nodes\n@required {deletedNodeIds: [int(int64)] # List of deleted node IDs}\n@optional {resolutionStrategy: str(autorename/overwrite/fail)=autorename # Node conflict resolution strategy:  * `autorename`  * `overwrite`  * `fail`, keepShareLinks: bool=false # Preserve Download Share Links and point them to the new node., parentId: int(int64) # Node parent ID  (default: previous parent ID)}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed, 507: Insufficient Storage}\n\n@endgroup\n\n@group groups\n@endpoint GET /v4/groups\n@desc Request list of user groups\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/groups\n@desc Create new user group\n@required {name: str # Group name}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), expiration: map{enableExpiration!: bool, expireAt: str(date-time)} # Expiration information}\n@returns(201) {id: int(int64), name: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, cntUsers: int(int32), updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), groupRoles: map{items: [map]}} # Created\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed}\n\n@endpoint GET /v4/groups/{group_id}/users\n@desc Request group member users or / and users who can become a member\n@required {group_id: int(int64) # Group ID}\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/groups/{group_id}/users\n@desc Add group members\n@required {group_id: int(int64) # Group ID, ids: [int(int64)] # List of user IDs}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), name: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, cntUsers: int(int32), updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), groupRoles: map{items: [map]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/groups/{group_id}/users\n@desc Remove group members\n@required {group_id: int(int64) # Group ID, ids: [int(int64)] # List of user IDs}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), name: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, cntUsers: int(int32), updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), groupRoles: map{items: [map]}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group datev\n@endpoint GET /v4/datev/mst/{config_id}/taxyears\n@desc Request all addable Datev MST tax years\n@required {config_id: int(int64) # Configuration ID}\n@returns(200) {years: [str]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/datev/mst/{config_id}/taxyears\n@desc Create new Datev MST tax year\n@required {config_id: int(int64) # Configuration ID, taxYear: str # Datev tax year}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/datev/mst/{config_id}/sync\n@desc Execute Datev MST sync\n@required {config_id: int(int64) # Configuration ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/datev/mst/authorization/start\n@desc Start Datev MST authorization\n@required {roomId: int(int64) # Room ID, consultantId: int(int64) # Datev Consultant ID, clientId: int(int64) # Datev Client ID, baseId: int(int64) # Datev Base ID}\n@returns(200) {url: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed, 502: Bad Gateway}\n\n@endpoint POST /v4/datev/mst/authorization/complete\n@desc Complete Datev MST authorization\n@required {state: str # OAuth State, code: str # OAuth Code}\n@returns(200) {id: int(int64), datevIntegration: int(int32), roomId: int(int64), consultantId: int(int64), clientId: int(int64), baseId: int(int64), authorizingUserId: int(int64), authorizingUserName: str, refreshTokenExpireAt: str(date-time), errorDetails: map{code: int(int32), message: str, debugInfo: str, errorCode: int(int32)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed, 502: Bad Gateway}\n\n@endpoint POST /v4/datev/duo/{config_id}/sync\n@desc Execute Datev DUO sync\n@required {config_id: int(int64) # Configuration ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint POST /v4/datev/duo/authorization/start\n@desc Start Datev DUO authorization\n@required {roomId: int(int64) # Room ID, consultantId: int(int64) # Datev Consultant ID, clientId: int(int64) # Datev Client ID}\n@returns(200) {url: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed, 502: Bad Gateway}\n\n@endpoint POST /v4/datev/duo/authorization/complete\n@desc Complete Datev DUO authorization\n@required {state: str # OAuth State, code: str # OAuth Code}\n@returns(200) {id: int(int64), datevIntegration: int(int32), roomId: int(int64), consultantId: int(int64), clientId: int(int64), baseId: int(int64), authorizingUserId: int(int64), authorizingUserName: str, refreshTokenExpireAt: str(date-time), errorDetails: map{code: int(int32), message: str, debugInfo: str, errorCode: int(int32)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 409: Conflict, 412: Precondition Failed, 502: Bad Gateway}\n\n@endgroup\n\n@group auth\n@endpoint POST /v4/auth/reset_password\n@desc Request password reset\n@optional {userName: str # Username, creatorLanguage: str # IETF language tag, language: str # Language ID or ISO 639-1 code, login: str # User login name}\n@returns(204) No Content\n@errors {400: Bad Request, 406: Not Acceptable}\n\n@endpoint POST /v4/auth/recover_username\n@desc Recover username\n@required {email: str # Email}\n@optional {creatorLanguage: str # IETF language tag}\n@returns(204) No Content\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable}\n\n@endgroup\n\n@group users\n@endpoint GET /v4/users/{user_id}/rooms\n@desc Request rooms granted to the user or / and rooms that can be granted\n@required {user_id: int(int64) # User ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/users/{user_id}/roles\n@desc Request user's granted roles\n@required {user_id: int(int64) # User ID}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/users/{user_id}/last_admin_rooms\n@desc Request rooms where the user is last admin\n@required {user_id: int(int64) # User ID}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/users/{user_id}/groups\n@desc Request groups that user is a member of or / and can become a member\n@required {user_id: int(int64) # User ID}\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group user\n@endpoint GET /v4/user/ping\n@desc (authenticated) Ping\n@returns(200) OK\n@errors {401: Unauthorized, 406: Not Acceptable}\n\n@endpoint GET /v4/user/oauth/authorizations\n@desc Request list of OAuth client authorizations\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), filter: str # Filter string, sort: str # Sort string}\n@returns(200) OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/user/oauth/approvals\n@desc Request list of OAuth client approvals\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), sort: str # Sort string}\n@returns(200) OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/user/notifications/config\n@desc Request list of notification configurations\n@returns(200) {items: [map]} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/user/account/mfa\n@desc Request information about the user's mfa status\n@returns(200) {mfaEnforced: bool, mfaSetups: [map]} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/user/account/mfa\n@desc Using emergency-code\n@required {emergency_code: str}\n@returns(200) OK\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/user/account/customer/keypair\n@desc Request customer's key pair\n@returns(200) {privateKeyContainer: map{version: str, privateKey: str, createdAt: str(date-time), createdBy: int(int64)}, publicKeyContainer: map{version: str, publicKey: str, createdAt: str(date-time), createdBy: int(int64)}} # OK\n@errors {401: Unauthorized, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group system\n@endpoint GET /v4/system/config/storage/s3/tags/{id}\n@desc Request S3 tag\n@required {id: int(int64) # S3 tag ID}\n@returns(200) {id: int(int64), key: str, value: str, isMandatory: bool} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/system/config/storage/s3/tags/{id}\n@desc Remove S3 tag\n@required {id: int(int64) # S3 tag ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/settings/infrastructure\n@desc Request infrastructure properties\n@returns(200) {smsConfigEnabled: bool, mediaServerConfigEnabled: bool, s3DefaultRegion: str, s3EnforceDirectUpload: bool, isDracoonCloud: bool, tenantUuid: str} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/system/config/policies/passwords/{password_type}\n@desc Request password policies for a certain password type\n@required {password_type: str(login/encryption/shares) # Password type}\n@returns(200) {loginPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectDictionaryWords: bool, rejectUserInfo: bool, rejectKeyboardPatterns: bool, numberOfArchivedPasswords: int(int32), passwordExpiration: map{enabled: bool, maxPasswordAge: int(int32)}, userLockout: map{enabled: bool, maxNumberOfLoginFailures: int(int32), lockoutPeriod: int(int32)}, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}, sharesPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectDictionaryWords: bool, rejectUserInfo: bool, rejectKeyboardPatterns: bool, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}, encryptionPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectUserInfo: bool, rejectKeyboardPatterns: bool, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group shares\n@endpoint GET /v4/shares/uploads/{share_id}/qr\n@desc Request Upload Share via QR Code\n@required {share_id: int(int64) # Share ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), name: str, targetId: int(int64), isProtected: bool, accessKey: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), targetPath: str, isEncrypted: bool, notes: str, internalNotes: str, filesExpiryPeriod: int(int32), cntFiles: int(int32), cntUploads: int(int32), showUploadedFiles: bool, dataUrl: str, maxSlots: int(int32), maxSize: int(int64), targetType: str, showCreatorName: bool, showCreatorUsername: bool, notifyCreator: bool, recipients: str, smsRecipients: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/shares/downloads/{share_id}/qr\n@desc Request Download Share via QR Code\n@required {share_id: int(int64) # Share ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), name: str, nodeId: int(int64), accessKey: str, cntDownloads: int(int32), createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, notes: str, internalNotes: str, showCreatorName: bool, showCreatorUsername: bool, isProtected: bool, expireAt: str(date-time), maxDownloads: int(int32), nodePath: str, dataUrl: str, isEncrypted: bool, nodeType: str, hideDownload: bool, classification: int(int32), notifyCreator: bool, recipients: str, smsRecipients: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group settings\n@endpoint GET /v4/settings/webhooks/event_types\n@desc Request list of event types\n@returns(200) {items: [map]} # OK\n@errors {401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group roles\n@endpoint GET /v4/roles\n@desc Request all roles with assigned rights\n@returns(200) {items: [map]} # OK\n@errors {401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group resources\n@endpoint GET /v4/resources/users/{user_id}/avatar/{uuid}\n@desc Request user avatar\n@required {uuid: str # UUID of the avatar, user_id: int(int64) # User ID}\n@returns(200) {avatarUri: str, avatarUuid: str, isCustomAvatar: bool} # OK\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable}\n\n@endpoint GET /v4/resources/user/notifications/scopes\n@desc Request list of subscription scopes\n@returns(200) {items: [map]} # OK\n@errors {406: Not Acceptable}\n\n@endgroup\n\n@group public\n@endpoint GET /v4/public/time\n@desc Request system time\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {time: str(date-time)} # OK\n@errors {406: Not Acceptable}\n\n@endpoint GET /v4/public/system/info\n@desc Request system information\n@optional {is_enabled: bool # Show only enabled authentication methods}\n@returns(200) {languageDefault: str, hideLoginInputFields: bool, s3Hosts: [str], s3EnforceDirectUpload: bool, useS3Storage: bool, authMethods: [map]} # OK\n@errors {400: Bad Request, 406: Not Acceptable}\n\n@endpoint GET /v4/public/system/info/auth/openid\n@desc Request OpenID Connect provider authentication information\n@optional {is_global_available: bool # Show only global available items}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 406: Not Acceptable}\n\n@endpoint GET /v4/public/system/info/auth/ad\n@desc Request Active Directory authentication information\n@optional {is_global_available: bool # Show only global available items}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 406: Not Acceptable}\n\n@endpoint GET /v4/public/software/version\n@desc Request software version information\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {restApiVersion: str, sdsServerVersion: str, version: str, buildDate: str(date-time), scmRevisionNumber: str, isDracoonCloud: bool} # OK\n@errors {406: Not Acceptable}\n\n@endpoint GET /v4/public/software/third_party_dependencies\n@desc Request third-party software dependencies\n@returns(200) OK\n@errors {406: Not Acceptable}\n\n@endgroup\n\n@group provisioning\n@endpoint GET /v4/provisioning/webhooks/event_types\n@desc Request list of event types\n@optional {X-Sds-Service-Token: str # Service Authentication token}\n@returns(200) {items: [map]} # OK\n@errors {401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable}\n\n@endpoint GET /v4/provisioning/customers/{customer_id}/users\n@desc Request list of customer users\n@required {customer_id: int(int64) # Customer ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string, include_attributes: bool # Include custom user attributes., include_roles: bool # Include roles, include_manageable_rooms: bool # Include hasManageableRooms (deprecated), X-Sds-Service-Token: str # Service Authentication token}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable}\n\n@endgroup\n\n@group nodes\n@endpoint GET /v4/nodes\n@desc Request list of nodes\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), depth_level: int(int32) # * `0` - top level nodes only  * `n` (any positive number) - include `n` levels starting from the current node, parent_id: int(int64) # Parent node ID.  Only rooms and folders can be parents.  Parent ID `0` or empty is the root node., room_manager: bool # Show all rooms for management perspective.  Only possible for _Rooms Managers_ / _Room Admins_.  For all other users, it will be ignored., filter: str # Filter string, sort: str # Sort string, offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., show_subscription: bool # Show subscription information (default: false)}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request * [-80024] Invalid range parameters, 401: Unauthorized, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/nodes\n@desc Remove nodes\n@required {nodeIds: [int(int64)] # List of node IDs}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/{node_id}\n@desc Request node\n@required {node_id: int(int64) # Node ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), referenceId: int(int64), type: str, name: str, timestampCreation: str(date-time), timestampModification: str(date-time), parentId: int(int64), parentPath: str, createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, expireAt: str(date-time), hash: str, fileType: str, mediaType: str, size: int(int64), classification: int(int32), notes: str, permissions: map{manage: bool, read: bool, create: bool, change: bool, delete: bool, manageDownloadShare: bool, manageUploadShare: bool, readRecycleBin: bool, restoreRecycleBin: bool, deleteRecycleBin: bool}, inheritPermissions: bool, isEncrypted: bool, encryptionInfo: map{userKeyState: str, roomKeyState: str, dataSpaceKeyState: str}, cntDeletedVersions: int(int32), cntComments: int(int32), cntDownloadShares: int(int32), cntUploadShares: int(int32), recycleBinRetentionPeriod: int(int32), hasActivitiesLog: bool, quota: int(int64), isFavorite: bool, isSubscribed: bool, branchVersion: int(int64), mediaToken: str, isBrowsable: bool, cntRooms: int(int32), cntFolders: int(int32), cntFiles: int(int32), authParentId: int(int64), cntChildren: int(int32), children: [map], virusProtectionInfo: map{verdict: str, lastCheckedAt: str(date-time), sha256: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/nodes/{node_id}\n@desc Remove node\n@required {node_id: int(int64) # Node ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/{node_id}/parents\n@desc Request list of parent nodes\n@required {node_id: int(int64) # Node ID}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/{node_id}/deleted_nodes\n@desc Request list of deleted nodes\n@required {node_id: int(int64) # Parent ID (can only be a room ID)}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), filter: str # Filter string, sort: str # Sort string, offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`).}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/nodes/{node_id}/deleted_nodes\n@desc Empty recycle bin\n@required {node_id: int(int64) # Room ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed, 507: Insufficient Storage}\n\n@endpoint GET /v4/nodes/{node_id}/deleted_nodes/versions\n@desc Request deleted versions of nodes\n@required {node_id: int(int64) # Parent ID (room or folder ID), type: str # Node type, name: str # Node name}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), sort: str # Sort string, offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`).}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/search\n@desc Search nodes\n@required {search_string: str # Search string}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), depth_level: int(int32) # * `0` - top level nodes only (default)  * `-1` - full tree  * `n` (any positive number) - include `n` levels starting from the current node, parent_id: int(int64) # Parent node ID.  Only rooms and folders can be parents.  Parent ID `0` or empty is the root node., filter: str # Filter string, sort: str # Sort string, offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., show_subscription: bool # Show subscription information (default: false)}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/rooms/{room_id}/events\n@desc Request events of a room\n@required {room_id: int(int64) # Room ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), sort: str # Sort string, offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., date_start: str # Filter events from given date   e.g. `2015-12-31T23:59:00`, date_end: str # Filter events until given date   e.g. `2015-12-31T23:59:00`, type: int(int32) # Operation ID   cf. `GET /eventlog/operations`, user_id: int(int64) # User ID, status: int(int32) # Operation status:  * `0` - Success  * `2` - Error}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/missingFileKeys\n@desc Request files without user's file key\n@optional {offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., room_id: int(int64) # Room ID, file_id: int(int64) # File ID, user_id: int(int64) # User ID, use_key: str(room_rescue_key/system_rescue_key/previous_user_key/previous_room_rescue_key/previous_system_rescue_key) # Determines which key should be used (NEW)}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map], users: [map], files: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/files/{file_id}/user_file_key\n@desc Request user's file key\n@required {file_id: int(int64) # File ID}\n@optional {version: str # Version (NEW)}\n@returns(200) {key: str, iv: str, version: str, tag: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/files/{file_id}/data_space_file_key\n@desc Request system rescue key\n@required {file_id: int(int64) # File ID}\n@optional {version: str # Version (NEW)}\n@returns(200) {key: str, iv: str, version: str, tag: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/files/{file_id}/data_room_file_key\n@desc Request room rescue key\n@required {file_id: int(int64) # File ID}\n@optional {version: str # Version (NEW)}\n@returns(200) {key: str, iv: str, version: str, tag: str} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/files/versions/{reference_id}\n@desc Request list of file versions\n@required {reference_id: int(int64) # Reference ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`).}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {401: Unauthorized, 412: Precondition Failed}\n\n@endpoint GET /v4/nodes/deleted_nodes/{deleted_node_id}\n@desc Request deleted node\n@required {deleted_node_id: int(int64) # Deleted node ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/))}\n@returns(200) {id: int(int64), referenceId: int(int64), parentId: int(int64), parentPath: str, type: str, name: str, expireAt: str(date-time), accessedAt: str(date-time), isEncrypted: bool, notes: str, size: int(int64), classification: int(int32), createdAt: str(date-time), createdBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, updatedAt: str(date-time), updatedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}, deletedAt: str(date-time), deletedBy: map{id: int(int64), userType: str, avatarUuid: str, userName: str, firstName: str, lastName: str, email: str, title: str, displayName: str}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group groups\n@endpoint GET /v4/groups/{group_id}/rooms\n@desc Request rooms granted to the group or / and rooms that can be granted\n@required {group_id: int(int64) # Group ID}\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/groups/{group_id}/roles\n@desc Request list of roles assigned to the group\n@required {group_id: int(int64) # Group ID}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/groups/{group_id}/last_admin_rooms\n@desc Request rooms where the group is defined as last admin group\n@required {group_id: int(int64) # Group ID}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group eventlog\n@endpoint GET /v4/eventlog/operations\n@desc Request allowed Log Operations\n@optional {is_deprecated: bool # Show only deprecated operations}\n@returns(200) {operationList: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/eventlog/events\n@desc Request system events\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), sort: str # Sort string, offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., date_start: str # Filter events from given date   e.g. `2015-12-31T23:59:00`, date_end: str # Filter events until given date   e.g. `2015-12-31T23:59:00`, type: int(int32) # Operation ID   cf. `GET /eventlog/operations`, user_id: int(int64) # User ID, status: str(0/2) # Operation status:  * `0` - Success  * `2` - Error, user_client: str # User client}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/eventlog/audits/nodes\n@desc Request node assigned users with permissions\n@optional {X-Sds-Date-Format: str(UTC/LOCAL/OFFSET/EPOCH/LEET) # Date time format (cf. [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) & [leettime.de](http://leettime.de/)), offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string}\n@returns(200) OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/eventlog/audits/node_info\n@desc Request nodes\n@optional {parent_id: int(int64) # Parent node ID.  Only rooms can be parents.  Parent ID `0` or empty is the root node., offset: int(int32) # Range offset, limit: int(int32) # Range limit.  Maximum 500.   For more results please use paging (`offset` + `limit`)., filter: str # Filter string, sort: str # Sort string}\n@returns(200) {range: map{offset: int(int64), limit: int(int64), total: int(int64)}, items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group downloads\n@endpoint GET /v4/downloads/zip/{token}\n@desc Download ZIP archive\n@required {token: str # Download token}\n@returns(200) OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable}\n\n@endpoint GET /v4/downloads/avatar/{user_id}/{uuid}\n@desc Download avatar\n@required {user_id: int(int64) # User ID, uuid: str # UUID of the avatar}\n@returns(200) OK\n@errors {400: Bad Request, 404: Not Found, 406: Not Acceptable}\n\n@endgroup\n\n@group datev\n@endpoint GET /v4/datev\n@desc Request Datev sync configuration for room\n@required {room_id: int(int64) # Room ID}\n@returns(200) {id: int(int64), datevIntegration: int(int32), roomId: int(int64), consultantId: int(int64), clientId: int(int64), baseId: int(int64), authorizingUserId: int(int64), authorizingUserName: str, refreshTokenExpireAt: str(date-time), errorDetails: map{code: int(int32), message: str, debugInfo: str, errorCode: int(int32)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/datev/mst\n@desc Request list of Datev MST sync configurations\n@optional {room_id: int(int64) # Room ID}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/datev/mst/{config_id}\n@desc Request Datev MST sync configuration\n@required {config_id: int(int64) # Configuration ID}\n@returns(200) {id: int(int64), datevIntegration: int(int32), roomId: int(int64), consultantId: int(int64), clientId: int(int64), baseId: int(int64), authorizingUserId: int(int64), authorizingUserName: str, refreshTokenExpireAt: str(date-time), errorDetails: map{code: int(int32), message: str, debugInfo: str, errorCode: int(int32)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/datev/mst/{config_id}\n@desc Remove Datev MST sync configuration\n@required {config_id: int(int64) # Configuration ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/datev/mst/{config_id}/files\n@desc Request information about Datev MST sync files\n@required {config_id: int(int64) # Configuration ID}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/datev/mst/{config_id}/files/{file_id}\n@desc Request information about a Datev MST sync file\n@required {config_id: int(int64) # Configuration ID, file_id: int(int64) # File ID}\n@returns(200) {syncConfigId: int(int64), fileId: int(int64), datevFileId: str, uploadStatus: str, uploadStartedAt: str(date-time), uploadCompletedAt: str(date-time), uploadErrorDetails: map{code: int(int32), message: str, debugInfo: str, errorCode: int(int32)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/datev/duo\n@desc Request list of Datev DUO sync configurations\n@optional {room_id: int(int64) # Room ID}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/datev/duo/{config_id}\n@desc Request Datev DUO sync configuration\n@required {config_id: int(int64) # Configuration ID}\n@returns(200) {id: int(int64), datevIntegration: int(int32), roomId: int(int64), consultantId: int(int64), clientId: int(int64), baseId: int(int64), authorizingUserId: int(int64), authorizingUserName: str, refreshTokenExpireAt: str(date-time), errorDetails: map{code: int(int32), message: str, debugInfo: str, errorCode: int(int32)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/datev/duo/{config_id}\n@desc Remove Datev DUO sync configuration\n@required {config_id: int(int64) # Configuration ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/datev/duo/{config_id}/files\n@desc Request information about Datev DUO sync files\n@required {config_id: int(int64) # Configuration ID}\n@returns(200) {items: [map]} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/datev/duo/{config_id}/files/{file_id}\n@desc Request information about a Datev DUO sync file\n@required {config_id: int(int64) # Configuration ID, file_id: int(int64) # File ID}\n@returns(200) {syncConfigId: int(int64), fileId: int(int64), datevFileId: str, uploadStatus: str, uploadStartedAt: str(date-time), uploadCompletedAt: str(date-time), uploadErrorDetails: map{code: int(int32), message: str, debugInfo: str, errorCode: int(int32)}} # OK\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group config\n@endpoint GET /v4/config/info/s3_tags\n@desc Request list of configured S3 tags\n@returns(200) {items: [map]} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/config/info/product_packages\n@desc Request list of product packages\n@returns(200) {packages: [map]} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/config/info/product_packages/current\n@desc Request list of currently enabled product packages\n@returns(200) {packages: [map]} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/config/info/policies/virus_protection\n@desc Request virus protection\n@returns(200) {isVirusProtectionEnabled: bool} # OK\n@errors {401: Unauthorized, 406: Not Acceptable}\n\n@endpoint GET /v4/config/info/policies/passwords\n@desc Request password policies\n@returns(200) {loginPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectDictionaryWords: bool, rejectUserInfo: bool, rejectKeyboardPatterns: bool, numberOfArchivedPasswords: int(int32), passwordExpiration: map{enabled: bool, maxPasswordAge: int(int32)}, userLockout: map{enabled: bool, maxNumberOfLoginFailures: int(int32), lockoutPeriod: int(int32)}, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}, sharesPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectDictionaryWords: bool, rejectUserInfo: bool, rejectKeyboardPatterns: bool, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}, encryptionPasswordPolicies: map{characterRules: map{mustContainCharacters: [str], numberOfCharacteristicsToEnforce: int(int32)}, minLength: int(int32), rejectUserInfo: bool, rejectKeyboardPatterns: bool, updatedAt: str(date-time), updatedBy: map{id: int(int64)}}} # OK\n@errors {401: Unauthorized, 406: Not Acceptable}\n\n@endpoint GET /v4/config/info/policies/guest_users\n@desc Request guest users policies\n@returns(200) {isInviteUsersEnabled: bool} # OK\n@errors {401: Unauthorized, 406: Not Acceptable}\n\n@endpoint GET /v4/config/info/policies/classifications\n@desc Request classification policies\n@returns(200) {shareClassificationPolicies: map{classificationRequiresSharePassword: int(int32)}} # OK\n@errors {401: Unauthorized, 406: Not Acceptable}\n\n@endpoint GET /v4/config/info/policies/algorithms\n@desc Request algorithms\n@returns(200) {fileKeyAlgorithms: [map], keyPairAlgorithms: [map]} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/config/info/notifications/channels\n@desc Request list of notification channels\n@returns(200) {items: [map]} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/config/info/infrastructure\n@desc Request infrastructure properties\n@returns(200) {smsConfigEnabled: bool, mediaServerConfigEnabled: bool, s3DefaultRegion: str, s3EnforceDirectUpload: bool, isDracoonCloud: bool, tenantUuid: str} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/config/info/general\n@desc Request general settings\n@returns(200) {sharePasswordSmsEnabled: bool, cryptoEnabled: bool, emailNotificationButtonEnabled: bool, eulaEnabled: bool, useS3Storage: bool, s3TagsEnabled: bool, hideLoginInputFields: bool, authTokenRestrictions: map{restrictionEnabled: bool, accessTokenValidity: int(int32), refreshTokenValidity: int(int32)}, mediaServerEnabled: bool, weakPasswordEnabled: bool, homeRoomsActive: bool, homeRoomParentId: int(int64), subscriptionPlan: int(int32)} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint GET /v4/config/info/defaults\n@desc Request default values\n@returns(200) {languageDefault: str, downloadShareDefaultExpirationPeriod: int(int32), uploadShareDefaultExpirationPeriod: int(int32), fileDefaultExpirationPeriod: int(int32), globalRecycleBinRetentionPeriod: int(int32), globalRecycleBinRetentionPeriodLegacy: int(int32), nonmemberViewerDefault: bool, hideLoginInputFields: bool} # OK\n@errors {401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group users\n@endpoint DELETE /v4/users/{user_id}/userAttributes/{key}\n@desc Remove custom user attribute\n@required {user_id: int(int64) # User ID, key: str # Key}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/users/{user_id}/mfa\n@desc Reset MFA for user\n@required {user_id: int(int64)}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group user\n@endpoint DELETE /v4/user/profileAttributes/{key}\n@desc Remove user profile attribute\n@required {key: str # Key}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/user/oauth/authorizations/{client_id}\n@desc Remove all OAuth authorizations of a client\n@required {client_id: str # OAuth client ID}\n@returns(204) No Content\n@errors {401: Unauthorized, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/user/oauth/authorizations/{client_id}/{authorization_id}\n@desc Remove a OAuth authorization\n@required {client_id: str # OAuth client ID, authorization_id: int(int64) # OAuth authorization ID}\n@returns(204) No Content\n@errors {401: Unauthorized, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/user/oauth/approvals/{client_id}\n@desc Remove OAuth client approval\n@required {client_id: str # OAuth client ID}\n@returns(204) No Content\n@errors {401: Unauthorized, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/user/account/mfa/totp/{id}\n@desc Disable a MFA TOTP setup with generated OTP\n@required {id: int(int64), valid_otp: str}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@group provisioning\n@endpoint DELETE /v4/provisioning/customers/{customer_id}/customerAttributes/{key}\n@desc Remove customer attribute\n@required {customer_id: int(int64) # Customer ID, key: str # Key}\n@optional {X-Sds-Service-Token: str # Service Authentication token}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 404: Not Found, 406: Not Acceptable}\n\n@endgroup\n\n@group nodes\n@endpoint DELETE /v4/nodes/{node_id}/node_attributes/{key}\n@desc Remove custom node attribute\n@required {node_id: int(int64) # Node ID, key: str # Key}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/nodes/malicious_files/{malicious_file_id}\n@desc Remove malicious File\n@required {malicious_file_id: int(int64) # Malicious file ID}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endpoint DELETE /v4/nodes/deleted_nodes\n@desc Remove nodes from recycle bin\n@required {deletedNodeIds: [int(int64)] # List of deleted node IDs}\n@returns(204) No Content\n@errors {400: Bad Request, 401: Unauthorized, 403: Forbidden, 404: Not Found, 406: Not Acceptable, 412: Precondition Failed}\n\n@endgroup\n\n@end\n"}}